From 715ccde3962c968454a5ef9f4cb7a52af1792b34 Mon Sep 17 00:00:00 2001 From: daniel@ruoso.com Date: Wed, 24 Jun 2009 14:10:53 +0000 Subject: [PATCH] Subindo todo o codigo fonte --- Apache2/fila-vhost.conf | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DJabberd/djabberd.conf | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/fila_administracao.yml | 6 ++++++ Fila-Administracao/lib/Fila/Administracao.pm | 47 +++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/Categorias.pm | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/Classes.pm | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/Conf_perguntas.pm | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/Conf_perguntas_praca.pm | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/ConfiguracaoCategorias.pm | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/ConfiguracaoLimites.pm | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/Funcionarios.pm | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/Guiches.pm | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/Locais.pm | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/Perguntas.pm | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/Perguntas_praca.pm | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/Root.pm | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/Servicos.pm | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Controller/Servicos_interno.pm | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/Model/DB.pm | 40 ++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Administracao/View/TT.pm | 34 ++++++++++++++++++++++++++++++++++ Fila-Administracao/lib/Fila/Servico | 1 + Fila-Administracao/root/bg_cabecalho2.gif | Bin 0 -> 36704 bytes Fila-Administracao/root/categorias/criar.tt | 30 ++++++++++++++++++++++++++++++ Fila-Administracao/root/categorias/index.tt | 36 ++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/categorias/ver.tt | 31 +++++++++++++++++++++++++++++++ Fila-Administracao/root/classes/criar.tt | 30 ++++++++++++++++++++++++++++++ Fila-Administracao/root/classes/index.tt | 36 ++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/classes/ver.tt | 31 +++++++++++++++++++++++++++++++ Fila-Administracao/root/conf_perguntas/criar.tt | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/conf_perguntas_praca/criar.tt | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/configuracaocategorias/criar.tt | 37 +++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/configuracaolimites/criar.tt | 34 ++++++++++++++++++++++++++++++++++ Fila-Administracao/root/favicon.ico | Bin 0 -> 2551 bytes Fila-Administracao/root/footer.tt | 28 ++++++++++++++++++++++++++++ Fila-Administracao/root/funcionarios/criar.tt | 36 ++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/funcionarios/index.tt | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/funcionarios/ver.tt | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/guiches/criar.tt | 30 ++++++++++++++++++++++++++++++ Fila-Administracao/root/guiches/ver.tt | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/header.tt | 47 +++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/index.tt | 22 ++++++++++++++++++++++ Fila-Administracao/root/locais/criar.tt | 32 ++++++++++++++++++++++++++++++++ Fila-Administracao/root/locais/index.tt | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/locais/ver.tt | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/perguntas/criar.tt | 30 ++++++++++++++++++++++++++++++ Fila-Administracao/root/perguntas/index.tt | 47 +++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/perguntas/ver.tt | 31 +++++++++++++++++++++++++++++++ Fila-Administracao/root/perguntas_praca/criar.tt | 30 ++++++++++++++++++++++++++++++ Fila-Administracao/root/perguntas_praca/index.tt | 47 +++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/perguntas_praca/ver.tt | 31 +++++++++++++++++++++++++++++++ Fila-Administracao/root/servicos/criar.tt | 37 +++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/servicos/index.tt | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/servicos/ver.tt | 42 ++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/servicos_interno/criar.tt | 37 +++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/servicos_interno/index.tt | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/servicos_interno/ver.tt | 42 ++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/static/css/main.css | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/static/doc/ajei/cat1.gif | Bin 0 -> 8452 bytes Fila-Administracao/root/static/doc/ajei/cat2.gif | Bin 0 -> 4210 bytes Fila-Administracao/root/static/doc/ajei/cat3.gif | Bin 0 -> 4796 bytes Fila-Administracao/root/static/doc/ajei/cla1.gif | Bin 0 -> 5182 bytes Fila-Administracao/root/static/doc/ajei/cla2.gif | Bin 0 -> 3219 bytes Fila-Administracao/root/static/doc/ajei/cla3.gif | Bin 0 -> 3694 bytes Fila-Administracao/root/static/doc/ajei/func1.gif | Bin 0 -> 17497 bytes Fila-Administracao/root/static/doc/ajei/func2.gif | Bin 0 -> 9039 bytes Fila-Administracao/root/static/doc/ajei/func3.gif | Bin 0 -> 20760 bytes Fila-Administracao/root/static/doc/ajei/int1.gif | Bin 0 -> 14815 bytes Fila-Administracao/root/static/doc/ajei/int2.gif | Bin 0 -> 4927 bytes Fila-Administracao/root/static/doc/ajei/int3.gif | Bin 0 -> 6076 bytes Fila-Administracao/root/static/doc/ajei/loc1.gif | Bin 0 -> 15093 bytes Fila-Administracao/root/static/doc/ajei/loc10.gif | Bin 0 -> 13618 bytes Fila-Administracao/root/static/doc/ajei/loc2.gif | Bin 0 -> 5736 bytes Fila-Administracao/root/static/doc/ajei/loc3.gif | Bin 0 -> 10658 bytes Fila-Administracao/root/static/doc/ajei/loc5.gif | Bin 0 -> 5257 bytes Fila-Administracao/root/static/doc/ajei/loc6.gif | Bin 0 -> 7367 bytes Fila-Administracao/root/static/doc/ajei/loc7.gif | Bin 0 -> 10947 bytes Fila-Administracao/root/static/doc/ajei/loc8.gif | Bin 0 -> 6761 bytes Fila-Administracao/root/static/doc/ajei/loc9.gif | Bin 0 -> 18473 bytes Fila-Administracao/root/static/doc/ajei/loccat.gif | Bin 0 -> 25903 bytes Fila-Administracao/root/static/doc/ajei/locgui.gif | Bin 0 -> 13283 bytes Fila-Administracao/root/static/doc/ajei/loclim.gif | Bin 0 -> 7103 bytes Fila-Administracao/root/static/doc/ajei/locopo.gif | Bin 0 -> 14509 bytes Fila-Administracao/root/static/doc/ajei/locopop.gif | Bin 0 -> 13059 bytes Fila-Administracao/root/static/doc/ajei/menu.gif | Bin 0 -> 6322 bytes Fila-Administracao/root/static/doc/ajei/pe1.gif | Bin 0 -> 13354 bytes Fila-Administracao/root/static/doc/ajei/pe2.gif | Bin 0 -> 3942 bytes Fila-Administracao/root/static/doc/ajei/pe4.gif | Bin 0 -> 4947 bytes Fila-Administracao/root/static/doc/ajei/pp1.gif | Bin 0 -> 13147 bytes Fila-Administracao/root/static/doc/ajei/pp2.gif | Bin 0 -> 3752 bytes Fila-Administracao/root/static/doc/ajei/pp3.gif | Bin 0 -> 4391 bytes Fila-Administracao/root/static/doc/ajei/serv1.gif | Bin 0 -> 11466 bytes Fila-Administracao/root/static/doc/ajei/serv2.gif | Bin 0 -> 5008 bytes Fila-Administracao/root/static/doc/ajei/serv3.gif | Bin 0 -> 5059 bytes Fila-Administracao/root/static/doc/ajuda.html | 249 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Administracao/root/static/images/add.png | Bin 0 -> 54300 bytes Fila-Administracao/root/static/images/bg_cabecalho.gif | Bin 0 -> 59 bytes Fila-Administracao/root/static/images/bg_cabecalho.jpg | Bin 0 -> 18670 bytes Fila-Administracao/root/static/images/bt_abrir_local.jpg | Bin 0 -> 1423 bytes Fila-Administracao/root/static/images/bt_concluir_atend.png | Bin 0 -> 61905 bytes Fila-Administracao/root/static/images/bt_devol_senha.png | Bin 0 -> 54807 bytes Fila-Administracao/root/static/images/bt_disponivel.png | Bin 0 -> 57470 bytes Fila-Administracao/root/static/images/bt_encaminhar_atend.png | Bin 0 -> 59068 bytes Fila-Administracao/root/static/images/bt_encerrar_senhas.jpg | Bin 0 -> 1818 bytes Fila-Administracao/root/static/images/bt_entrar_login.jpg | Bin 0 -> 788 bytes Fila-Administracao/root/static/images/bt_enviar_chat.jpg | Bin 0 -> 1031 bytes Fila-Administracao/root/static/images/bt_fechar_local.jpg | Bin 0 -> 1767 bytes Fila-Administracao/root/static/images/bt_fechar_mesa.jpg | Bin 0 -> 1816 bytes Fila-Administracao/root/static/images/bt_fechar_mesas.jpg | Bin 0 -> 2296 bytes Fila-Administracao/root/static/images/bt_forcar_fechar.png | Bin 0 -> 58489 bytes Fila-Administracao/root/static/images/bt_iniciar_atend.png | Bin 0 -> 60240 bytes Fila-Administracao/root/static/images/bt_iniciar_pausa.jpg | Bin 0 -> 1603 bytes Fila-Administracao/root/static/images/bt_iniciar_servico.jpg | Bin 0 -> 2132 bytes Fila-Administracao/root/static/images/bt_ir_para.png | Bin 0 -> 58033 bytes Fila-Administracao/root/static/images/bt_listar_ausentes.jpg | Bin 0 -> 2123 bytes Fila-Administracao/root/static/images/bt_ok.jpg | Bin 0 -> 647 bytes Fila-Administracao/root/static/images/bt_registrar_ausencia.png | Bin 0 -> 57075 bytes Fila-Administracao/root/static/images/bt_retornar_pausa.jpg | Bin 0 -> 2072 bytes Fila-Administracao/root/static/images/bt_voltar.jpg | Bin 0 -> 1603 bytes Fila-Administracao/root/static/images/bt_voltar_serv_interno.png | Bin 0 -> 58675 bytes Fila-Administracao/root/static/images/btn_120x50_built.png | Bin 0 -> 3826 bytes Fila-Administracao/root/static/images/btn_120x50_built_shadow.png | Bin 0 -> 3681 bytes Fila-Administracao/root/static/images/btn_120x50_powered.png | Bin 0 -> 3862 bytes Fila-Administracao/root/static/images/btn_120x50_powered_shadow.png | Bin 0 -> 3673 bytes Fila-Administracao/root/static/images/btn_88x31_built.png | Bin 0 -> 2517 bytes Fila-Administracao/root/static/images/btn_88x31_built_shadow.png | Bin 0 -> 2274 bytes Fila-Administracao/root/static/images/btn_88x31_powered.png | Bin 0 -> 2542 bytes Fila-Administracao/root/static/images/btn_88x31_powered_shadow.png | Bin 0 -> 2304 bytes Fila-Administracao/root/static/images/catalyst_logo.png | Bin 0 -> 13710 bytes Fila-Administracao/root/static/images/icon_atend_atrasados.jpg | Bin 0 -> 990 bytes Fila-Administracao/root/static/images/icon_cat.jpg | Bin 0 -> 507 bytes Fila-Administracao/root/static/images/icon_chat.jpg | Bin 0 -> 479 bytes Fila-Administracao/root/static/images/icon_encaminhar.png | Bin 0 -> 52701 bytes Fila-Administracao/root/static/images/icon_mesa.jpg | Bin 0 -> 624 bytes Fila-Administracao/root/static/images/icon_opi_off.png | Bin 0 -> 51094 bytes Fila-Administracao/root/static/images/icon_opi_on.png | Bin 0 -> 50314 bytes Fila-Administracao/root/static/images/icon_relogio.jpg | Bin 0 -> 400 bytes Fila-Administracao/root/static/images/icon_senha.jpg | Bin 0 -> 444 bytes Fila-Administracao/root/static/images/icon_servico.jpg | Bin 0 -> 566 bytes Fila-Administracao/script/fila_administracao_fastcgi.pl | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Agendamento/fila_agendamento.yml | 14 ++++++++++++++ Fila-Agendamento/lib/Fila/Agendamento.pm | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Agendamento/lib/Fila/Agendamento/Controller/Root.pm | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Agendamento/lib/Fila/Agendamento/DB.pm | 37 +++++++++++++++++++++++++++++++++++++ Fila-Agendamento/lib/Fila/Agendamento/DB/Atendimento.pm | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Agendamento/lib/Fila/Agendamento/DB/Expediente.pm | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Agendamento/lib/Fila/Agendamento/DB/Feriado.pm | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Agendamento/lib/Fila/Agendamento/DB/IntervalosView.pm | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Agendamento/lib/Fila/Agendamento/DB/Local.pm | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Agendamento/lib/Fila/Agendamento/Model/DB.pm | 38 ++++++++++++++++++++++++++++++++++++++ Fila-Agendamento/lib/Fila/Agendamento/View/Email.pm | 36 ++++++++++++++++++++++++++++++++++++ Fila-Agendamento/lib/Fila/Agendamento/View/TT.pm | 34 ++++++++++++++++++++++++++++++++++ Fila-Agendamento/root/atendimento.tt | 35 +++++++++++++++++++++++++++++++++++ Fila-Agendamento/root/email_atendimento.tt | 33 +++++++++++++++++++++++++++++++++ Fila-Agendamento/root/favicon.ico | Bin 0 -> 2551 bytes Fila-Agendamento/root/footer.tt | 25 +++++++++++++++++++++++++ Fila-Agendamento/root/header.tt | 30 ++++++++++++++++++++++++++++++ Fila-Agendamento/root/index.tt | 41 +++++++++++++++++++++++++++++++++++++++++ Fila-Agendamento/root/passo1.tt | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Agendamento/root/static/css/main.css | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Agendamento/root/static/images/bg_cabecalho.gif | Bin 0 -> 59 bytes Fila-Agendamento/root/static/images/bg_cabecalho.jpg | Bin 0 -> 18670 bytes Fila-Agendamento/root/static/images/bt_abrir_local.jpg | Bin 0 -> 1423 bytes Fila-Agendamento/root/static/images/bt_concluir_atend.png | Bin 0 -> 61905 bytes Fila-Agendamento/root/static/images/bt_devol_senha.png | Bin 0 -> 54807 bytes Fila-Agendamento/root/static/images/bt_disponivel.png | Bin 0 -> 57470 bytes Fila-Agendamento/root/static/images/bt_encaminhar_atend.png | Bin 0 -> 59068 bytes Fila-Agendamento/root/static/images/bt_encerrar_senhas.jpg | Bin 0 -> 1818 bytes Fila-Agendamento/root/static/images/bt_entrar_login.jpg | Bin 0 -> 788 bytes Fila-Agendamento/root/static/images/bt_enviar_chat.jpg | Bin 0 -> 1031 bytes Fila-Agendamento/root/static/images/bt_fechar_local.jpg | Bin 0 -> 1767 bytes Fila-Agendamento/root/static/images/bt_fechar_mesa.jpg | Bin 0 -> 1816 bytes Fila-Agendamento/root/static/images/bt_fechar_mesas.jpg | Bin 0 -> 2296 bytes Fila-Agendamento/root/static/images/bt_forcar_fechar.png | Bin 0 -> 58489 bytes Fila-Agendamento/root/static/images/bt_iniciar_atend.png | Bin 0 -> 60240 bytes Fila-Agendamento/root/static/images/bt_iniciar_pausa.jpg | Bin 0 -> 1603 bytes Fila-Agendamento/root/static/images/bt_iniciar_servico.jpg | Bin 0 -> 2132 bytes Fila-Agendamento/root/static/images/bt_ir_para.png | Bin 0 -> 58033 bytes Fila-Agendamento/root/static/images/bt_listar_ausentes.jpg | Bin 0 -> 2123 bytes Fila-Agendamento/root/static/images/bt_ok.jpg | Bin 0 -> 647 bytes Fila-Agendamento/root/static/images/bt_registrar_ausencia.png | Bin 0 -> 57075 bytes Fila-Agendamento/root/static/images/bt_retornar_pausa.jpg | Bin 0 -> 2072 bytes Fila-Agendamento/root/static/images/bt_voltar.jpg | Bin 0 -> 1603 bytes Fila-Agendamento/root/static/images/bt_voltar_serv_interno.png | Bin 0 -> 58675 bytes Fila-Agendamento/root/static/images/btn_120x50_built.png | Bin 0 -> 3826 bytes Fila-Agendamento/root/static/images/btn_120x50_built_shadow.png | Bin 0 -> 3681 bytes Fila-Agendamento/root/static/images/btn_120x50_powered.png | Bin 0 -> 3862 bytes Fila-Agendamento/root/static/images/btn_120x50_powered_shadow.png | Bin 0 -> 3673 bytes Fila-Agendamento/root/static/images/btn_88x31_built.png | Bin 0 -> 2517 bytes Fila-Agendamento/root/static/images/btn_88x31_built_shadow.png | Bin 0 -> 2274 bytes Fila-Agendamento/root/static/images/btn_88x31_powered.png | Bin 0 -> 2542 bytes Fila-Agendamento/root/static/images/btn_88x31_powered_shadow.png | Bin 0 -> 2304 bytes Fila-Agendamento/root/static/images/catalyst_logo.png | Bin 0 -> 13710 bytes Fila-Agendamento/root/static/images/icon_atend_atrasados.jpg | Bin 0 -> 990 bytes Fila-Agendamento/root/static/images/icon_cat.jpg | Bin 0 -> 507 bytes Fila-Agendamento/root/static/images/icon_chat.jpg | Bin 0 -> 479 bytes Fila-Agendamento/root/static/images/icon_encaminhar.png | Bin 0 -> 52701 bytes Fila-Agendamento/root/static/images/icon_mesa.jpg | Bin 0 -> 624 bytes Fila-Agendamento/root/static/images/icon_opi_off.png | Bin 0 -> 51094 bytes Fila-Agendamento/root/static/images/icon_opi_on.png | Bin 0 -> 50314 bytes Fila-Agendamento/root/static/images/icon_relogio.jpg | Bin 0 -> 400 bytes Fila-Agendamento/root/static/images/icon_senha.jpg | Bin 0 -> 444 bytes Fila-Agendamento/root/static/images/icon_servico.jpg | Bin 0 -> 566 bytes Fila-Agendamento/script/fila_agendamento_db.pl | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Agendamento/script/fila_agendamento_fastcgi.pl | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/fila_etl.yaml | 23 +++++++++++++++++++++++ Fila-ETL/lib/Fila/Agendamento | 1 + Fila-ETL/lib/Fila/ETL.pm | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/Controller/Agendamento.pm | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/Controller/Atendimento.pm | 557 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/Controller/Root.pm | 41 +++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/DB.pm | 36 ++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/DB/ActivityLog.pm | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/DB/DAtendente.pm | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/DB/DCategoria.pm | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/DB/DData.pm | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/DB/DGuiche.pm | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/DB/DHorario.pm | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/DB/DLocal.pm | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/DB/FQuantidadeAtendimentos.pm | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/DB/FQuantidadeEstados.pm | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/Model/DB.pm | 37 +++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/Model/DBAgendamento.pm | 37 +++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/Model/DBSERVI.pm | 37 +++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/ETL/Model/Federado.pm | 42 ++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/lib/Fila/Servico | 1 + Fila-ETL/script/fila_etl.pl | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-ETL/script/fila_etl_db.pl | 42 ++++++++++++++++++++++++++++++++++++++++++ Fila-Opiniometro/fila_opiniometro.yml | 16 ++++++++++++++++ Fila-Opiniometro/lib/Fila/Opiniometro.pm | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Opiniometro/lib/Fila/Opiniometro/Controller/Callback.pm | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Opiniometro/lib/Fila/Opiniometro/Device.pm | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Opiniometro/lib/Fila/Opiniometro/Model/Device.pm | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Opiniometro/lib/Fila/Opiniometro/Model/SOAP.pm | 45 +++++++++++++++++++++++++++++++++++++++++++++ Fila-Opiniometro/schemas | 1 + Fila-Opiniometro/script/fila_opiniometro_app.pl | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Painel/fila_painel.yml | 9 +++++++++ Fila-Painel/gtk_senha.glade | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Painel/gtk_senha.php | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Painel/gtk_senha.sh | 24 ++++++++++++++++++++++++ Fila-Painel/gtk_texto.php | 36 ++++++++++++++++++++++++++++++++++++ Fila-Painel/gtk_texto.sh | 26 ++++++++++++++++++++++++++ Fila-Painel/letreiro.pl | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Painel/letreiro2.pl | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Painel/lib/Fila/Painel.pm | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Painel/lib/Fila/Painel/Controller/Callback.pm | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Painel/lib/Fila/Painel/Model/Output.pm | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Painel/mplayer.sh | 23 +++++++++++++++++++++++ Fila-Painel/painel.pl | 192 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Painel/schemas | 1 + Fila-Painel/script/fila_painel_app.pl | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Painel/senhas.pl | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Painel/senhas2.pl | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Painel/teste.txt | 29 +++++++++++++++++++++++++++++ Fila-Senha/fila_senha.yml | 14 ++++++++++++++ Fila-Senha/lib/Fila/Senha.pm | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Senha/lib/Fila/Senha/Controller/Callback.pm | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Senha/lib/Fila/Senha/Model/Emissor.pm | 276 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Senha/lib/Fila/Senha/Model/Impressora.pm | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Senha/lib/Fila/Senha/Model/SOAP.pm | 47 +++++++++++++++++++++++++++++++++++++++++++++++ Fila-Senha/schemas | 1 + Fila-Senha/script/fila_senha_app.pl | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/fila_servico.yml | 11 +++++++++++ Fila-Servico/lib/Fila/Servico.pm | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/Controller.pm | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/Controller/Root.pm | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Atendente.pm | 1463 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Guiche.pm | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Local.pm | 1244 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Opiniometro.pm | 192 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Senha.pm | 266 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/Controller/WS/Scheduler.pm | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB.pm | 36 ++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/Agendamento.pm | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/AtendenteGuiche.pm | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/Atendimento.pm | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/Categoria.pm | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/CategoriaAtendimento.pm | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/ClasseServico.pm | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoCategoria.pm | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoLimite.pm | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoPerguntas.pm | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoPerguntasPraca.pm | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/EstadoAtendimento.pm | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/EstadoGuiche.pm | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/EstadoLocal.pm | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/Funcionario.pm | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/FuncionarioLocal.pm | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/GerenteLocal.pm | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/Guiche.pm | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/GuicheAtendimento.pm | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/GuicheCategoria.pm | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/GuicheEncaminhamento.pm | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/Local.pm | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/Pausa.pm | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/PerguntaAvaliacao.pm | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/PerguntaAvaliacaoPraca.pm | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/RespostaAvaliacao.pm | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/RespostaAvaliacaoPraca.pm | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/Senha.pm | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/Servico.pm | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/ServicoAtendimento.pm | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/ServicoGuiche.pm | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/ServicoInterno.pm | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/TipoEstadoAtendimento.pm | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/TipoEstadoGuiche.pm | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/DB/TipoEstadoLocal.pm | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/Model/DB.pm | 38 ++++++++++++++++++++++++++++++++++++++ Fila-Servico/lib/Fila/Servico/Model/SOAP.pm | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/reset-banco.sh | 28 ++++++++++++++++++++++++++++ Fila-Servico/schemas/FilaOpiniometro.wsdl | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/schemas/FilaPainel.wsdl | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/schemas/FilaSenha.wsdl | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/schemas/FilaServico.wsdl | 567 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/schemas/FilaWeb.wsdl | 387 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/schemas/FilaWebApp.wsdl | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/schemas/fila-servico.xsd | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/script/fila_servico_db.pl | 235 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/script/fila_servico_diagram.pl | 44 ++++++++++++++++++++++++++++++++++++++++++++ Fila-Servico/script/fila_servico_xmpp.pl | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/cgi-bin/nph-app.cgi | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/fila_web.yml | 2 ++ Fila-Web/lib/Fila/Web.pm | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/Web/Controller/CB/Atendente.pm | 358 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/Web/Controller/CB/Gerente.pm | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/Web/Controller/CB/Guiche.pm | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/Web/Controller/CB/Local.pm | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/Web/Controller/Emissor.pm | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/Web/Controller/Root.pm | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/Web/Model/SOAP.pm | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/Web/View/TT.pm | 39 +++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/WebApp.pm | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/WebApp/Controller/CB/Atendente.pm | 365 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/WebApp/Controller/CB/Emissor.pm | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/WebApp/Controller/CB/Gerente.pm | 307 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/WebApp/Controller/CB/Guiche.pm | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Atendente.pm | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Error.pm | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Gerente.pm | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/WebApp/Controller/Render.pm | 285 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/WebApp/Controller/Root.pm | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/WebApp/Model/SOAP.pm | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/lib/Fila/WebApp/View/NPH.pm | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/cb/atendente/encerrar_senhas.tt | 19 +++++++++++++++++++ Fila-Web/root/cb/atendente/enviar_chat.tt | 24 ++++++++++++++++++++++++ Fila-Web/root/cb/atendente/fechar_guiche.tt | 35 +++++++++++++++++++++++++++++++++++ Fila-Web/root/cb/atendente/mudar_senha.tt | 25 +++++++++++++++++++++++++ Fila-Web/root/cb/atendente/noshow.tt | 19 +++++++++++++++++++ Fila-Web/root/cb/atendente/receber_chat.tt | 24 ++++++++++++++++++++++++ Fila-Web/root/cb/atendente/refresh.tt | 27 +++++++++++++++++++++++++++ Fila-Web/root/cb/gerente/abrir_local.tt | 25 +++++++++++++++++++++++++ Fila-Web/root/cb/gerente/encerrar_senhas.tt | 25 +++++++++++++++++++++++++ Fila-Web/root/cb/gerente/enviar_chat.tt | 24 ++++++++++++++++++++++++ Fila-Web/root/cb/gerente/fechar_local.tt | 25 +++++++++++++++++++++++++ Fila-Web/root/cb/gerente/passar_gerencia.tt | 45 +++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/cb/gerente/receber_chat.tt | 24 ++++++++++++++++++++++++ Fila-Web/root/emissor.tt | 33 +++++++++++++++++++++++++++++++++ Fila-Web/root/favicon.ico | Bin 0 -> 2551 bytes Fila-Web/root/footer.tt | 25 +++++++++++++++++++++++++ Fila-Web/root/header.tt | 40 ++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/index.tt | 33 +++++++++++++++++++++++++++++++++ Fila-Web/root/render/atendente.tt | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/render/authenticated.tt | 42 ++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/render/aviso.tt | 21 +++++++++++++++++++++ Fila-Web/root/render/base.tt | 27 +++++++++++++++++++++++++++ Fila-Web/root/render/chat.tt | 28 ++++++++++++++++++++++++++++ Fila-Web/root/render/disconnected.tt | 38 ++++++++++++++++++++++++++++++++++++++ Fila-Web/root/render/emissor.tt | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/render/emissor/acoes.tt | 29 +++++++++++++++++++++++++++++ Fila-Web/root/render/emissor/error.tt | 21 +++++++++++++++++++++ Fila-Web/root/render/emissor/main.tt | 41 +++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/render/emissor/receber_senha.tt | 30 ++++++++++++++++++++++++++++++ Fila-Web/root/render/error.tt | 21 +++++++++++++++++++++ Fila-Web/root/render/error_message.tt | 21 +++++++++++++++++++++ Fila-Web/root/render/escolher_guiche.tt | 43 +++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/render/fechar.tt | 24 ++++++++++++++++++++++++ Fila-Web/root/render/gerente.tt | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/render/guiches.tt | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/render/mesas.tt | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/render/refresh_guiches.tt | 33 +++++++++++++++++++++++++++++++++ Fila-Web/root/render/status_atendente.tt | 286 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/render/status_local_gerente.tt | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/static/css/main.css | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/static/doc/ajuda.html | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/static/doc/gerenteajuda.html | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/static/doc/im/Screenshot-1.png | Bin 0 -> 201650 bytes Fila-Web/root/static/doc/im/Screenshot.png | Bin 0 -> 222974 bytes Fila-Web/root/static/doc/im/abloc.gif | Bin 0 -> 4121 bytes Fila-Web/root/static/doc/im/acões.gif | Bin 0 -> 17738 bytes Fila-Web/root/static/doc/im/aten.gif | Bin 0 -> 4739 bytes Fila-Web/root/static/doc/im/ava.gif | Bin 0 -> 4710 bytes Fila-Web/root/static/doc/im/bt_abrir_local.gif | Bin 0 -> 3429 bytes Fila-Web/root/static/doc/im/cham.gif | Bin 0 -> 4673 bytes Fila-Web/root/static/doc/im/conc.gif | Bin 0 -> 4577 bytes Fila-Web/root/static/doc/im/disp.gif | Bin 0 -> 4755 bytes Fila-Web/root/static/doc/im/fechado.gif | Bin 0 -> 3626 bytes Fila-Web/root/static/doc/im/int.gif | Bin 0 -> 5052 bytes Fila-Web/root/static/doc/im/pausa.gif | Bin 0 -> 4989 bytes Fila-Web/root/static/images/bg_cabecalho.gif | Bin 0 -> 59 bytes Fila-Web/root/static/images/bg_cabecalho.jpg | Bin 0 -> 18670 bytes Fila-Web/root/static/images/bt_abrir_local.jpg | Bin 0 -> 1423 bytes Fila-Web/root/static/images/bt_concluir_atend.png | Bin 0 -> 61905 bytes Fila-Web/root/static/images/bt_devol_senha.png | Bin 0 -> 54807 bytes Fila-Web/root/static/images/bt_disponivel.png | Bin 0 -> 57470 bytes Fila-Web/root/static/images/bt_encaminhar_atend.png | Bin 0 -> 59068 bytes Fila-Web/root/static/images/bt_encerrar_senhas.jpg | Bin 0 -> 1818 bytes Fila-Web/root/static/images/bt_entrar_login.jpg | Bin 0 -> 788 bytes Fila-Web/root/static/images/bt_enviar_chat.jpg | Bin 0 -> 1031 bytes Fila-Web/root/static/images/bt_fechar_local.jpg | Bin 0 -> 1767 bytes Fila-Web/root/static/images/bt_fechar_mesa.jpg | Bin 0 -> 1816 bytes Fila-Web/root/static/images/bt_fechar_mesas.jpg | Bin 0 -> 2296 bytes Fila-Web/root/static/images/bt_forcar_fechar.png | Bin 0 -> 58489 bytes Fila-Web/root/static/images/bt_iniciar_atend.png | Bin 0 -> 60240 bytes Fila-Web/root/static/images/bt_iniciar_pausa.jpg | Bin 0 -> 1603 bytes Fila-Web/root/static/images/bt_iniciar_servico.jpg | Bin 0 -> 2132 bytes Fila-Web/root/static/images/bt_ir_para.png | Bin 0 -> 58033 bytes Fila-Web/root/static/images/bt_listar_ausentes.jpg | Bin 0 -> 2123 bytes Fila-Web/root/static/images/bt_ok.jpg | Bin 0 -> 647 bytes Fila-Web/root/static/images/bt_registrar_ausencia.png | Bin 0 -> 57075 bytes Fila-Web/root/static/images/bt_retornar_pausa.jpg | Bin 0 -> 2072 bytes Fila-Web/root/static/images/bt_voltar.jpg | Bin 0 -> 1603 bytes Fila-Web/root/static/images/bt_voltar_serv_interno.png | Bin 0 -> 58675 bytes Fila-Web/root/static/images/btn_120x50_built.png | Bin 0 -> 3826 bytes Fila-Web/root/static/images/btn_120x50_built_shadow.png | Bin 0 -> 3681 bytes Fila-Web/root/static/images/btn_120x50_powered.png | Bin 0 -> 3862 bytes Fila-Web/root/static/images/btn_120x50_powered_shadow.png | Bin 0 -> 3673 bytes Fila-Web/root/static/images/btn_88x31_built.png | Bin 0 -> 2517 bytes Fila-Web/root/static/images/btn_88x31_built_shadow.png | Bin 0 -> 2274 bytes Fila-Web/root/static/images/btn_88x31_powered.png | Bin 0 -> 2542 bytes Fila-Web/root/static/images/btn_88x31_powered_shadow.png | Bin 0 -> 2304 bytes Fila-Web/root/static/images/catalyst_logo.png | Bin 0 -> 13710 bytes Fila-Web/root/static/images/icon_atend_atrasados.jpg | Bin 0 -> 990 bytes Fila-Web/root/static/images/icon_cat.jpg | Bin 0 -> 507 bytes Fila-Web/root/static/images/icon_chat.jpg | Bin 0 -> 479 bytes Fila-Web/root/static/images/icon_encaminhar.png | Bin 0 -> 52701 bytes Fila-Web/root/static/images/icon_mesa.jpg | Bin 0 -> 624 bytes Fila-Web/root/static/images/icon_opi_off.png | Bin 0 -> 51094 bytes Fila-Web/root/static/images/icon_opi_on.png | Bin 0 -> 50314 bytes Fila-Web/root/static/images/icon_relogio.jpg | Bin 0 -> 400 bytes Fila-Web/root/static/images/icon_senha.jpg | Bin 0 -> 444 bytes Fila-Web/root/static/images/icon_servico.jpg | Bin 0 -> 566 bytes Fila-Web/root/static/js/prototype-1.6.0.2.js | 4221 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fila-Web/root/teste.html | 32 ++++++++++++++++++++++++++++++++ Fila-Web/schemas | 1 + Fila-Web/script/fila_web_fastcgi.pl | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ FilaOLAP.xml | 236 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LEIAME | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LICENCA.txt | 339 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ documentacao/Apostila.odt | Bin 0 -> 206756 bytes documentacao/DicionarioDeDadosAgendamento.txt | 46 ++++++++++++++++++++++++++++++++++++++++++++++ documentacao/DicionarioDeDadosPrincipal.txt | 269 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ documentacao/Documentacao.odt | Bin 0 -> 20168 bytes documentacao/ajuda_atendente.html | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ documentacao/ajuda_gerente.html | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ documentacao/im/Screenshot-1.png | Bin 0 -> 201650 bytes documentacao/im/Screenshot.png | Bin 0 -> 222974 bytes documentacao/im/abloc.gif | Bin 0 -> 4121 bytes documentacao/im/acões.gif | Bin 0 -> 17738 bytes documentacao/im/aten.gif | Bin 0 -> 4739 bytes documentacao/im/ava.gif | Bin 0 -> 4710 bytes documentacao/im/bt_abrir_local.gif | Bin 0 -> 3429 bytes documentacao/im/cham.gif | Bin 0 -> 4673 bytes documentacao/im/conc.gif | Bin 0 -> 4577 bytes documentacao/im/disp.gif | Bin 0 -> 4755 bytes documentacao/im/fechado.gif | Bin 0 -> 3626 bytes documentacao/im/int.gif | Bin 0 -> 5052 bytes documentacao/im/pausa.gif | Bin 0 -> 4989 bytes documentacao/modelo_atemporal.dia | Bin 0 -> 4415 bytes documentacao/olap_cubes.txt | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ documentacao/temporalidade.txt | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ltsp/htmlmesa.html | 21 +++++++++++++++++++++ patches/DBIx-Class-ResultSource.patch | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ patches/DJabberd.patch | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 472 files changed, 28833 insertions(+), 0 deletions(-) create mode 100644 Apache2/fila-vhost.conf create mode 100644 DJabberd/djabberd.conf create mode 100644 Fila-Administracao/fila_administracao.yml create mode 100644 Fila-Administracao/lib/Fila/Administracao.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/Categorias.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/Classes.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/Conf_perguntas.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/Conf_perguntas_praca.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/ConfiguracaoCategorias.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/ConfiguracaoLimites.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/Funcionarios.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/Guiches.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/Locais.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/Perguntas.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/Perguntas_praca.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/Root.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/Servicos.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Controller/Servicos_interno.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/Model/DB.pm create mode 100644 Fila-Administracao/lib/Fila/Administracao/View/TT.pm create mode 120000 Fila-Administracao/lib/Fila/Servico create mode 100644 Fila-Administracao/root/bg_cabecalho2.gif create mode 100644 Fila-Administracao/root/categorias/criar.tt create mode 100644 Fila-Administracao/root/categorias/index.tt create mode 100644 Fila-Administracao/root/categorias/ver.tt create mode 100644 Fila-Administracao/root/classes/criar.tt create mode 100644 Fila-Administracao/root/classes/index.tt create mode 100644 Fila-Administracao/root/classes/ver.tt create mode 100644 Fila-Administracao/root/conf_perguntas/criar.tt create mode 100644 Fila-Administracao/root/conf_perguntas_praca/criar.tt create mode 100644 Fila-Administracao/root/configuracaocategorias/criar.tt create mode 100644 Fila-Administracao/root/configuracaolimites/criar.tt create mode 100644 Fila-Administracao/root/favicon.ico create mode 100644 Fila-Administracao/root/footer.tt create mode 100644 Fila-Administracao/root/funcionarios/criar.tt create mode 100644 Fila-Administracao/root/funcionarios/index.tt create mode 100644 Fila-Administracao/root/funcionarios/ver.tt create mode 100644 Fila-Administracao/root/guiches/criar.tt create mode 100644 Fila-Administracao/root/guiches/ver.tt create mode 100644 Fila-Administracao/root/header.tt create mode 100644 Fila-Administracao/root/index.tt create mode 100644 Fila-Administracao/root/locais/criar.tt create mode 100644 Fila-Administracao/root/locais/index.tt create mode 100644 Fila-Administracao/root/locais/ver.tt create mode 100644 Fila-Administracao/root/perguntas/criar.tt create mode 100644 Fila-Administracao/root/perguntas/index.tt create mode 100644 Fila-Administracao/root/perguntas/ver.tt create mode 100644 Fila-Administracao/root/perguntas_praca/criar.tt create mode 100644 Fila-Administracao/root/perguntas_praca/index.tt create mode 100644 Fila-Administracao/root/perguntas_praca/ver.tt create mode 100644 Fila-Administracao/root/servicos/criar.tt create mode 100644 Fila-Administracao/root/servicos/index.tt create mode 100644 Fila-Administracao/root/servicos/ver.tt create mode 100644 Fila-Administracao/root/servicos_interno/criar.tt create mode 100644 Fila-Administracao/root/servicos_interno/index.tt create mode 100644 Fila-Administracao/root/servicos_interno/ver.tt create mode 100644 Fila-Administracao/root/static/css/main.css create mode 100644 Fila-Administracao/root/static/doc/ajei/cat1.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/cat2.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/cat3.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/cla1.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/cla2.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/cla3.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/func1.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/func2.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/func3.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/int1.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/int2.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/int3.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/loc1.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/loc10.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/loc2.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/loc3.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/loc5.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/loc6.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/loc7.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/loc8.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/loc9.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/loccat.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/locgui.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/loclim.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/locopo.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/locopop.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/menu.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/pe1.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/pe2.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/pe4.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/pp1.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/pp2.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/pp3.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/serv1.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/serv2.gif create mode 100644 Fila-Administracao/root/static/doc/ajei/serv3.gif create mode 100644 Fila-Administracao/root/static/doc/ajuda.html create mode 100755 Fila-Administracao/root/static/images/add.png create mode 100644 Fila-Administracao/root/static/images/bg_cabecalho.gif create mode 100644 Fila-Administracao/root/static/images/bg_cabecalho.jpg create mode 100644 Fila-Administracao/root/static/images/bt_abrir_local.jpg create mode 100644 Fila-Administracao/root/static/images/bt_concluir_atend.png create mode 100644 Fila-Administracao/root/static/images/bt_devol_senha.png create mode 100644 Fila-Administracao/root/static/images/bt_disponivel.png create mode 100644 Fila-Administracao/root/static/images/bt_encaminhar_atend.png create mode 100644 Fila-Administracao/root/static/images/bt_encerrar_senhas.jpg create mode 100644 Fila-Administracao/root/static/images/bt_entrar_login.jpg create mode 100644 Fila-Administracao/root/static/images/bt_enviar_chat.jpg create mode 100644 Fila-Administracao/root/static/images/bt_fechar_local.jpg create mode 100644 Fila-Administracao/root/static/images/bt_fechar_mesa.jpg create mode 100644 Fila-Administracao/root/static/images/bt_fechar_mesas.jpg create mode 100644 Fila-Administracao/root/static/images/bt_forcar_fechar.png create mode 100644 Fila-Administracao/root/static/images/bt_iniciar_atend.png create mode 100644 Fila-Administracao/root/static/images/bt_iniciar_pausa.jpg create mode 100644 Fila-Administracao/root/static/images/bt_iniciar_servico.jpg create mode 100755 Fila-Administracao/root/static/images/bt_ir_para.png create mode 100644 Fila-Administracao/root/static/images/bt_listar_ausentes.jpg create mode 100644 Fila-Administracao/root/static/images/bt_ok.jpg create mode 100644 Fila-Administracao/root/static/images/bt_registrar_ausencia.png create mode 100644 Fila-Administracao/root/static/images/bt_retornar_pausa.jpg create mode 100644 Fila-Administracao/root/static/images/bt_voltar.jpg create mode 100644 Fila-Administracao/root/static/images/bt_voltar_serv_interno.png create mode 100644 Fila-Administracao/root/static/images/btn_120x50_built.png create mode 100644 Fila-Administracao/root/static/images/btn_120x50_built_shadow.png create mode 100644 Fila-Administracao/root/static/images/btn_120x50_powered.png create mode 100644 Fila-Administracao/root/static/images/btn_120x50_powered_shadow.png create mode 100644 Fila-Administracao/root/static/images/btn_88x31_built.png create mode 100644 Fila-Administracao/root/static/images/btn_88x31_built_shadow.png create mode 100644 Fila-Administracao/root/static/images/btn_88x31_powered.png create mode 100644 Fila-Administracao/root/static/images/btn_88x31_powered_shadow.png create mode 100644 Fila-Administracao/root/static/images/catalyst_logo.png create mode 100644 Fila-Administracao/root/static/images/icon_atend_atrasados.jpg create mode 100644 Fila-Administracao/root/static/images/icon_cat.jpg create mode 100644 Fila-Administracao/root/static/images/icon_chat.jpg create mode 100755 Fila-Administracao/root/static/images/icon_encaminhar.png create mode 100644 Fila-Administracao/root/static/images/icon_mesa.jpg create mode 100755 Fila-Administracao/root/static/images/icon_opi_off.png create mode 100755 Fila-Administracao/root/static/images/icon_opi_on.png create mode 100644 Fila-Administracao/root/static/images/icon_relogio.jpg create mode 100644 Fila-Administracao/root/static/images/icon_senha.jpg create mode 100644 Fila-Administracao/root/static/images/icon_servico.jpg create mode 100755 Fila-Administracao/script/fila_administracao_fastcgi.pl create mode 100644 Fila-Agendamento/fila_agendamento.yml create mode 100644 Fila-Agendamento/lib/Fila/Agendamento.pm create mode 100644 Fila-Agendamento/lib/Fila/Agendamento/Controller/Root.pm create mode 100644 Fila-Agendamento/lib/Fila/Agendamento/DB.pm create mode 100644 Fila-Agendamento/lib/Fila/Agendamento/DB/Atendimento.pm create mode 100644 Fila-Agendamento/lib/Fila/Agendamento/DB/Expediente.pm create mode 100644 Fila-Agendamento/lib/Fila/Agendamento/DB/Feriado.pm create mode 100644 Fila-Agendamento/lib/Fila/Agendamento/DB/IntervalosView.pm create mode 100644 Fila-Agendamento/lib/Fila/Agendamento/DB/Local.pm create mode 100644 Fila-Agendamento/lib/Fila/Agendamento/Model/DB.pm create mode 100644 Fila-Agendamento/lib/Fila/Agendamento/View/Email.pm create mode 100644 Fila-Agendamento/lib/Fila/Agendamento/View/TT.pm create mode 100644 Fila-Agendamento/root/atendimento.tt create mode 100644 Fila-Agendamento/root/email_atendimento.tt create mode 100644 Fila-Agendamento/root/favicon.ico create mode 100644 Fila-Agendamento/root/footer.tt create mode 100644 Fila-Agendamento/root/header.tt create mode 100644 Fila-Agendamento/root/index.tt create mode 100644 Fila-Agendamento/root/passo1.tt create mode 100644 Fila-Agendamento/root/static/css/main.css create mode 100644 Fila-Agendamento/root/static/images/bg_cabecalho.gif create mode 100644 Fila-Agendamento/root/static/images/bg_cabecalho.jpg create mode 100644 Fila-Agendamento/root/static/images/bt_abrir_local.jpg create mode 100644 Fila-Agendamento/root/static/images/bt_concluir_atend.png create mode 100644 Fila-Agendamento/root/static/images/bt_devol_senha.png create mode 100644 Fila-Agendamento/root/static/images/bt_disponivel.png create mode 100644 Fila-Agendamento/root/static/images/bt_encaminhar_atend.png create mode 100644 Fila-Agendamento/root/static/images/bt_encerrar_senhas.jpg create mode 100644 Fila-Agendamento/root/static/images/bt_entrar_login.jpg create mode 100644 Fila-Agendamento/root/static/images/bt_enviar_chat.jpg create mode 100644 Fila-Agendamento/root/static/images/bt_fechar_local.jpg create mode 100644 Fila-Agendamento/root/static/images/bt_fechar_mesa.jpg create mode 100644 Fila-Agendamento/root/static/images/bt_fechar_mesas.jpg create mode 100644 Fila-Agendamento/root/static/images/bt_forcar_fechar.png create mode 100644 Fila-Agendamento/root/static/images/bt_iniciar_atend.png create mode 100644 Fila-Agendamento/root/static/images/bt_iniciar_pausa.jpg create mode 100644 Fila-Agendamento/root/static/images/bt_iniciar_servico.jpg create mode 100755 Fila-Agendamento/root/static/images/bt_ir_para.png create mode 100644 Fila-Agendamento/root/static/images/bt_listar_ausentes.jpg create mode 100644 Fila-Agendamento/root/static/images/bt_ok.jpg create mode 100644 Fila-Agendamento/root/static/images/bt_registrar_ausencia.png create mode 100644 Fila-Agendamento/root/static/images/bt_retornar_pausa.jpg create mode 100644 Fila-Agendamento/root/static/images/bt_voltar.jpg create mode 100644 Fila-Agendamento/root/static/images/bt_voltar_serv_interno.png create mode 100644 Fila-Agendamento/root/static/images/btn_120x50_built.png create mode 100644 Fila-Agendamento/root/static/images/btn_120x50_built_shadow.png create mode 100644 Fila-Agendamento/root/static/images/btn_120x50_powered.png create mode 100644 Fila-Agendamento/root/static/images/btn_120x50_powered_shadow.png create mode 100644 Fila-Agendamento/root/static/images/btn_88x31_built.png create mode 100644 Fila-Agendamento/root/static/images/btn_88x31_built_shadow.png create mode 100644 Fila-Agendamento/root/static/images/btn_88x31_powered.png create mode 100644 Fila-Agendamento/root/static/images/btn_88x31_powered_shadow.png create mode 100644 Fila-Agendamento/root/static/images/catalyst_logo.png create mode 100644 Fila-Agendamento/root/static/images/icon_atend_atrasados.jpg create mode 100644 Fila-Agendamento/root/static/images/icon_cat.jpg create mode 100644 Fila-Agendamento/root/static/images/icon_chat.jpg create mode 100755 Fila-Agendamento/root/static/images/icon_encaminhar.png create mode 100644 Fila-Agendamento/root/static/images/icon_mesa.jpg create mode 100755 Fila-Agendamento/root/static/images/icon_opi_off.png create mode 100755 Fila-Agendamento/root/static/images/icon_opi_on.png create mode 100644 Fila-Agendamento/root/static/images/icon_relogio.jpg create mode 100644 Fila-Agendamento/root/static/images/icon_senha.jpg create mode 100644 Fila-Agendamento/root/static/images/icon_servico.jpg create mode 100755 Fila-Agendamento/script/fila_agendamento_db.pl create mode 100755 Fila-Agendamento/script/fila_agendamento_fastcgi.pl create mode 100644 Fila-ETL/fila_etl.yaml create mode 120000 Fila-ETL/lib/Fila/Agendamento create mode 100644 Fila-ETL/lib/Fila/ETL.pm create mode 100644 Fila-ETL/lib/Fila/ETL/Controller/Agendamento.pm create mode 100644 Fila-ETL/lib/Fila/ETL/Controller/Atendimento.pm create mode 100644 Fila-ETL/lib/Fila/ETL/Controller/Root.pm create mode 100644 Fila-ETL/lib/Fila/ETL/DB.pm create mode 100644 Fila-ETL/lib/Fila/ETL/DB/ActivityLog.pm create mode 100644 Fila-ETL/lib/Fila/ETL/DB/DAtendente.pm create mode 100644 Fila-ETL/lib/Fila/ETL/DB/DCategoria.pm create mode 100644 Fila-ETL/lib/Fila/ETL/DB/DData.pm create mode 100644 Fila-ETL/lib/Fila/ETL/DB/DGuiche.pm create mode 100644 Fila-ETL/lib/Fila/ETL/DB/DHorario.pm create mode 100644 Fila-ETL/lib/Fila/ETL/DB/DLocal.pm create mode 100644 Fila-ETL/lib/Fila/ETL/DB/FQuantidadeAtendimentos.pm create mode 100644 Fila-ETL/lib/Fila/ETL/DB/FQuantidadeEstados.pm create mode 100644 Fila-ETL/lib/Fila/ETL/Model/DB.pm create mode 100644 Fila-ETL/lib/Fila/ETL/Model/DBAgendamento.pm create mode 100644 Fila-ETL/lib/Fila/ETL/Model/DBSERVI.pm create mode 100644 Fila-ETL/lib/Fila/ETL/Model/Federado.pm create mode 120000 Fila-ETL/lib/Fila/Servico create mode 100755 Fila-ETL/script/fila_etl.pl create mode 100755 Fila-ETL/script/fila_etl_db.pl create mode 100644 Fila-Opiniometro/fila_opiniometro.yml create mode 100644 Fila-Opiniometro/lib/Fila/Opiniometro.pm create mode 100644 Fila-Opiniometro/lib/Fila/Opiniometro/Controller/Callback.pm create mode 100644 Fila-Opiniometro/lib/Fila/Opiniometro/Device.pm create mode 100644 Fila-Opiniometro/lib/Fila/Opiniometro/Model/Device.pm create mode 100644 Fila-Opiniometro/lib/Fila/Opiniometro/Model/SOAP.pm create mode 120000 Fila-Opiniometro/schemas create mode 100755 Fila-Opiniometro/script/fila_opiniometro_app.pl create mode 100644 Fila-Painel/fila_painel.yml create mode 100644 Fila-Painel/gtk_senha.glade create mode 100755 Fila-Painel/gtk_senha.php create mode 100755 Fila-Painel/gtk_senha.sh create mode 100755 Fila-Painel/gtk_texto.php create mode 100755 Fila-Painel/gtk_texto.sh create mode 100755 Fila-Painel/letreiro.pl create mode 100644 Fila-Painel/letreiro2.pl create mode 100644 Fila-Painel/lib/Fila/Painel.pm create mode 100644 Fila-Painel/lib/Fila/Painel/Controller/Callback.pm create mode 100644 Fila-Painel/lib/Fila/Painel/Model/Output.pm create mode 100755 Fila-Painel/mplayer.sh create mode 100644 Fila-Painel/painel.pl create mode 120000 Fila-Painel/schemas create mode 100755 Fila-Painel/script/fila_painel_app.pl create mode 100755 Fila-Painel/senhas.pl create mode 100755 Fila-Painel/senhas2.pl create mode 100755 Fila-Painel/teste.txt create mode 100644 Fila-Senha/fila_senha.yml create mode 100644 Fila-Senha/lib/Fila/Senha.pm create mode 100644 Fila-Senha/lib/Fila/Senha/Controller/Callback.pm create mode 100644 Fila-Senha/lib/Fila/Senha/Model/Emissor.pm create mode 100644 Fila-Senha/lib/Fila/Senha/Model/Impressora.pm create mode 100644 Fila-Senha/lib/Fila/Senha/Model/SOAP.pm create mode 120000 Fila-Senha/schemas create mode 100755 Fila-Senha/script/fila_senha_app.pl create mode 100644 Fila-Servico/fila_servico.yml create mode 100644 Fila-Servico/lib/Fila/Servico.pm create mode 100644 Fila-Servico/lib/Fila/Servico/Controller.pm create mode 100644 Fila-Servico/lib/Fila/Servico/Controller/Root.pm create mode 100644 Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Atendente.pm create mode 100644 Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Guiche.pm create mode 100644 Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Local.pm create mode 100644 Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Opiniometro.pm create mode 100644 Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Senha.pm create mode 100644 Fila-Servico/lib/Fila/Servico/Controller/WS/Scheduler.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/Agendamento.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/AtendenteGuiche.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/Atendimento.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/Categoria.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/CategoriaAtendimento.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/ClasseServico.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoCategoria.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoLimite.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoPerguntas.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoPerguntasPraca.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/EstadoAtendimento.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/EstadoGuiche.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/EstadoLocal.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/Funcionario.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/FuncionarioLocal.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/GerenteLocal.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/Guiche.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/GuicheAtendimento.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/GuicheCategoria.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/GuicheEncaminhamento.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/Local.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/Pausa.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/PerguntaAvaliacao.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/PerguntaAvaliacaoPraca.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/RespostaAvaliacao.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/RespostaAvaliacaoPraca.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/Senha.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/Servico.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/ServicoAtendimento.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/ServicoGuiche.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/ServicoInterno.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/TipoEstadoAtendimento.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/TipoEstadoGuiche.pm create mode 100644 Fila-Servico/lib/Fila/Servico/DB/TipoEstadoLocal.pm create mode 100644 Fila-Servico/lib/Fila/Servico/Model/DB.pm create mode 100644 Fila-Servico/lib/Fila/Servico/Model/SOAP.pm create mode 100755 Fila-Servico/reset-banco.sh create mode 100644 Fila-Servico/schemas/FilaOpiniometro.wsdl create mode 100644 Fila-Servico/schemas/FilaPainel.wsdl create mode 100644 Fila-Servico/schemas/FilaSenha.wsdl create mode 100644 Fila-Servico/schemas/FilaServico.wsdl create mode 100644 Fila-Servico/schemas/FilaWeb.wsdl create mode 100644 Fila-Servico/schemas/FilaWebApp.wsdl create mode 100644 Fila-Servico/schemas/fila-servico.xsd create mode 100755 Fila-Servico/script/fila_servico_db.pl create mode 100755 Fila-Servico/script/fila_servico_diagram.pl create mode 100755 Fila-Servico/script/fila_servico_xmpp.pl create mode 100755 Fila-Web/cgi-bin/nph-app.cgi create mode 100644 Fila-Web/fila_web.yml create mode 100644 Fila-Web/lib/Fila/Web.pm create mode 100644 Fila-Web/lib/Fila/Web/Controller/CB/Atendente.pm create mode 100644 Fila-Web/lib/Fila/Web/Controller/CB/Gerente.pm create mode 100644 Fila-Web/lib/Fila/Web/Controller/CB/Guiche.pm create mode 100644 Fila-Web/lib/Fila/Web/Controller/CB/Local.pm create mode 100644 Fila-Web/lib/Fila/Web/Controller/Emissor.pm create mode 100644 Fila-Web/lib/Fila/Web/Controller/Root.pm create mode 100644 Fila-Web/lib/Fila/Web/Model/SOAP.pm create mode 100644 Fila-Web/lib/Fila/Web/View/TT.pm create mode 100644 Fila-Web/lib/Fila/WebApp.pm create mode 100644 Fila-Web/lib/Fila/WebApp/Controller/CB/Atendente.pm create mode 100644 Fila-Web/lib/Fila/WebApp/Controller/CB/Emissor.pm create mode 100644 Fila-Web/lib/Fila/WebApp/Controller/CB/Gerente.pm create mode 100644 Fila-Web/lib/Fila/WebApp/Controller/CB/Guiche.pm create mode 100644 Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Atendente.pm create mode 100644 Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Error.pm create mode 100644 Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Gerente.pm create mode 100644 Fila-Web/lib/Fila/WebApp/Controller/Render.pm create mode 100644 Fila-Web/lib/Fila/WebApp/Controller/Root.pm create mode 100644 Fila-Web/lib/Fila/WebApp/Model/SOAP.pm create mode 100644 Fila-Web/lib/Fila/WebApp/View/NPH.pm create mode 100644 Fila-Web/root/cb/atendente/encerrar_senhas.tt create mode 100644 Fila-Web/root/cb/atendente/enviar_chat.tt create mode 100644 Fila-Web/root/cb/atendente/fechar_guiche.tt create mode 100644 Fila-Web/root/cb/atendente/mudar_senha.tt create mode 100644 Fila-Web/root/cb/atendente/noshow.tt create mode 100644 Fila-Web/root/cb/atendente/receber_chat.tt create mode 100644 Fila-Web/root/cb/atendente/refresh.tt create mode 100644 Fila-Web/root/cb/gerente/abrir_local.tt create mode 100644 Fila-Web/root/cb/gerente/encerrar_senhas.tt create mode 100644 Fila-Web/root/cb/gerente/enviar_chat.tt create mode 100644 Fila-Web/root/cb/gerente/fechar_local.tt create mode 100644 Fila-Web/root/cb/gerente/passar_gerencia.tt create mode 100644 Fila-Web/root/cb/gerente/receber_chat.tt create mode 100644 Fila-Web/root/emissor.tt create mode 100644 Fila-Web/root/favicon.ico create mode 100644 Fila-Web/root/footer.tt create mode 100644 Fila-Web/root/header.tt create mode 100644 Fila-Web/root/index.tt create mode 100644 Fila-Web/root/render/atendente.tt create mode 100644 Fila-Web/root/render/authenticated.tt create mode 100644 Fila-Web/root/render/aviso.tt create mode 100644 Fila-Web/root/render/base.tt create mode 100644 Fila-Web/root/render/chat.tt create mode 100644 Fila-Web/root/render/disconnected.tt create mode 100644 Fila-Web/root/render/emissor.tt create mode 100644 Fila-Web/root/render/emissor/acoes.tt create mode 100644 Fila-Web/root/render/emissor/error.tt create mode 100644 Fila-Web/root/render/emissor/main.tt create mode 100644 Fila-Web/root/render/emissor/receber_senha.tt create mode 100644 Fila-Web/root/render/error.tt create mode 100644 Fila-Web/root/render/error_message.tt create mode 100644 Fila-Web/root/render/escolher_guiche.tt create mode 100644 Fila-Web/root/render/fechar.tt create mode 100644 Fila-Web/root/render/gerente.tt create mode 100644 Fila-Web/root/render/guiches.tt create mode 100644 Fila-Web/root/render/mesas.tt create mode 100644 Fila-Web/root/render/refresh_guiches.tt create mode 100644 Fila-Web/root/render/status_atendente.tt create mode 100644 Fila-Web/root/render/status_local_gerente.tt create mode 100644 Fila-Web/root/static/css/main.css create mode 100644 Fila-Web/root/static/doc/ajuda.html create mode 100644 Fila-Web/root/static/doc/gerenteajuda.html create mode 100644 Fila-Web/root/static/doc/im/Screenshot-1.png create mode 100644 Fila-Web/root/static/doc/im/Screenshot.png create mode 100644 Fila-Web/root/static/doc/im/abloc.gif create mode 100644 Fila-Web/root/static/doc/im/acões.gif create mode 100644 Fila-Web/root/static/doc/im/aten.gif create mode 100644 Fila-Web/root/static/doc/im/ava.gif create mode 100644 Fila-Web/root/static/doc/im/bt_abrir_local.gif create mode 100644 Fila-Web/root/static/doc/im/cham.gif create mode 100644 Fila-Web/root/static/doc/im/conc.gif create mode 100644 Fila-Web/root/static/doc/im/disp.gif create mode 100644 Fila-Web/root/static/doc/im/fechado.gif create mode 100644 Fila-Web/root/static/doc/im/int.gif create mode 100644 Fila-Web/root/static/doc/im/pausa.gif create mode 100644 Fila-Web/root/static/images/bg_cabecalho.gif create mode 100644 Fila-Web/root/static/images/bg_cabecalho.jpg create mode 100644 Fila-Web/root/static/images/bt_abrir_local.jpg create mode 100644 Fila-Web/root/static/images/bt_concluir_atend.png create mode 100644 Fila-Web/root/static/images/bt_devol_senha.png create mode 100644 Fila-Web/root/static/images/bt_disponivel.png create mode 100644 Fila-Web/root/static/images/bt_encaminhar_atend.png create mode 100644 Fila-Web/root/static/images/bt_encerrar_senhas.jpg create mode 100644 Fila-Web/root/static/images/bt_entrar_login.jpg create mode 100644 Fila-Web/root/static/images/bt_enviar_chat.jpg create mode 100644 Fila-Web/root/static/images/bt_fechar_local.jpg create mode 100644 Fila-Web/root/static/images/bt_fechar_mesa.jpg create mode 100644 Fila-Web/root/static/images/bt_fechar_mesas.jpg create mode 100644 Fila-Web/root/static/images/bt_forcar_fechar.png create mode 100644 Fila-Web/root/static/images/bt_iniciar_atend.png create mode 100644 Fila-Web/root/static/images/bt_iniciar_pausa.jpg create mode 100644 Fila-Web/root/static/images/bt_iniciar_servico.jpg create mode 100755 Fila-Web/root/static/images/bt_ir_para.png create mode 100644 Fila-Web/root/static/images/bt_listar_ausentes.jpg create mode 100644 Fila-Web/root/static/images/bt_ok.jpg create mode 100644 Fila-Web/root/static/images/bt_registrar_ausencia.png create mode 100644 Fila-Web/root/static/images/bt_retornar_pausa.jpg create mode 100644 Fila-Web/root/static/images/bt_voltar.jpg create mode 100644 Fila-Web/root/static/images/bt_voltar_serv_interno.png create mode 100644 Fila-Web/root/static/images/btn_120x50_built.png create mode 100644 Fila-Web/root/static/images/btn_120x50_built_shadow.png create mode 100644 Fila-Web/root/static/images/btn_120x50_powered.png create mode 100644 Fila-Web/root/static/images/btn_120x50_powered_shadow.png create mode 100644 Fila-Web/root/static/images/btn_88x31_built.png create mode 100644 Fila-Web/root/static/images/btn_88x31_built_shadow.png create mode 100644 Fila-Web/root/static/images/btn_88x31_powered.png create mode 100644 Fila-Web/root/static/images/btn_88x31_powered_shadow.png create mode 100644 Fila-Web/root/static/images/catalyst_logo.png create mode 100644 Fila-Web/root/static/images/icon_atend_atrasados.jpg create mode 100644 Fila-Web/root/static/images/icon_cat.jpg create mode 100644 Fila-Web/root/static/images/icon_chat.jpg create mode 100755 Fila-Web/root/static/images/icon_encaminhar.png create mode 100644 Fila-Web/root/static/images/icon_mesa.jpg create mode 100755 Fila-Web/root/static/images/icon_opi_off.png create mode 100755 Fila-Web/root/static/images/icon_opi_on.png create mode 100644 Fila-Web/root/static/images/icon_relogio.jpg create mode 100644 Fila-Web/root/static/images/icon_senha.jpg create mode 100644 Fila-Web/root/static/images/icon_servico.jpg create mode 100644 Fila-Web/root/static/js/prototype-1.6.0.2.js create mode 100644 Fila-Web/root/teste.html create mode 120000 Fila-Web/schemas create mode 100755 Fila-Web/script/fila_web_fastcgi.pl create mode 100644 FilaOLAP.xml create mode 100644 LEIAME create mode 100644 LICENCA.txt create mode 100644 documentacao/Apostila.odt create mode 100644 documentacao/DicionarioDeDadosAgendamento.txt create mode 100644 documentacao/DicionarioDeDadosPrincipal.txt create mode 100644 documentacao/Documentacao.odt create mode 100644 documentacao/ajuda_atendente.html create mode 100644 documentacao/ajuda_gerente.html create mode 100644 documentacao/im/Screenshot-1.png create mode 100644 documentacao/im/Screenshot.png create mode 100644 documentacao/im/abloc.gif create mode 100644 documentacao/im/acões.gif create mode 100644 documentacao/im/aten.gif create mode 100644 documentacao/im/ava.gif create mode 100644 documentacao/im/bt_abrir_local.gif create mode 100644 documentacao/im/cham.gif create mode 100644 documentacao/im/conc.gif create mode 100644 documentacao/im/disp.gif create mode 100644 documentacao/im/fechado.gif create mode 100644 documentacao/im/int.gif create mode 100644 documentacao/im/pausa.gif create mode 100644 documentacao/modelo_atemporal.dia create mode 100644 documentacao/olap_cubes.txt create mode 100644 documentacao/temporalidade.txt create mode 100644 ltsp/htmlmesa.html create mode 100644 patches/DBIx-Class-ResultSource.patch create mode 100644 patches/DJabberd.patch diff --git a/Apache2/fila-vhost.conf b/Apache2/fila-vhost.conf new file mode 100644 index 0000000..e229d47 --- /dev/null +++ b/Apache2/fila-vhost.conf @@ -0,0 +1,59 @@ +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +PerlSwitches -I/home/oktiva/fila/Fila-Administracao/lib/ +PerlModule Fila::Administracao + + + + ServerName localhost + DocumentRoot /home/oktiva/fila/Fila-Web/root/ + + + SetHandler default-handler + + + # nph-app.cgi + ScriptAlias /cgi-bin/ /home/oktiva/fila/Fila-Web/cgi-bin/ + + Options +ExecCGI + AddHandler cgi-script .cgi + + + Options +ExecCGI + SetHandler cgi-script + + + FastCgiServer /home/oktiva/fila/Fila-Web/script/fila_web_fastcgi.pl -processes 10 + Alias / /home/oktiva/fila/Fila-Web/script/fila_web_fastcgi.pl/ + + + + + + ServerName localhost + DocumentRoot /home/oktiva/fila/Fila-Administracao/root/ + + + SetHandler modperl + PerlResponseHandler Fila::Administracao + + + + SetHandler default-handler + + + diff --git a/DJabberd/djabberd.conf b/DJabberd/djabberd.conf new file mode 100644 index 0000000..50c788b --- /dev/null +++ b/DJabberd/djabberd.conf @@ -0,0 +1,61 @@ + + S2S disable + RequireSSL no + + + Policy accept + AllowedUsers motor apache + + + Password password + + + + + + + + AllowVHost agents.fila.vhost + AllowVHost people.fila.vhost + + + + S2S disable + RequireSSL no + + + dsn dbi:Pg:host=127.0.0.1;database=fila + user fila + pass senha + query SELECT * FROM funcionario WHERE jid=?||'@people.fila.vhost' AND password=? + args login,password_md5_hex + + + + + + + AllowVHost agents.fila.vhost + AllowVHost gestao.fila.vhost + + + + S2S disable + RequireSSL no + + + Policy accept + AllowedUsers painel senhas senhas1 opiniometro opiniometro01 opiniometro02 opiniometro03 opiniometro04 opiniometro05 opiniometro06 opiniometro07 opiniometro08 opiniometro09 opiniometro10 opiniometro11 opiniometro12 opiniometro13 opiniometro14 opiniometro15 opiniometro16 opiniometro17 opiniometro18 opiniometro19 opiniometro20 opiniometro21 opiniometro22 opiniometro23 opiniometro24 opiniometro25 opiniometro26 + + + Password password + + + + + + + AllowVHost gestao.fila.vhost + AllowVHost people.fila.vhost + + diff --git a/Fila-Administracao/fila_administracao.yml b/Fila-Administracao/fila_administracao.yml new file mode 100644 index 0000000..f6d82b6 --- /dev/null +++ b/Fila-Administracao/fila_administracao.yml @@ -0,0 +1,6 @@ +--- +name: Fila::Administracao +Model::DB: + schema_class: Fila::Servico::DB + connect_info: + - 'dbi:Pg:host=127.0.0.1;database=fila;user=fila;password=senha' diff --git a/Fila-Administracao/lib/Fila/Administracao.pm b/Fila-Administracao/lib/Fila/Administracao.pm new file mode 100644 index 0000000..3190774 --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao.pm @@ -0,0 +1,47 @@ +package Fila::Administracao; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; + +use Catalyst::Runtime '5.70'; +use parent qw/Catalyst/; + +our $VERSION = '0.01'; + +__PACKAGE__->config( name => 'Fila::Administracao', + static => { dirs => [ 'static', qr/^(images|css|doc)$/ ] } ); +__PACKAGE__->setup(qw/-Debug ConfigLoader Static::Simple/); + +1; + +__END__ + +=head1 NAME + +Fila::Administracao - Aplicação de Administração + +=head1 DESCRIPTION + +Esta aplicação pode ser utilizada para gerir as informações do local +de atendimento como um todo. É a partir dela que se definem as +informações dos funcionários, dos guichês e outras informações que +definem o funcionamento do local. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/Categorias.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/Categorias.pm new file mode 100644 index 0000000..6f3fd1c --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/Categorias.pm @@ -0,0 +1,80 @@ +package Fila::Administracao::Controller::Categorias; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +sub index :Path('') :Args(0) { + my ( $self, $c ) = @_; + $c->stash->{categorias} = $c->model('DB::Categoria')->search + ({}, + { order_by => 'nome' }); +} + +sub preload :Chained :PathPart('categorias') :CaptureArgs(1) { + my ($self, $c, $id_categoria) = @_; + $c->stash->{categoria} = $c->model('DB::Categoria')->find + ({ id_categoria => $id_categoria }); +} + +sub ver :Chained('preload') :PathPart('') :Args(0) { + my ($self, $c) = @_; + + unless ($c->req->param('submitted')) { + $c->req->param($_,$c->stash->{categoria}->get_column($_)) + for qw(nome codigo) + } +} + +sub salvar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + if ($c->req->param('submitted')) { + $c->stash->{categoria}->update + ({ ( map { $_ => $c->req->param($_) } + qw(nome codigo) ) }); + $c->res->redirect($c->uri_for('/categorias/')); + } +} + +sub criar :Local :Args(0) { + my ($self, $c) = @_; + if ($c->req->param('submitted')) { + my $cat = $c->model('DB::Categoria')->create + ({ ( map { $_ => $c->req->param($_) } + qw(nome codigo) ) }); + $c->res->redirect($c->uri_for('/categorias/')); + } +} + +1; + +__END__ + +=head1 NAME + +Fila::Administracao::Controller::Categorias - Categorias de Atendimento + +=head1 DESCRIPTION + +Esse é o módulo que implementa a definição das categorias de +atendimento no sistema. Essa informação é usada conjuntamente com a +informação das configurações das categorias para gerir o atendimento. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/Classes.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/Classes.pm new file mode 100644 index 0000000..05d8dbc --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/Classes.pm @@ -0,0 +1,83 @@ +package Fila::Administracao::Controller::Classes; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +sub index :Path('') :Args(0) { + my ($self, $c) = @_; + $c->stash->{classes} = $c->model('DB::ClasseServico')->search + ({}, + { order_by => 'nome' }); +} + +sub preload :Chained :PathPart('classes') :CaptureArgs(1) { + my ($self, $c, $id_classe) = @_; + $c->stash->{classes} = $c->model('DB::ClasseServico')->find + ({ id_classe => $id_classe }); +} + + +sub salvar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + $c->stash->{classes}->update + ({ map { $_ => $c->req->param($_) } + qw(nome ) }); + $c->res->redirect($c->uri_for('/classes')); +} + +sub ver :Chained('preload') :PathPart('') :Args(0) { + my ($self, $c) = @_; + + unless ($c->req->param('submitted')) { + $c->req->param($_,$c->stash->{classes}->get_column($_)) + for qw(id_classe nome) + } + +} + +sub criar :Local :Args(0) { + my ($self, $c) = @_; + + $c->stash->{classes} = $c->model('DB::ClasseServico')->search({}); + + if ($c->req->param('submitted')) { + $c->stash->{classes}->create + ({ ( map { $_ => $c->req->param($_) } + qw(nome) ) }); + $c->res->redirect($c->uri_for('/classes')); + } +} + + +1; + +__END__ + +=head1 NAME + +Fila::Administracao::Controller::Classes - Gerencia as classes de +serviço + +=head1 DESCRIPTION + +Gerencia as classes de serviços no sistema. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/Conf_perguntas.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/Conf_perguntas.pm new file mode 100644 index 0000000..a8053d2 --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/Conf_perguntas.pm @@ -0,0 +1,63 @@ +package Fila::Administracao::Controller::Conf_perguntas; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +sub preload :Chained('/locais/preload') :PathPart('conf_perguntas') :CaptureArgs(1) { + my ($self, $c) = @_; +} + +sub criar :Chained('/locais/preload') :PathPart('conf_perguntas/criar') :Args(0) { + my ($self, $c) = @_; + if ($c->req->param('submitted')) { + # antes de criar, vamos certificar que as configuracoes + # anteriores dessa categoria para esse local sejam desativadas. + $c->stash->{local}->configuracoes_perguntas->search + ({ vt_fim => 'Infinity' })->update + ({ vt_fim => DateTime->now(time_zone => 'local')}); + + $c->stash->{local}->configuracoes_perguntas->create + ({ vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity', + ( map { $_ => $c->req->param($_) } + qw(pergunta1 pergunta2 pergunta3 pergunta4 pergunta5 ) ) }); + + $c->res->redirect($c->uri_for('/locais/'.$c->stash->{local}->id_local)); + } else { + $c->stash->{perguntas} = $c->model('DB::PerguntaAvaliacao')->search({}); + } +} + +1; + +__END__ + +=head1 NAME + +Fila::Administracao::Conf_perguntas - Configuração das perguntas + +=head1 DESCRIPTION + +Este é o módulo que implementa a configuração das perguntas que são +exibidas no opiniômetro de cada mesa. Essas são as perguntas ao qual o +cliente da praça de atendimentos responde no final de um atendimento. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/Conf_perguntas_praca.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/Conf_perguntas_praca.pm new file mode 100644 index 0000000..89ac777 --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/Conf_perguntas_praca.pm @@ -0,0 +1,65 @@ +package Fila::Administracao::Controller::Conf_perguntas_praca; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +sub preload :Chained('/locais/preload') :PathPart('conf_perguntas_praca') :CaptureArgs(1) { + my ($self, $c) = @_; +} + +sub criar :Chained('/locais/preload') :PathPart('conf_perguntas_praca/criar') :Args(0) { + my ($self, $c) = @_; + if ($c->req->param('submitted')) { + # antes de criar, vamos certificar que as configuracoes + # anteriores dessa categoria para esse local sejam desativadas. + $c->stash->{local}->configuracoes_perguntas_praca->search + ({ vt_fim => 'Infinity' })->update + ({ vt_fim => DateTime->now(time_zone => 'local')}); + + $c->stash->{local}->configuracoes_perguntas_praca->create + ({ vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity', + ( map { $_ => $c->req->param($_) } + qw(pergunta1 pergunta2 pergunta3 pergunta4 pergunta5 ) ) }); + + $c->res->redirect($c->uri_for('/locais/'.$c->stash->{local}->id_local)); + } else { + $c->stash->{perguntas} = $c->model('DB::PerguntaAvaliacaoPraca')->search({}); + } +} + +1; + + +__END__ + +=head1 NAME + +Fila::Administracao::Controller::Conf_perguntas_praca - Define +configuração das perguntas do opiniometro da praca + +=head1 DESCRIPTION + +Este módulo implementa o suporte à configuração de quais são as +perguntas que estao nesse momento associadas ao opiniometro geral da +praça de atendimento. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/ConfiguracaoCategorias.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/ConfiguracaoCategorias.pm new file mode 100644 index 0000000..a0b68ce --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/ConfiguracaoCategorias.pm @@ -0,0 +1,87 @@ +package Fila::Administracao::Controller::ConfiguracaoCategorias; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +sub preload :Chained('/locais/preload') :PathPart('categoria') :CaptureArgs(1) { + my ($self, $c, $id_categoria) = @_; + $c->stash->{configuracao} = $c->stash->{local}->configuracoes_categoria->find + ({ id_categoria => $id_categoria, + vt_fim => 'Infinity' }); +} + +sub encerrar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + $c->stash->{configuracao}->update + ({ vt_fim => DateTime->now(time_zone => 'local') }); + $c->res->redirect($c->uri_for('/locais/'.$c->stash->{local}->id_local)); +} + +sub criar :Chained('/locais/preload') :PathPart('categoria/criar') :Args(0) { + my ($self, $c) = @_; + if ($c->req->param('submitted')) { + # antes de criar, vamos certificar que as configuracoes + # anteriores dessa categoria para esse local sejam desativadas. + $c->stash->{local}->configuracoes_categoria->search + ({ id_categoria => $c->req->param('id_categoria'), + vt_fim => 'Infinity' })->update + ({ vt_fim => DateTime->now(time_zone => 'local')}); + + $c->stash->{local}->configuracoes_categoria->create + ({ vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity', + ( map { $_ => $c->req->param($_) } + qw(id_categoria prioridade limite_tempo_espera limite_pessoas_espera ordem) ) }); + + # vamos também certificar que existem as senhas para essa + # categoria nesse local. + for my $cod (1..999) { + $c->stash->{local}->senhas->create + ({ id_categoria => $c->req->param('id_categoria'), + codigo => $cod }) + unless $c->stash->{local}->senhas->find + ({ id_categoria => $c->req->param('id_categoria'), + codigo => $cod }); + } + + $c->res->redirect($c->uri_for('/locais/'.$c->stash->{local}->id_local)); + } else { + $c->stash->{categorias} = + $c->model('DB::Categoria')->search({}, + { order_by => 'nome' }) + } +} + +1; + +__END__ + +=head1 NAME + +Fila::Administracao::ConfiguracaoCategorias - Gerencia as configurações das categorias + +=head1 DESCRIPTION + +A categoria de atendimento tem a configuração das suas prioridades +definidas de acordo com cada local. Esse é o módulo que implementa a +gestão dessas informações. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/ConfiguracaoLimites.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/ConfiguracaoLimites.pm new file mode 100644 index 0000000..1d480a5 --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/ConfiguracaoLimites.pm @@ -0,0 +1,76 @@ +package Fila::Administracao::Controller::ConfiguracaoLimites; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +sub preload :Chained('/locais/preload') :PathPart('limite') :CaptureArgs(1) { + my ($self, $c, $id_estado) = @_; + $c->stash->{limite} = $c->stash->{local}->configuracoes_limite->find + ({ id_estado => $id_estado, + vt_fim => 'Infinity' }); +} + +sub encerrar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + $c->stash->{limite}->update + ({ vt_fim => DateTime->now(time_zone => 'local') }); + $c->res->redirect($c->uri_for('/locais/'.$c->stash->{local}->id_local)); +} + +sub criar :Chained('/locais/preload') :PathPart('limite/criar') :Args(0) { + my ($self, $c) = @_; + if ($c->req->param('submitted')) { + # antes de criar, vamos certificar que as configuracoes + # anteriores dessa categoria para esse local sejam desativadas. + $c->stash->{local}->configuracoes_limite->search + ({ id_estado => $c->req->param('id_estado'), + vt_fim => 'Infinity' })->update + ({ vt_fim => DateTime->now(time_zone => 'local')}); + + $c->stash->{local}->configuracoes_limite->create + ({ vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity', + ( map { $_ => $c->req->param($_) } + qw(id_estado segundos) ) }); + + $c->res->redirect($c->uri_for('/locais/'.$c->stash->{local}->id_local)); + } else { + $c->stash->{estados} = + $c->model('DB::TipoEstadoGuiche')->search({}, + { order_by => 'nome' }) + } +} + +1; + +__END__ + +=head1 NAME + +Fila::Administracao::Controller::ConfiguracaoLimites - Gere os Limites para Alerta + +=head1 DESCRIPTION + +Esse módulo define os limites de tempo para cada um dos estados do +guiche. Permitindo que o gerente seja visualmente avisado sobre +anomalias durante o processo de atendimento. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/Funcionarios.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/Funcionarios.pm new file mode 100644 index 0000000..ab5a77e --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/Funcionarios.pm @@ -0,0 +1,170 @@ +package Fila::Administracao::Controller::Funcionarios; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use parent 'Catalyst::Controller'; +use Digest::MD5 qw(md5_hex md5_base64); + +sub index :Path('') :Args(0) { + my ($self, $c) = @_; + $c->stash->{funcionarios} = $c->model('DB::Funcionario')->search + ( + {},{ + 'join' => ['local_atual','gerente_atual'], + 'select' => ['me.id_funcionario','me.nome','me.jid','local_atual.vt_fim','gerente_atual.vt_fim'], + 'as' => ['id_funcionario', 'nome', 'jid', 'vt_fim','gerente_vt_fim'], + 'order_by'=> 'nome' } + ); + #({}, + # { order_by => 'nome' }); + +} + +sub preload :Chained :PathPart('funcionarios') :CaptureArgs(1) { + my ($self, $c, $id) = @_; + + $c->stash->{funcionario} = $c->model('DB::Funcionario')->find + ({ id_funcionario => $id }) or die 'Funcionario nao encontrado'; +} + +sub ver :Chained('preload') :PathPart('') :Args(0) { + my ($self, $c) = @_; + + $c->stash->{template} = 'funcionarios/ver.tt'; + $c->stash->{locais} = + $c->stash->{funcionario}->locais->search({},{prefetch => 'local', + order_by => 'me.vt_ini'}); + $c->stash->{gerentes} = + $c->stash->{funcionario}->gerentes->search({},{prefetch => 'local', + order_by => 'me.vt_ini'}); + + unless ($c->req->param('submitted')) { + $c->req->param($_, $c->stash->{funcionario}->$_()) + for qw(nome jid); + } +} + +sub salvar :Chained('preload') :PathPart('salvar') :Args(0) { + my ($self, $c) = @_; + + unless ($c->req->param('submitted')) { + $c->res->redirect($c->uri_for('/funcionarios/'.$c->stash->{funcionario}->id_funcionario)); + } else { + if ($c->req->param('senha')) { + if ($c->req->param('senha') eq $c->req->param('confirmacao')) { + $c->stash->{funcionario}->update + ({ nome => $c->req->param('nome'), + jid => $c->req->param('jid').'@people.fila.vhost' , + password => md5_hex($c->req->param('senha')) }); + } else { + $c->stash->{template} = 'funcionarios/ver.tt'; + return $c->stash->{error} = "Senhas não conferem"; + } + } else { + $c->stash->{funcionario}->update + ({ nome => $c->req->param('nome'), + jid => $c->req->param('jid').'@people.fila.vhost' }); + } + $c->res->redirect($c->uri_for('/funcionarios/')); + } +} + +sub criar :Local :Args(0) { + my ($self, $c) = @_; + if ($c->req->param('submitted')) { + if ($c->req->param('senha') eq $c->req->param('confirmacao')) { + $c->model('DB::Funcionario')->create + ({ nome => $c->req->param('nome'), + jid => $c->req->param('jid').'@people.fila.vhost', + password => md5_hex($c->req->param('senha')) }); + $c->res->redirect($c->uri_for('/funcionarios/')); + } else { + $c->stash->{error} = "Senhas não conferem"; + } + } +} + +sub associar_gerente :Chained('preload') :PathPart('gerente/associar') :Args(0) { + my ($self, $c) = @_; + # primeiro testa para ver se o funcionario mencionado está ligado a uma mesa. + my $guiche_associado = $c->model('DB::AtendenteGuiche')->find + ({ id_funcionario => $c->stash->{funcionario}->id_funcionario , + vt_fim => 'Infinity'}); + if($guiche_associado){ + $c->stash->{error} = 'Atendente nao pode ser gerente se estiver ligado a uma mesa'; + $c->forward('/funcionarios/ver'); + } else { + # para a figura não ter que procurar qual é o gerente atual, a gente sempre + # desassocia o gerente atual do local para associar o que ele está pedindo + my $local = $c->model('DB::Local')->find + ({ id_local => $c->req->param('id_local') }, + { join => 'gerentes' })->gerentes->search + ({ 'gerentes.vt_fim' => 'Infinity' })->update + ({ vt_fim => DateTime->now(time_zone => 'local') }); + $c->stash->{funcionario}->gerentes->create + ({ id_local => $c->req->param('id_local'), + vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity' }); + $c->res->redirect('/funcionarios/'.$c->stash->{funcionario}->id_funcionario ); + } + } + +sub associar_local :Chained('preload') :PathPart('local/associar') :Args(0) { + my ($self, $c) = @_; + $c->stash->{funcionario}->locais->create + ({ id_local => $c->req->param('id_local'), + vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity' }); + $c->res->redirect('/funcionarios/'.$c->stash->{funcionario}->id_funcionario); +} + +sub desassociar_gerente :Chained('preload') :PathPart('gerente') :Args(1) { + my ($self, $c, $id_local) = @_; + $c->stash->{funcionario}->gerentes->search + ({ id_local => $id_local, + vt_fim => 'Infinity' })->update + ({ vt_fim => DateTime->now(time_zone => 'local') }); + $c->res->redirect('/funcionarios/'.$c->stash->{funcionario}->id_funcionario); +} + +sub desassociar_local :Chained('preload') :PathPart('local') :Args(1) { + my ($self, $c, $id_local) = @_; + $c->stash->{funcionario}->locais->search + ({ id_local => $id_local, + vt_fim => 'Infinity' })->update + ({ vt_fim => DateTime->now(time_zone => 'local') }); + $c->res->redirect('/funcionarios/'.$c->stash->{funcionario}->id_funcionario); +} + +1; + +__END__ + +=head1 NAME + +Fila::Administracao::Controller::Funcionarios - Gestão dos Funcionários + +=head1 DESCRIPTION + +Este módulo implementa a administração dos dados dos funcionários, +incluindo a associação aos locais de atendimento e a associação à +função de gerente. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/Guiches.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/Guiches.pm new file mode 100644 index 0000000..2b5c400 --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/Guiches.pm @@ -0,0 +1,120 @@ +package Fila::Administracao::Controller::Guiches; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +sub preload :Chained('/locais/preload') :PathPart('guiche') :CaptureArgs(1) { + my ($self, $c, $id_guiche) = @_; + $c->stash->{guiche} = $c->stash->{local}->guiches->find + ({ id_guiche => $id_guiche }); +} + +sub encerrar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + $c->stash->{guiche}->update + ({ vt_fim => DateTime->now(time_zone => 'local') }); + $c->res->redirect($c->uri_for('/locais/'.$c->stash->{local}->id_local)); +} + +sub reabrir :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + my $guiche = $c->stash->{guiche}->update + ({ vt_fim => 'Infinity' }); + $c->res->redirect($c->uri_for('/locais/'.$c->stash->{local}->id_local)); +} + +sub ver :Chained('preload') :PathPart('') :Args(0) { + my ($self, $c) = @_; + + unless ($c->req->param('submitted')) { + $c->req->param($_, $c->stash->{guiche}->get_column($_)) + for qw(identificador jid_opiniometro); + } +} + +sub encerrar_categoria :Chained('preload') :PathPart :Args(1) { + my ($self, $c, $id_categoria) = @_; + $c->stash->{guiche}->categorias_atuais->find + ({ id_categoria => $id_categoria })->update + ({ vt_fim => DateTime->now(time_zone => 'local') }); + $c->res->redirect($c->uri_for('/locais/'.$c->stash->{local}->id_local. + '/guiche/'.$c->stash->{guiche}->id_guiche)); +} + +sub associar_categoria :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + $c->stash->{guiche}->categorias->create + ({ id_categoria => $c->req->param('id_categoria'), + vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity' }); + $c->res->redirect($c->uri_for('/locais/'.$c->stash->{local}->id_local. + '/guiche/'.$c->stash->{guiche}->id_guiche)); +} + +sub salvar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + $c->stash->{guiche}->update + ({ map { $_ => $c->req->param($_) } + qw(identificador jid_opiniometro) }); + $c->res->redirect($c->uri_for('/locais/'.$c->stash->{local}->id_local)); +} + +sub criar :Chained('/locais/preload') :PathPart('guiche/criar') :Args(0) { + my ($self, $c) = @_; + + # cria um novo guiche e seta seu estado inicial como 'fechado' + + if ($c->req->param('submitted')) { + my $estado_fechado = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'fechado' }); + unless ($estado_fechado) { + $c->stash->{error} = 'Ocorreu um erro de configuracao do sistema, estado "fechado" de guiche nao encontrado.'; + } else { + my $guiche = $c->stash->{local}->guiches->create + ({ vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity', + pular_opiniometro => 0, + ( map { $_ => $c->req->param($_) } + qw(identificador jid_opiniometro) ) }); + $guiche->estados->create + ({ vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity', + id_estado => $estado_fechado->id_estado }); + + $c->res->redirect($c->uri_for('/locais/'.$c->stash->{local}->id_local)); + } + } +} + +1; + +__END__ + +=head1 NAME + +Fila::Administracao::Controller::Guiches - Gerencia os Guichês + +=head1 DESCRIPTION + +O guichê é a mesa onde o atendente realiza os atendimentos. Esse é o +módulo responsável por gerenciar as informações dos guichês. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/Locais.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/Locais.pm new file mode 100644 index 0000000..51d9f7e --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/Locais.pm @@ -0,0 +1,107 @@ +package Fila::Administracao::Controller::Locais; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +sub index :Path('') :Args(0) { + my ( $self, $c ) = @_; + $c->stash->{locais} = $c->model('DB::Local')->search + ({}, + { order_by => 'nome' }); +} + +sub preload :Chained :PathPart('locais') :CaptureArgs(1) { + my ($self, $c, $id_local) = @_; + $c->stash->{local} = $c->model('DB::Local')->find + ({ id_local => $id_local }); +} + +sub encerrar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + $c->stash->{local}->update + ({ vt_fim => DateTime->now(time_zone => 'local') }); + $c->res->redirect($c->uri_for('/locais')); +} + +sub reabrir :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + $c->stash->{local}->update + ({ vt_fim => 'Infinity' }); + $c->res->redirect($c->uri_for('/locais')); +} + +sub salvar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + $c->stash->{local}->update + ({ map { $_ => $c->req->param($_) } + qw(nome jid_senhas jid_painel jid_opiniometro) }); + $c->res->redirect($c->uri_for('/locais')); +} + +sub ver :Chained('preload') :PathPart('') :Args(0) { + my ($self, $c) = @_; + + unless ($c->req->param('submitted')) { + $c->req->param($_,$c->stash->{local}->get_column($_)) + for qw(nome jid_senhas jid_painel jid_opiniometro) + } + + $c->stash->{guiches} = $c->stash->{local}->guiches->search + ({},{ order_by => 'identificador' }); + + $c->stash->{configuracoes} = $c->stash->{local}->configuracoes_categoria->search + ({},{ prefetch => 'categoria', order_by => [ 'me.vt_ini', 'categoria.nome' ] }); + + $c->stash->{limites} = $c->stash->{local}->configuracoes_limite->search + ({},{ prefetch => 'estado', order_by => [ 'me.vt_ini', 'estado.nome' ] }); + + $c->stash->{conf_perguntas} = $c->stash->{local}->configuracoes_perguntas->search({}); + + $c->stash->{conf_perguntas_praca} = $c->stash->{local}->configuracoes_perguntas_praca->search({}); + +} + +sub criar :Local :Args(0) { + my ($self, $c) = @_; + if ($c->req->param('submitted')) { + my $local = $c->model('DB::Local')->create + ({ vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity', + ( map { $_ => $c->req->param($_) } + qw(nome jid_senhas jid_painel jid_opiniometro) ) }); + $c->res->redirect($c->uri_for('/locais/'.$local->id_local)); + } +} + +1; + +__END__ + +=head1 NAME + +Fila::Administracao::Locais - Controller para a gestão dos locais + +=head1 DESCRIPTION + +É através desse módulo que são geridas as informações sobre as praças +de atendimento. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/Perguntas.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/Perguntas.pm new file mode 100644 index 0000000..04faed8 --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/Perguntas.pm @@ -0,0 +1,105 @@ +package Fila::Administracao::Controller::Perguntas; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +sub index :Path('') :Args(0) { + my ($self, $c) = @_; + $c->stash->{perguntas} = $c->model('DB::PerguntaAvaliacao')->search + ({}, + { order_by => 'pergunta' }); +} + +sub preload :Chained :PathPart('perguntas') :CaptureArgs(1) { + my ($self, $c, $id_pergunta) = @_; + $c->stash->{perguntas} = $c->model('DB::PerguntaAvaliacao')->find + ({ id_pergunta => $id_pergunta }); +} + +sub encerrar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + + $c->stash->{perguntas}->update( + { + vt_fim => DateTime->now(time_zone => 'local') + }); + $c->res->redirect($c->uri_for('/perguntas')); +} + +sub reabrir :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + + $c->stash->{perguntas}->update( + { + vt_fim => 'infinity' + }); + $c->res->redirect($c->uri_for('/perguntas')); +} + +sub salvar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + $c->stash->{perguntas}->update + ({ map { $_ => $c->req->param($_) } + qw(pergunta ) }); + $c->res->redirect($c->uri_for('/perguntas')); +} + +sub ver :Chained('preload') :PathPart('') :Args(0) { + my ($self, $c) = @_; + + unless ($c->req->param('submitted')) { + $c->req->param($_,$c->stash->{perguntas}->get_column($_)) + for qw(id_pergunta pergunta ) + } + +} + +sub criar :Local :Args(0) { + my ($self, $c) = @_; + + $c->stash->{perguntas} = $c->model('DB::PerguntaAvaliacao')->search({}); + + if ($c->req->param('submitted')) { + $c->stash->{perguntas}->create + ({ vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity', + ( map { $_ => $c->req->param($_) } + qw(pergunta ) ) }); + $c->res->redirect($c->uri_for('/perguntas')); + } +} + + +1; + +__END__ + +=head1 NAME + +Fila::Administracao::Controller::Perguntas - Gerencia as perguntas +para o opiniometro + +=head1 DESCRIPTION + +Este módulo implementa a interface de gerencia das perguntas do +opiniometro. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/Perguntas_praca.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/Perguntas_praca.pm new file mode 100644 index 0000000..3dc7a0d --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/Perguntas_praca.pm @@ -0,0 +1,105 @@ +package Fila::Administracao::Controller::Perguntas_praca; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +sub index :Path('') :Args(0) { + my ($self, $c) = @_; + $c->stash->{perguntas_praca} = $c->model('DB::PerguntaAvaliacaoPraca')->search + ({}, + { order_by => 'pergunta' }); +} + +sub preload :Chained :PathPart('perguntas_praca') :CaptureArgs(1) { + my ($self, $c, $id_pergunta) = @_; + $c->stash->{perguntas_praca} = $c->model('DB::PerguntaAvaliacaoPraca')->find + ({ id_pergunta => $id_pergunta }); +} + +sub encerrar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + + $c->stash->{perguntas_praca}->update( + { + vt_fim => DateTime->now(time_zone => 'local') + }); + $c->res->redirect($c->uri_for('/perguntas_praca')); +} + +sub reabrir :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + + $c->stash->{perguntas_praca}->update( + { + vt_fim => 'infinity' + }); + $c->res->redirect($c->uri_for('/perguntas_praca')); +} + +sub salvar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + $c->stash->{perguntas_praca}->update + ({ map { $_ => $c->req->param($_) } + qw(pergunta ) }); + $c->res->redirect($c->uri_for('/perguntas_praca')); +} + +sub ver :Chained('preload') :PathPart('') :Args(0) { + my ($self, $c) = @_; + + unless ($c->req->param('submitted')) { + $c->req->param($_,$c->stash->{perguntas_praca}->get_column($_)) + for qw(id_pergunta pergunta ) + } + +} + +sub criar :Local :Args(0) { + my ($self, $c) = @_; + + $c->stash->{perguntas_praca} = $c->model('DB::PerguntaAvaliacaoPraca')->search({}); + + if ($c->req->param('submitted')) { + $c->stash->{perguntas_praca}->create + ({ vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity', + ( map { $_ => $c->req->param($_) } + qw(pergunta ) ) }); + $c->res->redirect($c->uri_for('/perguntas_praca')); + } +} + + +1; + +__END__ + +=head1 NAME + +Fila::Administracao::Controller::Perguntas_praca - Gerencia as +perguntas do opiniometro geral + +=head1 DESCRIPTION + +Este módulo gerencia as perguntas que são utilizadas no opiniômetro +geral da praça. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/Root.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/Root.pm new file mode 100644 index 0000000..b5ccec5 --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/Root.pm @@ -0,0 +1,57 @@ +package Fila::Administracao::Controller::Root; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use DateTime; +use parent 'Catalyst::Controller'; + +__PACKAGE__->config->{namespace} = ''; + +sub auto :Private { + my ($self, $c) = @_; + $c->stash->{now} = DateTime->now(time_zone => 'local'); +} + +sub index : Path Args(0) {} + +sub default : Path { + my ( $self, $c ) = @_; + $c->response->body( 'Page not found' ); + $c->response->status(404); +} + +sub end : ActionClass('RenderView') {} + +1; + +__END__ + +=head1 NAME + +Fila::Administracao::Controller::Root - Implementa a raiz da navegação + +=head1 DESCRIPTION + +A aplicação de administração é responsável por gerir algumas +informações padrões para a aplicação inteira, como a definição do +time_zone padrão bem como a definição da ação default que usa o view +para renderizar a saída. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/Servicos.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/Servicos.pm new file mode 100644 index 0000000..7fd1ce9 --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/Servicos.pm @@ -0,0 +1,108 @@ +package Fila::Administracao::Controller::Servicos; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +sub index :Path('') :Args(0) { + my ($self, $c) = @_; + $c->stash->{servicos} = $c->model('DB::Servico')->search + ({}, + { order_by => 'nome' }); +} + +sub preload :Chained :PathPart('servicos') :CaptureArgs(1) { + my ($self, $c, $id_servico) = @_; + $c->stash->{servicos} = $c->model('DB::Servico')->find + ({ id_servico => $id_servico }); +} + + +sub encerrar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + + $c->stash->{servicos}->update( + { + vt_fim => DateTime->now(time_zone => 'local') + }); + $c->res->redirect($c->uri_for('/servicos')); +} + +sub reabrir :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + + $c->stash->{servicos}->update( + { + vt_fim => 'infinity' + }); + $c->res->redirect($c->uri_for('/servicos')); +} + +sub salvar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + $c->stash->{servicos}->update + ({ map { $_ => $c->req->param($_) } + qw(nome id_classe ) }); + $c->res->redirect($c->uri_for('/servicos')); +} + +sub ver :Chained('preload') :PathPart('') :Args(0) { + my ($self, $c) = @_; + + unless ($c->req->param('submitted')) { + $c->req->param($_,$c->stash->{servicos}->get_column($_)) + for qw(id_servico nome id_classe) + } + + $c->stash->{classes} = $c->model('DB::ClasseServico')->search + ({},{ order_by => 'id_classe' }); + +} + +sub criar :Local :Args(0) { + my ($self, $c) = @_; + + $c->stash->{servicos} = $c->model('DB::Servico')->search({}); + + if ($c->req->param('submitted')) { + $c->stash->{servicos}->create + ({ vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity', + ( map { $_ => $c->req->param($_) } + qw(nome id_classe) ) }); + $c->res->redirect($c->uri_for('/servicos')); + } +} + + +1; + +__END__ + +=head1 NAME + +Fila::Administraca::Controller::Servicos - Gerencia os serviços + +=head1 DESCRIPTION + +Este módulo implementa o controller para a gerencia dos serviços da +praca. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Controller/Servicos_interno.pm b/Fila-Administracao/lib/Fila/Administracao/Controller/Servicos_interno.pm new file mode 100644 index 0000000..853535b --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Controller/Servicos_interno.pm @@ -0,0 +1,108 @@ +package Fila::Administracao::Controller::Servicos_interno; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +sub index :Path('') :Args(0) { + my ($self, $c) = @_; + $c->stash->{servicos_interno} = $c->model('DB::ServicoInterno')->search + ({}, + { order_by => 'nome' }); +} + +sub preload :Chained :PathPart('servicos_interno') :CaptureArgs(1) { + my ($self, $c, $id_servico) = @_; + $c->stash->{servicos_interno} = $c->model('DB::ServicoInterno')->find + ({ id_servico => $id_servico }); +} + + +sub encerrar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + + $c->stash->{servicos_interno}->update( + { + vt_fim => DateTime->now(time_zone => 'local') + }); + $c->res->redirect($c->uri_for('/servicos_interno')); +} + +sub reabrir :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + + $c->stash->{servicos_interno}->update( + { + vt_fim => 'infinity' + }); + $c->res->redirect($c->uri_for('/servicos_interno')); +} + +sub salvar :Chained('preload') :PathPart :Args(0) { + my ($self, $c) = @_; + $c->stash->{servicos_interno}->update + ({ map { $_ => $c->req->param($_) } + qw(nome id_classe ) }); + $c->res->redirect($c->uri_for('/servicos_interno')); +} + +sub ver :Chained('preload') :PathPart('') :Args(0) { + my ($self, $c) = @_; + + unless ($c->req->param('submitted')) { + $c->req->param($_,$c->stash->{servicos_interno}->get_column($_)) + for qw(id_servico nome id_classe) + } + + $c->stash->{classes} = $c->model('DB::ClasseServico')->search + ({},{ order_by => 'id_classe' }); + +} + +sub criar :Local :Args(0) { + my ($self, $c) = @_; + + $c->stash->{servicos_interno} = $c->model('DB::ServicoInterno')->search({}); + + if ($c->req->param('submitted')) { + $c->stash->{servicos_interno}->create + ({ vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity', + ( map { $_ => $c->req->param($_) } + qw(nome id_classe) ) }); + $c->res->redirect($c->uri_for('/servicos_interno')); + } +} + + +1; + +__END__ + +=head1 NAME + +Fila::Administracao::Controller::Servicos_interno - Gestão dos serviços internos + +=head1 DESCRIPTION + +Este módulo gerencia os dados dos serviços internos, criando, ativando +e desativando os cadastros. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/Model/DB.pm b/Fila-Administracao/lib/Fila/Administracao/Model/DB.pm new file mode 100644 index 0000000..4ae8831 --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/Model/DB.pm @@ -0,0 +1,40 @@ +package Fila::Administracao::Model::DB; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Model::DBIC::Schema'; + + +1; + +__END__ + +=head1 NAME + +Fila::Administracao::Model::DB - Configura o Model para acesso ao +banco de dados + +=head1 DESCRIPTION + +Este módulo configura um Model catalyst para acesso ao banco de dados +do sistema de atendimento. As configurações desse acesso estão +definidas no arquivo fila_administracao.yml. + +=cut + diff --git a/Fila-Administracao/lib/Fila/Administracao/View/TT.pm b/Fila-Administracao/lib/Fila/Administracao/View/TT.pm new file mode 100644 index 0000000..cc9cc19 --- /dev/null +++ b/Fila-Administracao/lib/Fila/Administracao/View/TT.pm @@ -0,0 +1,34 @@ +package Fila::Administracao::View::TT; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use base 'Catalyst::View::TT'; + +__PACKAGE__->config(TEMPLATE_EXTENSION => '.tt'); + +=head1 NAME + +Fila::Administracao::View::TT - TT View para Fila::Administracao + +=head1 DESCRIPTION + +TT View para Fila::Administracao. + +=cut + +1; diff --git a/Fila-Administracao/lib/Fila/Servico b/Fila-Administracao/lib/Fila/Servico new file mode 120000 index 0000000..d120748 --- /dev/null +++ b/Fila-Administracao/lib/Fila/Servico @@ -0,0 +1 @@ +../../../Fila-Servico/lib/Fila/Servico \ No newline at end of file diff --git a/Fila-Administracao/root/bg_cabecalho2.gif b/Fila-Administracao/root/bg_cabecalho2.gif new file mode 100644 index 0000000..9d62c2e Binary files /dev/null and b/Fila-Administracao/root/bg_cabecalho2.gif differ diff --git a/Fila-Administracao/root/categorias/criar.tt b/Fila-Administracao/root/categorias/criar.tt new file mode 100644 index 0000000..27e5cab --- /dev/null +++ b/Fila-Administracao/root/categorias/criar.tt @@ -0,0 +1,30 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados da Categoria +
+ +

+

+

+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/categorias/index.tt b/Fila-Administracao/root/categorias/index.tt new file mode 100644 index 0000000..d7eeeae --- /dev/null +++ b/Fila-Administracao/root/categorias/index.tt @@ -0,0 +1,36 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +

Categorias

+ + + + + + +[% FOREACH categoria IN categorias.all %] + + + + +[% END %] +
Nova
IdNomeCodigo
[% categoria.id_categoria %][% categoria.nome %][% categoria.codigo %]
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/categorias/ver.tt b/Fila-Administracao/root/categorias/ver.tt new file mode 100644 index 0000000..e2d9f0c --- /dev/null +++ b/Fila-Administracao/root/categorias/ver.tt @@ -0,0 +1,31 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados da Categoria +
+ +

+

+

+

+
+ +[% INCLUDE 'footer.tt' %] \ No newline at end of file diff --git a/Fila-Administracao/root/classes/criar.tt b/Fila-Administracao/root/classes/criar.tt new file mode 100644 index 0000000..4dfb931 --- /dev/null +++ b/Fila-Administracao/root/classes/criar.tt @@ -0,0 +1,30 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Criar Classe +
+ +

+

+
+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/classes/index.tt b/Fila-Administracao/root/classes/index.tt new file mode 100644 index 0000000..4018cb6 --- /dev/null +++ b/Fila-Administracao/root/classes/index.tt @@ -0,0 +1,36 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +

Classes

+ + + + + + +[% FOREACH classe IN classes.all %] + + + + +[% END %] +
Novo
IdNome
[% classe.id_classe %][% classe.nome %]
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/classes/ver.tt b/Fila-Administracao/root/classes/ver.tt new file mode 100644 index 0000000..76b04b6 --- /dev/null +++ b/Fila-Administracao/root/classes/ver.tt @@ -0,0 +1,31 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados da classe +
+ +

+

+

+
+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/conf_perguntas/criar.tt b/Fila-Administracao/root/conf_perguntas/criar.tt new file mode 100644 index 0000000..599d4d7 --- /dev/null +++ b/Fila-Administracao/root/conf_perguntas/criar.tt @@ -0,0 +1,64 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados +
+ +

+

+

+

+

+ +

+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/conf_perguntas_praca/criar.tt b/Fila-Administracao/root/conf_perguntas_praca/criar.tt new file mode 100644 index 0000000..0bc04bf --- /dev/null +++ b/Fila-Administracao/root/conf_perguntas_praca/criar.tt @@ -0,0 +1,64 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados +
+ +

+

+

+

+

+ +

+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/configuracaocategorias/criar.tt b/Fila-Administracao/root/configuracaocategorias/criar.tt new file mode 100644 index 0000000..a31c849 --- /dev/null +++ b/Fila-Administracao/root/configuracaocategorias/criar.tt @@ -0,0 +1,37 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados da Configuração +
+ +

+

+

+

+

+

+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/configuracaolimites/criar.tt b/Fila-Administracao/root/configuracaolimites/criar.tt new file mode 100644 index 0000000..6b1080f --- /dev/null +++ b/Fila-Administracao/root/configuracaolimites/criar.tt @@ -0,0 +1,34 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados do Limite +
+ +

+

+

+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/favicon.ico b/Fila-Administracao/root/favicon.ico new file mode 100644 index 0000000..5ad723d Binary files /dev/null and b/Fila-Administracao/root/favicon.ico differ diff --git a/Fila-Administracao/root/footer.tt b/Fila-Administracao/root/footer.tt new file mode 100644 index 0000000..36bc1c3 --- /dev/null +++ b/Fila-Administracao/root/footer.tt @@ -0,0 +1,28 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + + + + + + + diff --git a/Fila-Administracao/root/funcionarios/criar.tt b/Fila-Administracao/root/funcionarios/criar.tt new file mode 100644 index 0000000..24958e8 --- /dev/null +++ b/Fila-Administracao/root/funcionarios/criar.tt @@ -0,0 +1,36 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Criar Funcionario +[% error %] +
+ +

+

+

+

+
+

A senha padrão para novos usuários é 123 - Certifique-se de mudar essa senha no primeiro acesso.

+

+
+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/funcionarios/index.tt b/Fila-Administracao/root/funcionarios/index.tt new file mode 100644 index 0000000..8b56d8a --- /dev/null +++ b/Fila-Administracao/root/funcionarios/index.tt @@ -0,0 +1,49 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +

Funcionários

+ + + + + + + + + +[% FOREACH funcionario IN funcionarios.all %] + + + + + + +[% END %] +
Novo
IdNomeNome de UsuárioAtendente do LocalGerente do Local
[% funcionario.id_funcionario %][% funcionario.nome %][% jid = funcionario.jid %][% jid.replace('@people.fila.vhost','') %] + [% IF funcionario.local_atual.vt_fim.is_infinite() %] + SIM + [% END %] + + [% IF funcionario.gerente_atual.vt_fim.is_infinite() %] + SIM + [% END %] +
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/funcionarios/ver.tt b/Fila-Administracao/root/funcionarios/ver.tt new file mode 100644 index 0000000..b12da8d --- /dev/null +++ b/Fila-Administracao/root/funcionarios/ver.tt @@ -0,0 +1,92 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados do Funcionario +

[% error %]

+
+ +

+

+

+

+

+

+
+ + +
+
+ + +[% SET pode_associar = 1 %] + +[% FOREACH local IN locais.all %] + + + +[% END %] +[% IF pode_associar %] + + +[% END %] +
Atendente nos locais
Data de InícioData de FimLocal
[% local.vt_ini.strftime('%d/%m/%Y') %][% IF local.vt_fim.is_infinite() %] + [% SET pode_associar = 0 %] + atual (Encerrar) + [% ELSE %] + [% local.vt_fim.strftime('%d/%m/%Y') %] + [% END %][% local.local.nome %]
+
+
+
+ +[% SET pode_associar = 1 %] + + +[% FOREACH local IN gerentes.all %] + + + +[% END %] +[% IF pode_associar %] + + +[% END %] +
Gerente nos locais
Data de InícioData de FimLocal
[% local.vt_ini.strftime('%d/%m/%Y') %][% IF local.vt_fim.is_infinite() %] + [% SET pode_associar = 0 %] + atual (Encerrar) + [% ELSE %] + [% local.vt_fim.strftime('%d/%m/%Y') %] + [% END %][% local.local.nome %]
+
+ +
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/guiches/criar.tt b/Fila-Administracao/root/guiches/criar.tt new file mode 100644 index 0000000..95e267c --- /dev/null +++ b/Fila-Administracao/root/guiches/criar.tt @@ -0,0 +1,30 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados da Mesa +
+ +

+

+

+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/guiches/ver.tt b/Fila-Administracao/root/guiches/ver.tt new file mode 100644 index 0000000..35648c5 --- /dev/null +++ b/Fila-Administracao/root/guiches/ver.tt @@ -0,0 +1,62 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados da Mesa +
+ +

+

+

+

+

+

+
+ +
+
+ + + +[% FOREACH gc IN guiche.categorias %] + + + +[% END %] + + +
Atender apenas as categorias (não selecionar nenhuma significa atender todas)
Data de InícioData de FimCategoria
[% gc.vt_ini.strftime('%d/%m/%Y') %][% IF gc.vt_fim.is_infinite() %] + atual (Encerrar) + [% ELSE %] + [% gc.vt_fim.strftime('%d/%m/%Y') %] + [% END %][% gc.categoria.nome %]
+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/header.tt b/Fila-Administracao/root/header.tt new file mode 100644 index 0000000..0bac542 --- /dev/null +++ b/Fila-Administracao/root/header.tt @@ -0,0 +1,47 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + + + + Sistema de Atendimento + + + + +
+ +
+ + + +
diff --git a/Fila-Administracao/root/index.tt b/Fila-Administracao/root/index.tt new file mode 100644 index 0000000..1db6b5f --- /dev/null +++ b/Fila-Administracao/root/index.tt @@ -0,0 +1,22 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + + +[% INCLUDE 'footer.tt' %] \ No newline at end of file diff --git a/Fila-Administracao/root/locais/criar.tt b/Fila-Administracao/root/locais/criar.tt new file mode 100644 index 0000000..8d6d1b6 --- /dev/null +++ b/Fila-Administracao/root/locais/criar.tt @@ -0,0 +1,32 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados do Local +
+ +

+

+

+

+

+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/locais/index.tt b/Fila-Administracao/root/locais/index.tt new file mode 100644 index 0000000..a8b24c1 --- /dev/null +++ b/Fila-Administracao/root/locais/index.tt @@ -0,0 +1,50 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +

Locais

+ + + + + + + + + + +[% FOREACH local IN locais.all %] + + + + + + + + +[% END %] +
Novo
IdData AberturaData EncerramentoNomeJID EmissorJID PainelJID Opiniometro
[% local.id_local %][% local.vt_ini.strftime('%d/%m/%Y') %][% IF local.vt_fim.is_infinite() %] + atual (Encerrar) + [% ELSE %] + [% local.vt_fim.strftime('%d/%m/%Y') %] + (Reabrir) + [% END %] + [% local.nome %][% local.jid_senhas %][% local.jid_painel %][% local.jid_opiniometro %]
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/locais/ver.tt b/Fila-Administracao/root/locais/ver.tt new file mode 100644 index 0000000..5f6324e --- /dev/null +++ b/Fila-Administracao/root/locais/ver.tt @@ -0,0 +1,186 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+ Dados do Local +
+ +

+

+

+

+

+

+

+

+
+ +
+ + + + + + + + + [% FOREACH guiche IN guiches.all %] + + + + + + [% END %] +
+ Guichês + Novo +
IdIdentificadorAberturaEncerramentoJID Opiniometro
[% guiche.id_guiche %][% guiche.identificador %][% guiche.vt_ini.strftime('%d/%m/%Y') %][% IF guiche.vt_fim.is_infinite() %] + atual (Encerrar) + [% ELSE %] + [% guiche.vt_fim.strftime('%d/%m/%Y') %] + (Reabrir) + [% END %][% guiche.jid_opiniometro %]
+ +


+ + + + + + + [% FOREACH categoria IN configuracoes.all %] + + + + + + + + + + + [% END %] +
+ Categorias + Nova +
IdInicioFimNomeCódigoPrioridadeLimite Tempo em EsperaLimite Pessoas em EsperaOrdem
[% categoria.id_categoria %][% categoria.vt_ini.strftime('%d/%m/%Y') %][% IF categoria.vt_fim.is_infinite() %] + atual (Encerrar) + [% ELSE %] + [% categoria.vt_fim.strftime('%d/%m/%Y') %] + [% END %][% categoria.categoria.nome %][% categoria.categoria.codigo %][% categoria.prioridade %][% categoria.limite_tempo_espera %] Segundos[% categoria.limite_pessoas_espera %][% categoria.ordem %]
+ +


+ + + + + + + + + + + [% FOREACH limite IN limites.all %] + + + + + + + [% END %] +
+ Limites + Nova +
IdInicioFimNomeLimite
[% limite.id_estado %][% limite.vt_ini.strftime('%d/%m/%Y') %][% IF limite.vt_fim.is_infinite() %] + atual (Encerrar) + [% ELSE %] + [% limite.vt_fim.strftime('%d/%m/%Y') %] + [% END %][% limite.estado.nome %][% limite.segundos %] Segundos
+ +


+ + + + + + + + [% FOREACH perg IN conf_perguntas.all %] + + + + + [% END %] +
+ Ordem das perguntas do opiniometro + Nova +
Inicio

Fim
Pergunta 1
Pergunta 2
Pergunta 3
Pergunta 4
Pergunta 5
[% perg.vt_ini.strftime('%d/%m/%Y') %]

+ [% IF perg.vt_fim.is_infinite() %] + atual + [% ELSE %] + [% perg.vt_fim.strftime('%d/%m/%Y') %] + [% END %] +
+ [% perg.pergunta1.pergunta | html %]
+ [% perg.pergunta2.pergunta | html %]
+ [% perg.pergunta3.pergunta | html %]
+ [% perg.pergunta4.pergunta | html %]
+ [% perg.pergunta5.pergunta | html %]
+
+ +


+ + + + + + + + [% FOREACH perg IN conf_perguntas_praca.all %] + + + + + [% END %] +
+ Ordem das perguntas do opiniometro (praça) + Nova +
Inicio

Fim
Pergunta 1
Pergunta 2
Pergunta 3
Pergunta 4
Pergunta 5
[% perg.vt_ini.strftime('%d/%m/%Y') %]

+ [% IF perg.vt_fim.is_infinite() %] + atual + [% ELSE %] + [% perg.vt_fim.strftime('%d/%m/%Y') %] + [% END %] +
+ [% perg.pergunta1.pergunta | html %]
+ [% perg.pergunta2.pergunta | html %]
+ [% perg.pergunta3.pergunta | html %]
+ [% perg.pergunta4.pergunta | html %]
+ [% perg.pergunta5.pergunta | html %]
+
+ +
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/perguntas/criar.tt b/Fila-Administracao/root/perguntas/criar.tt new file mode 100644 index 0000000..1a2a5f4 --- /dev/null +++ b/Fila-Administracao/root/perguntas/criar.tt @@ -0,0 +1,30 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Criar Pergunta +
+ +

+

+
+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/perguntas/index.tt b/Fila-Administracao/root/perguntas/index.tt new file mode 100644 index 0000000..3cf9e47 --- /dev/null +++ b/Fila-Administracao/root/perguntas/index.tt @@ -0,0 +1,47 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +

Perguntas

+ + + + + + + + +[% FOREACH pergunta IN perguntas.all %] + + + + + + + +[% END %] +
Novo
IdData AberturaData EncerramentoPergunta
[% pergunta.id_pergunta %][% pergunta.vt_ini.strftime('%d/%m/%Y') %][% IF pergunta.vt_fim.is_infinite() %] + atual (Encerrar) + [% ELSE %] + [% pergunta.vt_fim.strftime('%d/%m/%Y') %] + (Reabrir) + [% END %] + [% pergunta.pergunta %]
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/perguntas/ver.tt b/Fila-Administracao/root/perguntas/ver.tt new file mode 100644 index 0000000..0792acd --- /dev/null +++ b/Fila-Administracao/root/perguntas/ver.tt @@ -0,0 +1,31 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados da Pergunta +
+ +

+

+

+
+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/perguntas_praca/criar.tt b/Fila-Administracao/root/perguntas_praca/criar.tt new file mode 100644 index 0000000..ff3eba8 --- /dev/null +++ b/Fila-Administracao/root/perguntas_praca/criar.tt @@ -0,0 +1,30 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Criar Pergunta (praça) +
+ +

+

+
+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/perguntas_praca/index.tt b/Fila-Administracao/root/perguntas_praca/index.tt new file mode 100644 index 0000000..2e5b990 --- /dev/null +++ b/Fila-Administracao/root/perguntas_praca/index.tt @@ -0,0 +1,47 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +

Perguntas (praça)

+ + + + + + + + +[% FOREACH pergunta IN perguntas_praca.all %] + + + + + + + +[% END %] +
Novo
IdData AberturaData EncerramentoPergunta
[% pergunta.id_pergunta %][% pergunta.vt_ini.strftime('%d/%m/%Y') %][% IF pergunta.vt_fim.is_infinite() %] + atual (Encerrar) + [% ELSE %] + [% pergunta.vt_fim.strftime('%d/%m/%Y') %] + (Reabrir) + [% END %] + [% pergunta.pergunta %]
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/perguntas_praca/ver.tt b/Fila-Administracao/root/perguntas_praca/ver.tt new file mode 100644 index 0000000..f12a965 --- /dev/null +++ b/Fila-Administracao/root/perguntas_praca/ver.tt @@ -0,0 +1,31 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados da Pergunta +
+ +

+

+

+
+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/servicos/criar.tt b/Fila-Administracao/root/servicos/criar.tt new file mode 100644 index 0000000..4fd7fcd --- /dev/null +++ b/Fila-Administracao/root/servicos/criar.tt @@ -0,0 +1,37 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Criar Serviço +
+ +

+

+

+
+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/servicos/index.tt b/Fila-Administracao/root/servicos/index.tt new file mode 100644 index 0000000..439a105 --- /dev/null +++ b/Fila-Administracao/root/servicos/index.tt @@ -0,0 +1,49 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +

Serviços

+ + + + + + + + + +[% FOREACH servico IN servicos.all %] + + + + + + + + +[% END %] +
Novo
IdData AberturaData EncerramentoNomeClasse
[% servico.id_servico %][% servico.vt_ini.strftime('%d/%m/%Y') %][% IF servico.vt_fim.is_infinite() %] + atual (Encerrar) + [% ELSE %] + [% servico.vt_fim.strftime('%d/%m/%Y') %] + (Reabrir) + [% END %] + [% servico.nome %][% servico.id_classe %]
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/servicos/ver.tt b/Fila-Administracao/root/servicos/ver.tt new file mode 100644 index 0000000..3a417f5 --- /dev/null +++ b/Fila-Administracao/root/servicos/ver.tt @@ -0,0 +1,42 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados do Serviço +
+ +

+

+

+

+
+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/servicos_interno/criar.tt b/Fila-Administracao/root/servicos_interno/criar.tt new file mode 100644 index 0000000..aaae0cc --- /dev/null +++ b/Fila-Administracao/root/servicos_interno/criar.tt @@ -0,0 +1,37 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Criar Serviço (Interno) +
+ +

+

+

+
+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/servicos_interno/index.tt b/Fila-Administracao/root/servicos_interno/index.tt new file mode 100644 index 0000000..f57c059 --- /dev/null +++ b/Fila-Administracao/root/servicos_interno/index.tt @@ -0,0 +1,49 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +

Serviço (Interno)

+ + + + + + + + + +[% FOREACH servico IN servicos_interno.all %] + + + + + + + + +[% END %] +
Novo
IdData AberturaData EncerramentoNomeClasse
[% servico.id_servico %][% servico.vt_ini.strftime('%d/%m/%Y') %][% IF servico.vt_fim.is_infinite() %] + atual (Encerrar) + [% ELSE %] + [% servico.vt_fim.strftime('%d/%m/%Y') %] + (Reabrir) + [% END %] + [% servico.nome %][% servico.id_classe %]
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/servicos_interno/ver.tt b/Fila-Administracao/root/servicos_interno/ver.tt new file mode 100644 index 0000000..0ed3747 --- /dev/null +++ b/Fila-Administracao/root/servicos_interno/ver.tt @@ -0,0 +1,42 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
+Dados do Serviço (Interno) +
+ +

+

+

+

+
+
+ +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Administracao/root/static/css/main.css b/Fila-Administracao/root/static/css/main.css new file mode 100644 index 0000000..413f1db --- /dev/null +++ b/Fila-Administracao/root/static/css/main.css @@ -0,0 +1,211 @@ + +body { + padding : 0; color:#000; + margin : 0; font-size: 12px; + font-family : Arial, Sans-Serif; +} + +a:hover{ + text-decoration: underline; +} + +a:link, a:visited{ + text-decoration: none; + color: #B20F0F; +} + +#BackHeader {width: 100%; height : 134px; background: url('../images/bg_cabecalho.gif') repeat-x;} + +#header { + height : 89px; padding:45px 0 0 557px; background: url('../images/bg_cabecalho.jpg') no-repeat; +} + +#header h1 { + margin: 0; padding: 0; font-size : 20px; + color : white; + font-family : Arial; +} + +.titulos {font-size: 16px; padding: 3px 0 5px 5px; border-bottom: 1px solid #ed1c24; margin: 0 0 15px 0;} + +#content_menu { + margin : 0 20px 0 0; + padding : 0 20px; + float: left; + width: 200px; +} + +#header h1 { + margin: 0; padding: 0; font-size : 20px; + font-family : Arial; +} + +#content_main { + margin : 0; + padding : 0 20px; + width: 700px; float: left; +} + +#footer { + width : 100%; + clear : both; + padding : 5px 5px; + margin : 0 0 0 0; + border-top : 0px solid #999; +} + +#footer p { + margin : 0.2em; + padding : 0.2em; + font-size : 10px; +} + +label { + display : block; +} + +.error { + color : red; + font-weight : bold; +} + +div #bloco_acoes { + width: 100%; + clear: both; +} + +div #bloco_informacoes { + clear: both; + width: 100%; font-size: 12px; +} + +div #bloco_chat { + clear: both; + width: 100%; +} + +div #bloco_guiches { + clear: both; + width: 100%; +} + +#CHAT_WINDOW { + display: block; + clear: both; + width: 100%; + height: 200px; + overflow: auto; + border: 1px solid #999; +} + +#CHAT_SEND { + display: block; + clear: both; + width: 100%; +} + +.botao_acao { + display: block; height: 41px; float: left; margin: 0 15px 15px 0; +} + +.chat_remetente { + display: block; + font-weight: bold; +} + +input { border: solid 1px #999;} + +tbody { + border: solid 1px black; +} +.colunaUm {padding: 0 30px 0 0;} +.botao_acao a {display:block; float: left; font-size:0; text-indent: -999px;} + +#InfoSenhas {font-size: 12px;} +#TitCategoria {background: url('../images/icon_cat.jpg') 0 center no-repeat; padding: 0 0 0 16px;} + +.fechar_local a {background: url('../images/bt_fechar_local.jpg') no-repeat; width: 111px; height:34px;} +.fechar_mesas a {background: url('../images/bt_fechar_mesas.jpg') no-repeat; width: 183px; height:34px;} +.forcar_fechar a {background: url('../images/bt_forcar_fechar.png') no-repeat; width: 153px; height:37px;} + +.acao_abrir a {background: url('../images/bt_abrir_local.jpg') no-repeat; width: 101px; height:34px;} +.encerrar_senhas a {background: url('../images/bt_encerrar_senhas.jpg') no-repeat; width: 139px; height:34px;} + +.acao_iniciar a {background: url('../images/bt_iniciar_atend.png') no-repeat; width: 174px; height:38px;} +.acao_devolver_senha a {background: url('../images/bt_devol_senha.png') 0 5px no-repeat; width: 124px; height:37px;} +.acao_registrar_ausencia a {background: url('../images/bt_registrar_ausencia.png') no-repeat; width: 103px; height:33px;} +.acao_concluir a {background: url('../images/bt_concluir_atend.png') no-repeat; width: 179px; height:41px;} +.acao_ir_para a {background: url('../images/bt_ir_para.png') no-repeat; width: 126px; height:34px;} +.acao_encaminhar a {background: url('../images/bt_encaminhar_atend.png') no-repeat; width: 109px; height:37px;} +.acao_retornar_pausa a {background: url('../images/bt_retornar_pausa.jpg') no-repeat; width: 159px; height:34px;} +.acao_voltar_serv_interno a {background: url('../images/bt_voltar_serv_interno.png') no-repeat; width: 180px; height:37px;} +.acao_fechar_mesa a {background: url('../images/bt_fechar_mesa.jpg') no-repeat; width: 139px; height:34px;} +.acao_iniciar_pausa a {background: url('../images/bt_iniciar_pausa.jpg') no-repeat; width: 119px; height:36px;} +.acao_atender_ausente a {background: url('../images/bt_listar_ausentes.jpg') no-repeat; width: 148px; height:30px;} +.acao_disponivel a {background: url('../images/bt_disponivel.png') no-repeat; width: 105px; height:31px;} +.acao_iniciar_servico a {background: url('../images/bt_iniciar_servico.jpg') no-repeat; width: 165px; height:33px;} + +.opi a {font-size:0; text-indent: -999px; display: block; margin:15px auto 0 auto;} +.acao_opi_on a {background: url('../images/icon_opi_on.png') no-repeat; width: 23px; height:28px;} +.acao_opi_off a {background: url('../images/icon_opi_off.png') no-repeat; width: 23px; height:28px;} +.nick_azul {color: blue; font-size: 12px; font-weight: none; font-family: Arial; } +.nick_vermelho {color: red; font-size: 12px; font-weight: none; font-family: Arial; } +.chat_mensagem {color: black; font-size: 12px; font-weight: none; font-family: Arial;} + +#TitChat {background: url('../images/icon_chat.jpg') 48px 0 no-repeat; height: 24px;} +#ContainerMesas {height: 30px} + +#ContainerMesas h3 {font-weight: normal; margin: 0; padding: 0} +#TitMesas {background: url('../images/icon_mesa.jpg') 65px 0 no-repeat; height: 24px; float: left; width: 200px; text-align: left;} +#TitEncaminhamentos {background: url('../images/icon_encaminhar.png') 0px 0 no-repeat; height: 24px; float: right; width: 205px; +text-align:right} + + +#ContainerSenha {padding-top: 40px;} +#TitSenha {background: url('../images/icon_senha.jpg') 65px 0 no-repeat; height: 24px;} +#Senha {font-size: 50px;} + +#encaminhar {padding: 10px; margin:15px auto 0 auto;} + +.mesas {float: left; border: solid 1px #999; margin: 0.1em; width: 160px; height: 95px; font-size: 12px;} + +.mesas .guiche {color: #FFF; font-size: 25px; width: 28px; text-align: center;} +.mesas .guiche_ativo {background-color: #009933;} +.mesas .guiche_pausa {background-color: #FFCB08;} +.mesas .guiche_inativo {background-color: #ED1C24;} +.mesas .guiche_fechado {background-color: #c0c0c0;} + +#txtTexto, #txtDestinatario {border: 1px solid #999; padding:2px; font-family: Arial; font-size: 12px; color: #636563; margin: 10px 0 0 0;} +#BtEnviar {display:block; font-size:0; text-indent: -999px; padding: 0; margin: 10px auto 0 auto; border:0; +background: url('../images/bt_enviar_chat.jpg') no-repeat; width: 182px; height:22px; } + +#informacoes_status {font-size: 14px; padding-bottom: 20px;} +#informacoes_status .status {font-size: 20px;} +#servicos {padding-bottom: 20px;} +#bloco_informacoes {padding-bottom: 10px;} + +.motivo a { color: black; background: #DDD; text-decoration: none;} +.motivo a:hover { color: black; background: #FF8; text-decoration: none;} + + +#ContainerEncaminhamentos {padding: 10px;} + +#TabEncaminhamentos td {text-align: center;} +#TabEncaminhamentos {font-family: Arial; font-size: 12px;} + +.titulosTabela th {background-color: #ed1c24; color:#fff; font-weight:bold; border-bottom: solid 1px #999; text-align: left; padding: 4px;} +.titulosTabela tr, td {padding: 4px;} +.tabs {border: solid 1px #999; margin: 0.1em; font-family: Arial; font-size: 12px; padding: 0px; } +.adicionar a {background: url('../images/add.png') no-repeat; width: 87px; height:22px;} +.legend {font-family: Arial; font-size: 12px; font-weight: bold; color: #666;} + +.lista li { list-style-type: circle; list-style-position: outside; display: list-item;} + +/*************** Ajuda .html *************/ +#ConteudoAjuda h2 { clear: both; text-align: center; border-width: 3px; border-style: outset; border-color: #FF0000; } +#ConteudoAjuda h3 { clear: both; text-align: center; margin: 15px 0;} +#ConteudoAjuda h4 { clear: both; text-align: center; } +#ConteudoAjuda img { float: left; border: 1; border-width: 1px; border-style: solid; border-color: #000000; margin: 0 15px 15px 0;} +#ConteudoAjuda li { font-weight : bold; margin: 8px auto 0 25px; } +#ConteudoAjuda a { color: blue; text-decoration: underline; } +#ConteudoAjuda p { text-indent: 30px; margin: 15px 8px 0 auto; text-align: justify;} diff --git a/Fila-Administracao/root/static/doc/ajei/cat1.gif b/Fila-Administracao/root/static/doc/ajei/cat1.gif new file mode 100644 index 0000000..3f917be Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/cat1.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/cat2.gif b/Fila-Administracao/root/static/doc/ajei/cat2.gif new file mode 100644 index 0000000..48bdc9e Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/cat2.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/cat3.gif b/Fila-Administracao/root/static/doc/ajei/cat3.gif new file mode 100644 index 0000000..daaed38 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/cat3.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/cla1.gif b/Fila-Administracao/root/static/doc/ajei/cla1.gif new file mode 100644 index 0000000..867bbd5 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/cla1.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/cla2.gif b/Fila-Administracao/root/static/doc/ajei/cla2.gif new file mode 100644 index 0000000..630b92b Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/cla2.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/cla3.gif b/Fila-Administracao/root/static/doc/ajei/cla3.gif new file mode 100644 index 0000000..19cb5d9 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/cla3.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/func1.gif b/Fila-Administracao/root/static/doc/ajei/func1.gif new file mode 100644 index 0000000..7bc199e Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/func1.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/func2.gif b/Fila-Administracao/root/static/doc/ajei/func2.gif new file mode 100644 index 0000000..36ececc Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/func2.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/func3.gif b/Fila-Administracao/root/static/doc/ajei/func3.gif new file mode 100644 index 0000000..5449535 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/func3.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/int1.gif b/Fila-Administracao/root/static/doc/ajei/int1.gif new file mode 100644 index 0000000..9dcaa4e Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/int1.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/int2.gif b/Fila-Administracao/root/static/doc/ajei/int2.gif new file mode 100644 index 0000000..4a1397b Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/int2.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/int3.gif b/Fila-Administracao/root/static/doc/ajei/int3.gif new file mode 100644 index 0000000..9a48212 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/int3.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/loc1.gif b/Fila-Administracao/root/static/doc/ajei/loc1.gif new file mode 100644 index 0000000..476b0f9 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/loc1.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/loc10.gif b/Fila-Administracao/root/static/doc/ajei/loc10.gif new file mode 100644 index 0000000..996f107 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/loc10.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/loc2.gif b/Fila-Administracao/root/static/doc/ajei/loc2.gif new file mode 100644 index 0000000..897ccaf Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/loc2.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/loc3.gif b/Fila-Administracao/root/static/doc/ajei/loc3.gif new file mode 100644 index 0000000..9ff93a5 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/loc3.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/loc5.gif b/Fila-Administracao/root/static/doc/ajei/loc5.gif new file mode 100644 index 0000000..4b90b5b Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/loc5.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/loc6.gif b/Fila-Administracao/root/static/doc/ajei/loc6.gif new file mode 100644 index 0000000..c0fc99d Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/loc6.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/loc7.gif b/Fila-Administracao/root/static/doc/ajei/loc7.gif new file mode 100644 index 0000000..5e428dd Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/loc7.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/loc8.gif b/Fila-Administracao/root/static/doc/ajei/loc8.gif new file mode 100644 index 0000000..bc69012 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/loc8.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/loc9.gif b/Fila-Administracao/root/static/doc/ajei/loc9.gif new file mode 100644 index 0000000..7b7d40c Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/loc9.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/loccat.gif b/Fila-Administracao/root/static/doc/ajei/loccat.gif new file mode 100644 index 0000000..a6bba5c Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/loccat.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/locgui.gif b/Fila-Administracao/root/static/doc/ajei/locgui.gif new file mode 100644 index 0000000..d8a210f Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/locgui.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/loclim.gif b/Fila-Administracao/root/static/doc/ajei/loclim.gif new file mode 100644 index 0000000..8e5dc56 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/loclim.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/locopo.gif b/Fila-Administracao/root/static/doc/ajei/locopo.gif new file mode 100644 index 0000000..442e521 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/locopo.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/locopop.gif b/Fila-Administracao/root/static/doc/ajei/locopop.gif new file mode 100644 index 0000000..ad7d04b Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/locopop.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/menu.gif b/Fila-Administracao/root/static/doc/ajei/menu.gif new file mode 100644 index 0000000..dbc3260 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/menu.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/pe1.gif b/Fila-Administracao/root/static/doc/ajei/pe1.gif new file mode 100644 index 0000000..6dfc543 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/pe1.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/pe2.gif b/Fila-Administracao/root/static/doc/ajei/pe2.gif new file mode 100644 index 0000000..627d52d Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/pe2.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/pe4.gif b/Fila-Administracao/root/static/doc/ajei/pe4.gif new file mode 100644 index 0000000..4cd7f7b Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/pe4.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/pp1.gif b/Fila-Administracao/root/static/doc/ajei/pp1.gif new file mode 100644 index 0000000..dadfbcc Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/pp1.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/pp2.gif b/Fila-Administracao/root/static/doc/ajei/pp2.gif new file mode 100644 index 0000000..57a141c Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/pp2.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/pp3.gif b/Fila-Administracao/root/static/doc/ajei/pp3.gif new file mode 100644 index 0000000..922d268 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/pp3.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/serv1.gif b/Fila-Administracao/root/static/doc/ajei/serv1.gif new file mode 100644 index 0000000..f573c32 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/serv1.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/serv2.gif b/Fila-Administracao/root/static/doc/ajei/serv2.gif new file mode 100644 index 0000000..30cbed9 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/serv2.gif differ diff --git a/Fila-Administracao/root/static/doc/ajei/serv3.gif b/Fila-Administracao/root/static/doc/ajei/serv3.gif new file mode 100644 index 0000000..3db1b04 Binary files /dev/null and b/Fila-Administracao/root/static/doc/ajei/serv3.gif differ diff --git a/Fila-Administracao/root/static/doc/ajuda.html b/Fila-Administracao/root/static/doc/ajuda.html new file mode 100644 index 0000000..12179b4 --- /dev/null +++ b/Fila-Administracao/root/static/doc/ajuda.html @@ -0,0 +1,249 @@ + + + + + + Sistema de Atendimento + + + + +
+ +
+
+

Apostila do Treinamento

+

Atribuições do administrador

+

As principais atribuições do administrador neste sistema são:

+
  • Cadastrar atendentes e gerente;
  • +
  • Organizar categorias de senha, se necessário, criar novas;
  • +
  • Atribuir prioridades e limites às categorias de senha;
  • +
  • Criar limites de tempo para o atendente permanecer em um determinado estado, facilitando dessa forma a “fiscalização” do gerente;
  • +
  • Organizar e/ou criar novos serviços de atendimento;
  • +
  • Organizar e/ou criar novos serviços internos;
  • +
  • Organizar e/ou criar perguntas que serão feitas ao cidadão nos opiniômetros;
  • +
  • Organizar e/ou criar perguntas que serão feitas ao cidadão no opiniômetro da praça;
  • + +

    Conceitos

    +
      1. Opiniômetro: na praça, vão existir dois tipos de opiniômetro, um que estará ligado diretamente à mesa e outro que estará na praça, para que o usuário a qualquer momento, dê sua opinião a respeito dos questionamentos. Eles podem ou não exibir as mesmas perguntas.
    +
      2. Categoria: vão ser emitidas senhas de categorias diferentes de acordo com o necessidade do cidadão. As principais categorias são: Normal (N); Preferencial (P), destinada a gestantes, idosos, pessoas com criança de colo ou deficientes; Servidor (S), destinada a atendimento de servidores da prefeitura e Agendamento (A), que não será emitido através do emissor da praça já que se trata de um atendimento agendado pela Internet. Cada categoria tem uma prioridade determinada que pode ser reconfigurada de acordo com a necessidade de cada praça.
    +
      3. Atendente: funcionário que possui permissão para entrar no sistema e realizar atendimentos.
    +
      4. Gerente: atendente que recebe atribuição do administrador para gerenciar o expediente;
    +
      5. Serviço Atendimento: às vezes, durante o atendimento, é necessário consultar ou utilizar outros sistemas, como: Base de Conhecimento, SCUMA, SPU, etc. Cabe ao administrador, adicionar esses serviços ao local para que os atendentes possam registrar de maneira mais rápida as atividades realizadas.
    +
      6. Serviços (Interno): são serviços que o atendente precisa realizar e que o torna indisponível para atendimentos, como por exemplo: digitalizar documentos, consultar a Base de Conhecimento, xerox de documentos, dentre outros que o administrador julgar necessário.
    +
      7. Classes de Serviços: maneira de organizar serviços com a mesma funcionalidade.
    + +

    Interface do administrador

    + + +

    O campo “Menu” é sempre exibido do lado esquerdo da tela. Através dele, pode-se visualizar os seguintes itens:

    +
  • Categorias
  • +
  • Funcionários
  • +
  • Locais
  • +
  • Serviços
  • +
  • Serviços (interno)
  • +
  • Classes de Serviços
  • +
  • Perguntas do Opiniômetro
  • +
  • Perguntas do Opiniômetro (Praça)
  • +

    Detalharemos a seguir cada item:

    + +

    CATEGORIAS

    + +

    Figura inicial

    +

    Esta é a figura inicial que surge do lado direito da tela quando o item “Categoria” do "Menu" é pressionado.

    + +

    Este item exibe uma tabela com as categorias existentes no sistema e torna possível a criação de novas categorias através do botão “Adicionar”.

    +

    Como criar uma nova categoria?

    +
    +

    Ao se clicar o botão Adicionar, surgirá no lado direito da tela o campo “Dados da Categoria”. Para criar uma nova categoria, basta preenchê-lo corretamente e clicar no botão “Salvar”, o sistema atribui automaticamente um ID à nova categoria.

    +

    Como exibir os dados das categorias?

    + +

    Na figura inicial é mostrada uma tabela de categorias onde são exibidas as principais características de cada uma, como: ID, Nome e Código.

    +

    Ao se clicar no ID da categoria correspondente, é possível visualizá-lo e modificá-lo. Caso algma modificação seja realizada, é preciso pressionar o botão “Salvar” para se registrar as mudanças. Somente o campo ID não é passível de modificação.

    +

    Topo

    + +

    FUNCIONÁRIOS

    + +

    Figura inicial

    +

    Esta é a figura inicial que surge do lado direito da tela quando o item “Funcionario” do "Menu" é pressionado.

    + +

    Ao clicar neste item, o administrador poderá visualizar na tela todos os dados dos atendentes dentro de uma tabela. São exibidos o ID (número único de identificação dentro do banco de dados do sistema), + o Nome ( nome do atendente), o Nome de Usuário (identificação do atendente no momento do login), Atendente no Local(mostra se o funcionário é atendente no momento) e Gerente do Local + (mostra se o funcionário é o gerente do local).

    +

    Como criar um novo funcionário?

    + +

    Na tela inicial, acima da tabela, é possível visualizar o botão “Adicionar”. Este botão permite ao administrador criar, incluir novos atendentes.

    +

    Ao clicar esse botão, surge na tela o campo “Criar Funcionário”. Esta ação é muito fácil de ser executada, bastando para isso, preencher os campos com as informações Nome, + nome do funcionário, Nome de Ususário que é o nome utilizado para o login no sistema e clicar no botão Salvar. Exemplo, adicionar o atendente João da Silva:

    +

    Nome: João da Silva

    +

    Nome de usuário: joao

    +

    obs.: Nesse momento o funcionário ainda não é Atendente do local!

    +

    Como editar as características do funcionário?

    + +

    Na tabela mostrada na tela inicial, o ID do funcionário é um link para exibir suas características atuais. Ao clicar, surge o campo Dados do Funcionário onde são mostrados seus dados: ID, Nome, Nome de + Usuário, Nova Senha, Confirmar. Somente o ID não pode ser modificado. +
    +
    + Como tornar o Funcionário um Atendente ou Gerente do local? +

    Para que o funcionário passe a ser atendente, é preciso escolher o local em que ele será atendente e depois clicar no botão associar. O mesmo deve ser feito caso o administrador queira tornar o atendente + Gerente do Local.

    +

    Para que as possíveis modificações sejam registradas, é preciso clicar no botão Salvar.

    +

    Topo

    + +

    LOCAIS

    + +

    Figura inicial

    +

    Esta é a figura inicial que surge do lado direito da tela quando o item “Locais” do "Menu" é pressionado.

    + +

    Este item mostra um botão Adicionar e logo abaixo, uma tabela que exibe as principais características dos Locais existentes no sistema, como: ID; Data de Abertura; + Data Encerramento (onde se pode encerrar o local no sistema através do clique na palavra “Encerrar”); Nome; JID Emissor (o endereço do emissor no sistema que torna + possível a troca de informações); JID Painel(endereço no sistema para onde serão enviadas as informações que serão exibidas no painel do local) e JID Opiniometro (endereço no sistema + para onde são enviadas as informações ao opiniometro da praça).

    +

    Visualização dos dados do Local

    + +

    Com um clique no ID do local, pode-se visualizar o campo Dados do Local, com as configurações do local (ID, Data Abertura - constantes; Data Encerramento, pode encerrar o local clicando em Encerrar; + Nome; JID Emissor; JID Painel). Não é recomendável, apesar de ser possível, modificar os dados dos endereços dos JID's. Para salvar alguma alteração que tenha sido realizada, deve-se clicar no botão Salvar. + Logo abaixo, são exibidas cinco tabelas: Guichês, Categorias, Limites, Ordem das perguntas do opiniometro e Ordem das perguntas do opiniometro (praça).

    +

    As funções de cada tabela, serão explicadas individualmente.

    +

    1. Guichês

    + +

    Nessa tabela são exibidas as características de cada mesa associada ao local, como: ID (identificação da mesa no sistema e link para edição dos “Dados da Mesa”); + Identificador (o “nome” da mesa que aparece nas telas do gerente e do atendente); Abertura (data de atribuição da mesa ao local); Encerramento (onde se pode tornar a mesa indisponível no local + clicando na palavra “Encerrar”) e JID Opiniômetro (endereço usado para a comunicação do opiniômetro ligado à mesa com o sistema).

    +

    1.1. Como criar novas Mesas para o Local?

    + +

    Ao se clicar no botão Adicionar, logo abaixo da palavra Guichês mostrada na figura acima, é mostrado o campo Dados da Mesa. Para se criar uma nova mesa, basta + preencher corretamente os campos Identificador e JID Opiniômetro.

    +

    Após certificar-se que o preenchiento está correto, clique no botão Salvar.

    +

    1.2. Como editar os dados da Mesa?

    + +

    Como foi dito anteriormente, o ID da Mesa é um link para mostrar as características da Mesa correspondente. É possível encerrar a mesa clicando na palavra Encerrar, modificar o Identificador da mesa e/ou + modificar o JID Opiniometro.

    +

    No entanto, para que as modificações sejam registradas com sucesso, é preciso clicar no botão Salvar.

    +

    2. Categorias

    + +

    Nesta tabela, são exibidas as categorias de atendimento existentes no sistema bem como suas principais características, como :ID (identificação de cada categoria no sistema); Início (data que começou a fazer parte do local); + Fim (onde se pode tornar a categoria indisponível no sistema, clicando em “Encerrar”); Nome; Código (letra que representa a categoria); Prioridade (número que é multiplicado pelo tempo real de espera de cada senha dessa categoria, + ou seja, quanto maior esse número menos tempo a senha vai ficar na fila esperando já que para o sistema ela vai estar a mais tempo que as outras); Limite Tempo em Espera (tempo máximo de espera para senhas dessa categoria, ou seja, tempo que é + estipulado como ideal para a pessoa com a senha aguarde na fila); Limite de Pessoas em Espera (número máximo de senhas esperando pelo atendimento) e Ordem (ordem, de cima para baixo, em que as categorias são mostradas no emissor).

    +

    No entanto, para que a categoria esteja disponível no local, é preciso adicioná-la através do botão Adicionar. Acompanhe os detalhes no tópico abaixo.

    +

    2.1. Adicionando Categorias ao local

    + +

    Após o clique no botão Adicionar, aparecerá o campo Dados da Configuração então escolha a categoria na barra de seleção, digite a prioridade, o limite de espera em segundos, o limite de pessoas em espera e a ordem em que vai estar listada + no emissor (caso a categoria não seja mostrada no emissor, deve-se atribuir a ela a ordem '0'). Após certificar-se de que os dados estão corretos, clique no botão Salvar.

    +

    Obs.: Caso você configure a mesma categoria mais de uma vez, será considerada a configuraçã mais recente.

    +

    3.Limites

    + +

    Nesta tabela, são exibidas algumas características dos limites de tempo para cada possível estado da mesa, como: ID (identificação do estado da mesa no sistema); Início (data de criação do limite no sistema); Fim (onde se pode tornar + o limite indisponível para o local, clicando em “Encerrar”); Nome(estado da mesa); Limite (tempo em segundos de tolerância para a mesa ficar nesse estado).

    +

    3.1. Como atribuir Limites ao local?

    + +

    Para atribuir um limite a um determinado estado, basta clicar no botão Adicionar. Aparecerá o campo Dados do Limite então escolha o estado na barra de seleção, digite o limite de espera em segundos e clique no botão Salvar. +

    Lembrando que apenas o limite configurado mais recentemente do mesmo estado será considerado.

    +

    4. Ordem das perguntas do opiniômetro

    + +

    Mostra a ordem das perguntas que serão exibidas nos opiniômetros ligados às mesas de cima para baixo, bem como a sua data de início e fim no local. Para modificar as perguntas ou a ordem delas, deve-se clicar no botão Adicionar. Acompanhe passo-a-passo no tópico abaixo.

    +

    4.1. Modificando a ordem das perguntas do opiniômetro

    + +

    Aparecerá o campo Dados, onde se pode selecionar a 1ª, 2ª, 3ª, 4ª e 5ª pergunta. Em seguida, clique em Salvar.

    +

    Importante: Cuidado para não colocar perguntas repetidas!

    +

    5. Ordem das perguntas do opiniômetro(praça)

    + +

    Mostra a ordem das perguntas que serão exibidas no opiniômetro da praça de cima para baixo, bem como a sua data de início e fim no local. Para modificar a ordem ou as perguntas, deve-se clicar no botão Adicionar. Acompanhe passo-a-passo no tópico abaixo.

    +

    5.1. Modificando a ordem das perguntas do opiniômetro(praça)

    + +

    Aparecerá o campo Dados, onde se pode selecionar a 1ª, 2ª, 3ª, 4ª e 5ª pergunta. Em seguida, clique em Salvar.

    +

    Importante: Cuidado para não colocar perguntas repetidas!

    +

    Topo

    + +

    SERVIÇOS

    + +

    Tela inicial

    +

    Esta é a figura inicial que surge do lado direito da tela quando o item “Serviços” do "Menu" é pressionado.

    + +

    Este item exibe o botão Adicionar e uma tabela listando todos os serviços existentes durante o expediente, bem como suas principais características.

    +

    Na tabela, pode-se visualizar características do serviço, tais como: ID (que é um número de identificação do serviço no sistema e funciona como um link para a visualização e possíveis modificações do serviço); + data de abertura; data encerramento (onde se pode encerrar o serviço, ou seja, torná-lo indisponível no sistema, através do clique na palavra “Encerrar”); Nome do Serviço e a Classe correspondente.

    +

    Criando novos serviços

    + +

    O botão Adicionar ao ser pressionado, permite a criação de um novo serviço no sistema de maneira muito simples. Basta escrever o nome do serviço no campo Nome, escolher a Classe correspondente ao serviço na barra de seleção abaixo e pressionar o botão Salvar.

    +

    O sistema atribui automaticamente um ID ao novo serviço.

    +

    Modificando serviços já existentes

    + +

    Como já foi dito anteriormente, o ID do serviço é um link que ao ser clicado, abre o campo Dados do Serviço.

    +

    É possível visualizar os dados do serviço e modificar seu Nome e/ou sua Classe. No entanto, para se registrar as modificações é preciso clicar no botão Salvar.

    +

    Topo

    + +

    SERVIÇOS (INTERNO)

    + +

    Tela inicial

    +

    Esta é a figura inicial que surge do lado direito da tela quando o item “Serviços (interno)” do "Menu" é pressionado.

    + +

    Este item exibe o botão Adicionar e uma tabela listando todos os serviços internos existentes, bem como suas principais características.

    +

    Na tabela, pode-se visualizar características do serviço, tais como: ID (que é um número de identificação do serviço interno no sistema e funciona como um link para a visualização e possíveis modificações); + data de abertura; data encerramento (onde se pode encerrar o serviço no sistema, ou seja, torná-lo indisponível no sistema, através do clique na palavra “Encerrar”); Nome do Serviço e a Classe correspondente.

    +

    Criando novos serviços internos

    + +

    O botão Adicionar ao ser pressionado, permite a criação de um novo serviço interno no sistema de maneira muito simples. Basta escrever o nome do serviço no campo Nome, escolher a Classe correspondente ao serviço na barra de seleção abaixo e pressionar o botão Salvar.

    +

    O sistema atribui um ID ao novo serviço interno automaticamente.

    +

    Modificando serviços internos já existentes

    + +

    Como já foi dito anteriormente, o ID do serviço é um link que ao ser clicado, abre o campo Dados do Serviço.

    +

    É possível visualizar os dados do serviço interno e modificar seu Nome e/ou sua Classe. No entanto, para se registrar as modificações é preciso clicar no botão Salvar.

    +

    Topo

    + +

    CLASSES DE SERVIÇOS

    + +

    Tela inicial

    +

    Esta é a figura inicial que surge do lado direito da tela quando o item “Classes” do "Menu" é pressionado.

    + +

    Ao clicar neste item, é exibido uma tabela com as classes existentes no sistema, bem como seu ID e nome.

    +

    Visualizando os dados da Classe

    + +

    Ao se clicar no ID correspondente de cada classe, surge o campo Dados da classe, onde os dados da classe podem ser modificados, ou simplesmente conferidos.

    +

    Caso alguma alteração seja feita, para torná-la permanente, é necessário pressionar o botão Salvar.

    +

    Criando novas Classes

    + +

    Para adicionar uma nova classe, basta clicar no botão Adicionar (que é exibido acima da tabela de todas as classes existentes). Surgirá o campo “Adicionar Classe”, então é só preencher corretamente os dados ID e “Nome” e, em seguida, clicar em “Salvar”.

    +

    Topo

    + +

    PERGUNTAS DO OPINIÔMETRO

    + +

    Tela inicial

    +

    Esta é a figura inicial que surge do lado direito da tela quando o item “Perguntas do Opiniometro” do "Menu" é pressionado.

    + +

    Este item exibe um botão Adicionar e uma tabela com as configurações de cada pergunta, como: ID (identificação da pergunta no sistema que também funciona como link para edição e possíveis modificações na pergunta correspondente); Data de Abertura (data da criação da pergunta no sistema); + Data de encerramento(mostra a data de encerramento ou “Encerrar”, que deve ser pressionado para tornar a pergunta indisponível no sistema) e Pergunta(exibe a pergunta propriamente dita que é exibida em cada opiniômetro).

    +

    Criando as Perguntas

    + +

    O botão adicionar ao ser pressionado, cria um campo chamado Criar Pergunta e permite a implementação de uma nova pergunta no sistema. Para isso, basta escrever a pergunta e clicar no botão Salvar. O sistema cria um ID para a pergunta automaticamente.

    +

    Ao criar novas perguntas, tome o cuidado de não estar copiando uma pergunta que já existe ou estar fazendo a mesma pergunta com outras palavras!

    +

    Visualizando as Perguntas

    + +

    Como já foi dito, o ID da pergunta serve como link para a sua visualização. Após o pressionamento é mostrado o campo Dados da Pergunta, seu ID e a pergunta, que pode ser modificada.

    +

    Para se registrar as modificações é preciso pressionar o botão Salvar.

    +

    Topo

    + +

    PERGUNTAS DO OPINIÔMETRO (PRAÇA)

    + +

    Tela inicial

    +

    Esta é a figura inicial que surge do lado direito da tela quando o item “Perguntas do Opiniometro (praça)” do "Menu" é pressionado.

    + +

    Este item exibe um botão Adicionar e uma tabela com as configurações de cada pergunta, como: ID(identificação da pergunta da praça no sistema que também funciona como link para edição e possíveis modificações na pergunta correspondente); Data de Abertura (data da criação da pergunta da praça no sistema); + Data de encerramento(mostra a data de encerramento ou “Encerrar”, que deve ser pressionado para tornar a pergunta da praça indisponível no sistema) e Pergunta (exibe a pergunta que é exibida no opiniômetro da praça).

    +

    Criando as Perguntas

    + +

    O botão adicionar ao ser pressionado, cria um campo chamado Criar Pergunta e permite a implementação de uma nova pergunta no sistema. Para isso, basta escrever a pergunta e clicar no botão Salvar. O sistema cria um ID para a pergunta automaticamente.

    +

    Ao criar novas perguntas, tome o cuidado de não estar copiando uma pergunta que já existe ou estar fazendo a mesma pergunta com outras palavras!

    +

    Visualizando as Perguntas

    + +

    Como já foi dito, o ID da pergunta serve como link para a sua visualização. Após o pressionamento é mostrado o campo Dados da Pergunta, seu ID e a pergunta, que pode ser modificada.

    +

    Para se registrar as modificações é preciso pressionar o botão Salvar.

    +

    Topo

    + +
    + + + + + diff --git a/Fila-Administracao/root/static/images/add.png b/Fila-Administracao/root/static/images/add.png new file mode 100755 index 0000000..f1b131a Binary files /dev/null and b/Fila-Administracao/root/static/images/add.png differ diff --git a/Fila-Administracao/root/static/images/bg_cabecalho.gif b/Fila-Administracao/root/static/images/bg_cabecalho.gif new file mode 100644 index 0000000..8a36c02 Binary files /dev/null and b/Fila-Administracao/root/static/images/bg_cabecalho.gif differ diff --git a/Fila-Administracao/root/static/images/bg_cabecalho.jpg b/Fila-Administracao/root/static/images/bg_cabecalho.jpg new file mode 100644 index 0000000..c8f4a3f Binary files /dev/null and b/Fila-Administracao/root/static/images/bg_cabecalho.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_abrir_local.jpg b/Fila-Administracao/root/static/images/bt_abrir_local.jpg new file mode 100644 index 0000000..82ccc75 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_abrir_local.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_concluir_atend.png b/Fila-Administracao/root/static/images/bt_concluir_atend.png new file mode 100644 index 0000000..5f4feb1 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_concluir_atend.png differ diff --git a/Fila-Administracao/root/static/images/bt_devol_senha.png b/Fila-Administracao/root/static/images/bt_devol_senha.png new file mode 100644 index 0000000..df19ed1 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_devol_senha.png differ diff --git a/Fila-Administracao/root/static/images/bt_disponivel.png b/Fila-Administracao/root/static/images/bt_disponivel.png new file mode 100644 index 0000000..c8e13da Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_disponivel.png differ diff --git a/Fila-Administracao/root/static/images/bt_encaminhar_atend.png b/Fila-Administracao/root/static/images/bt_encaminhar_atend.png new file mode 100644 index 0000000..d769e34 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_encaminhar_atend.png differ diff --git a/Fila-Administracao/root/static/images/bt_encerrar_senhas.jpg b/Fila-Administracao/root/static/images/bt_encerrar_senhas.jpg new file mode 100644 index 0000000..88c69a0 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_encerrar_senhas.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_entrar_login.jpg b/Fila-Administracao/root/static/images/bt_entrar_login.jpg new file mode 100644 index 0000000..9ce39d5 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_entrar_login.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_enviar_chat.jpg b/Fila-Administracao/root/static/images/bt_enviar_chat.jpg new file mode 100644 index 0000000..bbac442 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_enviar_chat.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_fechar_local.jpg b/Fila-Administracao/root/static/images/bt_fechar_local.jpg new file mode 100644 index 0000000..938c560 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_fechar_local.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_fechar_mesa.jpg b/Fila-Administracao/root/static/images/bt_fechar_mesa.jpg new file mode 100644 index 0000000..79825d2 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_fechar_mesa.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_fechar_mesas.jpg b/Fila-Administracao/root/static/images/bt_fechar_mesas.jpg new file mode 100644 index 0000000..d7866d5 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_fechar_mesas.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_forcar_fechar.png b/Fila-Administracao/root/static/images/bt_forcar_fechar.png new file mode 100644 index 0000000..c0467c6 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_forcar_fechar.png differ diff --git a/Fila-Administracao/root/static/images/bt_iniciar_atend.png b/Fila-Administracao/root/static/images/bt_iniciar_atend.png new file mode 100644 index 0000000..ace04ec Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_iniciar_atend.png differ diff --git a/Fila-Administracao/root/static/images/bt_iniciar_pausa.jpg b/Fila-Administracao/root/static/images/bt_iniciar_pausa.jpg new file mode 100644 index 0000000..a7af474 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_iniciar_pausa.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_iniciar_servico.jpg b/Fila-Administracao/root/static/images/bt_iniciar_servico.jpg new file mode 100644 index 0000000..624b4b1 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_iniciar_servico.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_ir_para.png b/Fila-Administracao/root/static/images/bt_ir_para.png new file mode 100755 index 0000000..eb205fe Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_ir_para.png differ diff --git a/Fila-Administracao/root/static/images/bt_listar_ausentes.jpg b/Fila-Administracao/root/static/images/bt_listar_ausentes.jpg new file mode 100644 index 0000000..3f4927e Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_listar_ausentes.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_ok.jpg b/Fila-Administracao/root/static/images/bt_ok.jpg new file mode 100644 index 0000000..5395197 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_ok.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_registrar_ausencia.png b/Fila-Administracao/root/static/images/bt_registrar_ausencia.png new file mode 100644 index 0000000..46b4ce4 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_registrar_ausencia.png differ diff --git a/Fila-Administracao/root/static/images/bt_retornar_pausa.jpg b/Fila-Administracao/root/static/images/bt_retornar_pausa.jpg new file mode 100644 index 0000000..697571d Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_retornar_pausa.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_voltar.jpg b/Fila-Administracao/root/static/images/bt_voltar.jpg new file mode 100644 index 0000000..a7af474 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_voltar.jpg differ diff --git a/Fila-Administracao/root/static/images/bt_voltar_serv_interno.png b/Fila-Administracao/root/static/images/bt_voltar_serv_interno.png new file mode 100644 index 0000000..1380374 Binary files /dev/null and b/Fila-Administracao/root/static/images/bt_voltar_serv_interno.png differ diff --git a/Fila-Administracao/root/static/images/btn_120x50_built.png b/Fila-Administracao/root/static/images/btn_120x50_built.png new file mode 100644 index 0000000..c709fd6 Binary files /dev/null and b/Fila-Administracao/root/static/images/btn_120x50_built.png differ diff --git a/Fila-Administracao/root/static/images/btn_120x50_built_shadow.png b/Fila-Administracao/root/static/images/btn_120x50_built_shadow.png new file mode 100644 index 0000000..15142fe Binary files /dev/null and b/Fila-Administracao/root/static/images/btn_120x50_built_shadow.png differ diff --git a/Fila-Administracao/root/static/images/btn_120x50_powered.png b/Fila-Administracao/root/static/images/btn_120x50_powered.png new file mode 100644 index 0000000..7249b47 Binary files /dev/null and b/Fila-Administracao/root/static/images/btn_120x50_powered.png differ diff --git a/Fila-Administracao/root/static/images/btn_120x50_powered_shadow.png b/Fila-Administracao/root/static/images/btn_120x50_powered_shadow.png new file mode 100644 index 0000000..e6876c0 Binary files /dev/null and b/Fila-Administracao/root/static/images/btn_120x50_powered_shadow.png differ diff --git a/Fila-Administracao/root/static/images/btn_88x31_built.png b/Fila-Administracao/root/static/images/btn_88x31_built.png new file mode 100644 index 0000000..007b5db Binary files /dev/null and b/Fila-Administracao/root/static/images/btn_88x31_built.png differ diff --git a/Fila-Administracao/root/static/images/btn_88x31_built_shadow.png b/Fila-Administracao/root/static/images/btn_88x31_built_shadow.png new file mode 100644 index 0000000..ccf4624 Binary files /dev/null and b/Fila-Administracao/root/static/images/btn_88x31_built_shadow.png differ diff --git a/Fila-Administracao/root/static/images/btn_88x31_powered.png b/Fila-Administracao/root/static/images/btn_88x31_powered.png new file mode 100644 index 0000000..8f0cd9f Binary files /dev/null and b/Fila-Administracao/root/static/images/btn_88x31_powered.png differ diff --git a/Fila-Administracao/root/static/images/btn_88x31_powered_shadow.png b/Fila-Administracao/root/static/images/btn_88x31_powered_shadow.png new file mode 100644 index 0000000..aa776fa Binary files /dev/null and b/Fila-Administracao/root/static/images/btn_88x31_powered_shadow.png differ diff --git a/Fila-Administracao/root/static/images/catalyst_logo.png b/Fila-Administracao/root/static/images/catalyst_logo.png new file mode 100644 index 0000000..21f1cac Binary files /dev/null and b/Fila-Administracao/root/static/images/catalyst_logo.png differ diff --git a/Fila-Administracao/root/static/images/icon_atend_atrasados.jpg b/Fila-Administracao/root/static/images/icon_atend_atrasados.jpg new file mode 100644 index 0000000..0d20cc9 Binary files /dev/null and b/Fila-Administracao/root/static/images/icon_atend_atrasados.jpg differ diff --git a/Fila-Administracao/root/static/images/icon_cat.jpg b/Fila-Administracao/root/static/images/icon_cat.jpg new file mode 100644 index 0000000..ad2fbd4 Binary files /dev/null and b/Fila-Administracao/root/static/images/icon_cat.jpg differ diff --git a/Fila-Administracao/root/static/images/icon_chat.jpg b/Fila-Administracao/root/static/images/icon_chat.jpg new file mode 100644 index 0000000..29e0f2b Binary files /dev/null and b/Fila-Administracao/root/static/images/icon_chat.jpg differ diff --git a/Fila-Administracao/root/static/images/icon_encaminhar.png b/Fila-Administracao/root/static/images/icon_encaminhar.png new file mode 100755 index 0000000..2e26ec7 Binary files /dev/null and b/Fila-Administracao/root/static/images/icon_encaminhar.png differ diff --git a/Fila-Administracao/root/static/images/icon_mesa.jpg b/Fila-Administracao/root/static/images/icon_mesa.jpg new file mode 100644 index 0000000..e0d2703 Binary files /dev/null and b/Fila-Administracao/root/static/images/icon_mesa.jpg differ diff --git a/Fila-Administracao/root/static/images/icon_opi_off.png b/Fila-Administracao/root/static/images/icon_opi_off.png new file mode 100755 index 0000000..0fbab9a Binary files /dev/null and b/Fila-Administracao/root/static/images/icon_opi_off.png differ diff --git a/Fila-Administracao/root/static/images/icon_opi_on.png b/Fila-Administracao/root/static/images/icon_opi_on.png new file mode 100755 index 0000000..37fef93 Binary files /dev/null and b/Fila-Administracao/root/static/images/icon_opi_on.png differ diff --git a/Fila-Administracao/root/static/images/icon_relogio.jpg b/Fila-Administracao/root/static/images/icon_relogio.jpg new file mode 100644 index 0000000..08ddb51 Binary files /dev/null and b/Fila-Administracao/root/static/images/icon_relogio.jpg differ diff --git a/Fila-Administracao/root/static/images/icon_senha.jpg b/Fila-Administracao/root/static/images/icon_senha.jpg new file mode 100644 index 0000000..1600548 Binary files /dev/null and b/Fila-Administracao/root/static/images/icon_senha.jpg differ diff --git a/Fila-Administracao/root/static/images/icon_servico.jpg b/Fila-Administracao/root/static/images/icon_servico.jpg new file mode 100644 index 0000000..1321f41 Binary files /dev/null and b/Fila-Administracao/root/static/images/icon_servico.jpg differ diff --git a/Fila-Administracao/script/fila_administracao_fastcgi.pl b/Fila-Administracao/script/fila_administracao_fastcgi.pl new file mode 100755 index 0000000..d9265eb --- /dev/null +++ b/Fila-Administracao/script/fila_administracao_fastcgi.pl @@ -0,0 +1,52 @@ +#!/usr/bin/perl -w +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +BEGIN { $ENV{CATALYST_ENGINE} ||= 'FastCGI' } + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use Fila::Administracao; + +my $help = 0; +my ( $listen, $nproc, $pidfile, $manager, $detach, $keep_stderr ); + +GetOptions( + 'help|?' => \$help, + 'listen|l=s' => \$listen, + 'nproc|n=i' => \$nproc, + 'pidfile|p=s' => \$pidfile, + 'manager|M=s' => \$manager, + 'daemon|d' => \$detach, + 'keeperr|e' => \$keep_stderr, +); + +pod2usage(1) if $help; + +Fila::Administracao->run( + $listen, + { nproc => $nproc, + pidfile => $pidfile, + manager => $manager, + detach => $detach, + keep_stderr => $keep_stderr, + } +); diff --git a/Fila-Agendamento/fila_agendamento.yml b/Fila-Agendamento/fila_agendamento.yml new file mode 100644 index 0000000..7652e38 --- /dev/null +++ b/Fila-Agendamento/fila_agendamento.yml @@ -0,0 +1,14 @@ +--- +name: Fila::Agendamento +Model::DB: + schema_class: 'Fila::Agendamento::DB' + connect_info: + - 'dbi:Pg:host=localhost;database=agendamento;user=postgres;password=123' +View::Email: + sender: + mailer: IO + default: + content_type: text/plain + charset: utf8 + view: TT + from: agendamento@atendimento.fortaleza.ce.gov.br diff --git a/Fila-Agendamento/lib/Fila/Agendamento.pm b/Fila-Agendamento/lib/Fila/Agendamento.pm new file mode 100644 index 0000000..b76fc3e --- /dev/null +++ b/Fila-Agendamento/lib/Fila/Agendamento.pm @@ -0,0 +1,48 @@ +package Fila::Agendamento; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; + +use Catalyst::Runtime '5.70'; + +use parent qw/Catalyst/; + +our $VERSION = '0.01'; + +__PACKAGE__->config( name => 'Fila::Agendamento' ); + +__PACKAGE__->setup(qw/-Debug ConfigLoader Static::Simple Session + Session::Store::FastMmap Session::State::Cookie Unicode/); + +1; + +__END__ + +=head1 NAME + +Fila::Agendamento - Aplicação de Agendamento + +=head1 DESCRIPTION + +Esta aplicação é responsável pelo agendamento de atendimentos, ele +utiliza um banco de dados separado para permitir a configuração dessa +aplicação em um ambiente de rede completamente separado. + +=cut + diff --git a/Fila-Agendamento/lib/Fila/Agendamento/Controller/Root.pm b/Fila-Agendamento/lib/Fila/Agendamento/Controller/Root.pm new file mode 100644 index 0000000..d8ba4b1 --- /dev/null +++ b/Fila-Agendamento/lib/Fila/Agendamento/Controller/Root.pm @@ -0,0 +1,172 @@ +package Fila::Agendamento::Controller::Root; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use Business::BR::Ids qw( test_id canon_id ); +use parent 'Catalyst::Controller'; + +__PACKAGE__->config->{namespace} = ''; + +sub index : Path Args(0) { + my ($self, $c) = @_; + # No primeiro passo vai mostrar o formulário para preencher os + # dados pessoais e para escolher o local. + $c->stash->{local} = $c->model('DB::Local')->search; +} + + +my %names = + ( nome => 'nome', + tipopessoa => 'pessoa física ou jurídica', + cnpjf => 'CPF/CNPJ', + id_local => 'praça de atendimento', + email => 'endereço de email' ); + +sub passo0 : Local Args(0) { + my ($self, $c) = @_; + # guardar os dados na sessao, e redirecionar para a escolha do local + # data e hora. + my @missing; + for (qw(nome tipopessoa cnpjf id_local email)) { + push @missing, $_ unless $c->req->param($_); + $c->session->{$_} = $c->req->param($_); + $c->stash->{$_} = $c->req->param($_); + } + + if ($c->req->param('tipopessoa') eq 'F' && test_id('cpf', $c->req->param('cnpjf'))) { + $c->session->{cnpjf} = canon_id('cpf',$c->req->param('cnpjf')); + } elsif ($c->req->param('tipopessoa') eq 'J' && test_id('cnpj', $c->req->param('cnpjf'))) { + $c->session->{cnpjf} = canon_id('cnpj',$c->req->param('cnpjf')); + } else { + push @missing, 'cnpjf'; + } + + if (@missing) { + $c->stash->{error} = + 'Todos os campos são obrigatórios: '. + (join ', ', map { $names{$_} } @missing); + $c->stash->{template} = 'index.tt'; + $c->forward('/index'); + } else { + $c->res->redirect($c->uri_for('/'.$c->req->param('id_local').'/passo1')); + } +} + +sub preload :Chained :PathPart('') :CaptureArgs(1) { + my ($self, $c, $id_local) = @_; + $c->stash->{local} = + $c->model('DB::Local')->find({ id_local => $id_local }); +} + +sub passo1 :Chained('preload') :Args(0) { + my ($self, $c) = @_; + $c->stash->{error} = $c->flash->{error}; +} + +sub passo2 :Chained('preload') :Args(2) { + my ($self, $c, $date, $time) = @_; + + # vamos então criar o atendimento + my ($ano, $mes, $dia) = split /-/, $date; + my ($hora, $minuto) = split /:/, $time; + my $dt = DateTime->new + ( year => $ano, + month => $mes, + day => $dia, + hour => $hora, + minute => $minuto, + time_zone => 'local' ); + my $senha = 'A'.$hora.(int($minuto / 15)); + + my $dt_day_ini = $dt->clone(); + $dt_day_ini->set + ( hour => 0, + minute => 0, + second => 0 ); + + my $dt_day_fim = $dt->clone(); + $dt_day_fim->set + ( hour => 23, + minute => 59, + second => 59 ); + + $c->model('DB')->schema->txn_do + (sub { + my $at = + $c->stash->{local}->atendimentos->find({ data => $dt }); + my $at2 = + $c->stash->{local}->atendimentos->search + ({ cnpjf => $c->session->{cnpjf}, + -and => [ { data => { '>=' => $dt_day_ini } }, + { data => { '<=' => $dt_day_fim } } ] })->first; + if ($at) { + $c->flash->{error} = '

    Agendamento não realizado, horário não disponível.

    '; + $c->res->redirect($c->uri_for('/'.$c->stash->{local}->id_local.'/passo1')); + } if ($at2) { + $c->flash->{error} = + '

    Você já tinha um atendimento para esse dia, verifique as informações abaixo.

    '; + $c->session->{id_atendimento} = $at2->id_atendimento; + $c->res->redirect($c->uri_for('/atendimento/')); + } else { + $at = $c->stash->{local}->atendimentos->create + ({ ( map { $_ => $c->session->{$_} } + qw(nome tipopessoa cnpjf email)), + data => $dt, + senha => $senha }); + $c->session->{id_atendimento} = $at->id_atendimento; + $c->res->redirect($c->uri_for('/atendimento/')); + } + }); + +} + +sub atendimento :Local :Args(0) { + my ($self, $c) = @_; + my $id_atendimento = $c->session->{id_atendimento}; + $c->stash->{error} = $c->flash->{error}; + $c->stash->{atendimento} = + $c->model('DB::Atendimento')->find + ({ id_atendimento => $id_atendimento }, + { prefetch => 'local' }); + + $c->stash->{email} = + { to => $c->stash->{atendimento}->email, + subject => 'Informações do seu agendamento', + template => 'email_atendimento.tt' }; + $c->forward($c->view('Email')); + $c->forward($c->view('TT')); +} + +sub end :ActionClass('RenderView') {} + +1; + +__END__ + +=head1 NAME + +Root - Controller principal do Agendamento + +=head1 DESCRIPTION + +Considerando a simplicidade do sistema de agendamento, toda a lógica +de interface é implementada nesse módulo. + +=cut + diff --git a/Fila-Agendamento/lib/Fila/Agendamento/DB.pm b/Fila-Agendamento/lib/Fila/Agendamento/DB.pm new file mode 100644 index 0000000..04f5040 --- /dev/null +++ b/Fila-Agendamento/lib/Fila/Agendamento/DB.pm @@ -0,0 +1,37 @@ +package Fila::Agendamento::DB; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class::Schema); + +__PACKAGE__->load_classes(); + +1; + +__END__ + +=head1 NAME + +DB - Configura o Schema do DBIx::Class + +=head1 DESCRIPTION + +Este é um módulo que estabelece o schema do DBIx::Class que é +posteriormente utilizado pela aplicação Catalyst. + +=cut + diff --git a/Fila-Agendamento/lib/Fila/Agendamento/DB/Atendimento.pm b/Fila-Agendamento/lib/Fila/Agendamento/DB/Atendimento.pm new file mode 100644 index 0000000..24cfbaa --- /dev/null +++ b/Fila-Agendamento/lib/Fila/Agendamento/DB/Atendimento.pm @@ -0,0 +1,78 @@ +package Fila::Agendamento::DB::Atendimento; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('atendimento'); +__PACKAGE__->add_columns + ( + id_atendimento => + { + data_type => 'integer', + is_auto_increment => 1, + }, + data => + { + data_type => 'timestamp with time zone', + }, + id_local => + { + data_type => 'integer' + }, + nome => + { + data_type => 'varchar' + }, + email => + { + data_type => 'varchar' + }, + tipopessoa => + { + data_type => 'varchar', + }, + cnpjf => + { + data_type => 'varchar', + }, + senha => + { + data_type => 'varchar', + } + ); +__PACKAGE__->set_primary_key(qw(id_atendimento)); + +__PACKAGE__->belongs_to('local', 'Fila::Agendamento::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); + +1; + +__END__ + +=head1 NAME + +Atendimento - Armazena os agendamentos realizados + +=head1 DESCRIPTION + +No sistema de agendamento, ficam armazenados nessa tabela todos os +agendamentos realizados. + +=cut + diff --git a/Fila-Agendamento/lib/Fila/Agendamento/DB/Expediente.pm b/Fila-Agendamento/lib/Fila/Agendamento/DB/Expediente.pm new file mode 100644 index 0000000..c234411 --- /dev/null +++ b/Fila-Agendamento/lib/Fila/Agendamento/DB/Expediente.pm @@ -0,0 +1,67 @@ +package Fila::Agendamento::DB::Expediente; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('expediente'); +__PACKAGE__->add_columns + ( + id_expediente => + { + data_type => 'integer', + is_autoincrement => 1, + }, + id_local => + { + data_type => 'integer', + }, + dia_semana => + { + data_type => 'integer', + }, + hora_inicio => + { + data_type => 'integer', + }, + hora_fim => + { + data_type => 'integer', + } + ); +__PACKAGE__->set_primary_key(qw(id_expediente)); + +__PACKAGE__->belongs_to('local', 'Fila::Agendamento::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); + +1; + +__END__ + +=head1 NAME + +Expediente - Lista cada expediente do local + +=head1 DESCRIPTION + +Permite a configuração da hora de inicio e fim de cada dia da semana +para cada local, permitindo configurar, por exemplo, o funcionamento +apenas pela manhã no sábado. + +=cut + diff --git a/Fila-Agendamento/lib/Fila/Agendamento/DB/Feriado.pm b/Fila-Agendamento/lib/Fila/Agendamento/DB/Feriado.pm new file mode 100644 index 0000000..d7ae504 --- /dev/null +++ b/Fila-Agendamento/lib/Fila/Agendamento/DB/Feriado.pm @@ -0,0 +1,57 @@ +package Fila::Agendamento::DB::Feriado; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('feriado'); +__PACKAGE__->add_columns + ( + id_local => + { + data_type => 'integer', + }, + data => + { + data_type => 'date', + }, + descricao => + { + data_type => 'varchar', + } + ); +__PACKAGE__->set_primary_key(qw(id_local data)); + +__PACKAGE__->belongs_to('local', 'Fila::Agendamento::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); + +1; + +__END__ + +=head1 NAME + +Feriado - Dias de não funcionamento dos locais + +=head1 DESCRIPTION + +Utiliza-se essa tabela para configurar os dias extra-ordinários nos +quais a praça de atendimento não funciona. + +=cut + diff --git a/Fila-Agendamento/lib/Fila/Agendamento/DB/IntervalosView.pm b/Fila-Agendamento/lib/Fila/Agendamento/DB/IntervalosView.pm new file mode 100644 index 0000000..34c423e --- /dev/null +++ b/Fila-Agendamento/lib/Fila/Agendamento/DB/IntervalosView.pm @@ -0,0 +1,58 @@ +package Fila::Agendamento::DB::IntervalosView; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('intervalos'); +__PACKAGE__->add_columns + ( + inicio => + { + data_type => 'timestamp with time zone', + }, + fim => + { + data_type => 'timestamp with time zone' + } + ); + +1; +__END__ + +=head1 NAME + +Fila::Agendamento::DB::IntervalosView - Acesso ao view intervalos + +=head1 SYNOPSIS + + CREATE VIEW intervalos AS SELECT inicio, inicio + interval '15 + minutes' AS fim FROM (select (date_trunc('day',now()) + dias * + interval '1 day' + hora * interval '1 hour' + atend * interval '15 + minutes') AS inicio from generate_series(0,15) dias, + generate_series(8, 17) hora, generate_series(0,3) atend) AS + t(inicio) WHERE extract(dow FROM t.inicio) between 1 and 5 AND + t.inicio >= NOW() + interval '1 hour'; + +=head1 DESCRIPTION + +Este view é utilizado para listar os próximos intervalos possíveis +para o registro de novos agendamentos. + +=cut + diff --git a/Fila-Agendamento/lib/Fila/Agendamento/DB/Local.pm b/Fila-Agendamento/lib/Fila/Agendamento/DB/Local.pm new file mode 100644 index 0000000..3b72e28 --- /dev/null +++ b/Fila-Agendamento/lib/Fila/Agendamento/DB/Local.pm @@ -0,0 +1,143 @@ +package Fila::Agendamento::DB::Local; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use DateTime; +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('local'); +__PACKAGE__->add_columns + ( + id_local => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone' + }, + nome => + { + data_type => 'varchar', + }, + ); +__PACKAGE__->set_primary_key(qw(id_local)); + +__PACKAGE__->has_many('atendimentos', 'Fila::Agendamento::DB::Atendimento', + { 'foreign.id_local' => 'self.id_local' }); + +__PACKAGE__->has_many('expedientes', 'Fila::Agendamento::DB::Expediente', + { 'foreign.id_local' => 'self.id_local' }); + +__PACKAGE__->has_many('feriados', 'Fila::Agendamento::DB::Feriado', + { 'foreign.id_local' => 'self.id_local' }); + + +sub obter_grid { + my ($self, $clean) = @_; + + my $sql = <= e.hora_inicio + AND extract('hour' FROM i.inicio) <= e.hora_fim - 1 + AND e.id_local=l.id_local AND f.id_local IS NULL) +LEFT JOIN atendimento a +ON (a.id_local = l.id_local + AND a.data >= i.inicio + AND a.data < i.fim) +WHERE i.inicio < DATE_TRUNC('day',NOW()) + interval '10 days' +GROUP BY l.id_local, l.nome, i.inicio +ORDER BY hora, dia; +EOF + + my $storage = $self->result_source->storage; + $storage->ensure_connected(); + my $sth = $storage->sth($sql); + $sth->execute($self->id_local); + + my $grid; + while (my ($dia, $hora, $exp, $at) = $sth->fetchrow_array) { + + $hora =~ s/\:..$//; + + $grid ||= + { dias => {}, + horas => {} }; + my $info = $exp ? ( $at ? 'Ocupado' : 'Livre' ) : 'Indisp'; + $grid->{dias}{$dia}{$hora} = $info; + $grid->{horas}{$hora}{$dia} = $info; + } + + my $horas = $grid->{horas}; + if ($clean) { + $horas = + { map { $_ => $grid->{horas}{$_} } + grep { + my $hora = $_; + grep { $grid->{horas}{$hora}{$_} !~ /Indisp/ } + keys %{$grid->{horas}{$hora}} + } + keys %{$grid->{horas}} }; + } + $grid->{horas} = $horas; + + $grid->{idx_horas} = [ sort keys %{$grid->{horas}} ]; + $grid->{idx_dias} = [ sort keys %{$grid->{dias}} ]; + $grid->{dow_dias} = [ map { + my ($a,$m,$d) = split /-/, $_; + my $dt = DateTime->new(year => $a, + month => $m, + day => $d, + locale => 'pt_BR'); + } @{$grid->{idx_dias}} ]; + + return $grid; +} + +1; + +__END__ + +=head1 NAME + +Local - Define cada local para agendamento + +=head1 DESCRIPTION + +Cada local de agendamento deve ter o seu registro, e é através dessa +entidade que é montada a grelha dos horários livres ou ocupados que é +exibida na interface. + +=cut + diff --git a/Fila-Agendamento/lib/Fila/Agendamento/Model/DB.pm b/Fila-Agendamento/lib/Fila/Agendamento/Model/DB.pm new file mode 100644 index 0000000..76b60fb --- /dev/null +++ b/Fila-Agendamento/lib/Fila/Agendamento/Model/DB.pm @@ -0,0 +1,38 @@ +package Fila::Agendamento::Model::DB; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Model::DBIC::Schema'; + + +1; + +__END__ + +=head1 NAME + +Fila::Agendamento::Model::DB - Modelo de dados para o agendamento + +=head1 DESCRIPTION + +Esse módulo define, seguindo a configuração em fila_agendamento.yml, o +modelo de dados para o sistema de agendamento. + +=cut + diff --git a/Fila-Agendamento/lib/Fila/Agendamento/View/Email.pm b/Fila-Agendamento/lib/Fila/Agendamento/View/Email.pm new file mode 100644 index 0000000..082fdbc --- /dev/null +++ b/Fila-Agendamento/lib/Fila/Agendamento/View/Email.pm @@ -0,0 +1,36 @@ +package Fila::Agendamento::View::Email; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use base 'Catalyst::View::Email::Template'; + +__PACKAGE__->config( + stash_key => 'email' +); + +=head1 NAME + +Fila::Agendamento::View::Email - Email View for Fila::Agendamento + +=head1 DESCRIPTION + +View for sending email from Fila::Agendamento. + +=cut + +1; diff --git a/Fila-Agendamento/lib/Fila/Agendamento/View/TT.pm b/Fila-Agendamento/lib/Fila/Agendamento/View/TT.pm new file mode 100644 index 0000000..3254616 --- /dev/null +++ b/Fila-Agendamento/lib/Fila/Agendamento/View/TT.pm @@ -0,0 +1,34 @@ +package Fila::Agendamento::View::TT; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use base 'Catalyst::View::TT'; + +__PACKAGE__->config(TEMPLATE_EXTENSION => '.tt'); + +=head1 NAME + +Fila::Agendamento::View::TT - TT View para Fila::Agendamento + +=head1 DESCRIPTION + +TT View para Fila::Agendamento. + +=cut + +1; diff --git a/Fila-Agendamento/root/atendimento.tt b/Fila-Agendamento/root/atendimento.tt new file mode 100644 index 0000000..0c7e9b3 --- /dev/null +++ b/Fila-Agendamento/root/atendimento.tt @@ -0,0 +1,35 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +

    Informações do Agendamento

    +

    Imprima esta tela, ela é o seu comprovante do agendamento. + O agendamento é pessoal e intransferível.

    +[% error %] + + + + + + + + +
    Senha [% atendimento.senha %] - [% atendimento.local.nome %]
    Data e Hora: [% atendimento.data.strftime('%d/%m/%Y %H:%M') %]
    Nome: [% atendimento.nome %]
    CPF/CNPJ: [% atendimento.cnpjf %]
    Email: [% atendimento.email %]
    + +[% INCLUDE 'footer.tt' %] \ No newline at end of file diff --git a/Fila-Agendamento/root/email_atendimento.tt b/Fila-Agendamento/root/email_atendimento.tt new file mode 100644 index 0000000..3819e94 --- /dev/null +++ b/Fila-Agendamento/root/email_atendimento.tt @@ -0,0 +1,33 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +Informações de Atendimento + +Imprima este email, ele é o seu comprovante do agendamento. O +agendamento é pessoal e intransferível. + +Praça: [% atendimento.local.nome %] +Senha: [% atendimento.senha %] +Data e Hora: [% atendimento.data.strftime('%d/%m/%Y %H:%M') %] +Nome: [% atendimento.nome %] +CPF/CNPJ: [% atendimento.cnpjf %] +Email: [% atendimento.email %] + + +Sistema de Atendimento +Prefeitura de Fortaleza \ No newline at end of file diff --git a/Fila-Agendamento/root/favicon.ico b/Fila-Agendamento/root/favicon.ico new file mode 100644 index 0000000..5ad723d Binary files /dev/null and b/Fila-Agendamento/root/favicon.ico differ diff --git a/Fila-Agendamento/root/footer.tt b/Fila-Agendamento/root/footer.tt new file mode 100644 index 0000000..c189a17 --- /dev/null +++ b/Fila-Agendamento/root/footer.tt @@ -0,0 +1,25 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +
    + + + + diff --git a/Fila-Agendamento/root/header.tt b/Fila-Agendamento/root/header.tt new file mode 100644 index 0000000..5971f3b --- /dev/null +++ b/Fila-Agendamento/root/header.tt @@ -0,0 +1,30 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + + + + Sistema de Atendimento + + + + +
    + +
    +
    diff --git a/Fila-Agendamento/root/index.tt b/Fila-Agendamento/root/index.tt new file mode 100644 index 0000000..9ac8936 --- /dev/null +++ b/Fila-Agendamento/root/index.tt @@ -0,0 +1,41 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
    +
    +Dados Pessoais +[% error %] +

    +

    +

    +

    +

    +

    +

    +
    + +
    + +[% INCLUDE 'footer.tt' %] \ No newline at end of file diff --git a/Fila-Agendamento/root/passo1.tt b/Fila-Agendamento/root/passo1.tt new file mode 100644 index 0000000..3d1422a --- /dev/null +++ b/Fila-Agendamento/root/passo1.tt @@ -0,0 +1,69 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +

    Selecione um dia e horário

    + +[% SET grid = local.obter_grid(1) %] + + +[% error %] + + + +[% FOREACH dia IN grid.dow_dias %] + +[% END %] + +[% FOREACH hora IN grid.idx_horas %] + + + [% FOREACH dia IN grid.idx_dias %] + [% IF grid.horas.$hora.$dia == 'Livre' %] + + [% ELSIF grid.horas.$hora.$dia %] + + [% ELSE %] + + [% END %] + [% END %] + +[% END %] +
    Hora / Dia[% dia.strftime('%a
    %d/%m') %]
    [% hora %] + [% grid.horas.$hora.$dia %] + [% grid.horas.$hora.$dia %] 
    + +[% INCLUDE 'footer.tt' %] \ No newline at end of file diff --git a/Fila-Agendamento/root/static/css/main.css b/Fila-Agendamento/root/static/css/main.css new file mode 100644 index 0000000..487574d --- /dev/null +++ b/Fila-Agendamento/root/static/css/main.css @@ -0,0 +1,181 @@ + +body { + padding : 0; color:#000; + margin : 0; font-size: 12px; + font-family : Arial, Sans-Serif; +} + +a:hover{ + text-decoration: underline; +} + +a:link{ + text-decoration: none; + color: #B20F0F; +} + +#BackHeader {width: 100%; height : 134px; background: url('../images/bg_cabecalho.gif') repeat-x;} + +#header { + height : 89px; padding:45px 0 0 557px; background: url('../images/bg_cabecalho.jpg') no-repeat; +} + +#header h1 { + margin: 0; padding: 0; font-size : 20px; + color : white; + font-family : Arial; +} + +.titulos {font-size: 16px; padding: 3px 0 5px 5px; border-bottom: 1px solid #ed1c24; margin: 0 0 15px 0;} + +#content_main { + margin : 0; + padding : 0 20px; +} + +#footer { + width : 100%; + clear : both; + margin : 0; + margin-top : 1em; + border-top : 0.05em solid black; +} + +#footer p { + margin : 0.2em; + padding : 0.2em; + font-size : 0.4em; +} + +label { + display : block; +} + +.error { + color : red; + font-weight : bold; +} + +div #bloco_acoes { + width: 100%; + clear: both; +} + +div #bloco_informacoes { + clear: both; + width: 100%; font-size: 12px; +} + +div #bloco_chat { + clear: both; + width: 100%; +} + +div #bloco_guiches { + clear: both; + width: 100%; +} + +#CHAT_WINDOW { + display: block; + clear: both; + width: 100%; + height: 200px; + overflow: auto; + border: 1px solid #999; +} + +#CHAT_SEND { + display: block; + clear: both; + width: 100%; +} + +.botao_acao { + display: block; height: 41px; float: left; margin: 0 15px 15px 0; +} + +.chat_remetente { + display: block; + font-weight: bold; +} + +tbody { + border: solid 1px black; +} +.colunaUm {padding: 0 30px 0 0;} +.botao_acao a {display:block; float: left; font-size:0; text-indent: -999px;} + +#InfoSenhas {font-size: 12px;} +#TitCategoria {background: url('../images/icon_cat.jpg') 0 center no-repeat; padding: 0 0 0 16px;} + +.fechar_local a {background: url('../images/bt_fechar_local.jpg') no-repeat; width: 111px; height:34px;} +.fechar_mesas a {background: url('../images/bt_fechar_mesas.jpg') no-repeat; width: 183px; height:34px;} +.forcar_fechar a {background: url('../images/bt_forcar_fechar.png') no-repeat; width: 153px; height:37px;} + +.acao_abrir a {background: url('../images/bt_abrir_local.jpg') no-repeat; width: 101px; height:34px;} +.encerrar_senhas a {background: url('../images/bt_encerrar_senhas.jpg') no-repeat; width: 139px; height:34px;} + +.acao_iniciar a {background: url('../images/bt_iniciar_atend.png') no-repeat; width: 174px; height:38px;} +.acao_devolver_senha a {background: url('../images/bt_devol_senha.png') 0 5px no-repeat; width: 124px; height:37px;} +.acao_registrar_ausencia a {background: url('../images/bt_registrar_ausencia.png') no-repeat; width: 103px; height:33px;} +.acao_concluir a {background: url('../images/bt_concluir_atend.png') no-repeat; width: 179px; height:41px;} +.acao_ir_para a {background: url('../images/bt_ir_para.png') no-repeat; width: 126px; height:34px;} +.acao_encaminhar a {background: url('../images/bt_encaminhar_atend.png') no-repeat; width: 109px; height:37px;} +.acao_retornar_pausa a {background: url('../images/bt_retornar_pausa.jpg') no-repeat; width: 159px; height:34px;} +.acao_voltar_serv_interno a {background: url('../images/bt_voltar_serv_interno.png') no-repeat; width: 180px; height:37px;} +.acao_fechar_mesa a {background: url('../images/bt_fechar_mesa.jpg') no-repeat; width: 139px; height:34px;} +.acao_iniciar_pausa a {background: url('../images/bt_iniciar_pausa.jpg') no-repeat; width: 119px; height:36px;} +.acao_atender_ausente a {background: url('../images/bt_listar_ausentes.jpg') no-repeat; width: 148px; height:30px;} +.acao_disponivel a {background: url('../images/bt_disponivel.png') no-repeat; width: 105px; height:31px;} +.acao_iniciar_servico a {background: url('../images/bt_iniciar_servico.jpg') no-repeat; width: 165px; height:33px;} + +.opi a {font-size:0; text-indent: -999px; display: block; margin:15px auto 0 auto;} +.acao_opi_on a {background: url('../images/icon_opi_on.png') no-repeat; width: 23px; height:28px;} +.acao_opi_off a {background: url('../images/icon_opi_off.png') no-repeat; width: 23px; height:28px;} +.nick_azul {color: blue; font-size: 12px; font-weight: none; font-family: Arial; } +.nick_vermelho {color: red; font-size: 12px; font-weight: none; font-family: Arial; } +.chat_mensagem {color: black; font-size: 12px; font-weight: none; font-family: Arial;} + +#TitChat {background: url('../images/icon_chat.jpg') 48px 0 no-repeat; height: 24px;} +#ContainerMesas {height: 30px} + +#ContainerMesas h3 {font-weight: normal; margin: 0; padding: 0} +#TitMesas {background: url('../images/icon_mesa.jpg') 65px 0 no-repeat; height: 24px; float: left; width: 200px; text-align: left;} +#TitEncaminhamentos {background: url('../images/icon_encaminhar.png') 0px 0 no-repeat; height: 24px; float: right; width: 205px; +text-align:right} + + +#ContainerSenha {padding-top: 40px;} +#TitSenha {background: url('../images/icon_senha.jpg') 65px 0 no-repeat; height: 24px;} +#Senha {font-size: 50px;} + +#encaminhar {padding: 10px; margin:15px auto 0 auto;} + +.mesas {float: left; border: solid 1px #999; margin: 0.1em; width: 160px; height: 95px; font-size: 12px;} + +.mesas .guiche {color: #FFF; font-size: 25px; width: 28px; text-align: center;} +.mesas .guiche_ativo {background-color: #009933;} +.mesas .guiche_pausa {background-color: #FFCB08;} +.mesas .guiche_inativo {background-color: #ED1C24;} +.mesas .guiche_fechado {background-color: #c0c0c0;} + +#txtTexto, #txtDestinatario {border: 1px solid #999; padding:2px; font-family: Arial; font-size: 12px; color: #636563; margin: 10px 0 0 0;} +#BtEnviar {display:block; font-size:0; text-indent: -999px; padding: 0; margin: 10px auto 0 auto; border:0; +background: url('../images/bt_enviar_chat.jpg') no-repeat; width: 182px; height:22px; } + +#informacoes_status {font-size: 14px; padding-bottom: 20px;} +#informacoes_status .status {font-size: 20px;} +#servicos {padding-bottom: 20px;} +#bloco_informacoes {padding-bottom: 10px;} + +.motivo a { color: black; background: #DDD; text-decoration: none;} +.motivo a:hover { color: black; background: #FF8; text-decoration: none;} + + +#ContainerEncaminhamentos {padding: 10px;} + +#TabEncaminhamentos td {text-align: center;} +#TabEncaminhamentos {font-family: Arial; font-size: 12px;} + +.titulosTabela {background-color: #ed1c24; color:#fff; font-weight:bold;} diff --git a/Fila-Agendamento/root/static/images/bg_cabecalho.gif b/Fila-Agendamento/root/static/images/bg_cabecalho.gif new file mode 100644 index 0000000..8a36c02 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bg_cabecalho.gif differ diff --git a/Fila-Agendamento/root/static/images/bg_cabecalho.jpg b/Fila-Agendamento/root/static/images/bg_cabecalho.jpg new file mode 100644 index 0000000..c8f4a3f Binary files /dev/null and b/Fila-Agendamento/root/static/images/bg_cabecalho.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_abrir_local.jpg b/Fila-Agendamento/root/static/images/bt_abrir_local.jpg new file mode 100644 index 0000000..82ccc75 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_abrir_local.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_concluir_atend.png b/Fila-Agendamento/root/static/images/bt_concluir_atend.png new file mode 100644 index 0000000..5f4feb1 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_concluir_atend.png differ diff --git a/Fila-Agendamento/root/static/images/bt_devol_senha.png b/Fila-Agendamento/root/static/images/bt_devol_senha.png new file mode 100644 index 0000000..df19ed1 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_devol_senha.png differ diff --git a/Fila-Agendamento/root/static/images/bt_disponivel.png b/Fila-Agendamento/root/static/images/bt_disponivel.png new file mode 100644 index 0000000..c8e13da Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_disponivel.png differ diff --git a/Fila-Agendamento/root/static/images/bt_encaminhar_atend.png b/Fila-Agendamento/root/static/images/bt_encaminhar_atend.png new file mode 100644 index 0000000..d769e34 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_encaminhar_atend.png differ diff --git a/Fila-Agendamento/root/static/images/bt_encerrar_senhas.jpg b/Fila-Agendamento/root/static/images/bt_encerrar_senhas.jpg new file mode 100644 index 0000000..88c69a0 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_encerrar_senhas.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_entrar_login.jpg b/Fila-Agendamento/root/static/images/bt_entrar_login.jpg new file mode 100644 index 0000000..9ce39d5 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_entrar_login.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_enviar_chat.jpg b/Fila-Agendamento/root/static/images/bt_enviar_chat.jpg new file mode 100644 index 0000000..bbac442 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_enviar_chat.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_fechar_local.jpg b/Fila-Agendamento/root/static/images/bt_fechar_local.jpg new file mode 100644 index 0000000..938c560 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_fechar_local.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_fechar_mesa.jpg b/Fila-Agendamento/root/static/images/bt_fechar_mesa.jpg new file mode 100644 index 0000000..79825d2 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_fechar_mesa.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_fechar_mesas.jpg b/Fila-Agendamento/root/static/images/bt_fechar_mesas.jpg new file mode 100644 index 0000000..d7866d5 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_fechar_mesas.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_forcar_fechar.png b/Fila-Agendamento/root/static/images/bt_forcar_fechar.png new file mode 100644 index 0000000..c0467c6 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_forcar_fechar.png differ diff --git a/Fila-Agendamento/root/static/images/bt_iniciar_atend.png b/Fila-Agendamento/root/static/images/bt_iniciar_atend.png new file mode 100644 index 0000000..ace04ec Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_iniciar_atend.png differ diff --git a/Fila-Agendamento/root/static/images/bt_iniciar_pausa.jpg b/Fila-Agendamento/root/static/images/bt_iniciar_pausa.jpg new file mode 100644 index 0000000..a7af474 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_iniciar_pausa.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_iniciar_servico.jpg b/Fila-Agendamento/root/static/images/bt_iniciar_servico.jpg new file mode 100644 index 0000000..624b4b1 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_iniciar_servico.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_ir_para.png b/Fila-Agendamento/root/static/images/bt_ir_para.png new file mode 100755 index 0000000..eb205fe Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_ir_para.png differ diff --git a/Fila-Agendamento/root/static/images/bt_listar_ausentes.jpg b/Fila-Agendamento/root/static/images/bt_listar_ausentes.jpg new file mode 100644 index 0000000..3f4927e Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_listar_ausentes.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_ok.jpg b/Fila-Agendamento/root/static/images/bt_ok.jpg new file mode 100644 index 0000000..5395197 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_ok.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_registrar_ausencia.png b/Fila-Agendamento/root/static/images/bt_registrar_ausencia.png new file mode 100644 index 0000000..46b4ce4 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_registrar_ausencia.png differ diff --git a/Fila-Agendamento/root/static/images/bt_retornar_pausa.jpg b/Fila-Agendamento/root/static/images/bt_retornar_pausa.jpg new file mode 100644 index 0000000..697571d Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_retornar_pausa.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_voltar.jpg b/Fila-Agendamento/root/static/images/bt_voltar.jpg new file mode 100644 index 0000000..a7af474 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_voltar.jpg differ diff --git a/Fila-Agendamento/root/static/images/bt_voltar_serv_interno.png b/Fila-Agendamento/root/static/images/bt_voltar_serv_interno.png new file mode 100644 index 0000000..1380374 Binary files /dev/null and b/Fila-Agendamento/root/static/images/bt_voltar_serv_interno.png differ diff --git a/Fila-Agendamento/root/static/images/btn_120x50_built.png b/Fila-Agendamento/root/static/images/btn_120x50_built.png new file mode 100644 index 0000000..c709fd6 Binary files /dev/null and b/Fila-Agendamento/root/static/images/btn_120x50_built.png differ diff --git a/Fila-Agendamento/root/static/images/btn_120x50_built_shadow.png b/Fila-Agendamento/root/static/images/btn_120x50_built_shadow.png new file mode 100644 index 0000000..15142fe Binary files /dev/null and b/Fila-Agendamento/root/static/images/btn_120x50_built_shadow.png differ diff --git a/Fila-Agendamento/root/static/images/btn_120x50_powered.png b/Fila-Agendamento/root/static/images/btn_120x50_powered.png new file mode 100644 index 0000000..7249b47 Binary files /dev/null and b/Fila-Agendamento/root/static/images/btn_120x50_powered.png differ diff --git a/Fila-Agendamento/root/static/images/btn_120x50_powered_shadow.png b/Fila-Agendamento/root/static/images/btn_120x50_powered_shadow.png new file mode 100644 index 0000000..e6876c0 Binary files /dev/null and b/Fila-Agendamento/root/static/images/btn_120x50_powered_shadow.png differ diff --git a/Fila-Agendamento/root/static/images/btn_88x31_built.png b/Fila-Agendamento/root/static/images/btn_88x31_built.png new file mode 100644 index 0000000..007b5db Binary files /dev/null and b/Fila-Agendamento/root/static/images/btn_88x31_built.png differ diff --git a/Fila-Agendamento/root/static/images/btn_88x31_built_shadow.png b/Fila-Agendamento/root/static/images/btn_88x31_built_shadow.png new file mode 100644 index 0000000..ccf4624 Binary files /dev/null and b/Fila-Agendamento/root/static/images/btn_88x31_built_shadow.png differ diff --git a/Fila-Agendamento/root/static/images/btn_88x31_powered.png b/Fila-Agendamento/root/static/images/btn_88x31_powered.png new file mode 100644 index 0000000..8f0cd9f Binary files /dev/null and b/Fila-Agendamento/root/static/images/btn_88x31_powered.png differ diff --git a/Fila-Agendamento/root/static/images/btn_88x31_powered_shadow.png b/Fila-Agendamento/root/static/images/btn_88x31_powered_shadow.png new file mode 100644 index 0000000..aa776fa Binary files /dev/null and b/Fila-Agendamento/root/static/images/btn_88x31_powered_shadow.png differ diff --git a/Fila-Agendamento/root/static/images/catalyst_logo.png b/Fila-Agendamento/root/static/images/catalyst_logo.png new file mode 100644 index 0000000..21f1cac Binary files /dev/null and b/Fila-Agendamento/root/static/images/catalyst_logo.png differ diff --git a/Fila-Agendamento/root/static/images/icon_atend_atrasados.jpg b/Fila-Agendamento/root/static/images/icon_atend_atrasados.jpg new file mode 100644 index 0000000..0d20cc9 Binary files /dev/null and b/Fila-Agendamento/root/static/images/icon_atend_atrasados.jpg differ diff --git a/Fila-Agendamento/root/static/images/icon_cat.jpg b/Fila-Agendamento/root/static/images/icon_cat.jpg new file mode 100644 index 0000000..ad2fbd4 Binary files /dev/null and b/Fila-Agendamento/root/static/images/icon_cat.jpg differ diff --git a/Fila-Agendamento/root/static/images/icon_chat.jpg b/Fila-Agendamento/root/static/images/icon_chat.jpg new file mode 100644 index 0000000..29e0f2b Binary files /dev/null and b/Fila-Agendamento/root/static/images/icon_chat.jpg differ diff --git a/Fila-Agendamento/root/static/images/icon_encaminhar.png b/Fila-Agendamento/root/static/images/icon_encaminhar.png new file mode 100755 index 0000000..2e26ec7 Binary files /dev/null and b/Fila-Agendamento/root/static/images/icon_encaminhar.png differ diff --git a/Fila-Agendamento/root/static/images/icon_mesa.jpg b/Fila-Agendamento/root/static/images/icon_mesa.jpg new file mode 100644 index 0000000..e0d2703 Binary files /dev/null and b/Fila-Agendamento/root/static/images/icon_mesa.jpg differ diff --git a/Fila-Agendamento/root/static/images/icon_opi_off.png b/Fila-Agendamento/root/static/images/icon_opi_off.png new file mode 100755 index 0000000..0fbab9a Binary files /dev/null and b/Fila-Agendamento/root/static/images/icon_opi_off.png differ diff --git a/Fila-Agendamento/root/static/images/icon_opi_on.png b/Fila-Agendamento/root/static/images/icon_opi_on.png new file mode 100755 index 0000000..37fef93 Binary files /dev/null and b/Fila-Agendamento/root/static/images/icon_opi_on.png differ diff --git a/Fila-Agendamento/root/static/images/icon_relogio.jpg b/Fila-Agendamento/root/static/images/icon_relogio.jpg new file mode 100644 index 0000000..08ddb51 Binary files /dev/null and b/Fila-Agendamento/root/static/images/icon_relogio.jpg differ diff --git a/Fila-Agendamento/root/static/images/icon_senha.jpg b/Fila-Agendamento/root/static/images/icon_senha.jpg new file mode 100644 index 0000000..1600548 Binary files /dev/null and b/Fila-Agendamento/root/static/images/icon_senha.jpg differ diff --git a/Fila-Agendamento/root/static/images/icon_servico.jpg b/Fila-Agendamento/root/static/images/icon_servico.jpg new file mode 100644 index 0000000..1321f41 Binary files /dev/null and b/Fila-Agendamento/root/static/images/icon_servico.jpg differ diff --git a/Fila-Agendamento/script/fila_agendamento_db.pl b/Fila-Agendamento/script/fila_agendamento_db.pl new file mode 100755 index 0000000..7f8f413 --- /dev/null +++ b/Fila-Agendamento/script/fila_agendamento_db.pl @@ -0,0 +1,78 @@ +#!/usr/bin/perl +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use lib 'lib'; +use SQL::Translator; + +my $t = SQL::Translator->new + ( + show_warnings => 1, + add_drop_table => 1, + quote_table_names => 1, + quote_field_names => 1, + validate => 1, + ); +$t->parser_args + ( + 'DBIx::Schema' => 'Fila::Agendamento::DB', + ); +my $r = $t->translate + ( + from => 'SQL::Translator::Parser::DBIx::Class', + to => 'PostgreSQL', + ) or die $t->error; +print $r; + +print <= NOW() + interval '1 hour'; + +INSERT INTO local VALUES (1, '2008-01-01 00:00:00+0000', 'Infinity', 'Local de Teste'); +INSERT INTO local VALUES (2, '2008-01-01 00:00:00+0000', 'Infinity', 'Outro Local'); +INSERT INTO expediente VALUES (1, 1, 1, 8, 17); +INSERT INTO expediente VALUES (2, 1, 2, 8, 17); +INSERT INTO expediente VALUES (3, 1, 3, 8, 17); +INSERT INTO expediente VALUES (4, 1, 4, 8, 17); +INSERT INTO expediente VALUES (5, 1, 5, 8, 17); +INSERT INTO expediente VALUES (7, 2, 1, 8, 17); +INSERT INTO expediente VALUES (8, 2, 2, 8, 17); +INSERT INTO expediente VALUES (9, 2, 3, 8, 17); +INSERT INTO expediente VALUES (10, 2, 4, 8, 17); +INSERT INTO expediente VALUES (11, 2, 5, 8, 17); +INSERT INTO feriado VALUES (1, '2008-06-24', 'Dia do trabalhador'); +INSERT INTO feriado VALUES (1, '2008-06-25', 'Nao e um feriado'); +INSERT INTO feriado VALUES (2, '2008-06-26', 'Dia do trabalhador'); +INSERT INTO feriado VALUES (2, '2008-06-27', 'Nao e um feriado'); + + +SQL diff --git a/Fila-Agendamento/script/fila_agendamento_fastcgi.pl b/Fila-Agendamento/script/fila_agendamento_fastcgi.pl new file mode 100755 index 0000000..1980f34 --- /dev/null +++ b/Fila-Agendamento/script/fila_agendamento_fastcgi.pl @@ -0,0 +1,55 @@ +#!/usr/bin/perl -w +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +BEGIN { $ENV{CATALYST_ENGINE} ||= 'FastCGI' } + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use Fila::Agendamento; + +my $help = 0; +my ( $listen, $nproc, $pidfile, $manager, $detach, $keep_stderr ); + +GetOptions( + 'help|?' => \$help, + 'listen|l=s' => \$listen, + 'nproc|n=i' => \$nproc, + 'pidfile|p=s' => \$pidfile, + 'manager|M=s' => \$manager, + 'daemon|d' => \$detach, + 'keeperr|e' => \$keep_stderr, +); + +pod2usage(1) if $help; + +Fila::Agendamento->run( + $listen, + { nproc => $nproc, + pidfile => $pidfile, + manager => $manager, + detach => $detach, + keep_stderr => $keep_stderr, + } +); + +1; + diff --git a/Fila-ETL/fila_etl.yaml b/Fila-ETL/fila_etl.yaml new file mode 100644 index 0000000..89ae93f --- /dev/null +++ b/Fila-ETL/fila_etl.yaml @@ -0,0 +1,23 @@ +--- +name: Fila::ETL +Model::DB: + schema_class: 'Fila::ETL::DB' + connect_info: + - 'dbi:Pg:host=localhost;database=filadw' + - ruoso + - teste +Model::DBAgendamento: + schema_class: 'Fila::Agendamento::DB' + connect_info: + - 'dbi:Pg:host=localhost;database=agendamento' + - ruoso + - teste +Model::DBSERVI: + schema_class: 'Fila::Servico::DB' + connect_info: + - 'dbi:Pg:host=localhost;database=fila' + - ruoso + - teste +Model::Federado: + federacao: + 1: DBSERVI \ No newline at end of file diff --git a/Fila-ETL/lib/Fila/Agendamento b/Fila-ETL/lib/Fila/Agendamento new file mode 120000 index 0000000..78e2438 --- /dev/null +++ b/Fila-ETL/lib/Fila/Agendamento @@ -0,0 +1 @@ +../../../Fila-Agendamento/lib/Fila/Agendamento \ No newline at end of file diff --git a/Fila-ETL/lib/Fila/ETL.pm b/Fila-ETL/lib/Fila/ETL.pm new file mode 100644 index 0000000..3c4ce6b --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL.pm @@ -0,0 +1,48 @@ +package Fila::ETL; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; + +our $VERSION = '0.01'; + +use Catalyst::Runtime '5.70'; +use Catalyst qw( -Debug ConfigLoader ); + +__PACKAGE__->config( name => 'Fila::ETL', + 'Plugin::ConfigLoader' => { file => 'fila_etl.yaml' } + ); +__PACKAGE__->setup; + +1; + +__END__ + +=head1 NAME + +Fila::ETL - Aplicação de ETL + +=head1 DESCRIPTION + +Esta aplicação é usada para fazer o processo de ETL dos bancos de +dados transacionais do sistema de atendimento para o banco de dados +dimensional, que irá proporcionar a possibilidade de gerar as +estatísticas desejadas do sistema. + +=cut + diff --git a/Fila-ETL/lib/Fila/ETL/Controller/Agendamento.pm b/Fila-ETL/lib/Fila/ETL/Controller/Agendamento.pm new file mode 100644 index 0000000..cdeea76 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/Controller/Agendamento.pm @@ -0,0 +1,102 @@ +package Fila::ETL::Controller::Agendamento; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base qw(Catalyst::Controller); + +sub agendamento :Chained('/base') :PathPart :CaptureArgs(0) { + my ($self, $c) = @_; + my $vt_base = $c->stash->{now}->clone(); + $vt_base->add( hours => 1 ); + $c->stash->{vt_base} = $vt_base; +} + +sub agendar :Chained('agendamento') :PathPart :Args(0) { + my ($self, $c) = @_; + + my $result = $c->model('DB::ActivityLog')->search + ({ activity_type => '/agendamento/agendar' }, + { order_by => 'vt_base DESC' }); + + if (my $last = $result->first) { + $c->stash->{last_vt_base} = $last->vt_base; + } else { + $c->stash->{last_vt_base} = '-Infinity'; + } + + my $agendamentos = $c->model('DBAgendamento::Atendimento')->search + ({ -and => [{ data => { '>' => $c->stash->{last_vt_base} }}, + { data => { '<=' => $c->stash->{vt_base} }} ]}); + + + while (my $agendamento = $agendamentos->next) { + eval { + my $categoria = $c->model('Federado')->target + ($c, $agendamento->id_local, 'Categoria')->find + ({ codigo => 'A' }); + my $estado_espera = $c->model('Federado')->target + ($c, $agendamento->id_local, 'TipoEstadoAtendimento')->find + ({ nome => 'espera' }); + my $senha = $c->model('Federado')->target + ($c, $agendamento->id_local, 'Senha')->find + ({ id_categoria => $categoria->id_categoria, + codigo => substr($agendamento->senha, 1) }); + my $atendimento = $c->model('Federado')->target + ($c, $agendamento->id_local, 'Atendimento')->create + ({ id_senha => $senha->id_senha, + id_local => $agendamento->id_local, + vt_ini => $agendamento->data, + vt_fim => 'Infinity', + estados => + [{ id_estado => $estado_espera->id_estado, + vt_ini => $agendamento->data, + vt_fim => 'Infinity' }], + categorias => + [{ id_categoria => $categoria->id_categoria, + vt_ini => $agendamento->data, + vt_fim => 'Infinity' }]}); + }; + if ($@) { + warn 'Erro ao realizar Agendamento ('.$agendamento->id_atendimento.'): '.$@; + } + } + + $c->model('DB::ActivityLog')->create + ({ activity_type => '/agendamento/agendar', + vt_base => $c->stash->{vt_base}, + vt_ini => $c->stash->{now} }); + +} + + +1; + +__END__ + +=head1 NAME + +Fila::ETL::Controller::Agendamento - Realiza o agendamento nos sistemas das praças + +=head1 SYNOPSIS + +Este controller realiza o agendamento propriamente dito nos sistemas +de cada praça, de acordo com aquilo que está no sistema de agendamento +centralizado. + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/Controller/Atendimento.pm b/Fila-ETL/lib/Fila/ETL/Controller/Atendimento.pm new file mode 100644 index 0000000..90e5e93 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/Controller/Atendimento.pm @@ -0,0 +1,557 @@ +package Fila::ETL::Controller::Atendimento; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base qw(Catalyst::Controller); + +sub atendimento :Chained('/base') :PathPart :CaptureArgs(0) { + my ($self, $c) = @_; + $c->stash->{vt_base} = $c->stash->{now}; +} + +sub quantidade :Chained('atendimento') :PathPart :Args(0) { + my ($self, $c) = @_; + + $c->model('Federado')->doeach + ($c, sub { + my $id = shift; + my $min = 'minute'; + + my $result = $c->model('DB::ActivityLog')->search + ({ activity_type => '/atendimento/quantidade', + id_local => $id }, + { order_by => 'vt_base DESC' }); + + if (my $last = $result->first) { + $c->stash->{last_vt_base} = $last->vt_base; + } else { + $c->stash->{last_vt_base} = '-Infinity'; + } + + my $local = $c->model('Federado')->target($c, $id, 'Local')->find + ({ id_local => $id }); + + my $consulta = $local->atendimentos->search + ({ -and => [ { 'me.vt_ini' => { '>' => $c->stash->{last_vt_base} } }, + { 'me.vt_ini' => { '<=' => $c->stash->{vt_base} } }, + { 'atendentes.vt_ini' => \" <= me.vt_ini" }, + { 'atendentes.vt_fim' => \" > me.vt_ini" }, + { 'estado.nome' => 'espera' }, + { 'estados.vt_fim' => \"< now()" }, + { 'estado_2.nome' => 'chamando' }, + { 'estados_2.vt_fim' => \"< now()" }, + { 'estado_3.nome' => 'atendimento' }, + { 'estados_3.vt_fim' => \"< now()" }, + { 'categorias.vt_ini' => \" <= estados_3.vt_ini" }, + { 'categorias.vt_fim' => \" >= estados_3.vt_fim" }, + { 'guiches.vt_ini' => \" <= estados_3.vt_ini" }, + { 'guiches.vt_fim' => \" >= estados_3.vt_fim" }, + { 'atendentes.vt_ini' => \" <= estados_3.vt_ini" }, + { 'atendentes.vt_fim' => \" >= estados_3.vt_fim" }, + \"((estados.vt_fim - estados.vt_ini) < '5 hours')", + \"((estados_2.vt_fim - estados.vt_ini) < '5 hours')", + \"((estados_3.vt_fim - estados.vt_ini) < '5 hours')", + ] }, + + { join => [ + { 'guiches' => { 'guiche' => { 'atendentes' => 'funcionario' }}}, + { 'categorias' => 'categoria' }, + { 'estados' => 'estado' }, + { 'estados' => 'estado' }, + { 'estados' => 'estado' } + ], + + select => [ \'count(distinct me.id_atendimento)', + \'date_trunc(\'minute\', me.vt_ini)', + + \'min(EXTRACT(\'epoch\' FROM (CASE WHEN estados.vt_fim > NOW() THEN NOW() ELSE estados.vt_fim END) - estados.vt_ini))', + \'max(EXTRACT(\'epoch\' FROM (CASE WHEN estados.vt_fim > NOW() THEN NOW() ELSE estados.vt_fim END) - estados.vt_ini))', + \'sum(EXTRACT(\'epoch\' FROM (CASE WHEN estados.vt_fim > NOW() THEN NOW() ELSE estados.vt_fim END) - estados.vt_ini))', + + \'min(EXTRACT(\'epoch\' FROM (CASE WHEN estados_2.vt_fim > NOW() THEN NOW() ELSE estados_2.vt_fim END) - estados_2.vt_ini))', + \'max(EXTRACT(\'epoch\' FROM (CASE WHEN estados_2.vt_fim > NOW() THEN NOW() ELSE estados_2.vt_fim END) - estados_2.vt_ini))', + \'sum(EXTRACT(\'epoch\' FROM (CASE WHEN estados_2.vt_fim > NOW() THEN NOW() ELSE estados_2.vt_fim END) - estados_2.vt_ini))', + + \'min(EXTRACT(\'epoch\' FROM (CASE WHEN estados_3.vt_fim > NOW() THEN NOW() ELSE estados_3.vt_fim END) - estados_3.vt_ini))', + \'max(EXTRACT(\'epoch\' FROM (CASE WHEN estados_3.vt_fim > NOW() THEN NOW() ELSE estados_3.vt_fim END) - estados_3.vt_ini))', + \'sum(EXTRACT(\'epoch\' FROM (CASE WHEN estados_3.vt_fim > NOW() THEN NOW() ELSE estados_3.vt_fim END) - estados_3.vt_ini))', + + 'guiches.id_guiche', 'guiche.id_guiche', + 'guiche.id_local', 'guiche.vt_ini', + 'guiche.vt_fim', 'guiche.identificador', + 'guiche.jid_opiniometro', + 'guiche.pular_opiniometro', + 'atendentes.id_funcionario', + 'atendentes.id_guiche', + 'atendentes.vt_ini', 'atendentes.vt_fim', + 'funcionario.id_funcionario', + 'funcionario.nome', 'funcionario.jid', + 'funcionario.password', + 'categorias.id_categoria', + 'categoria.id_categoria', 'categoria.nome', + 'categoria.codigo' + ], + + as => [ 'quantidade', + 'datahora', + + 'min_tempo_espera', + 'max_tempo_espera', + 'sum_tempo_espera', + + 'min_tempo_deslocamento', + 'max_tempo_deslocamento', + 'sum_tempo_deslocamento', + + 'min_tempo_atendimento', + 'max_tempo_atendimento', + 'sum_tempo_atendimento', + + 'guiches_id_guiche', + 'guiche_id_guiche', + 'guiche_id_local', + 'guiche_vt_ini', + 'guiche_vt_fim', + 'guiche_identificador', + 'guiche_jid_opiniometro', + 'guiche_pular_opiniometro', + 'atendentes_id_funcionario', + 'atendentes_id_guiche', + 'atendentes_vt_ini', + 'atendentes_vt_fim', + 'funcionario_id_funcionario', + 'funcionario_nome', + 'funcionario_jid', + 'funcionario_password', + 'categorias_id_categoria', + 'categoria_id_categoria', + 'categoria_nome', + 'categoria_codigo' + ], + + group_by => [ 'guiches.id_guiche', 'guiche.id_guiche', + 'guiche.id_local', 'guiche.vt_ini', + 'guiche.vt_fim', 'guiche.identificador', + 'guiche.jid_opiniometro', + 'guiche.pular_opiniometro', + 'atendentes.id_funcionario', + 'atendentes.id_guiche', + 'atendentes.vt_ini', 'atendentes.vt_fim', + 'funcionario.id_funcionario', + 'funcionario.nome', 'funcionario.jid', + 'funcionario.password', + 'categorias.id_categoria', + 'categoria.id_categoria', + 'categoria.nome', 'categoria.codigo', + 'date_trunc(\'minute\', me.vt_ini)' ]}); + + while (my $item = $consulta->next()) { + + my $dlocal = $c->model('DB::DLocal')->get_dimension($local); + + my $categoria = $c->model('DB::DCategoria')->get_dimension + (Fila::Servico::DB::Categoria->new + ({ map { my $col = $_; + $col =~ s/^[^_]+_//; + $col => $item->get_column($_) + } qw(categoria_id_categoria categoria_nome categoria_codigo) })); + + my $guiche = $c->model('DB::DGuiche')->get_dimension + ( Fila::Servico::DB::Guiche->new + ({ map { my $col = $_; + $col =~ s/^[^_]+_//; + $col => $item->get_column($_) + } qw(guiche_id_guiche guiche_identificador) })); + + my $atendente = $c->model('DB::DAtendente')->get_dimension + ( Fila::Servico::DB::Funcionario->new + ({ map { my $col = $_; + $col =~ s/^[^_]+_//; + $col => $item->get_column($_) + } qw(funcionario_id_funcionario funcionario_jid funcionario_nome) })); + + $c->model('DB::FQuantidadeAtendimentos')->create + ({ id_local => $dlocal, + id_categoria => $categoria, + id_guiche => $guiche, + id_atendente => $atendente, + + data => $c->model('DB::DData')->get_dimension + ( DateTime::Format::Pg->parse_datetime($item->get_column('datahora') ) ), + + horario => $c->model('DB::DHorario')->get_dimension + ( DateTime::Format::Pg->parse_datetime($item->get_column('datahora') ) ), + + ( map { $_ => int(0 + $item->get_column($_)) } + 'quantidade', + 'min_tempo_espera', + 'max_tempo_espera', + 'sum_tempo_espera', + 'min_tempo_deslocamento', + 'max_tempo_deslocamento', + 'sum_tempo_deslocamento', + 'min_tempo_atendimento', + 'max_tempo_atendimento', + 'sum_tempo_atendimento', + ) + }); + } + + $c->model('DB::ActivityLog')->create + ({ activity_type => '/atendimento/quantidade', + vt_base => $c->stash->{vt_base}, + vt_ini => $c->stash->{now}, + id_local => $id }); + + }); + + +} + +sub estados :Chained('atendimento') :PathPart :Args(0) { + my ($self, $c) = @_; + + $c->model('Federado')->doeach + ($c, sub { + my $id = shift; + + my $result = $c->model('DB::ActivityLog')->search + ({ activity_type => '/atendimento/estados', + id_local => $id }, + { order_by => 'vt_base DESC' }); + + if (my $last = $result->first) { + $c->stash->{last_vt_base} = $last->vt_base; + } else { + $c->stash->{last_vt_base} = '-Infinity'; + } + + my $local = $c->model('Federado')->target($c, $id, 'Local')->find + ({ id_local => $id }); + + my $sql = q#; +SELECT + + date_trunc('minute',times.vt_fac) AS datahora, + COUNT(es_espe_ini.*) AS espe_ini, + COUNT(es_espe_fim.*) AS espe_fim, + COUNT(es_cham_ini.*) AS cham_ini, + COUNT(es_cham_fim.*) AS cham_fim, + COUNT(es_aten_ini.*) AS aten_ini, + COUNT(es_aten_fim.*) AS aten_fim, + COUNT(es_no_show.*) AS no_show, + ct_espe_ini.id_categoria AS ct_espe_ini_id_categoria, + ct_espe_ini.nome AS ct_espe_ini_nome, + ct_espe_ini.codigo AS ct_espe_ini_codigo, + ct_espe_fim.id_categoria AS ct_espe_fim_id_categoria, + ct_espe_fim.nome AS ct_espe_fim_nome, + ct_espe_fim.codigo AS ct_espe_fim_codigo, + ct_cham_ini.id_categoria AS ct_cham_ini_id_categoria, + ct_cham_ini.nome AS ct_cham_ini_nome, + ct_cham_ini.codigo AS ct_cham_ini_codigo, + ct_cham_fim.id_categoria AS ct_cham_fim_id_categoria, + ct_cham_fim.nome AS ct_cham_fim_nome, + ct_cham_fim.codigo AS ct_cham_fim_codigo, + ct_aten_ini.id_categoria AS ct_aten_ini_id_categoria, + ct_aten_ini.nome AS ct_aten_ini_nome, + ct_aten_ini.codigo AS ct_aten_ini_codigo, + ct_aten_fim.id_categoria AS ct_aten_fim_id_categoria, + ct_aten_fim.nome AS ct_aten_fim_nome, + ct_aten_fim.codigo AS ct_aten_fim_codigo, + ct_no_show.id_categoria AS ct_no_show_id_categoria, + ct_no_show.nome AS ct_no_show_nome, + ct_no_show.codigo AS ct_no_show_codigo + +FROM + + ( SELECT vt_ini AS vt_fac FROM estado_atendimento estados_ini + WHERE ( + ( estados_ini.vt_ini >= ? ) AND + ( estados_ini.vt_ini < ? ) ) + UNION + SELECT vt_fim AS vt_fac FROM estado_atendimento estados_fim + WHERE ( + ( estados_fim.vt_fim >= ? ) AND + ( estados_fim.vt_fim < ? ) ) + ) AS times + + LEFT JOIN estado_atendimento AS es_espe_ini ON (times.vt_fac = es_espe_ini.vt_ini + AND es_espe_ini.id_estado=(SELECT id_estado FROM tipo_estado_atendimento WHERE nome='espera')) + + LEFT JOIN atendimento AS at_espe_ini ON + ( es_espe_ini.id_atendimento = at_espe_ini.id_atendimento AND + at_espe_ini.id_local = ? ) + + LEFT JOIN categoria_atendimento AS cs_espe_ini ON + ( at_espe_ini.id_atendimento = cs_espe_ini.id_atendimento) + + LEFT JOIN categoria AS ct_espe_ini ON + ( cs_espe_ini.id_categoria = ct_espe_ini.id_categoria) + + LEFT JOIN estado_atendimento AS es_espe_fim ON (times.vt_fac = es_espe_fim.vt_fim + AND es_espe_fim.id_estado=(SELECT id_estado FROM tipo_estado_atendimento WHERE nome='espera')) + + LEFT JOIN atendimento AS at_espe_fim ON + ( es_espe_fim.id_atendimento = at_espe_fim.id_atendimento AND + at_espe_fim.id_local = ? ) + + LEFT JOIN categoria_atendimento AS cs_espe_fim ON + ( at_espe_fim.id_atendimento = cs_espe_fim.id_atendimento) + + LEFT JOIN categoria AS ct_espe_fim ON + ( cs_espe_fim.id_categoria = ct_espe_fim.id_categoria) + + LEFT JOIN estado_atendimento AS es_cham_ini ON (times.vt_fac = es_cham_ini.vt_ini + AND es_cham_ini.id_estado=(SELECT id_estado FROM tipo_estado_atendimento WHERE nome='chamando')) + + LEFT JOIN atendimento AS at_cham_ini ON + ( es_cham_ini.id_atendimento = at_cham_ini.id_atendimento AND + at_cham_ini.id_local = ? ) + + LEFT JOIN categoria_atendimento AS cs_cham_ini ON + ( at_cham_ini.id_atendimento = cs_cham_ini.id_atendimento) + + LEFT JOIN categoria AS ct_cham_ini ON + ( cs_cham_ini.id_categoria = ct_cham_ini.id_categoria) + + LEFT JOIN estado_atendimento AS es_cham_fim ON (times.vt_fac = es_cham_fim.vt_fim + AND es_cham_fim.id_estado=(SELECT id_estado FROM tipo_estado_atendimento WHERE nome='chamando')) + + LEFT JOIN atendimento AS at_cham_fim ON + ( es_cham_fim.id_atendimento = at_cham_fim.id_atendimento AND + at_cham_fim.id_local = ? ) + + LEFT JOIN categoria_atendimento AS cs_cham_fim ON + ( at_cham_fim.id_atendimento = cs_cham_fim.id_atendimento) + + LEFT JOIN categoria AS ct_cham_fim ON + ( cs_cham_fim.id_categoria = ct_cham_fim.id_categoria) + + LEFT JOIN estado_atendimento AS es_aten_ini ON (times.vt_fac = es_aten_ini.vt_ini + AND es_aten_ini.id_estado=(SELECT id_estado FROM tipo_estado_atendimento WHERE nome='atendimento')) + + LEFT JOIN atendimento AS at_aten_ini ON + ( es_aten_ini.id_atendimento = at_aten_ini.id_atendimento AND + at_aten_ini.id_local = ? ) + + LEFT JOIN categoria_atendimento AS cs_aten_ini ON + ( at_aten_ini.id_atendimento = cs_aten_ini.id_atendimento) + + LEFT JOIN categoria AS ct_aten_ini ON + ( cs_aten_ini.id_categoria = ct_aten_ini.id_categoria) + + LEFT JOIN estado_atendimento AS es_aten_fim ON (times.vt_fac = es_aten_fim.vt_fim + AND es_aten_fim.id_estado=(SELECT id_estado FROM tipo_estado_atendimento WHERE nome='atendimento')) + + LEFT JOIN atendimento AS at_aten_fim ON + ( es_aten_fim.id_atendimento = at_aten_fim.id_atendimento AND + at_aten_fim.id_local = ? ) + + LEFT JOIN categoria_atendimento AS cs_aten_fim ON + ( at_aten_fim.id_atendimento = cs_aten_fim.id_atendimento) + + LEFT JOIN categoria AS ct_aten_fim ON + ( cs_aten_fim.id_categoria = ct_aten_fim.id_categoria) + + LEFT JOIN estado_atendimento AS es_no_show ON (times.vt_fac = es_no_show.vt_ini + AND es_no_show.id_estado=(SELECT id_estado FROM tipo_estado_atendimento WHERE nome='no_show')) + + LEFT JOIN atendimento AS at_no_show ON + ( es_no_show.id_atendimento = at_no_show.id_atendimento AND + at_no_show.id_local = ? ) + + LEFT JOIN categoria_atendimento AS cs_no_show ON + ( at_no_show.id_atendimento = cs_no_show.id_atendimento) + + LEFT JOIN categoria AS ct_no_show ON + ( cs_no_show.id_categoria = ct_no_show.id_categoria) + +GROUP BY date_trunc('minute',times.vt_fac), + ct_espe_ini.id_categoria, ct_espe_ini.nome, ct_espe_ini.codigo, + ct_espe_fim.id_categoria, ct_espe_fim.nome, ct_espe_fim.codigo, + ct_cham_ini.id_categoria, ct_cham_ini.nome, ct_cham_ini.codigo, + ct_cham_fim.id_categoria, ct_cham_fim.nome, ct_cham_fim.codigo, + ct_aten_ini.id_categoria, ct_aten_ini.nome, ct_aten_ini.codigo, + ct_aten_fim.id_categoria, ct_aten_fim.nome, ct_aten_fim.codigo, + ct_no_show.id_categoria, ct_no_show.nome, ct_no_show.codigo + +ORDER BY datahora + +#; + + my $storage = $c->model('Federado')->storage($c, $id); + $storage->ensure_connected; + my $dbi = $storage->dbh; + + my $sth = $dbi->prepare($sql); + $sth->execute( $c->stash->{last_vt_base}, $c->stash->{vt_base}, + $c->stash->{last_vt_base}, $c->stash->{vt_base}, + map { $id } 1..7 ); + + my $dlocal = $c->model('DB::DLocal')->get_dimension($local); + my $last_datahora; + my $counters_cat = {}; + my $last_data; + + while (my $item = $sth->fetchrow_hashref) { + + if ($last_datahora && $item->{datahora} ne $last_datahora) { + + # inserir registros para cada categoria + my $data = $c->model('DB::DData')->get_dimension + ( DateTime::Format::Pg->parse_datetime($last_datahora) ); + my $horario = $c->model('DB::DHorario')->get_dimension + ( DateTime::Format::Pg->parse_datetime($last_datahora) ); + + foreach my $id_categoria (keys %{$counters_cat}) { + + my $categoria = $c->model('DB::DCategoria')->get_dimension + (Fila::Servico::DB::Categoria->new + ({ map { $_ => $counters_cat->{$id_categoria}{categoria}{$_} + } qw(id_categoria nome codigo) })); + + + $c->model('DB::FQuantidadeEstados')->create + ({ id_local => $dlocal, + id_categoria => $categoria, + data => $data, + horario => $horario, + + ( map { 'quantidade_'.$_ => ($counters_cat->{$id_categoria}{$_} || 0) } + 'espera', + 'chamando', + 'atendimento', + 'no_show' + ) + }); + + $counters_cat->{$id_categoria}{no_show} = 0; + } + + $last_datahora = $item->{datahora}; + if ($last_data ne $data) { + $last_datahora = undef; + $last_data = undef; + } + + } + if (not $last_datahora ) { + # vamos obter os contadores iniciais para aquela datahora + + my $sql_quant = q# + +SELECT + cat_est.estado, + cat_est.id_categoria, + cat_est.codigo, + cat_est.nome, + COUNT(categoria_atendimento.*) as total +FROM + ( SELECT tipo_estado_atendimento.id_estado, + tipo_estado_atendimento.nome AS estado, categoria.id_categoria, + categoria.codigo, categoria.nome FROM tipo_estado_atendimento, + categoria + WHERE + tipo_estado_atendimento.nome IN ('espera','chamando','atendimento') + ) AS cat_est + INNER JOIN estado_atendimento + ON (estado_atendimento.id_estado = cat_est.id_estado AND + ? BETWEEN estado_atendimento.vt_ini AND estado_atendimento.vt_fim) + INNER JOIN atendimento + ON (estado_atendimento.id_atendimento = atendimento.id_atendimento AND + ? BETWEEN atendimento.vt_ini AND atendimento.vt_fim) + INNER JOIN categoria_atendimento + ON (atendimento.id_atendimento = categoria_atendimento.id_atendimento AND + categoria_atendimento.id_categoria = cat_est.id_categoria) +GROUP BY + cat_est.estado, + cat_est.id_categoria, + cat_est.codigo, + cat_est.nome + +#; + + my $sth = $dbi->prepare($sql_quant); + $sth->execute($item->{datahora}, $item->{datahora}); + + $counters_cat = {}; + + while (my $cat_est = $sth->fetchrow_hashref) { + $counters_cat->{$cat_est->{id_categoria}}{categoria} = $cat_est; + $counters_cat->{$cat_est->{id_categoria}}{$cat_est->{estado}} = $cat_est->{total}; + $counters_cat->{$cat_est->{id_categoria}}{no_show} = 0; + } + + $last_datahora = $item->{datahora}; + $last_data = $last_datahora; + $last_data =~ s/\s.+$//; + } + + # vamos calcular os contadores + if ($item->{espe_ini}) { + $counters_cat->{$item->{ct_espe_ini_id_categoria}}{espera} += $item->{espe_ini}; + $counters_cat->{$item->{ct_espe_ini_id_categoria}}{categoria}{codigo} = $item->{ct_espe_ini_codigo}; + $counters_cat->{$item->{ct_espe_ini_id_categoria}}{categoria}{nome} = $item->{ct_espe_ini_nome}; + } + if ($item->{espe_fim}) { + $counters_cat->{$item->{ct_espe_fim_id_categoria}}{espera} -= $item->{espe_fim}; + $counters_cat->{$item->{ct_espe_fim_id_categoria}}{categoria}{codigo} = $item->{ct_espe_fim_codigo}; + $counters_cat->{$item->{ct_espe_fim_id_categoria}}{categoria}{nome} = $item->{ct_espe_fim_nome}; + } + if ($item->{cham_ini}) { + $counters_cat->{$item->{ct_cham_ini_id_categoria}}{chamando} += $item->{cham_ini}; + $counters_cat->{$item->{ct_cham_ini_id_categoria}}{categoria}{codigo} = $item->{ct_cham_ini_codigo}; + $counters_cat->{$item->{ct_cham_ini_id_categoria}}{categoria}{nome} = $item->{ct_cham_ini_nome}; + } + if ($item->{cham_fim}) { + $counters_cat->{$item->{ct_cham_fim_id_categoria}}{chamando} -= $item->{cham_fim}; + $counters_cat->{$item->{ct_cham_fim_id_categoria}}{categoria}{codigo} = $item->{ct_cham_fim_codigo}; + $counters_cat->{$item->{ct_cham_fim_id_categoria}}{categoria}{nome} = $item->{ct_cham_fim_nome}; + } + if ($item->{aten_ini}) { + $counters_cat->{$item->{ct_aten_ini_id_categoria}}{atendimento} += $item->{aten_ini}; + $counters_cat->{$item->{ct_aten_ini_id_categoria}}{categoria}{codigo} = $item->{ct_aten_ini_codigo}; + $counters_cat->{$item->{ct_aten_ini_id_categoria}}{categoria}{nome} = $item->{ct_aten_ini_nome}; + } + if ($item->{aten_fim}) { + $counters_cat->{$item->{ct_aten_fim_id_categoria}}{atendimento} -= $item->{aten_fim}; + $counters_cat->{$item->{ct_aten_fim_id_categoria}}{categoria}{codigo} = $item->{ct_aten_fim_codigo}; + $counters_cat->{$item->{ct_aten_fim_id_categoria}}{categoria}{nome} = $item->{ct_aten_fim_nome}; + } + if ($item->{no_show}) { + $counters_cat->{$item->{ct_no_show_id_categoria}}{no_show} += $item->{no_show}; + $counters_cat->{$item->{ct_no_show_id_categoria}}{categoria}{codigo} = $item->{ct_no_show_codigo}; + $counters_cat->{$item->{ct_no_show_id_categoria}}{categoria}{nome} = $item->{ct_no_show_nome}; + } + + } + + $c->model('DB::ActivityLog')->create + ({ activity_type => '/atendimento/estados', + id_local => $id, + vt_base => $c->stash->{vt_base}, + vt_ini => $c->stash->{now} }); + + }); + + + +} + +1; diff --git a/Fila-ETL/lib/Fila/ETL/Controller/Root.pm b/Fila-ETL/lib/Fila/ETL/Controller/Root.pm new file mode 100644 index 0000000..3fd5474 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/Controller/Root.pm @@ -0,0 +1,41 @@ +package Fila::ETL::Controller::Root; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base qw(Catalyst::Controller); +use DateTime::Format::Pg; + +__PACKAGE__->config->{namespace} = ''; + +sub base :Chained('/') :PathPart('') :CaptureArgs(0) { + my ($self, $c) = @_; + my $now = DateTime->now(time_zone => 'local'); + $now->set_formatter('DateTime::Format::Pg'); + $c->stash->{now} = $now; +} + +sub end :Private { + my ($self, $c) = @_; + if (my @err = @{$c->error}) { + $c->res->body(join '', @err); + $c->error(0); + } +} + +1; diff --git a/Fila-ETL/lib/Fila/ETL/DB.pm b/Fila-ETL/lib/Fila/ETL/DB.pm new file mode 100644 index 0000000..6886ec2 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/DB.pm @@ -0,0 +1,36 @@ +package Fila::ETL::DB; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class::Schema); + +__PACKAGE__->load_classes(); + +1; + +__END__ + +=head1 NAME + +DB - DBIx::Class::Schema + +=head1 DESCRIPTION + +Essa classe prove o schema de banco de dados para uso com o DBIx::Class. + +=cut + diff --git a/Fila-ETL/lib/Fila/ETL/DB/ActivityLog.pm b/Fila-ETL/lib/Fila/ETL/DB/ActivityLog.pm new file mode 100644 index 0000000..f25b0d6 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/DB/ActivityLog.pm @@ -0,0 +1,62 @@ +package Fila::ETL::DB::ActivityLog; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('activitylog'); +__PACKAGE__->add_columns + ( + id_local => + { + data_type => 'integer', + }, + activity_type => + { + data_type => 'varchar', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_base => + { + data_type => 'timestamp with time zone', + } + ); + +__PACKAGE__->set_primary_key(qw(id_local activity_type vt_ini)); + +1; + +__END__ + +=head1 NAME + +ActivityLog - Controle de atividades de ETL + +=head1 DESCRIPTION + +Essa tabela contém as atividades de ETL realizadas, guardando a data +de base para as operações, bem como a data e hora de início da +operação. Essa tabela será usada pelo próprio processo de ETL para +poder determinar os intervalos de tempo a serem trabalhados. + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/DB/DAtendente.pm b/Fila-ETL/lib/Fila/ETL/DB/DAtendente.pm new file mode 100644 index 0000000..4c4e659 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/DB/DAtendente.pm @@ -0,0 +1,76 @@ +package Fila::ETL::DB::DAtendente; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(Core PK::Auto)); +__PACKAGE__->table('d_atendente'); +__PACKAGE__->add_columns + ( + id_atendente => + { + data_type => 'integer', + is_auto_increment => 1 + }, + matricula => + { + data_type => 'varchar', + is_nullable => 1, + }, + nome => + { + data_type => 'varchar', + is_nullable => 1, + }, + ); + +__PACKAGE__->set_primary_key('id_atendente'); +__PACKAGE__->resultset_class('Fila::ETL::DB::DAtendente::RS'); + +package Fila::ETL::DB::DAtendente::RS; +use base 'DBIx::Class::ResultSet'; + +sub get_dimension { + my ($self, $atendente) = @_; + my $matricula = $atendente->jid; + $matricula =~ s/\@.+$//; + if (my $dim = $self->find({ matricula => $matricula })) { + return $dim->id_atendente; + } else { + # TODO: Obter isso de um lugar mais inteligente; + return $self->create + ({ matricula => $matricula ? $matricula : '', + nome => $atendente->nome })->id_atendente; + } +} + +1; + +__END__ + +=head1 NAME + +DGuiche - Tabela da dimensão "Atendente" + +=head1 SYNOPSIS + +Essa tabela lista todas as entradas da dimensão "Atendente". + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/DB/DCategoria.pm b/Fila-ETL/lib/Fila/ETL/DB/DCategoria.pm new file mode 100644 index 0000000..a4c185b --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/DB/DCategoria.pm @@ -0,0 +1,85 @@ +package Fila::ETL::DB::DCategoria; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(Core PK::Auto)); +__PACKAGE__->table('d_categoria'); +__PACKAGE__->add_columns + ( + id_categoria => + { + data_type => 'integer', + is_auto_increment => 1 + }, + nome => + { + data_type => 'varchar', + is_nullable => 1, + }, + codigo => + { + data_type => 'varchar', + is_nullable => 1, + }, + prioritaria => + { + data_type => 'boolean', + is_nullable => 1, + } + ); + +__PACKAGE__->set_primary_key('id_categoria'); +__PACKAGE__->resultset_class('Fila::ETL::DB::DCategoria::RS'); + +package Fila::ETL::DB::DCategoria::RS; +use base 'DBIx::Class::ResultSet'; + + +sub get_dimension { + my ($self, $categoria) = @_; + my $nome = $categoria->nome; + if (my $dim = $self->find({ nome => $nome })) { + return $dim->id_categoria; + } else { + # Aqui vamos presumir que se a categoria tem "preferencial" ou + # "prioritaria" no nome, ela é prioritária, senão ela é normal. + return $self->create + ({ nome => $categoria->nome, + codigo => $categoria->codigo, + prioritaria => $categoria->nome =~ /(prefer|priorit)/i ? 1 : 0 + })->id_categoria; + } +} + + +1; + +__END__ + +=head1 NAME + +DCategoria - Tabela da dimensão "Categoria" + +=head1 SYNOPSIS + +Essa tabela lista todas as entradas da dimensão "Categoria". + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/DB/DData.pm b/Fila-ETL/lib/Fila/ETL/DB/DData.pm new file mode 100644 index 0000000..686d6d9 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/DB/DData.pm @@ -0,0 +1,89 @@ +package Fila::ETL::DB::DData; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(Core PK::Auto)); +__PACKAGE__->table('d_data'); +__PACKAGE__->add_columns + ( + data => + { + data_type => 'char(10)', + }, + ano => + { + data_type => 'integer', + is_nullable => 1, + }, + mes => + { + data_type => 'integer', + is_nullable => 1, + }, + dia => + { + data_type => 'integer', + is_nullable => 1, + }, + diasemana => + { + data_type => 'integer', + is_nullable => 1, + } + ); + +__PACKAGE__->set_primary_key('data'); +__PACKAGE__->resultset_class('Fila::ETL::DB::DData::RS'); + +package Fila::ETL::DB::DData::RS; +use base 'DBIx::Class::ResultSet'; + + +sub get_dimension { + my ($self, $date) = @_; + my $result = $self->find({ ano => $date->year, + mes => $date->month, + dia => $date->day }); + if ($result) { + return $result->data; + } else { + return $self->create + ({ data => $date->strftime('%F'), + ano => $date->year, + mes => $date->month, + dia => $date->day, + diasemana => $date->day_of_week })->data; + } +} + +1; + +__END__ + +=head1 NAME + +DData - Tabela da dimensão "Data" + +=head1 SYNOPSIS + +Essa tabela lista todas as entradas da dimensão "Data". + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/DB/DGuiche.pm b/Fila-ETL/lib/Fila/ETL/DB/DGuiche.pm new file mode 100644 index 0000000..0893340 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/DB/DGuiche.pm @@ -0,0 +1,75 @@ +package Fila::ETL::DB::DGuiche; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(Core PK::Auto)); +__PACKAGE__->table('d_guiche'); +__PACKAGE__->add_columns + ( + id_guiche => + { + data_type => 'integer', + is_auto_increment => 1 + }, + identificador => + { + data_type => 'varchar', + is_nullable => 1, + } + ); + +__PACKAGE__->set_primary_key('id_guiche'); +__PACKAGE__->resultset_class('Fila::ETL::DB::DGuiche::RS'); + +package Fila::ETL::DB::DGuiche::RS; +use base 'DBIx::Class::ResultSet'; + + +sub get_dimension { + my ($self, $guiche) = @_; + my $ident = $guiche->identificador; + if (my $dim = $self->find({ identificador => $ident })) { + return $dim->id_guiche; + } else { + # TODO: Aqui deveríamos ter um conjunto maior de informações + # sobre o guichê, como por exemplo, a distância entre o guichê + # e a porta, a distância entre o guichê e a cadeira mais + # próxima, a distância entre o guichê e a cadeira mais longe + # para que pudéssemos obter mais informações. Por enquanto, + # consolidamos apenas no número do guichê. + return $self->create + ({ identificador => $ident ? $ident : '' })->id_guiche; + } +} + +1; + +__END__ + +=head1 NAME + +DGuiche - Tabela da dimensão "Guiche" + +=head1 SYNOPSIS + +Essa tabela lista todas as entradas da dimensão "Guiche". + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/DB/DHorario.pm b/Fila-ETL/lib/Fila/ETL/DB/DHorario.pm new file mode 100644 index 0000000..192ebe2 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/DB/DHorario.pm @@ -0,0 +1,76 @@ +package Fila::ETL::DB::DHorario; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(Core PK::Auto)); +__PACKAGE__->table('d_horario'); +__PACKAGE__->add_columns + ( + horario => + { + data_type => 'char(5)', + }, + hora => + { + data_type => 'integer', + is_nullable => 1, + }, + minuto => + { + data_type => 'integer', + is_nullable => 1, + } + ); + +__PACKAGE__->set_primary_key('horario'); +__PACKAGE__->resultset_class('Fila::ETL::DB::DHorario::RS'); + +package Fila::ETL::DB::DHorario::RS; +use base 'DBIx::Class::ResultSet'; + + +sub get_dimension { + my ($self, $date) = @_; + my $result = $self->find({ hora => $date->hour, + minuto => $date->minute }); + if ($result) { + return $result->horario; + } else { + return $self->create + ({ horario => $date->strftime('%H:%M'), + hora => $date->hour, + minuto => $date->minute })->horario; + } +} + +1; + +__END__ + +=head1 NAME + +DHorario - Tabela da dimensão "Horario" + +=head1 SYNOPSIS + +Essa tabela lista todas as entradas da dimensão "Horario". + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/DB/DLocal.pm b/Fila-ETL/lib/Fila/ETL/DB/DLocal.pm new file mode 100644 index 0000000..d88bf14 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/DB/DLocal.pm @@ -0,0 +1,70 @@ +package Fila::ETL::DB::DLocal; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(Core PK::Auto)); +__PACKAGE__->table('d_local'); +__PACKAGE__->add_columns + ( + id_local => + { + data_type => 'integer', + is_auto_increment => 1 + }, + nome => + { + data_type => 'varchar', + is_nullable => 1, + } + ); + +__PACKAGE__->set_primary_key('id_local'); +__PACKAGE__->resultset_class('Fila::ETL::DB::DLocal::RS'); + +package Fila::ETL::DB::DLocal::RS; +use base 'DBIx::Class::ResultSet'; + +sub get_dimension { + my ($self, $local) = @_; + my $nome = $local->nome; + if (my $dim = $self->find({ nome => $nome })) { + return $dim->id_local; + } else { + # Aqui também precisaríamos de mais informações acerca da + # praça de atendimento... + return $self->create({ nome => $nome })->id_local; + } +} + +1; + +__END__ + +=head1 NAME + +DLocal - Tabela da dimensão "Local" + +=head1 SYNOPSIS + +Essa tabela lista todas as entradas da dimensão "Local", que +representa uma praça de atendimento. + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/DB/FQuantidadeAtendimentos.pm b/Fila-ETL/lib/Fila/ETL/DB/FQuantidadeAtendimentos.pm new file mode 100644 index 0000000..d01956d --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/DB/FQuantidadeAtendimentos.pm @@ -0,0 +1,107 @@ +package Fila::ETL::DB::FQuantidadeAtendimentos; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(Core)); +__PACKAGE__->table('f_quantidade_atendimentos'); +__PACKAGE__->add_columns + ( + id_local => + { + data_type => 'integer', + }, + id_categoria => + { + data_type => 'integer', + }, + id_guiche => + { + data_type => 'integer', + }, + id_atendente => + { + data_type => 'integer', + }, + data => + { + data_type => 'char(10)', + }, + horario => + { + data_type => 'char(5)', + }, + quantidade => + { + data_type => 'integer', + }, + min_tempo_espera => + { + data_type => 'integer', + }, + max_tempo_espera => + { + data_type => 'integer', + }, + sum_tempo_espera => + { + data_type => 'integer', + }, + min_tempo_deslocamento => + { + data_type => 'integer', + }, + max_tempo_deslocamento => + { + data_type => 'integer', + }, + sum_tempo_deslocamento => + { + data_type => 'integer', + }, + min_tempo_atendimento => + { + data_type => 'integer', + }, + max_tempo_atendimento => + { + data_type => 'integer', + }, + sum_tempo_atendimento => + { + data_type => 'integer', + }, + ); + + +1; + +__END__ + +=head1 NAME + +FQuantidadeAtendimentos - Tabela de fatos de atendimentos iniciados por minuto + +=head1 DESCRIPTION + +Esta tabela contem o total de atendimentos iniciados por local, +categoria, guichê, atendente, data, hora e minuto. + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/DB/FQuantidadeEstados.pm b/Fila-ETL/lib/Fila/ETL/DB/FQuantidadeEstados.pm new file mode 100644 index 0000000..703f43e --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/DB/FQuantidadeEstados.pm @@ -0,0 +1,75 @@ +package Fila::ETL::DB::FQuantidadeEstados; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(Core)); +__PACKAGE__->table('f_quantidade_estados'); +__PACKAGE__->add_columns + ( + id_local => + { + data_type => 'integer', + }, + id_categoria => + { + data_type => 'integer', + }, + data => + { + data_type => 'char(10)', + }, + horario => + { + data_type => 'char(5)', + }, + quantidade_espera => + { + data_type => 'integer', + }, + quantidade_chamando => + { + data_type => 'integer', + }, + quantidade_atendimento => + { + data_type => 'integer', + }, + quantidade_no_show => + { + data_type => 'integer', + }, + ); + + +1; + +__END__ + +=head1 NAME + +FQuantidadeEstados - Tabela de quantidades por estado de atendimento + +=head1 DESCRIPTION + +Esta tabela contem o total de atendimentos em um determinado estado +por local, categoria, data, hora e minuto. + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/Model/DB.pm b/Fila-ETL/lib/Fila/ETL/Model/DB.pm new file mode 100644 index 0000000..bf230f5 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/Model/DB.pm @@ -0,0 +1,37 @@ +package Fila::ETL::Model::DB; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Model::DBIC::Schema'; + + +1; + +__END__ + +=head1 NAME + +DB - Configura o acesso ao DBIx::Class + +=head1 DESCRIPTION + +Seguindo a configuração no arquivo fila_servico.yml, define os meios +de acesso para o banco de dados utilizando o DBIx::Class. + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/Model/DBAgendamento.pm b/Fila-ETL/lib/Fila/ETL/Model/DBAgendamento.pm new file mode 100644 index 0000000..735fe63 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/Model/DBAgendamento.pm @@ -0,0 +1,37 @@ +package Fila::ETL::Model::DBAgendamento; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Model::DBIC::Schema'; + + +1; + +__END__ + +=head1 NAME + +DB - Configura o acesso ao DBIx::Class + +=head1 DESCRIPTION + +Seguindo a configuração no arquivo fila_servico.yml, define os meios +de acesso para o banco de dados utilizando o DBIx::Class. + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/Model/DBSERVI.pm b/Fila-ETL/lib/Fila/ETL/Model/DBSERVI.pm new file mode 100644 index 0000000..3e6f72f --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/Model/DBSERVI.pm @@ -0,0 +1,37 @@ +package Fila::ETL::Model::DBSERVI; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Model::DBIC::Schema'; + + +1; + +__END__ + +=head1 NAME + +DB - Configura o acesso ao DBIx::Class + +=head1 DESCRIPTION + +Seguindo a configuração no arquivo fila_servico.yml, define os meios +de acesso para o banco de dados utilizando o DBIx::Class. + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/Model/Federado.pm b/Fila-ETL/lib/Fila/ETL/Model/Federado.pm new file mode 100644 index 0000000..6e60f44 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/Model/Federado.pm @@ -0,0 +1,42 @@ +package Fila::ETL::Model::Federado; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Model'; + +__PACKAGE__->mk_accessors('federacao'); + +sub target { + my ($self, $c, $id, $class) = @_; + return $c->model($self->federacao->{$id}.'::'.$class); +} + +sub storage { + my ($self, $c, $id) = @_; + return $c->model($self->federacao->{$id})->schema->storage; +} + +sub doeach { + my ($self, $c, $code) = @_; + foreach my $id (keys %{$self->federacao}) { + $code->($id); + } +} + +1; diff --git a/Fila-ETL/lib/Fila/Servico b/Fila-ETL/lib/Fila/Servico new file mode 120000 index 0000000..d120748 --- /dev/null +++ b/Fila-ETL/lib/Fila/Servico @@ -0,0 +1 @@ +../../../Fila-Servico/lib/Fila/Servico \ No newline at end of file diff --git a/Fila-ETL/script/fila_etl.pl b/Fila-ETL/script/fila_etl.pl new file mode 100755 index 0000000..a4b41a3 --- /dev/null +++ b/Fila-ETL/script/fila_etl.pl @@ -0,0 +1,50 @@ +#!/usr/bin/perl -w +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +$ENV{CATALYST_ENGINE} = 'Embeddable'; + +use strict; +use warnings; +use Getopt::Long; +use FindBin; +use lib "$FindBin::Bin/../lib"; + + +my $debug = 0; +my $help = 0; + +my @argv = @ARGV; + +GetOptions( + 'debug|d' => \$debug, +); + +if ( $debug ) { + $ENV{CATALYST_DEBUG} = 1; +} + +require Fila::ETL; + +my $action = shift || die 'Nenhuma ação definida'; + +my $http_response; +my $http_request = HTTP::Request->new(GET => $action); +Fila::ETL->handle_request($http_request, \$http_response); +print $http_response->as_string; + +1; diff --git a/Fila-ETL/script/fila_etl_db.pl b/Fila-ETL/script/fila_etl_db.pl new file mode 100755 index 0000000..3f8106d --- /dev/null +++ b/Fila-ETL/script/fila_etl_db.pl @@ -0,0 +1,42 @@ +#!/usr/bin/perl +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use lib 'lib'; +use SQL::Translator; + +my $t = SQL::Translator->new + ( + show_warnings => 1, + add_drop_table => 1, + quote_table_names => 1, + quote_field_names => 1, + validate => 1, + ); +$t->parser_args + ( + 'DBIx::Schema' => 'Fila::ETL::DB', + ); +my $r = $t->translate + ( + from => 'SQL::Translator::Parser::DBIx::Class', + to => 'PostgreSQL', + ) or die $t->error; +print $r; + diff --git a/Fila-Opiniometro/fila_opiniometro.yml b/Fila-Opiniometro/fila_opiniometro.yml new file mode 100644 index 0000000..1bb068f --- /dev/null +++ b/Fila-Opiniometro/fila_opiniometro.yml @@ -0,0 +1,16 @@ +--- +name: Fila::Opiniometro +Engine::XMPP2: + username: opiniometro1 + domain: agents.fila.vhost + password: password + override_host: localhost +timeout: 5 +portas: + opiniometro: emulate +perguntas: + - 1 + - 2 + - 3 + - 4 + - 5 diff --git a/Fila-Opiniometro/lib/Fila/Opiniometro.pm b/Fila-Opiniometro/lib/Fila/Opiniometro.pm new file mode 100644 index 0000000..e3acd09 --- /dev/null +++ b/Fila-Opiniometro/lib/Fila/Opiniometro.pm @@ -0,0 +1,134 @@ +package Fila::Opiniometro; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use EV; +use Catalyst::Runtime '5.70'; +use Catalyst qw/-Debug ConfigLoader Static::Simple/; + +our $VERSION = '0.01'; + +warn 'Setting up application'; +__PACKAGE__->setup; + +if ($::username) { + __PACKAGE__->config->{'Engine::XMPP2'}{username} = $::username; +} + +# variavel para receber username +our $porta_opiniometro; +our $perguntas; +our $timeout; +{ + my $portas = __PACKAGE__->config->{portas}; + + die 'Porta do dispositivo nao configurada' unless + $porta_opiniometro = $portas->{opiniometro}; + + $perguntas = __PACKAGE__->config->{perguntas} + or die 'Categorias nao configuradas.'; + + $timeout = __PACKAGE__->config->{timeout} || 5; +} + + +# Inicializar uma conexão principal de controle que ira fazer a +# inicializacao + +$::connection = Net::XMPP2::Connection->new + (%{Fila::Opiniometro->config->{'Engine::XMPP2'}}, + resource => 'Main Connection'); + +$::connection->reg_cb + (bind_error => sub { + warn 'Error binding to resource'; + EV::unloop(EV::UNLOOP_ALL); + }, + + iq_auth_error => sub { + warn 'Authentication error'; + EV::unloop(EV::UNLOOP_ALL); + }, + + sasl_error => sub { + warn 'Authentication error'; + EV::unloop(EV::UNLOOP_ALL); + }, + + disconnect => sub { + warn 'Disconnecting.'; + EV::unloop(EV::UNLOOP_ALL); + }, + + stream_error => sub { + warn 'Connection error.'; + EV::unloop(EV::UNLOOP_ALL); + }, + + stream_ready => sub { + $::connection->send_presence('available', sub {}); + + warn 'Setting up connection...'; + Fila::Opiniometro->model('SOAP')->transport->connection($::connection); + Fila::Opiniometro->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/opiniometro']); + + if ($::praca && $::praca == 1) { + warn 'Iniciando Opiniometro..'; + Fila::Opiniometro->model('Device')->iniciar; + } else { + warn 'Opiniometro sempre inicia desligado, e espera por eventos'; + Fila::Opiniometro->model('Device')->encerrar; + } + eval { + Fila::Opiniometro->run(); + }; + if ($@) { + warn 'Error running application: '.$@; + EV::unloop(EV::UNLOOP_ALL); + } + }); + +unless ($::connection->connect) { + die 'Cannot connect to server'; +} else { + warn 'Connecting...'; + EV::loop; +} + + +1; + +__END__ + +=head1 NAME + +Opiniometro - Aplicação para comunicação com o dispositivo opiniômetro + +=head1 SYNOPSIS + + # dentro do diretório Fila-Opiniometro + ./script/fila_opiniometro_app.pl + +=head1 DESCRIPTION + +Este é o módulo de aplicação que comunica-se com o dispositivo +opiniômetro para registrar a avaliação dos usuários sobre a praça. + +=cut + diff --git a/Fila-Opiniometro/lib/Fila/Opiniometro/Controller/Callback.pm b/Fila-Opiniometro/lib/Fila/Opiniometro/Controller/Callback.pm new file mode 100644 index 0000000..6f7cb04 --- /dev/null +++ b/Fila-Opiniometro/lib/Fila/Opiniometro/Controller/Callback.pm @@ -0,0 +1,52 @@ +package Fila::Opiniometro::Controller::Callback; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Controller::SOAP'; + +__PACKAGE__->config->{wsdl} = + {wsdl => Fila::Opiniometro->path_to('schemas/FilaOpiniometro.wsdl')}; + +sub iniciar_opiniometro :WSDLPort('FilaOpiniometroCallback') { + my ($self, $c) = @_; + $c->model('Device')->iniciar; +} + +sub encerrar_opiniometro :WSDLPort('FilaOpiniometroCallback') { + my ($self, $c) = @_; + $c->model('Device')->encerrar; +} + + +1; + +__END__ + +=head1 NAME + +Callback - Recebe notificacao para encerrar/iniciar aparelho + +=head1 DESCRIPTION + +As avaliações só podem ser realizadas com a praça aberta, por isso o +opiniometro precisa receber mensagens do serviço para a +disponibilização e o encerramento do opiniometro. + +=cut + diff --git a/Fila-Opiniometro/lib/Fila/Opiniometro/Device.pm b/Fila-Opiniometro/lib/Fila/Opiniometro/Device.pm new file mode 100644 index 0000000..8e4f181 --- /dev/null +++ b/Fila-Opiniometro/lib/Fila/Opiniometro/Device.pm @@ -0,0 +1,210 @@ +package Fila::Opiniometro::Model::Device; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use EV; +use IO::Handle; +use POSIX qw(:termios_h); +use base 'Catalyst::Model'; + +__PACKAGE__->mk_accessors('fh', 'read_buffer', 'write_buffer'); + +our ($read_watcher, $write_watcher); + +sub encerrar { + my $self = shift; + + if ($Fila::Opiniometro::porta_opiniometro eq 'emulate') { + warn 'Desligar Opiniometro!'.$/; + $self->_check_emulate_watcher(); + } else { + $self->push_write('@OPC.'); + } +} + +sub iniciar { + my $self = shift; + + if ($Fila::Opiniometro::porta_opiniometro eq 'emulate') { + warn 'Iniciar Opiniometro!'.$/; + $self->_check_emulate_watcher(); + } else { + $self->push_write('@OPI'.$Fila::Opiniometro::timeout.'.'); + } +} + +sub push_write { + my ($self, $buf) = @_; + + $self->write_buffer + (($self->write_buffer()||''). + $buf); + + $self->_check_fh; + $self->_check_wb; +} + +sub _check_fh { + my $self = shift; + + return if $self->fh; + + open my $fh, '+<', $Fila::Opiniometro::porta_opiniometro + or do { + warn 'Erro abrindo porta do emissor: '.$!; + EV::unloop(EV::UNLOOP_ALL); + die 'Erro abrindo porta do emissor: '.$!; + }; + + $fh->blocking(0); + + my $term = POSIX::Termios->new; + $term->getattr(fileno($fh)) or die $!; + $term->setospeed(&POSIX::B1200); + $term->setispeed(&POSIX::B1200); + $term->setiflag($term->getiflag ^ &POSIX::IXON ^ &POSIX::IXOFF | &POSIX::IGNBRK | &POSIX::BRKINT | &POSIX::IGNPAR); + $term->setcflag($term->getcflag | &POSIX::CSIZE | &POSIX::CS8); + $term->setattr(fileno($fh), &POSIX::TCSANOW) or die $!; + + $self->fh($fh); + + $read_watcher = EV::io $fh, EV::READ, sub { + my $buf; + while (my $ret = $fh->sysread($buf, '100')) { + $self->push_read($buf); + } + }; +} + +sub _check_emulate_watcher { + my $self = shift; + STDIN->blocking(0); + $read_watcher = EV::io \*STDIN, EV::READ, sub { + my $buf; + while (my $ret = STDIN->sysread($buf, '100')) { + $self->push_read($buf); + } + }; +} + +sub _check_wb { + my $self = shift; + + return if $write_watcher || !$self->write_buffer; + + $write_watcher = EV::io $self->fh, EV::WRITE, sub { + use bytes; + my $buf = $self->write_buffer; + my $len = length $buf; + my $wrt = $self->fh->syswrite($buf, $len); + substr($buf,0,$wrt,''); + $self->write_buffer($buf); + $write_watcher = undef unless $buf; + }; +} + +sub push_read { + my ($self, $buf) = @_; + + warn "antes"; + $self->read_buffer + (($self->read_buffer()||''). + $buf); + warn "antes"; + + $self->_check_rb; + warn "antes"; +} + +sub _check_rb { + my $self = shift; + + my $buf = $self->read_buffer; + return unless $buf; + return unless length $buf >= 5; + + while ($buf) { + if (substr($buf,0,1) ne '@') { + my $pos = index $buf, '@'; + if ($pos < 0) { + warn 'Disarding bad read buffer ('.$buf.')'; + $self->read_buffer(''); + return; + } else { + my $bad = substr($buf,0,$pos-1,''); + warn 'Discaring bad read buffer ('.$bad.')'; + } + } elsif ($buf =~ s/^\@OPK.//) { + # ok... + } elsif ($buf =~ /^\@\d/) { + last if length $buf < 7; + my $cmd = substr($buf,0,7,''); + my $respostas = + [ map { { id_pergunta => $_->[0], resposta => $_->[1] } } + map { [ $Fila::Opiniometro::perguntas->[$_] => substr($cmd,1+$_,1) ] } + 0..4 ]; + + if ($::praca && $::praca == 1) { + my $dados = Fila::Opiniometro->model('SOAP::Opiniometro')->registrar_avaliacao_praca + ({ avaliacao_atendimento => { resposta => $respostas } }); + } else { + my $dados = Fila::Opiniometro->model('SOAP::Opiniometro')->registrar_avaliacao + ({ avaliacao_atendimento => { resposta => $respostas } }); + } + if ($dados->{Fault}) { + warn 'Erro ao enviar avaliacao. '.$dados->{Fault}{faultstring}; + } + $self->encerrar; + + } else { + substr $buf, 0, 1, ''; + last; + } + } + + $self->read_buffer($buf); + +} + +1; + +__END__ + +=head1 NAME + +Device - Esse módulo implementa a comunicação com o aparelho +opiniometro + +=head1 DESCRIPTION + +Este módulo implementa a comunicação com o aparelho opiniometro, +utilizando o seguinte protocolo (> para escrita e < para leitura): + + # Inicia o opiniometro, deixando 5 segundos de + # tempo para o usuario responder cada pergunta + > @OPI5. + # Sucesso + < @OPK. + # Falha + < @OPE. + # Registra a informação do voto + < @12343. + +=cut + diff --git a/Fila-Opiniometro/lib/Fila/Opiniometro/Model/Device.pm b/Fila-Opiniometro/lib/Fila/Opiniometro/Model/Device.pm new file mode 100644 index 0000000..c53b642 --- /dev/null +++ b/Fila-Opiniometro/lib/Fila/Opiniometro/Model/Device.pm @@ -0,0 +1,220 @@ +package Fila::Opiniometro::Model::Device; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use EV; +use IO::Handle; +use POSIX qw(:termios_h); +use base 'Catalyst::Model'; + +__PACKAGE__->mk_accessors('fh', 'read_buffer', 'write_buffer'); + +our ($read_watcher, $write_watcher); + +sub encerrar { + my $self = shift; + + if ($Fila::Opiniometro::porta_opiniometro eq 'emulate') { + warn 'Desligar Opiniometro!'.$/; + $self->_check_emulate_watcher(); + } else { + $self->push_write('@OPC.'); + } +} + +sub iniciar { + my $self = shift; + + if ($Fila::Opiniometro::porta_opiniometro eq 'emulate') { + warn 'Iniciar Opiniometro!'.$/; + $self->_check_emulate_watcher(); + } else { + $self->push_write('@OPI'.$Fila::Opiniometro::timeout.'.'); + } +} + +sub push_write { + my ($self, $buf) = @_; + + $self->write_buffer + (($self->write_buffer()||''). + $buf); + + $self->_check_fh; + $self->_check_wb; +} + +sub _check_fh { + my $self = shift; + + return if $self->fh; + + open my $fh, '+<', $Fila::Opiniometro::porta_opiniometro + or do { + warn 'Erro abrindo porta do emissor: '.$!; + EV::unloop(EV::UNLOOP_ALL); + die 'Erro abrindo porta do emissor: '.$!; + }; + + $fh->blocking(0); + + my $term = POSIX::Termios->new; + $term->getattr(fileno($fh)) or die $!; + + $term->setiflag( $term->getiflag & ( &POSIX::IGNBRK | &POSIX::IGNPAR & ~&POSIX::INPCK & ~ &POSIX::IXON & ~ &POSIX::IXOFF)); + $term->setlflag( $term->getlflag & ~( &POSIX::ICANON | &POSIX::ECHO | &POSIX::ECHONL | &POSIX::ISIG | &POSIX::IEXTEN )); + $term->setcflag( $term->getcflag & ( &POSIX::CSIZE | &POSIX::CS8 & ~&POSIX::PARENB)); + + $term->setospeed(&POSIX::B1200); + $term->setispeed(&POSIX::B1200); + + $term->setattr(fileno($fh), &POSIX::TCSANOW) or die $!; + + $self->fh($fh); + + $read_watcher = EV::io $fh, EV::READ, sub { + my $buf; + while (my $ret = $fh->sysread($buf, '100')) { + $self->push_read($buf); + } + }; +} + +sub _check_emulate_watcher { + my $self = shift; + STDIN->blocking(0); + $read_watcher = EV::io \*STDIN, EV::READ, sub { + my $buf; + while (my $ret = STDIN->sysread($buf, '100')) { + warn 'Read '.$ret.' bytes ('.$buf.')'; + $self->push_read($buf); + } + }; +} + +sub _check_wb { + my $self = shift; + + return if $write_watcher || !$self->write_buffer; + + $write_watcher = EV::io $self->fh, EV::WRITE, sub { + use bytes; + my $buf = $self->write_buffer; + my $len = length $buf; + my $wrt = $self->fh->syswrite($buf, $len); + my $wrote = substr($buf,0,$wrt,''); + warn 'Wrote '.$wrt.' bytes ('.$wrote.')'; + $self->write_buffer($buf); + $write_watcher = undef unless $buf; + }; +} + +sub push_read { + my ($self, $buf) = @_; + + $self->read_buffer + (($self->read_buffer()||''). + $buf); + + $self->_check_rb; +} + +sub _check_rb { + my $self = shift; + + my $buf = $self->read_buffer; + return unless $buf; + return unless length $buf >= 5; + + while ($buf) { + if (substr($buf,0,1) ne '@') { + my $pos = index $buf, '@'; + if ($pos < 0) { + warn 'Disarding bad read buffer ('.$buf.')'; + $self->read_buffer(''); + return; + } else { + my $bad = substr($buf,0,$pos-1,''); + warn 'Discaring bad read buffer ('.$bad.')'; + } + } elsif ($buf =~ s/^\@OPK.//) { + # ok... + } elsif ($buf =~ /^\@\d/) { + last if length $buf < 7; + my $cmd = substr($buf,0,7,''); + my $respostas = + [ map { { id_pergunta => $_->[0], resposta => $_->[1] } } + map { [ $Fila::Opiniometro::perguntas->[$_] => substr($cmd,1+$_,1) ] } + 0..4 ]; + + my $dados; + if ($::praca && $::praca == 1) { + $dados = Fila::Opiniometro->model('SOAP::Opiniometro')->registrar_avaliacao_praca + ({ avaliacao_atendimento => { resposta => $respostas } }); + } else { + $dados = Fila::Opiniometro->model('SOAP::Opiniometro')->registrar_avaliacao + ({ avaliacao_atendimento => { resposta => $respostas } }); + } + + if ($dados->{Fault}) { + warn 'Erro ao enviar avaliacao. '.$dados->{Fault}{faultstring}; + } + if ($::praca && $::praca == 1) { + sleep 5; + $self->iniciar; + } else { + $self->encerrar; + } + + } else { + substr $buf, 0, 1, ''; + last; + } + } + + $self->read_buffer($buf); + +} + +1; + +__END__ + +=head1 NAME + +Device - Esse módulo implementa a comunicação com o aparelho +opiniometro + +=head1 DESCRIPTION + +Este módulo implementa a comunicação com o aparelho opiniometro, +utilizando o seguinte protocolo (> para escrita e < para leitura): + + # Inicia o opiniometro, deixando 5 segundos de + # tempo para o usuario responder cada pergunta + > @OPI5. + # Sucesso + < @OPK. + # Falha + < @OPE. + # Registra a informação do voto + < @12343. + +=cut + diff --git a/Fila-Opiniometro/lib/Fila/Opiniometro/Model/SOAP.pm b/Fila-Opiniometro/lib/Fila/Opiniometro/Model/SOAP.pm new file mode 100644 index 0000000..f3ed879 --- /dev/null +++ b/Fila-Opiniometro/lib/Fila/Opiniometro/Model/SOAP.pm @@ -0,0 +1,45 @@ +package Fila::Opiniometro::Model::SOAP; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use XML::CompileX::Transport::SOAPXMPP; +use base 'Catalyst::Model::SOAP'; + +__PACKAGE__->config->{transport} = XML::CompileX::Transport::SOAPXMPP->new(); + +__PACKAGE__->register_wsdl + ({ wsdl => Fila::Opiniometro->path_to('/schemas/FilaServico.wsdl'), + schema => Fila::Opiniometro->path_to('/schemas/fila-servico.xsd')}, + { 'GestaoOpiniometro' => 'Opiniometro' }); + +1; + +__END__ + +=head1 NAME + +SOAP - Implementa a comunicação com o Fila-Servico + +=head1 DESCRIPTION + +Implementa o lado cliente da comunicação com o Fila-Servico, que deve +receber a notificação de cada votação registrada. + +=cut + diff --git a/Fila-Opiniometro/schemas b/Fila-Opiniometro/schemas new file mode 120000 index 0000000..3614ccd --- /dev/null +++ b/Fila-Opiniometro/schemas @@ -0,0 +1 @@ +../Fila-Servico/schemas/ \ No newline at end of file diff --git a/Fila-Opiniometro/script/fila_opiniometro_app.pl b/Fila-Opiniometro/script/fila_opiniometro_app.pl new file mode 100755 index 0000000..533b3bc --- /dev/null +++ b/Fila-Opiniometro/script/fila_opiniometro_app.pl @@ -0,0 +1,61 @@ +#!/usr/bin/perl +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +$ENV{CATALYST_ENGINE} = 'XMPP2'; + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; + +use EV; +use AnyEvent; +use Net::XMPP2::Connection; +use Catalyst::Engine::XMPP2; +{ +# no warnings; + *Catalyst::Engine::XMPP2::loop = *EV::loop; +} + +my $debug = 0; +my $help = 0; + +# alteracao para setar o username variavel +$::username = $ARGV[0]; +$::praca = $ARGV[1]; #recebe 1 ou 0 para opiniometro de praca. + +GetOptions( + 'debug|d' => \$debug, + 'help|?' => \$help, +); + +pod2usage(1) if $help; + +if ( $debug ) { + $ENV{CATALYST_DEBUG} = 1; +} + + +require Fila::Opiniometro; + + +Fila::Opiniometro->run(); + +1; diff --git a/Fila-Painel/fila_painel.yml b/Fila-Painel/fila_painel.yml new file mode 100644 index 0000000..6415568 --- /dev/null +++ b/Fila-Painel/fila_painel.yml @@ -0,0 +1,9 @@ +--- +name: Fila::Opiniometro +Engine::XMPP2: + username: painel + domain: agents.fila.vhost + password: password + override_host: localhost +timeout: 5 +output: /tmp/senhas_chamando.csv diff --git a/Fila-Painel/gtk_senha.glade b/Fila-Painel/gtk_senha.glade new file mode 100644 index 0000000..bf1bd9b --- /dev/null +++ b/Fila-Painel/gtk_senha.glade @@ -0,0 +1,158 @@ + + + + + + + True + window1 + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + False + False + False + False + False + GDK_WINDOW_TYPE_HINT_DESKTOP + GDK_GRAVITY_NORTH_WEST + True + False + + + + 520 + 768 + True + + + + 520 + 60 + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + True + 0 + + + 0 + 0 + + + + + + 520 + 100 + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 43 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 65 + + + + + + + 520 + 90 + True + + False + False + GTK_JUSTIFY_CENTER + True + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 165 + + + + + + + 520 + 800 + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 43 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 240 + + + + + + + + + + diff --git a/Fila-Painel/gtk_senha.php b/Fila-Painel/gtk_senha.php new file mode 100755 index 0000000..d8993d7 --- /dev/null +++ b/Fila-Painel/gtk_senha.php @@ -0,0 +1,160 @@ +#!/usr/bin/php +set_label($tela); + if(trim($tela) != "") { + Gtk::timeout_add(100, 'toca_tchuru'); + } + $telaultima = ""; + if($ultima_p[2] > 0) { + $telaultima = $telaultima.$ultima_p[1]." ".$ultima_p[2]; + } + if($ultima_s[2] > 0) { + $telaultima = $telaultima.$ultima_s[1]." ".$ultima_s[2]; + } + if($ultima_n[2] > 0) { + $telaultima = $telaultima.$ultima_n[1]." ".$ultima_n[2]; + } + + $lblultima->set_label($telaultima); + + echo "setando label\n\n\n"; + return true; +} + + +function completa_array(){ + global $arraytotal,$tamanho; + $linhas = file("/fila-painel/tmp/senhas_chamando.csv"); + $arraytotal = array(); + foreach ($linhas as $linha_num => $linha) { + $exp = explode(",",$linha); + $senhas = $exp[0]; + $mesa = $exp[1]; + + $arraytotal[] = array($senhas,$mesa); + $tamanho = (sizeof($arraytotal)-1); + } + echo "li o arquivo\n"; + echo "tamanho: $tamanho\n"; + +} + +function completa_ultimas($ultima) { + global $ultima_s,$ultima_p,$ultima_n,$lblultima; + $cat = substr($ultima[0],0,1); + $num = substr($ultima[0],1,3); + if($cat == "N") { + if($ultima_n[0] < $num) { + $ultima_n = array($num,$ultima[0],$ultima[1]); + echo "gravando N $num\n"; + } + } elseif($cat == "P") { + if($ultima_p[0] < $num) { + $ultima_p = array($num,$ultima[0],$ultima[1]); + echo "gravando P $num\n"; + } + } elseif($cat == "S") { + if($ultima_s[0] < $num) { + $ultima_s = array($num,$ultima[0],$ultima[1]); + echo "gravando S $num\n"; + } + } +} + + +$glade=&new GladeXML('gtk_senha.glade'); + +$window = $glade->get_widget("window1"); +$titulo = $glade->get_widget("label1"); +$lblsenha = $glade->get_widget("label2"); +$ultima = $glade->get_widget("label3"); +$lblultima = $glade->get_widget("label4"); + +$window->connect_simple('destroy', array('Gtk','main_quit')); +$window->set_decorated(false); +$window->move(840,0); +$window->modify_bg(Gtk::STATE_NORMAL, GdkColor::parse("#000000")); + + + +$lblsenha->modify_font(new PangoFontDescription("Courier New Bold 72")); +$lblsenha->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#380")); + +// em producao deixar comentado +$lblsenha->set_label('P002 14'); + +$titulo->modify_font(new PangoFontDescription("Arial 50")); +$titulo->modify_fg(Gtk::STATE_NORMAL,GdkColor::parse("#380")); +$titulo->set_label(' Senha Mesa'); + +$ultima->modify_font(new PangoFontDescription("Arial 50")); +$ultima->modify_fg(Gtk::STATE_NORMAL,GdkColor::parse("#FF4500")); +$ultima->set_label(utf8_decode(' Últimas ')); + + +$lblultima->modify_font(new PangoFontDescription("Courier New Bold 72")); +$lblultima->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#FF4500")); +// em producao deixar comentado +$lblultima->set_label("P001 14\nS110 01\nI201 05\nP112 31\nN213 40"); + + + +$window->show_all(); + +// em producao deixar descomentado +//Gtk::timeout_add(2000, 'lista_senha'); + +Gtk::main(); + +?> diff --git a/Fila-Painel/gtk_senha.sh b/Fila-Painel/gtk_senha.sh new file mode 100755 index 0000000..218eebe --- /dev/null +++ b/Fila-Painel/gtk_senha.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +# Boston, MA 02110-1301 USA + +killall konqueror +killall knotify +killall knotify +php /home/f13/gtk_senha.php diff --git a/Fila-Painel/gtk_texto.php b/Fila-Painel/gtk_texto.php new file mode 100755 index 0000000..4a96a40 --- /dev/null +++ b/Fila-Painel/gtk_texto.php @@ -0,0 +1,36 @@ +#!/usr/bin/php +channel->item as $item ) { + $mensagem = $item->description; + fwrite($f,$mensagem."\n\n\n"); +} +fclose($f); +echo "atualizando array\n"; + + +?> diff --git a/Fila-Painel/gtk_texto.sh b/Fila-Painel/gtk_texto.sh new file mode 100755 index 0000000..8bfb8b6 --- /dev/null +++ b/Fila-Painel/gtk_texto.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +# Boston, MA 02110-1301 USA +# +# + + +export DISPLAY=":0" +perl /home/f13/letreiro2.pl /home/f13/noticias.txt + diff --git a/Fila-Painel/letreiro.pl b/Fila-Painel/letreiro.pl new file mode 100755 index 0000000..4abe5e2 --- /dev/null +++ b/Fila-Painel/letreiro.pl @@ -0,0 +1,75 @@ +#!/usr/bin/perl +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +use warnings; +use strict; +use Gtk2 '-init'; +use Gnome2::Canvas; + +my $ts ; +my $tempo = 20; #maior é mais lento +my $cor = "red"; #red, green, blue, black, white, etc.. +my $tamanho = "80000"; #tamanho da fonte +my $width = 1200; #largura da janela +my $height = 120; #altura da janela +my $altura_texto = 60; #posicao do texto relativa a janela +my $deslocamento = 5; #deslocamento em pixels do texto + +if($ARGV[0]){ + open my $source, '<:utf8', $ARGV[0]; + read($source, $ts, -s $source ); + close $source; +}else{ + $ts = "Erro ao abrir o arquivo."; +} + +$ts =~ tr[\x0a\x0d][ ]d; #strip newlines + +my $window = Gtk2::Window->new(); +my $vp = Gtk2::Viewport->new(); +my $text = Gtk2::Label->new($ts.' '); +my $fontdesc = Gtk2::Pango::FontDescription->from_string("Sans 70"); +$text->modify_font($fontdesc); +$vp->modify_bg($text->state, Gtk2::Gdk::Color->new(0x0000,0x0000,0x0000)); +$text->modify_fg($text->state, Gtk2::Gdk::Color->new(0xFFFF,0x0000,0x0000)); +$window->add($vp); +$vp->add($text); +$window->signal_connect('destroy'=>\&_closeapp); +$vp->set_size_request($width, $height); +$window->show_all(); + +my ($wi, $he) = $text->get_size_request(); +print $wi,$he,$/; + +my $timer = Glib::Timeout->add($tempo, \&timer); +my $posicao = $vp->get_hadjustment->lower(); + + +Gtk2->main(); + +sub timer { + sleep 1 if $posicao == $vp->get_hadjustment->lower(); + $posicao += $deslocamento; + $posicao = $vp->get_hadjustment->lower() if $posicao > $vp->get_hadjustment->upper(); + $vp->get_hadjustment->set_value($posicao); + return 1; +} + +sub _closeapp{ + Gtk2->main_quit(); + return 0; +} diff --git a/Fila-Painel/letreiro2.pl b/Fila-Painel/letreiro2.pl new file mode 100644 index 0000000..83985c6 --- /dev/null +++ b/Fila-Painel/letreiro2.pl @@ -0,0 +1,78 @@ +#!/usr/bin/perl +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +use warnings; +use strict; +use Gtk2 '-init'; +use Gnome2::Canvas; + +my $ts ; +my $tempo = 20; #maior é mais lento +my $cor = "yellow"; #red, green, blue, black, white, etc.. +my $tamanho = "80000"; #tamanho da fonte +my $width = 841; #largura da janela +my $height = 120; #altura da janela +my $altura_texto = 60; #posicao do texto relativa a janela +my $deslocamento = 5; #deslocamento em pixels do texto + +if($ARGV[0]){ + open my $source, '<:utf8', $ARGV[0]; + read($source, $ts, -s $source ); + close $source; +}else{ + $ts = "Erro ao abrir o arquivo."; +} + +$ts =~ tr[\x0a\x0d][ ]d; #strip newlines + +my $window = Gtk2::Window->new(); +$window->set_default_size($width,$height); +my $vp = Gtk2::Viewport->new(); +my $text = Gtk2::Label->new($ts.' '); +my $fontdesc = Gtk2::Pango::FontDescription->from_string("Sans 70"); +$text->modify_font($fontdesc); +$vp->modify_bg($text->state, +Gtk2::Gdk::Color->new(0*257, 0*257, 125*257)); +$text->modify_fg($text->state, +Gtk2::Gdk::Color->new(255*255,255*255,0*255)); +$window->add($vp); +$window->move(0,1100); +$vp->add($text); +$window->signal_connect('destroy'=>\&_closeapp); +$vp->set_size_request($width, $height); +$window->show_all(); + +my ($wi, $he) = $text->get_size_request(); +print $wi,$he,$/; + +my $timer = Glib::Timeout->add($tempo, \&timer); +my $posicao = $vp->get_hadjustment->lower(); + +Gtk2->main(); + +sub timer { + sleep 1 if $posicao == $vp->get_hadjustment->lower(); + $posicao += $deslocamento; + $posicao = $vp->get_hadjustment->lower() if $posicao > $vp->get_hadjustment->upper(); + $vp->get_hadjustment->set_value($posicao); + return 1; +} + +sub _closeapp{ + Gtk2->main_quit(); + return 0; +} diff --git a/Fila-Painel/lib/Fila/Painel.pm b/Fila-Painel/lib/Fila/Painel.pm new file mode 100644 index 0000000..0bf1830 --- /dev/null +++ b/Fila-Painel/lib/Fila/Painel.pm @@ -0,0 +1,107 @@ +package Fila::Painel; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; + +use Catalyst::Runtime '5.70'; +use Catalyst qw/-Debug ConfigLoader Static::Simple/; + +our $VERSION = '0.01'; + +__PACKAGE__->setup; + +our $output; +{ + $output = __PACKAGE__->config->{output} + or die 'Arquivo de saida nao configuradas.'; +} + + +# Inicializar uma conexão principal de controle que ira fazer a +# inicializacao + +$::connection = Net::XMPP2::Connection->new + (%{Fila::Painel->config->{'Engine::XMPP2'}}, + resource => 'Main Connection'); + +$::connection->reg_cb + (bind_error => sub { + warn 'Error binding to resource'; + EV::unloop(EV::UNLOOP_ALL); + }, + + iq_auth_error => sub { + warn 'Authentication error'; + EV::unloop(EV::UNLOOP_ALL); + }, + + sasl_error => sub { + warn 'Authentication error'; + EV::unloop(EV::UNLOOP_ALL); + }, + + disconnect => sub { + warn 'Disconnecting.'; + EV::unloop(EV::UNLOOP_ALL); + }, + + stream_error => sub { + warn 'Connection error.'; + EV::unloop(EV::UNLOOP_ALL); + }, + + stream_ready => sub { + $::connection->send_presence('available', sub {}); + + eval { + Fila::Painel->run(); + }; + if ($@) { + warn 'Error running application: '.$@; + EV::unloop(EV::UNLOOP_ALL); + } + }); + +unless ($::connection->connect) { + die 'Cannot connect to server'; +} else { + EV::loop; +} + + +1; + +__END__ + +=head1 NAME + +Fila::Painel - Recepção da informação para Sinalização + +=head1 SYNOPSIS + + # dentro do diretório Fila-Painel + ./script/fila_painel_app.pl + +=head1 DESCRIPTION + +Este é o módulo da aplicação do Fila-Painel. Ele é também responsável +por gerir a conexão principal da aplicação. + +=cut + diff --git a/Fila-Painel/lib/Fila/Painel/Controller/Callback.pm b/Fila-Painel/lib/Fila/Painel/Controller/Callback.pm new file mode 100644 index 0000000..85f9bd8 --- /dev/null +++ b/Fila-Painel/lib/Fila/Painel/Controller/Callback.pm @@ -0,0 +1,51 @@ +package Fila::Painel::Controller::Callback; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Controller::SOAP'; + +__PACKAGE__->config->{wsdl} = + {wsdl => Fila::Painel->path_to('schemas/FilaPainel.wsdl')}; + +sub senhas_chamando :WSDLPort('FilaPainelCallback') { + my ($self, $c, $dados) = @_; + my @senhas = map { [ $_->{senha}, $_->{guiche} ] } + @{$dados->{senhas_chamando}{senha}}; + $c->model('Output')->salvar(\@senhas); +} + + +1; + +__END__ + +=head1 NAME + +Fila::Painel::Controller::Callback - Recebe a lista das senhas sendo +chamadas + +=head1 DESCRIPTION + +Este controller é o responsável pela recepção da mensagem SOAP +estabelecida pelo Port FilaPainelCallback. Este callback fica +disponível para o Fila-Servico comunicar ao painel que a lista de +senhas chamando foi alterada. + +=cut + diff --git a/Fila-Painel/lib/Fila/Painel/Model/Output.pm b/Fila-Painel/lib/Fila/Painel/Model/Output.pm new file mode 100644 index 0000000..0b9c3c0 --- /dev/null +++ b/Fila-Painel/lib/Fila/Painel/Model/Output.pm @@ -0,0 +1,53 @@ +package Fila::Painel::Model::Output; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use IO::Handle; +use Text::CSV; +use base 'Catalyst::Model'; + +my $csv = Text::CSV->new; + +sub salvar { + my ($self, $senhas) = @_; + open my $output, '>', $Fila::Painel::output + or die $!; + + for (@$senhas) { + $csv->print($output, $_); + print {$output} "\n"; + } + close $output; +} + +1; + +__END__ + +=head1 NAME + +Fila::Painel::Model::Output - Salva a lista de senhas em um arquivo csv + +=head1 DESCRIPTION + +Este Model salva a lista de senhas sendo chamadas em um arquivo csv +cujo nome é definido na configuração do sistema. + +=cut + diff --git a/Fila-Painel/mplayer.sh b/Fila-Painel/mplayer.sh new file mode 100755 index 0000000..d4f6d4d --- /dev/null +++ b/Fila-Painel/mplayer.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +# Boston, MA 02110-1301 USA + +#/usr/bin/mplayer -ao alsa -loop 0 -geometry 841x643+0+0 /home/f13/videos/* + +export DISPLAY=":0" +/usr/bin/tvtime diff --git a/Fila-Painel/painel.pl b/Fila-Painel/painel.pl new file mode 100644 index 0000000..5e80096 --- /dev/null +++ b/Fila-Painel/painel.pl @@ -0,0 +1,192 @@ +#!/usr/bin/perl +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +use strict; +use warnings; +use utf8; +use Gtk2 -init; +use Gtk2::GladeXML; +use Data::Dumper; +use POSIX qw(ceil floor); + +use constant { + INPUT_FILE => '/fila-painel/tmp/senhas_chamando.csv', + TEMPO_ROTACAO => 4, + TEMPO_ATENCAO => 6, + TEMPO_RECHAMADA => 70, + TEMPO_ULTIMAS => 5, + TEMPO_TIRAR_ULTIMAS => 180, + }; + +my $gladexml = Gtk2::GladeXML->new('gtk_senha.glade'); +my ($window, $titulo, $lblsenha, $ultima, $lblultima) = + map { $gladexml->get_widget($_) } + qw(window1 label1 label2 label3 label4); + +our @chamar_atencao; +our @rotacao; +our %ultimas; +our $status = 'iniciando'; +our $error; +our $pagina_ultimas = 0; +our $counter_rotacao = 0; + +setup_widgets(); + +cycle(); +Glib::Timeout->add(TEMPO_ULTIMAS * 1000, \&cycle_ultimas); + +Gtk2->main(); + + +sub check_input_file { + open my $file, '<', INPUT_FILE or do { $status = 'erro'; + $error = 'Não conseguiu abrir arquivo '.$!; + return }; + + my $time = time; + + my @arquivo = map { chomp; [ split(/,/, $_), $time ] } <$file>; + + my @new = + grep { my $a = $_; + !(grep { $a->[0] eq $_->[0] } @rotacao) } @arquivo; + + push @chamar_atencao, @new; + push @rotacao, @new; + + push @chamar_atencao, + grep { (($time - $_->[2]) > TEMPO_RECHAMADA) && ($_->[2] = $time) } + @rotacao; + + my @old = + grep { my $a = $_; + !grep { $a->[0] eq $_->[0] } @arquivo } @rotacao; + + @rotacao = + grep { my $a = $_; + !grep { $a->[0] eq $_->[0] } @old } @rotacao; + + foreach my $oldie (sort { $a->[2] <=> $b->[2] } @old) { + my $categoria = substr $oldie->[0], 0, 1; + $ultimas{$categoria} = $oldie; + } + + my @categorias = keys %ultimas; + foreach my $categoria (@categorias) { + delete $ultimas{$categoria} if + ((time - $ultimas{$categoria}[2]) > TEMPO_TIRAR_ULTIMAS); + } + + if (@chamar_atencao) { + $status = 'atencao'; + } else { + $status = 'rotacao'; + } +} + +sub cycle { + my $delay; + if ($status eq 'atencao') { + $delay = cycle_atencao(); + } elsif ($status eq 'rotacao') { + $delay = cycle_rotacao(); + } elsif ($status eq 'erro') { + warn "Erro: $error"; + $delay = 1000; + } + check_input_file; + + # como nao sabemos a principio qual e o delay, vamos sempre + # adicionar de novo o timeout e retornar falso aqui para nao + # repetir. + Glib::Timeout->add($delay, \&cycle); + 0; +} + +sub cycle_atencao { + my $refsenha = shift @chamar_atencao; + my ($senha, $mesa) = @{$refsenha}; + + $lblsenha->set_label($senha.' '.$mesa); + + Glib::Idle->add(\&toca_tchuru); + return TEMPO_ATENCAO * 1000; +} + +sub cycle_rotacao { + unless (@rotacao) { + $lblsenha->set_label(''); + return 500; + } + + my $refsenha = $rotacao[$counter_rotacao++]; + $counter_rotacao = 0 if $counter_rotacao > $#rotacao; + + if ($refsenha) { + my ($senha, $mesa) = @{$refsenha}; + $lblsenha->set_label($senha.' '.$mesa); + } + + return TEMPO_ROTACAO * 1000; +} + +sub cycle_ultimas { + my @categorias = sort keys %ultimas; + + my $paginas = ceil(@categorias / 5); + return 1 unless $paginas; + + my $porpagina = ceil(@categorias / $paginas); + $pagina_ultimas = 0 if $pagina_ultimas >= $paginas; + + my $inicio = $porpagina * $pagina_ultimas++; + my $fim = $inicio + $porpagina - 1; + my @esta = @categorias[$inicio..$fim]; + my $str = join("\n",(map { $ultimas{$_}[0].' '.$ultimas{$_}[1] } @esta)); + + $lblultima->set_label($str); + 1; +} + +sub toca_tchuru { + system('/usr/bin/music123', '/home/f13/KDE_Event_2.ogg'); + 0; +} + +sub setup_widgets { + $window->signal_connect('destroy', sub { Gtk2->main_quit }); + $window->set_decorated(0); + $window->move(840,0); + $window->modify_bg($window->state, Gtk2::Gdk::Color->parse("#000000")); + + $lblsenha->modify_font(Gtk2::Pango::FontDescription->from_string("Courier New Bold 72")); + $lblsenha->modify_fg($lblsenha->state, Gtk2::Gdk::Color->parse("#380")); + + $titulo->modify_font(Gtk2::Pango::FontDescription->from_string("Arial 50")); + $titulo->modify_fg($titulo->state,Gtk2::Gdk::Color->parse("#380")); + $titulo->set_label(' Senha Mesa'); + + $ultima->modify_font(Gtk2::Pango::FontDescription->from_string("Arial 50")); + $ultima->modify_fg($ultima->state,Gtk2::Gdk::Color->parse("#FF4500")); + $ultima->set_label(' Últimas '); + + $lblultima->modify_font(Gtk2::Pango::FontDescription->from_string("Courier New Bold 72")); + $lblultima->modify_fg($ultima->state, Gtk2::Gdk::Color->parse("#FF4500")); + + $window->show_all(); +} diff --git a/Fila-Painel/schemas b/Fila-Painel/schemas new file mode 120000 index 0000000..3614ccd --- /dev/null +++ b/Fila-Painel/schemas @@ -0,0 +1 @@ +../Fila-Servico/schemas/ \ No newline at end of file diff --git a/Fila-Painel/script/fila_painel_app.pl b/Fila-Painel/script/fila_painel_app.pl new file mode 100755 index 0000000..29bc156 --- /dev/null +++ b/Fila-Painel/script/fila_painel_app.pl @@ -0,0 +1,57 @@ +#!/usr/bin/perl +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +$ENV{CATALYST_ENGINE} = 'XMPP2'; + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; + +use EV; +use AnyEvent; +use Net::XMPP2::Connection; +use Catalyst::Engine::XMPP2; +{ + no warnings; + *Catalyst::Engine::XMPP2::loop = *EV::loop; +} + +my $debug = 0; +my $help = 0; + +my @argv = @ARGV; + +GetOptions( + 'debug|d' => \$debug, + 'help|?' => \$help, +); + +pod2usage(1) if $help; + +if ( $debug ) { + $ENV{CATALYST_DEBUG} = 1; +} + +require Fila::Painel; + +Fila::Painel->run(); + +1; diff --git a/Fila-Painel/senhas.pl b/Fila-Painel/senhas.pl new file mode 100755 index 0000000..bcec420 --- /dev/null +++ b/Fila-Painel/senhas.pl @@ -0,0 +1,150 @@ +#!/usr/bin/perl +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +use warnings; +use strict; +use Gtk2 '-init'; +use Gnome2::Canvas; +use Gtk2::GladeXML; +use Unicode::String qw(utf8 latin1); + +my $black = Gtk2::Gdk::Color->new (0x255,0x255,0x255); +my $red = Gtk2::Gdk::Color->new (255x255,0,0); +my $font_courier = Gtk2::Pango::FontDescription->from_string('Courier New Bold 80'); +my $font_arial = Gtk2::Pango::FontDescription->from_string('Arial 50'); +my (@arraytotal, @ultima, @ultima_s, @exp, @senhas, @mesa, @ultima_p, @ultima_n); +my $senhas; +my %arraytotal; +my $mesa; +my ($posicao, $tamanho, $ultima_p, $ultima_n, $ultima_s, $tela, $telaultima, $num); + +my $glade = Gtk2::GladeXML->new('gtk_senha.glade'); + +my $window = $glade->get_widget('window1'); +my $titulo = $glade->get_widget('label1'); +my $lblsenha = $glade->get_widget('label2'); +my $ultima = $glade->get_widget('label3'); +my $lblultima = $glade->get_widget('label4'); + +sub construct { + + $window->move(840,0); + $window->modify_bg('normal', $black); + + $lblsenha->modify_font($font_courier); + $lblsenha->modify_fg('normal', $red); + $lblsenha->set_label('P002 14'); + + $titulo->modify_font($font_arial); + $titulo->modify_fg('normal',$red); + $titulo->set_label(' Senha Mesa'); + + $ultima->modify_font($font_arial); + $ultima->modify_fg('normal',$red); + $ultima->set_label(latin1('Ultimas')); + + $lblultima->modify_font($font_courier); + $lblultima->modify_fg('normal', $red); + $lblultima->set_label('P001 14 \nS110 01\nI201 05'); + + $window->show_all(); +} + +sub lista_senha { + unless(@arraytotal) { + $posicao = 0; + $tamanho = 0; + $tela = ""; + print "sizeof: $tamanho\n"; + } else { + $tela = $arraytotal[$posicao][0]."\n".$arraytotal[$posicao][1]; + completa_ultimas($arraytotal[$posicao]); + print "tela: $tela"; + } + + if($posicao == $tamanho) { + completa_array(); + $posicao = 0; + print "completando array\n"; + } else { + $posicao = $posicao+1; + print "incrementando posicao\n"; + print "proxima posicao: $posicao\n"; + } + $lblsenha->set_label($tela); + $telaultima = ""; + if($ultima_p[2] > 0) { + $telaultima = $telaultima.$ultima_p[1]." ".$ultima_p[2]; + } + if($ultima_s[2] > 0) { + $telaultima = $telaultima.$ultima_s[1]." ".$ultima_s[2]; + } + if($ultima_n[2] > 0) { + $telaultima = $telaultima.$ultima_n[1]." ".$ultima_n[2]; + } + + $lblultima->set_label($telaultima); + + print "setando label\n\n\n"; + return 1; +} + + +sub completa_array { + unless(open(FILE, ") { + print "linha = $linha\n"; + @exp = split(/,/,$linha); + push(@senhas,$exp[0]); + push(@mesa,$exp[1]); + $arraytotal{$exp[0]} = $exp[1]; + print %arraytotal; + } +} + +sub completa_ultimas($ultima) { + my $cat = substr($ultima[0],0,1); + my $num = substr($ultima[0],1,3); + if($cat eq "N") { + if($ultima_n[0] < $num) { + $ultima_n = $num.",".$ultima[0].",".$ultima[1]; + print "gravando N $num\n"; + } + } elsif($cat eq "P") { + if($ultima_p[0] < $num) { + $ultima_p = $num.",".$ultima[0].",".$ultima[1]; + print "gravando P $num\n"; + } + } elsif($cat eq "S") { + if($ultima_s[0] < $num) { + $ultima_s = $num.",".$ultima[0].",".$ultima[1]; + print "gravando S $num\n"; + } + } +} + + +Glib::Timeout->add(5000, 'lista_senha'); + +construct(); + +Gtk2->main(); + + diff --git a/Fila-Painel/senhas2.pl b/Fila-Painel/senhas2.pl new file mode 100755 index 0000000..b912bd4 --- /dev/null +++ b/Fila-Painel/senhas2.pl @@ -0,0 +1,145 @@ +#!/usr/bin/perl +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +use warnings; +use strict; +use Gtk2 '-init'; +use Gnome2::Canvas; +use Gtk2::GladeXML; +use Unicode::String qw(utf8 latin1); + +my $black = Gtk2::Gdk::Color->new (0x255,0x255,0x255); +my $red = Gtk2::Gdk::Color->new (255x255,0,0); +my $font_courier = Gtk2::Pango::FontDescription->from_string('Courier New Bold 80'); +my $font_arial = Gtk2::Pango::FontDescription->from_string('Arial 50'); +my $arraytotal; +my $senhas; +my $mesa; +my $posicao, $tamanho, $lblsenha, $lblultima, $ultima_p, $ultima_n, $ultima_s; + +sub construct { + my $glade = Gtk2::GladeXML->new('gtk_senha.glade'); + + my $window = $glade->get_widget('window1'); + my $titulo = $glade->get_widget('label1'); + my $lblsenha = $glade->get_widget('label2'); + my $ultima = $glade->get_widget('label3'); + my $lblultima = $glade->get_widget('label4'); + + $window->move(840,0); + $window->modify_bg('normal', $black); + + $lblsenha->modify_font($font_courier); + $lblsenha->modify_fg('normal', $red); + $lblsenha->set_label('P002 14'); + + $titulo->modify_font($font_arial); + $titulo->modify_fg('normal',$red); + $titulo->set_label(' Senha Mesa'); + + $ultima->modify_font($font_arial); + $ultima->modify_fg('normal',$red); + $ultima->set_label(latin1('Ultimas')); + + $lblultima->modify_font($font_courier); + $lblultima->modify_fg('normal', $red); + $lblultima->set_label('P001 14 \nS110 01\nI201 05'); + + $window->show_all(); +} + +sub lista_senha { + unless($arraytotal) { + $posicao = 0; + $tamanho = 0; + $tela = ""; + print "sizeof: $tamanho\n"; + } else { + $tela = $arraytotal[$posicao][0]." ".$arraytotal[$posicao][1]; + completa_ultimas($arraytotal[$posicao]); + print "tela: $tela"; + } + + if($posicao == $tamanho) { + completa_array(); + $posicao = 0; + print "completando array\n"; + } else { + $posicao = $posicao+1; + print "incrementando posicao\n"; + print "proxima posicao: $posicao\n"; + } + $lblsenha->set_label($tela); + $telaultima = ""; + if($ultima_p[2] > 0) { + $telaultima = $telaultima.$ultima_p[1]." ".$ultima_p[2]; + } + if($ultima_s[2] > 0) { + $telaultima = $telaultima.$ultima_s[1]." ".$ultima_s[2]; + } + if($ultima_n[2] > 0) { + $telaultima = $telaultima.$ultima_n[1]." ".$ultima_n[2]; + } + + $lblultima->set_label($telaultima); + + print "setando label\n\n\n"; + return true; +} + +sub completa_array { + open FILE, "senhas_chamando.csv" or die $!; + while (my $linha = ) { + print "linha = $linha\n"; + @exp = split(/,/,$linha); + push(@senhas,$exp[0]); + push(@mesa,$exp[1]); + %arraytotal{$exp[0]} = $exp[1]; + print %arraytotal; + } + +} + +sub completa_ultimas(ultima) { + $cat = substr($ultima[0],0,1); + $num = substr($ultima[0],1,3); + if($cat == "N") { + if($ultima_n[0] < $num) { + $ultima_n = array($num,$ultima[0],$ultima[1]); + echo "gravando N $num\n"; + } + } elseif($cat == "P") { + if($ultima_p[0] < $num) { + $ultima_p = array($num,$ultima[0],$ultima[1]); + echo "gravando P $num\n"; + } + } elseif($cat == "S") { + if($ultima_s[0] < $num) { + $ultima_s = array($num,$ultima[0],$ultima[1]); + echo "gravando S $num\n"; + } + } +} + + +Gtk::timeout_add(5000, 'lista_senha'); + +construct(); + +Gtk2->main(); + + diff --git a/Fila-Painel/teste.txt b/Fila-Painel/teste.txt new file mode 100755 index 0000000..5b7361d --- /dev/null +++ b/Fila-Painel/teste.txt @@ -0,0 +1,29 @@ +Vai minha tristeza e diz a ela + Que sem ela não pode ser + Diz-lhe numa prece, que ela regresse + Porque eu não posso mais sofrer + + Chega de saudade, a realidade é que sem ela + Não há paz, não há beleza + É só tristeza e a melancolia + Que não sai de mim, não sai de mim, não sai + + Mas, se ela voltar, se ela voltar + Que coisa linda, que coisa louca + Pois há menos peixinhos a nadar no mar + Do que os beijinhos que eu darei na sua boca + + Dentro dos meus braços + Os abraços hão de ser milhões de abraços + Apertado assim, colado assim, calado assim + Abraços e beijinhos e carinhos sem ter fim + + Que é pra acabar com esse negócio + De viver longe de mim + + [Voltar ao início da melodia] + + Não quero mais esse negócio + De você viver assim + Vamos deixar desse negócio + De você viver sem mim diff --git a/Fila-Senha/fila_senha.yml b/Fila-Senha/fila_senha.yml new file mode 100644 index 0000000..2cba4b6 --- /dev/null +++ b/Fila-Senha/fila_senha.yml @@ -0,0 +1,14 @@ +--- +name: Fila::Senha +Engine::XMPP2: + username: emissor + domain: agents.fila.vhost + password: password + override_host: 127.0.0.1 +portas: + impressora: emulate + emissor: emulate +categorias: + - 1 + - 2 + - 3 diff --git a/Fila-Senha/lib/Fila/Senha.pm b/Fila-Senha/lib/Fila/Senha.pm new file mode 100644 index 0000000..46290d4 --- /dev/null +++ b/Fila-Senha/lib/Fila/Senha.pm @@ -0,0 +1,139 @@ +package Fila::Senha; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use EV; +use Catalyst::Runtime '5.70'; +use Catalyst qw/-Debug ConfigLoader Static::Simple/; +use Net::XMPP2::Connection; + +our $VERSION = '0.01'; + +__PACKAGE__->setup; + +our $porta_impressora; +our $porta_emissor; +our $categorias; + +{ + my $portas = __PACKAGE__->config->{portas}; + die 'Porta da impressora nao configurada' unless + $porta_impressora = $portas->{impressora}; + + die 'Porta do emissor nao configurada' unless + $porta_emissor = $portas->{emissor}; + + $categorias = __PACKAGE__->config->{categorias} + or die 'Categorias nao configuradas.'; + +} + + +# Inicializar uma conexão principal de controle que ira fazer a +# inicializacao + +$::connection = Net::XMPP2::Connection->new + (%{Fila::Senha->config->{'Engine::XMPP2'}}, + resource => 'Main Connection'); + +$::connection->reg_cb + (bind_error => sub { + warn 'Error binding to resource'; + EV::unloop(EV::UNLOOP_ALL); + }, + + iq_auth_error => sub { + warn 'Authentication error'; + EV::unloop(EV::UNLOOP_ALL); + }, + + sasl_error => sub { + warn 'Authentication error'; + EV::unloop(EV::UNLOOP_ALL); + }, + + disconnect => sub { + warn 'Disconnecting.'; + EV::unloop(EV::UNLOOP_ALL); + }, + + stream_error => sub { + warn 'Connection error.'; + EV::unloop(EV::UNLOOP_ALL); + }, + + stream_ready => sub { + $::connection->send_presence('available', sub {}); + + Fila::Senha->model('SOAP')->transport->connection($::connection); + Fila::Senha->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/senha']); + + our $dados_local = Fila::Senha->model('SOAP::Senha') + ->dados_local({ local => {} }); + + if ($dados_local->{Fault} && + $dados_local->{Fault}{faultstring} =~ /Permissao Negada/) { + warn 'Local está fechado. Vai esperar uma notificacao.'; + Fila::Senha->model('Emissor')->bloquear; + } elsif ($dados_local->{Fault}) { + warn 'Erro ao obter os dados do local: '.$dados_local->{Fault}{faultstring}; + EV::unloop(EV::UNLOOP_ALL()); + } else { + warn 'Abrindo para senhas'; + Fila::Senha->model('Emissor')->abrir; + } + + eval { + Fila::Senha->run(); + }; + if ($@) { + warn 'Error running application: '.$@; + EV::unloop(EV::UNLOOP_ALL); + } + }); + +unless ($::connection->connect) { + die 'Cannot connect to server'; +} else { + EV::loop; +} + + +1; + +__END__ + +=head1 NAME + +Fila::Senha - Aplicação de comunicação com o emissor de senha e a impressora. + +=head1 SYNOPSIS + + # dentro do diretorio Fila-Senha + ./script/fila_senha_app.pl + +=head1 DESCRIPTION + +Essa aplicação é responsável por comunicar-se tanto com o dispositivo +emissor de senha que notifica quando algum dos seus botões são +pressionados, quanto com a impressora que recebe o texto para ser +impresso com os dados da senha. + +=cut + diff --git a/Fila-Senha/lib/Fila/Senha/Controller/Callback.pm b/Fila-Senha/lib/Fila/Senha/Controller/Callback.pm new file mode 100644 index 0000000..fb300e0 --- /dev/null +++ b/Fila-Senha/lib/Fila/Senha/Controller/Callback.pm @@ -0,0 +1,53 @@ +package Fila::Senha::Controller::Callback; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Controller::SOAP'; + +__PACKAGE__->config->{wsdl} = + {wsdl => Fila::Senha->path_to('schemas/FilaSenha.wsdl')}; + +sub local_aberto :WSDLPort('FilaSenhaCallback') { + my ($self, $c) = @_; + $c->model('Emissor')->abrir; +} + +sub senhas_encerradas :WSDLPort('FilaSenhaCallback') { + my ($self, $c) = @_; + $c->model('Emissor')->bloquear; +} + + +1; + +__END__ + +=head1 NAME + +Fila::Senha::Controller::Callback - Serviço SOAP para ativar e +desativar o emissor. + +=head1 DESCRIPTION + +Esse é o Controller que implementa o serviço descrito no wsdl +'schemas/FilasSenha.wsdl'. Esse serviço é chamado pelo Fila-Servico no +momento em que o Local é aberto, fechado ou tem as senhas encerradas. + +=cut + diff --git a/Fila-Senha/lib/Fila/Senha/Model/Emissor.pm b/Fila-Senha/lib/Fila/Senha/Model/Emissor.pm new file mode 100644 index 0000000..8bbd3d7 --- /dev/null +++ b/Fila-Senha/lib/Fila/Senha/Model/Emissor.pm @@ -0,0 +1,276 @@ +package Fila::Senha::Model::Emissor; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor + +use strict; +use warnings; +use EV; +use IO::Handle; +use POSIX qw(:termios_h); +use base 'Catalyst::Model'; + +__PACKAGE__->mk_accessors('fh', 'read_buffer', 'write_buffer', 'ids'); + +our ($read_watcher, $write_watcher); + +sub bloquear { + my $self = shift; + + if ($Fila::Senha::porta_emissor eq 'emulate') { + warn 'Emissor Bloqueado!'.$/; + } else { + $self->push_write('@ESP0000.'); + } +} + +sub abrir { + my $self = shift; + + warn 'Buscando categorias..'; + my $cats = Fila::Senha->model('SOAP::Senha')->listar_categorias + ({ local => {} }); + + unless ($cats) { + warn 'Erro buscando categorias.'; + die 'Erro buscando categorias.'; + } + + $self->ids({}); + + my $max_ordem = 0; + foreach my $tmp (@{$cats->{lista_categorias}{categoria}}) { + $self->ids->{$tmp->{ordem}} = $tmp->{id_categoria}; + $max_ordem = $tmp->{ordem} if $tmp->{ordem} > $max_ordem; + } + + my $categorias; + for (1..$max_ordem) { + $categorias .= + $self->ids->{$_} ? '1' : '0'; + } + + if ($Fila::Senha::porta_emissor eq 'emulate') { + warn 'Emissor aberto '.$categorias.'!'.$/; + $self->_check_emulate_watcher(); + } else { + warn 'Escrevendo categorias'; + $self->push_write('@ESP'.$categorias.'.'); + } +} + +sub push_write { + warn 'Iniciando push_write '.$_[1]; + my ($self, $buf) = @_; + + $self->write_buffer + (($self->write_buffer()||''). + $buf); + + $self->_check_fh; + $self->_check_wb; + warn 'Fim push_write'; +} + +sub _check_fh { + my $self = shift; + + return if $self->fh; + return if $Fila::Senha::porta_emissor eq 'emulate'; + + open my $fh, '+<', $Fila::Senha::porta_emissor + or do { + warn 'Erro abrindo porta do emissor: '.$!; + EV::unloop(EV::UNLOOP_ALL); + die 'Erro abrindo porta do emissor: '.$!; + }; + + $fh->blocking(0); + + my $term = POSIX::Termios->new; + $term->getattr(fileno($fh)) or die $!; + + $term->setiflag( $term->getiflag & ( &POSIX::IGNBRK | &POSIX::IGNPAR & ~&POSIX::INPCK & ~ &POSIX::IXON & ~ &POSIX::IXOFF)); + $term->setlflag( $term->getlflag & ~( &POSIX::ICANON | &POSIX::ECHO | &POSIX::ECHONL | &POSIX::ISIG | &POSIX::IEXTEN )); + $term->setcflag( $term->getcflag & ( &POSIX::CSIZE | &POSIX::CS8 & ~&POSIX::PARENB)); + + $term->setospeed(&POSIX::B1200); + $term->setispeed(&POSIX::B1200); + + $term->setattr(fileno($fh), &POSIX::TCSANOW) or die $!; + + $self->fh($fh); +} + + + +sub _check_readwatcher { + my $self = shift; + $read_watcher ||= EV::io $self->fh, EV::READ, sub { + my $buf; + my $ret; + while ($ret = $self->fh->sysread($buf, '100')) { + warn 'sysread: '.$buf; + $self->push_read($buf); + } + }; +} + +sub _check_emulate_watcher { + my $self = shift; + STDIN->blocking(0); + $read_watcher = EV::io \*STDIN, EV::READ, sub { + my $buf; + while (my $ret = STDIN->sysread($buf, '100')) { + $self->push_read($buf); + } + }; +} + +sub _check_wb { + my $self = shift; + + return if $write_watcher || !$self->write_buffer; + return if $Fila::Senha::porta_emissor eq 'emulate'; + + $write_watcher = EV::io $self->fh, EV::WRITE, sub { + use bytes; + my $buf = $self->write_buffer; + my $len = length $buf; + my $wrt = $self->fh->syswrite($buf, $len); + my $wrote = substr($buf,0,$wrt,''); + $self->write_buffer($buf); + + warn 'Wrote ('.$wrote.') into device'; + $write_watcher = undef; + $self->_check_readwatcher unless $buf; + }; +} + +sub push_read { + + my ($self, $buf) = @_; + + $self->read_buffer + (($self->read_buffer()||''). + $buf); + + $self->_check_rb; +} + +sub _check_rb { + my $self = shift; + + my $buf = $self->read_buffer; + return unless $buf; + return unless length $buf >= 5; + + while ($buf) { + if (substr($buf,0,1) ne '@') { + my $pos = index $buf, '@'; + if ($pos < 0) { + warn 'Disarding bad read buffer ('.$buf.')'; + $self->read_buffer(''); + return; + } else { + my $bad = substr($buf,0,$pos,''); + warn 'Discaring bad read buffer ('.$bad.')'; + } + $self->read_buffer($buf); + } elsif ($buf =~ s/^\@ESE.//) { + warn 'Device error.'; + $self->read_buffer($buf); + } elsif ($buf =~ s/^\@ESK.//) { + # ok... + warn 'Success sending command.'; + $self->read_buffer($buf); + } elsif ($buf =~ /^\@\d*$/) { + last; + } elsif ($buf =~ /^\@(\d+)\./) { + my $cmd = substr($buf,0,2+length($1),''); + $self->read_buffer($buf); + + $self->push_write('@ESK.'); + + my $posicao = index $cmd, '1'; + warn $posicao; + my $id_categoria = $self->ids->{$posicao}; + + my $dados = Fila::Senha->model('SOAP::Senha')->solicitar_senha + ({ atendimento => { id_categoria => $id_categoria } }); + if ($dados->{Fault}) { + warn 'Erro ao pedir senha. '.$dados->{Fault}{faultstring}; + } else { + Fila::Senha->model('Impressora')->imprimir_senha($dados); + } + + sleep 5; + $self->fh->close(); + $self->fh(undef); + + $self->abrir; + } elsif (length $buf < 5) { + last; + } else { + # bad command... + warn 'Discarding command header, watch for more output.'; + substr($buf,0,1,''); + $self->read_buffer($buf); + } + } + + +} + +1; + +__END__ + +=head1 NAME + +Fila::Senha::Model::Emissor - Comunica com o dispositivo emissor + +=head1 DESCRIPTION + +Esse módulo implementa o protocolo de comunicação com o emissor de +senhas. O emissor é um dispositivo serial que implementa o seguinte +protocolo (">" representa escrita e "<" representa leitura): + + # Configura o número de botões habilitados. + > @ESP0000. + > @ESP1100. + + # Retorno de sucesso + < @ESK. + + # Retorno de erro + > @ESE. + +=head1 METHODS + +=over + +=item abrir + +Busca a lista de categorias para emissao de senhas e envia para o +emissor o comando para habilitar os botões relacionados. + +=item bloquear + +Enviar um comando para desabilitar todos os botões do emissor. + +=cut + diff --git a/Fila-Senha/lib/Fila/Senha/Model/Impressora.pm b/Fila-Senha/lib/Fila/Senha/Model/Impressora.pm new file mode 100644 index 0000000..a80d950 --- /dev/null +++ b/Fila-Senha/lib/Fila/Senha/Model/Impressora.pm @@ -0,0 +1,113 @@ +package Fila::Senha::Model::Impressora; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use IO::Handle; +use utf8; +use DateTime::Format::XSD; +use Encode; +use IO::Handle; +use POSIX qw(:termios_h); +use base 'Catalyst::Model'; + +__PACKAGE__->mk_accessors('fh'); + +sub imprimir_senha { + my ($self, $dados) = @_; + + $self->_check_fh; + + my $date = DateTime::Format::XSD->parse_datetime + ($dados->{atendimento}{vt_ini}); + $date->set_time_zone('local'); + + my $a = encode('iso8859-1', + "\n\e!\x30Prefeitura de Fortaleza\n\e!\x01 Praça do Povo\n\n\ea\x01\x04\x00\x01". + sprintf("%04d%08d",$dados->{atendimento}{id_local}, $dados->{atendimento}{id_atendimento}). # EAN13 +# "123456789012". # EAN13 + "\x00\e!\x11". + $Fila::Senha::dados_local->{local}{nome}. # Nome do Local +# "Regional VI". # Nome do Local + "\n\n\e!\x39SENHA ". +# "A123". # SENHA + $dados->{atendimento}{senha}. # SENHA + "\e!\x11\n\n". + $date->strftime('%F %H:%M'). # DATA +# "2008-05-08 10:43". # DATA + "\e!\x00\n\n\nAtendimento ". +# "123". # id_atendimento + $dados->{atendimento}{id_atendimento}. # id_atendimento + "\nVálido somente nesta praça\nTolerância de 3 senhas após chamada\nFique atento ao Painel\xff\n\n\n\n\em"); + + + use bytes; + syswrite $self->fh, $a; + +} + +sub _check_fh { + my $self = shift; + + return if $self->fh; + if ($Fila::Senha::porta_impressora eq 'emulate') { + $self->fh(\*STDOUT); + return;3 + } + + open my $fh, '>', $Fila::Senha::porta_impressora or die $!; + $fh->blocking(1); + + my $term = POSIX::Termios->new; + $term->getattr(fileno($fh)) or die $!; + $term->setospeed(&POSIX::B9600); + $term->setispeed(&POSIX::B9600); + $term->setiflag((&POSIX::IXON | &POSIX::IXOFF | &POSIX::IGNPAR)&(~(&POSIX::IGNBRK | &POSIX::BRKINT))); + $term->setlflag($term->getlflag & ~&POSIX::ECHO); + $term->setcflag($term->getcflag | &POSIX::CSIZE | &POSIX::CS7); + $term->setattr(fileno($fh), &POSIX::TCSANOW) or die $!; + + $self->fh($fh); +} + +1; + +__END__ + +=head1 NAME + +Fila::Senha::Model::Impressora - Imprime a Senha + +=head1 DESCRIPTION + +Este é o Módulo responsável por imprimir a senha para a impressora +térmica. Esse módulo pressupõe o formato de impressão da Impressora +Térmica Daruma DR600. + +É importante notar que esse módulo utiliza escrita síncrona na +impressora. Para garantir que não aconteça um pedido de senha no meio +da impressão de uma outra senha. O sistema estará bloqueado e só +processará o pedido de uma nova senha no momento em que a impressora +terminar de receber a informação. + +É preciso entender que isso não necessariamente se coloca como um +problema porque a impressora costuma ter um buffer que aguenta uma +quantidade sificiente de informação para evitar qualquer travamento. + +=cut + diff --git a/Fila-Senha/lib/Fila/Senha/Model/SOAP.pm b/Fila-Senha/lib/Fila/Senha/Model/SOAP.pm new file mode 100644 index 0000000..cb0cee7 --- /dev/null +++ b/Fila-Senha/lib/Fila/Senha/Model/SOAP.pm @@ -0,0 +1,47 @@ +package Fila::Senha::Model::SOAP; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use XML::CompileX::Transport::SOAPXMPP; +use base 'Catalyst::Model::SOAP'; + +__PACKAGE__->config->{transport} = XML::CompileX::Transport::SOAPXMPP->new(); + +__PACKAGE__->register_wsdl + ({ wsdl => Fila::Senha->path_to('/schemas/FilaServico.wsdl'), + schema => Fila::Senha->path_to('/schemas/fila-servico.xsd')}, + { 'GestaoSenha' => 'Senha' }); + +1; + +__END__ + +=head1 NAME + +Fila::Senha::Model::SOAP - Conexão com o Fila-Servico + +=head1 DESCRIPTION + +Este módulo é responsável por estabelecer uma maneira de comunicação +com o Fila-Senha. Essa comunicação acontece em termos de mensagens +SOAP descritas no arquivo WSDL 'schemas/FilaServico.wsdl' e +'schemas/fila-servico.xsd'. + +=cut + diff --git a/Fila-Senha/schemas b/Fila-Senha/schemas new file mode 120000 index 0000000..3614ccd --- /dev/null +++ b/Fila-Senha/schemas @@ -0,0 +1 @@ +../Fila-Servico/schemas/ \ No newline at end of file diff --git a/Fila-Senha/script/fila_senha_app.pl b/Fila-Senha/script/fila_senha_app.pl new file mode 100755 index 0000000..ec478d5 --- /dev/null +++ b/Fila-Senha/script/fila_senha_app.pl @@ -0,0 +1,57 @@ +#!/usr/bin/perl +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +$ENV{CATALYST_ENGINE} = 'XMPP2'; + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; + +use EV; +use AnyEvent; +use Net::XMPP2::Connection; +use Catalyst::Engine::XMPP2; +{ + no warnings; + *Catalyst::Engine::XMPP2::loop = *EV::loop; +} + +my $debug = 0; +my $help = 0; + +my @argv = @ARGV; + +GetOptions( + 'debug|d' => \$debug, + 'help|?' => \$help, +); + +pod2usage(1) if $help; + +if ( $debug ) { + $ENV{CATALYST_DEBUG} = 1; +} + +require Fila::Senha; + +Fila::Senha->run(); + +1; diff --git a/Fila-Servico/fila_servico.yml b/Fila-Servico/fila_servico.yml new file mode 100644 index 0000000..a6e7211 --- /dev/null +++ b/Fila-Servico/fila_servico.yml @@ -0,0 +1,11 @@ +--- +name: Fila::Servico +Engine::XMPP2: + username: motor + password: password + domain: gestao.fila.vhost + override_host: 127.0.0.1 +Model::DB: + schema_class: 'Fila::Servico::DB' + connect_info: + - 'dbi:Pg:host=127.0.0.1;database=fila;user=fila;password=senha' diff --git a/Fila-Servico/lib/Fila/Servico.pm b/Fila-Servico/lib/Fila/Servico.pm new file mode 100644 index 0000000..457d887 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico.pm @@ -0,0 +1,52 @@ +package Fila::Servico; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; + +use Catalyst::Runtime '5.70'; + +use Catalyst qw/-Debug ConfigLoader Static::Simple/; + +our $VERSION = '0.01'; + +__PACKAGE__->config( name => 'Fila::Servico' ); + +__PACKAGE__->setup; + + +1; + +__END__ + +=head1 NAME + +Servico - Módulo que implementa a aplicação de regras de negócio. + +=head1 SYNOPSIS + + # dentro do diretorio Fila-Servico + ./script/fila_servico_server.pl + +=head1 DESCRIPTION + +Esta é a aplicação que implementa todas as lógicas efetivas do sistema +de atendimento. Ela é acessada utilizando SOAP+XMPP. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/Controller.pm b/Fila-Servico/lib/Fila/Servico/Controller.pm new file mode 100644 index 0000000..03f0a6f --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/Controller.pm @@ -0,0 +1,148 @@ +package Fila::Servico::Controller; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use UNIVERSAL 'isa'; +use Sub::Name 'subname'; +use Net::XMPP2::Util 'bare_jid'; +use base 'Catalyst::Controller::SOAP'; + +my $tempcounter = 0; +# implements some tricks that won't be published to avoid the +# proliferation (as requested by #catalyst people) + +sub _parse_MI_attr { + no strict 'refs'; + my $classname = 'Fila::Servico::Action::TempMI'.($tempcounter++); + @{$classname.'::ISA'} = qw(Fila::Servico::Action::MI); + ( ActionClass => $classname ); +} + +sub create_action { + my ($self, %args) = @_; + + if (exists $args{attributes}{ActionClass} && + ref $args{attributes}{ActionClass} eq 'ARRAY') { + my @ActionClasses = @{$args{attributes}{ActionClass}}; + my ($mi) = grep { $_->isa('Fila::Servico::Action::MI') } @ActionClasses; + if ($mi) { + @ActionClasses = grep { !$_->isa('Fila::Servico::Action::MI') } @ActionClasses; + $args{attributes}{ActionClass} = [$mi, @ActionClasses]; + } + } + + $self->SUPER::create_action(%args); +} + +sub end : Private { + my $self = shift; + my ($c) = @_; + if ($c->stash->{soap} && + $c->stash->{soap}->fault && + $c->req->header('XMPP_Stanza') eq 'message') { + + # enviar o fault para renderização do erro. + my $fault = $c->stash->{soap}->fault; + my $from = bare_jid($c->req->header('XMPP_Stanza_from')); + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + $c->model('SOAP')->transport->addrs([$from.'/cb/render/error']); + + $c->model('SOAP::CB::Error')->render_error({ Fault => { faultcode => $fault->{code}, + faultstring => $fault->{reason}.' - '.$fault->{detail} } }); + $c->error(0); + return 0; + } else { + + if ($c->stash->{refresh_gerente}) { + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/scheduler']); + $c->model('SOAP::Scheduler')->refresh_gerente({ local => { id_local => $c->stash->{local}->id_local } }); + } + + if ($c->stash->{escalonar_senha}) { + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/scheduler']); + $c->model('SOAP::Scheduler')->escalonar_senha({ local => { id_local => $c->stash->{local}->id_local } }); + } + + if ($c->stash->{refresh_painel}) { + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/scheduler']); + $c->model('SOAP::Scheduler')->refresh_painel({ local => { id_local => $c->stash->{local}->id_local } }); + } + + if ($c->stash->{refresh_guiche}) { + for my $id_guiche (@{$c->stash->{refresh_guiche}}) { + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/scheduler']); + $c->model('SOAP::Scheduler')->escalonar_senha({ local => { id_guiche => $id_guiche } }); + } + } + + return $self->SUPER::end(@_); + } +} + +{ package Fila::Servico::Action::MI; + use base 'Catalyst::Action'; + sub new { + my $self = shift; + my ( $args ) = @_; + if (exists $args->{attributes}{ActionClass} && + ref $args->{attributes}{ActionClass} eq 'ARRAY') { + my @isa; + + my @others = grep { $_ ne $self } + @{$args->{attributes}{ActionClass}}; + no strict 'refs'; + + foreach my $other (@others) { + unless ( Class::Inspector->loaded($other) ) { + require Class::Inspector->filename($other); + } + } + + push @isa, @others; + + @{$self.'::ISA'} = @isa; + } + $self->SUPER::new(@_); + } +} + +1; + +__END__ + + +=head1 NAME + +Controller - Superclasse dos controllers do Fila-Servico + +=head1 DESCRIPTION + +Este módulo implementa características comuns a todos os controllers +da aplicação fila-serviço, incluindo o attributo de métodos "MI", que +permite a uma ação de controller descender de mais de um tipo de ação, +o que no caso do Fila-Serviço, é importante para que a ação seja ao +mesmo tempo visível como uma ação SOAP, e ao mesmo tempo encapsule a +criação de uma transação para toda a ação. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/Controller/Root.pm b/Fila-Servico/lib/Fila/Servico/Controller/Root.pm new file mode 100644 index 0000000..38574b5 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/Controller/Root.pm @@ -0,0 +1,53 @@ +package Fila::Servico::Controller::Root; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Controller'; + +use DateTime; +use DateTime::Format::Pg; + +# +# Sets the actions in this controller to be registered with no prefix +# so they function identically to actions created in MyApp.pm +# +__PACKAGE__->config->{namespace} = ''; + +sub auto : Private { + my ( $self, $c ) = @_; + my $now = DateTime->now(time_zone => 'local'); + $now->set_formatter('DateTime::Format::Pg'); + $c->stash->{now} = $now; +} + +1; + +__END__ + +=head1 NAME + +Root - Controller raiz que define algumas configurações + +=head1 DESCRIPTION + +Esse controller define algumas características básicas para a +aplicação como um todo. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Atendente.pm b/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Atendente.pm new file mode 100644 index 0000000..27151b1 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Atendente.pm @@ -0,0 +1,1463 @@ +package Fila::Servico::Controller::WS::Gestao::Atendente; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use Net::XMPP2::Util 'bare_jid'; +use DateTime; +use DateTime::Format::Pg; +use DateTime::Format::XSD; +use Digest::MD5 qw(md5_hex md5_base64); +use base + 'Fila::Servico::Controller', + 'Catalyst::Controller::SOAP', + 'Catalyst::Controller::DBIC::Transaction'; + +__PACKAGE__->config->{wsdl} = + {wsdl => '/usr/share/fila/Fila-Servico/schemas/FilaServico.wsdl', + schema => '/usr/share/fila/Fila-Servico/schemas/fila-servico.xsd'}; + +sub auto : Private { + my ($self, $c) = @_; + + return 0 if $c->req->header('XMPP_Stanza') eq 'presence'; + + my $from = $c->req->header('XMPP_Stanza_from'); + $from = bare_jid $from; + + # GestaoAtendente exige que seja um atendente de um guiche, o que + # significa que o guichê vai estar aberto. + my $now = $c->stash->{now}; + my $funcionario = $c->model('DB::Funcionario')->search + ({ jid => $from, + 'atendentes.vt_ini' => { '<=' => $now }, + 'atendentes.vt_fim' => { '>' => $now }, + 'guiche.vt_ini' => { '<=' => $now }, + 'guiche.vt_fim' => { '>' => $now }, + 'local.vt_ini' => { '<=' => $now }, + 'local.vt_fim' => { '>' => $now }}, + { prefetch => { 'atendentes' => { 'guiche' => 'local' }}})->first(); + + if ($funcionario) { + $c->stash->{funcionario} = $funcionario; + $c->stash->{atendente} = $funcionario->atendentes->first; + $c->stash->{guiche} = $c->stash->{atendente}->guiche; + $c->stash->{local} = $c->stash->{guiche}->local; + $c->stash->{gerente} = $c->stash->{local}->gerente_atual->first; + } else { + $c->action->prepare_soap_helper($self, $c); + $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Permissao Negada', + detail => 'Funcionario precisa ser atendente para acessar'}); + return 0; + } +} + +sub refresh_atendente :Private { + my ($self, $c) = @_; + # esse método é chamado por outras ações que precisam fazer um + # callback para o atendente do guiche. As informações todas são + # enviadas, para que possa ser apresentada a tela. + + my $old = $c->stash->{soap}->compile_return(); + + my $guiche = $self->status_guiche($c, {}); + + my $atendente = $c->stash->{guiche}->atendente_atual->first; + + if ($atendente) { + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + $c->model('SOAP')->transport->addrs([$atendente->funcionario->jid.'/cb/render/atendente']); + $c->model('SOAP::CB::Atendente')->render_atendente({ %$guiche }); + } elsif ($c->stash->{atendente}) { + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + $c->model('SOAP')->transport->addrs([$c->stash->{atendente}->funcionario->jid.'/cb/render/atendente']); + $c->model('SOAP::CB::Atendente')->render_atendente({ %$guiche }); + } + + $c->stash->{soap}->compile_return($old); +} + + +sub status_guiche :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + + #status_guiche retorna todos os dados pertinentes aos guiches. + + my ($self, $c) = @_; + + my $now = $c->stash->{now}; + + my $guiches = $c->stash->{local}->guiches->search + ({ 'me.id_guiche' => $c->stash->{guiche}->id_guiche }, + { 'join' => [{ 'estado_atual' => 'estado' }, + 'pausa_atual', + { 'atendimento_atual' => { 'atendimento' => + [ { 'senha' => 'categoria' }, + { 'estado_atual' => 'estado' }, + 'agendamento' ]}}, + { 'atendente_atual' => 'funcionario' }], + 'select' => [ 'me.id_guiche', + 'me.identificador', + 'funcionario.id_funcionario', + 'funcionario.nome', + 'funcionario.jid', + 'estado.nome', + 'estado_atual.vt_ini', + 'categoria.codigo', + 'senha.codigo', + 'estado_2.nome', + 'estado_atual_2.vt_ini', + 'pausa_atual.motivo', + 'agendamento.nome', + 'agendamento.tipopessoa', + 'agendamento.cnpjf', + 'agendamento.email'], + 'as' => [ 'id_guiche', + 'identificador', + 'id_funcionario', + 'funcionario', + 'jid', + 'estado', + 'estado_desde', + 'codigo_categoria', + 'codigo_senha', + 'estado_atendimento', + 'estado_atendimento_desde', + 'pausa_motivo', + 'agendamento_nome', + 'agendamento_tipopessoa', + 'agendamento_cnpjf', + 'agendamento_email' ]}); + + #pega o estado do guiche, se for interno entao seleciona do servicoguiche, senao do servicoatendimento + my $estado_guiche = $c->stash->{guiche}->estados->search + ({ vt_ini => { '<=', $now }, + vt_fim => { '>', $now }}, + { prefetch => 'estado' })->first; + unless ($estado_guiche) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado do guiche', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + my $interno; + # se estiver 'interno' pega os servicos de {guiche}->servico_atual + if ($estado_guiche->estado->nome eq 'interno') { + my $servicos_internos = $c->stash->{guiche}->servico_atual->search( + { }, + { + 'join' => + [ + 'servico' + ], + 'select' => + [ 'me.id_servico', + 'servico.id_classe', + 'servico.nome', + 'me.informacoes' ], + 'as' => + [ 'id_servico', + 'id_classe', + 'nome', + 'informacoes' ] + }, + ); + + my $servico; + while ($servico = $servicos_internos->next) { + push @{$interno}, + { + ( map { $_ => $servico->get_column($_) } + qw/ id_servico id_classe nome informacoes / ), + } + } + } + # se estiver 'atendimento' pega os servicos de {guiche}->atendimento_atual->atendimento->servico_atual + if ($estado_guiche->estado->nome eq 'atendimento') { + #pegar atendimento atual do guiche_atendimento + my $atend_guiche = $c->stash->{guiche}->atendimento_atual->find({}); + unless ($atend_guiche) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + #pegar atendimento atual do atendimento + my $atendimento = $atend_guiche->atendimento; + unless ($atendimento) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + my $servicos_internos = $atendimento->servico_atual->search( + { }, + { + 'join' => + [ + 'servico' + ], + 'select' => + [ 'me.id_servico', + 'servico.id_classe', + 'servico.nome', + 'me.informacoes' ], + 'as' => + [ 'id_servico', + 'id_classe', + 'nome', + 'informacoes' ] + }, + ); + + my $servico; + while ($servico = $servicos_internos->next) { + push @{$interno}, + { + ( map { $_ => $servico->get_column($_) } + qw/ id_servico id_classe nome informacoes / ), + } + } + } + + my $guiche = $guiches->next; + my $agendamento; + if ($guiche->get_column('agendamento_nome')) { + $agendamento = + { map { $_ => $guiche->get_column('agendamento_'.$_) } + qw(nome tipopessoa cnpjf email) }; + } + $c->stash->{soap}->compile_return( + { guiche => + { ( map { $_ => $guiche->get_column($_) } + qw( id_guiche identificador estado estado_atendimento + funcionario id_funcionario jid pausa_motivo ) ), + ( map { $guiche->get_column($_) ? + ($_ => DateTime::Format::XSD->format_datetime + (DateTime::Format::Pg->parse_datetime + ($guiche->get_column($_)))) : () } + qw/ estado_desde estado_atendimento_desde / ), + id_local => $c->stash->{local}->id_local, + senha => $guiche->get_column('codigo_senha') ? + ( sprintf('%s%03d', ( map { $guiche->get_column($_) || '' } + qw( codigo_categoria codigo_senha ) )) ) : '', + servicos => { servico => $interno }, + agendamento => $agendamento } } ); +} + +sub registrar_no_show :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $estado_guiche = $c->stash->{guiche}->estados->search + ({ vt_ini => { '<=', $now }, + vt_fim => { '>', $now }}, + { prefetch => 'estado' })->first; + unless ($estado_guiche && $estado_guiche->estado->nome eq 'chamando') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Guiche precisa estar "chamando" para registrar no-show' }); + } + + my $estado_no_show = $c->model('DB::TipoEstadoAtendimento')->find + ({ nome => 'no_show' }); + unless ($estado_no_show) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "no_show"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + my $estado_concluido = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'concluido' }); + unless ($estado_concluido) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "concluido"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + my $atend_guiche = $c->stash->{guiche}->atendimento_atual->find({}); + unless ($atend_guiche) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + my $atendimento = $atend_guiche->atendimento; + unless ($atendimento) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + my $estado_atendimento = $atendimento->estados->find + ({ vt_ini => { '<=', $now }, + vt_fim => { '>', $now } }, + { prefetch => 'estado' }); + unless ($estado_atendimento && $estado_atendimento->estado->nome eq 'chamando') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Atendimento precisa estar "chamando" para registrar no-show' }); + } + + $atend_guiche->update + ({ vt_fim => $now }); + + $estado_atendimento->update + ({ vt_fim => $now }); + + $atendimento->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_no_show->id_estado }); + + $estado_guiche->update + ({ vt_fim => $now }); + + $c->stash->{guiche}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_concluido->id_estado }); + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} + +sub listar_no_show :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + #lista todos os atendimentos no_show + my($self, $c) = @_; + + #Procurar todos os atendimentos no_show + my $list = $c->stash->{local}->atendimentos_atuais->search + ({ 'estado.nome' => 'no_show' }, + { prefetch => [ { 'senha' => 'categoria' }, { 'estado_atual' => 'estado' }]}); + + my $retorno = []; + while (my $atendimento = $list->next) { + my $senha = $atendimento->senha; + push @{$retorno}, + {( map { $_ => $atendimento->$_() } + qw/ id_atendimento id_local id_senha / ), + estado => 'no_show', + senha => sprintf('%s%03d',$senha->categoria->codigo, $senha->codigo)} + } + + $c->stash->{soap}->compile_return + ({ lista_atendimentos => + { atendimento => $retorno }}); + +} + +sub atender_no_show :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $estado_guiche = $c->stash->{guiche}->estado_atual->search + ({ }, + { prefetch => 'estado' })->first; + + my $estado_atendendo_at = $c->model('DB::TipoEstadoAtendimento')->find + ({ nome => 'atendimento' }); + unless ($estado_atendendo_at) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "atendimento"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + my $estado_atendendo_gu = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'atendimento' }); + unless ($estado_atendendo_gu) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "atendimento"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + my $atendimento = $c->model('DB::Atendimento')->find + ($query->{atendimento}); + unless ($atendimento) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + my $estado_atendimento = $atendimento->estado_atual->find + ({ }, + { prefetch => 'estado' }); + unless ($estado_atendimento && $estado_atendimento->estado->nome eq 'no_show') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Atendimento precisa estar "chamando" para iniciar atendimento' }); + } + + $estado_atendimento->update + ({ vt_fim => $now }); + + $atendimento->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_atendendo_at->id_estado }); + + $estado_guiche->update + ({ vt_fim => $now }); + + $c->stash->{guiche}->atendimentos->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_atendimento => $atendimento->id_atendimento }); + + $c->stash->{guiche}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_atendendo_gu->id_estado }); + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} + +sub iniciar_atendimento :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $estado_guiche = $c->stash->{guiche}->estado_atual->search + ({ }, + { prefetch => 'estado' })->first; + unless ($estado_guiche && $estado_guiche->estado->nome eq 'chamando') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Guiche precisa estar "chamando" para iniciar atendimento' }); + } + + my $estado_atendendo_at = $c->model('DB::TipoEstadoAtendimento')->find + ({ nome => 'atendimento' }); + unless ($estado_atendendo_at) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "atendimento"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + my $estado_atendendo_gu = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'atendimento' }); + unless ($estado_atendendo_gu) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "atendimento"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + my $atendimento = $c->stash->{guiche}->atendimento_atual->find({}); + unless ($atendimento) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + my $estado_atendimento = $atendimento->atendimento->estado_atual->find + ({ }, + { prefetch => 'estado' }); + unless ($estado_atendimento && $estado_atendimento->estado->nome eq 'chamando') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Atendimento precisa estar "chamando" para iniciar atendimento' }); + } + + $estado_atendimento->update + ({ vt_fim => $now }); + + $atendimento->atendimento->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_atendendo_at->id_estado }); + + $estado_guiche->update + ({ vt_fim => $now }); + + $c->stash->{guiche}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_atendendo_gu->id_estado }); + + + $c->stash->{refresh_painel} = 1; + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} + +sub devolver_senha :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $estado_guiche = $c->stash->{guiche}->estado_atual->search + ({ }, + { prefetch => 'estado' })->first; + unless ($estado_guiche && $estado_guiche->estado->nome eq 'chamando') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Guiche precisa estar "chamando" para devolver senha' }); + } + + my $estado_concluido_gu = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'concluido' }); + unless ($estado_concluido_gu) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "concluido"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + my $atendimento = $c->stash->{guiche}->atendimento_atual->find({}); + unless ($atendimento) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + my $estado_atendimento = $atendimento->atendimento->estado_atual->find + ({ }, + { prefetch => 'estado' }); + unless ($estado_atendimento && $estado_atendimento->estado->nome eq 'chamando') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Atendimento precisa estar "chamando" para devolver senha' }); + } + + $estado_atendimento->delete; + + my $estado_anterior = $atendimento->atendimento->estados->search + ({ }, + { order_by => 'vt_fim DESC', + rows => 1 }); + + unless ($estado_anterior) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Não conseguiu encontrar estado anterior para devolver o atendimento' }); + } + + $estado_anterior->update + ({ vt_fim => 'Infinity' }); + + $estado_guiche->update + ({ vt_fim => $now }); + + $c->stash->{guiche}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_concluido_gu->id_estado }); + + # desassociar do guiche. + $atendimento->update + ({ vt_fim => $now }); + + $c->stash->{refresh_painel} = 1; + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} + +sub concluir_atendimento :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $estado_guiche = $c->stash->{guiche}->estado_atual->search + ({ }, + { prefetch => 'estado' })->first; + unless ($estado_guiche && $estado_guiche->estado->nome eq 'atendimento') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Guiche precisa estar "atendimento" para concluir atendimento' }); + } + + my $estado_avaliacao = $c->model('DB::TipoEstadoAtendimento')->find + ({ nome => 'avaliacao' }); + unless ($estado_avaliacao) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "avaliacao"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + my $estado_guiche_avaliacao = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'avaliacao' }); + unless ($estado_guiche_avaliacao) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "avaliacao"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + my $atendimento = $c->stash->{guiche}->atendimento_atual->find; + + unless ($atendimento) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + my $estado_atendimento = $atendimento->atendimento->estado_atual->find + ({ }, + { prefetch => 'estado' }); + unless ($estado_atendimento && $estado_atendimento->estado->nome eq 'atendimento') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Atendimento precisa estar "atendimento" para concluir atendimento' }); + } + + #checa se existem servicos abertos. + my $servico_atual = $atendimento->atendimento->servico_atual->find; + + if ($servico_atual) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Existem serviços abertos.', + detail => 'Nao e possivel concluir atendimento com servicos em andamento.' }); + } + + $estado_atendimento->update + ({ vt_fim => $now }); + + $atendimento->atendimento->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_avaliacao->id_estado }); + + $estado_guiche->update + ({ vt_fim => $now }); + + $c->stash->{guiche}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_guiche_avaliacao->id_estado }); + + my $guiche = $c->stash->{guiche}; + + if ($guiche && $guiche->pular_opiniometro == 0) { + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + $c->model('SOAP')->transport->addrs([$c->stash->{guiche}->jid_opiniometro . '/callback']); + $c->model('SOAP::Opiniometro') + ->iniciar_opiniometro({ refresh_request => '' }); + } else { + #encerra atendimento + my $estado_atual = $atendimento->atendimento->estado_atual->search + ({},{ prefetch => 'estado' })->first; + if ($estado_atual->estado->nome ne 'avaliacao') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Atendimento em estado invalido', + detail => 'O atendimento precisa estar em "avaliacao" para ser encerrado' }); + } + + my $estado_at_encerrado = $c->model('DB::TipoEstadoAtendimento')->find({ nome => 'encerrado' }); + unless ($estado_at_encerrado) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "encerrado"', + detail => 'Ocorreu um erro de configuracao no sistema' }); + } + + my $estado_gu_concluido = $c->model('DB::TipoEstadoGuiche')->find({ nome => 'concluido' }); + unless ($estado_gu_concluido) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "concluido"', + detail => 'Ocorreu um erro de configuracao no sistema' }); + } + + $estado_atual->update({ vt_fim => $now }); + + $atendimento->atendimento->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_at_encerrado->id_estado }); + $atendimento->atendimento->update({ vt_fim => $now }); + + $atendimento->atendimento->guiche_atual->first->update({ vt_fim => $now }); + + $guiche->estado_atual->first->update({ vt_fim => $now }); + $guiche->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_gu_concluido->id_estado }); + + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + + $c->model('SOAP')->transport->addrs([$guiche->jid_opiniometro . '/callback/']); + $c->model('SOAP::Opiniometro') + ->encerrar_opiniometro({ refresh_request => '' }); + + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $guiche->id_guiche; + } + + $c->stash->{refresh_painel} = 1; + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} + +sub encaminhar_atendimento :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + + my $guiche_origem = $c->model('DB::Guiche')->find + ( id_guiche => $c->stash->{guiche}->id_guiche ); + + my $outro_guiche = $c->model('DB::Guiche')->find + ( $query->{guiche} ); + + my $motivo = $query->{guiche}{pausa_motivo}; + unless ($motivo) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Motivo Invalido', + detail => 'E necessário um motivo para o encaminhamento.' }); + } + + unless ($outro_guiche) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Guiche Invalido', + detail => 'Nao conseguiu encontrar guiche.' }); + } + + my $atendimento = $c->stash->{guiche}->atendimento_atual->first; + + unless ($atendimento) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Atendimento Invalido', + detail => 'Nao conseguiu encontrar atendimento.' }); + } + + my $estado_concluido_gu = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'concluido' }); + unless ($estado_concluido_gu) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "concluido"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + my $estado_encaminhado = $c->model('DB::TipoEstadoAtendimento')->find + ({ nome => 'encaminhado' }); + unless ($estado_encaminhado) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "encaminhado"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + $atendimento->atendimento->estado_atual->update + ({ vt_fim => $now }); + + $atendimento->atendimento->estado_atual->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_encaminhado->id_estado }); + + $outro_guiche->encaminhamentos->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_atendimento => $atendimento->id_atendimento, + id_guiche_origem => $guiche_origem->id_guiche, + informacoes => $motivo + }); + + $c->stash->{guiche}->estado_atual->first->update + ({ vt_fim => $now }); + + $c->stash->{guiche}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_concluido_gu->id_estado }); + + $atendimento->update + ({ vt_fim => $now }); + + $c->stash->{escalonar_senha} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} + +sub iniciar_pausa :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c) = @_; + + my $now = $c->stash->{now}; + + #pegando estado atual do guiche + my $estado_guiche = $c->stash->{guiche}->estado_atual->search + ({ }, + { prefetch => 'estado' })->first; + #guiche tem que estar concluido ou disponivel para iniciar pausa + unless ($estado_guiche && (($estado_guiche->estado->nome eq 'concluido') || ($estado_guiche->estado->nome eq 'disponivel') )) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Guiche deve estar "concluido" ou "disponivel" para iniciar uma pausa.' }); + } + + #pegando estado pausa + my $estado_pausa = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'pausa' }); + unless ($estado_pausa) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "pausa"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + #fechando estado anterior do guiche + $estado_guiche->update + ({ vt_fim => $now }); + + #criando estado pausa para o guiche + $c->stash->{guiche}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_pausa->id_estado }); + + #criando objeto pausa + $c->stash->{guiche}->pausas->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_funcionario => $c->stash->{guiche}->atendente_atual->first->id_funcionario, + motivo => '' }); + + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} + +sub setar_motivo_pausa : WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $pausa_motivo = $query->{guiche}{pausa_motivo}; + + #unless ($pausa_motivo) { + # die $c->stash->{soap}->fault + # ({ code => 'Server', + # reason => 'Nao encontrou um motivo de pausa associado.', + # detail => 'Nao existia motivo da pausa associado ao guiche.' }); + #} + + my $pausa_atual = $c->stash->{guiche}->pausa_atual->first; + + unless ($pausa_atual) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou uma pausa associada.', + detail => 'Nao existia pausa associada ao guiche.' }); + } + + $pausa_atual->update + ({ motivo => $pausa_motivo }); + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} + +sub fechar_servico_interno: WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c) = @_; + + my $now = $c->stash->{now}; + my $estado_guiche = $c->stash->{guiche}->estado_atual->search + ({ }, + { prefetch => 'estado' })->first; + unless ($estado_guiche && $estado_guiche->estado->nome eq 'interno') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Guiche deve estar "interno" para fechar servico interno' }); + } + + #fechar objeto servicoguiche + if($estado_guiche->estado->nome eq 'interno'){ + my $interno = $c->stash->{guiche}->servico_atual->first; + if ($interno) { + $interno->update + ({vt_fim => $now}); + } + } + + my $estado_concluido = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'concluido' }); + unless ($estado_concluido) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "concluido"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + $estado_guiche->update + ({ vt_fim => $now }); + + $c->stash->{guiche}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_concluido->id_estado }); + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} + +sub disponivel :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $estado_guiche = $c->stash->{guiche}->estado_atual->search + ({ }, + { prefetch => 'estado' })->first; + unless ($estado_guiche && (($estado_guiche->estado->nome eq 'concluido') || ($estado_guiche->estado->nome eq 'pausa') )) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Guiche deve estar "concluido" ou em "pausa" para voltar a estar disponivel' }); + } + + if($estado_guiche->estado->nome eq 'pausa'){ + my $pausa = $c->stash->{guiche}->pausa_atual->first; + if ($pausa) { + $pausa->update + ({vt_fim => $now}); + } + } + + if($estado_guiche->estado->nome eq 'interno'){ + my $pausa = $c->stash->{guiche}->pausa_atual->first; + if ($pausa) { + $pausa->update + ({vt_fim => $now}); + } + } + + my $estado_disponivel = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'disponivel' }); + unless ($estado_disponivel) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "disponivel"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + my $atendimento = $c->stash->{guiche}->atendimento_atual->find; + if ($atendimento) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Atendimento ainda associado.', + detail => 'Nao pode voltar a estar disponivel enquanto atendimento estiver associado ao guiche.' }); + } + + $estado_guiche->update + ({ vt_fim => $now }); + + $c->stash->{guiche}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_disponivel->id_estado }); + + + $c->stash->{escalonar_gerente} = 1; + $c->stash->{escalonar_senha} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} + +sub fechar_guiche :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + + #fechar_guiche irá desvincular o atendente ao guiche que está aberto + #e criar um novo estado para o guiche. + + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $estado_guiche = $c->stash->{guiche}->estados->find + ({ vt_ini => { '<=', $now }, + vt_fim => { '>', $now }}, + { prefetch => 'estado' }); + #unless ($estado_guiche && $estado_guiche->estado->nome !~ 'atendimento') { + #gerente sempre vai poder fechar o guichê, mesmo estando em atendimento. + unless ($estado_guiche) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Guiche nao pode estar "atendimento" quando for fechado' }); + } + + my $estado_fechado = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'fechado' }); + unless ($estado_fechado) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "fechado"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + my $atendimento = $c->stash->{guiche}->atendimentos->find + ({ vt_ini => { '<=', $now }, + vt_fim => { '>', $now }}); + if ($atendimento) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Atendimento ainda associado.', + detail => 'Nao pode fechar enquanto atendimento estiver associado ao guiche.' }); + } + + #checa se existe pausa + if($estado_guiche->estado->nome eq 'pausa'){ + my $pausa = $c->stash->{guiche}->pausa_atual->find; + if ($pausa) { + $pausa->update + ({vt_fim => $now}); + } + } + + #checa se existe servico interno + if($estado_guiche->estado->nome eq 'interno'){ + my $interno = $c->stash->{guiche}->servico_atual->find; + if ($interno) { + $interno->update + ({vt_fim => $now}); + } + } + + $estado_guiche->update + ({ vt_fim => $now }); + + my $atendente = $c->stash->{guiche}->atendentes + ->find( { vt_ini => { '<=', $now }, + vt_fim => { '>', $now } } ); + + if ($atendente) { + $atendente->update({ vt_fim => $now }); + } else { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Atendimento ainda associado.', + detail => 'Nenhum atendente associado ao guichê.' }); + } + + $c->stash->{guiche}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_fechado->id_estado }); + + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; + +} + +sub iniciar_servico_interno :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $id_servico = $query->{servico}{id_servico}; + + #pegando estado atual do guiche + my $estado_guiche = $c->stash->{guiche}->estado_atual->search + ({ }, + { prefetch => 'estado' })->first; + #guiche tem que estar concluido ou disponivel para iniciar servico interno + unless ($estado_guiche && (($estado_guiche->estado->nome eq 'concluido') || ($estado_guiche->estado->nome eq 'disponivel') )) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Guiche deve estar "concluido" ou "disponivel" para iniciar um serviço interno.' }); + } + + #pegando estado servico interno + my $estado_interno = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'interno' }); + unless ($estado_interno) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "interno"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + #fechando estado anterior do guiche + $estado_guiche->update + ({ vt_fim => $now }); + + #criando estado interno para o guiche + $c->stash->{guiche}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_interno->id_estado }); + + #criando objeto servico_guiche + $c->stash->{guiche}->servicos->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_servico => $id_servico, + informacoes => '' }); + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; + +} + +sub listar_servicos :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c) = @_; + + my $now = $c->stash->{now}; + + #pega no model todos os serviços + my $servicos = $c->model('DB::ServicoInterno')->search + ({ 'me.vt_ini' => { '<=', $now }, + 'me.vt_fim' => { '>', $now } + }); + + my $lista_servicos = []; + + while (my $servico = $servicos->next) { + push @$lista_servicos, + { + (map { $_ => $servico->$_() } + qw/id_servico id_classe nome/ ) + }; + } + + #retorna uma lista dos serviços + $c->stash->{soap}->compile_return + ({ lista_servicos => { servico => $lista_servicos } }); + +} + +sub listar_servicos_atendimento :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c) = @_; + + my $now = $c->stash->{now}; + + #pega no model todos os serviços + my $servicos = $c->model('DB::Servico')->search + ({ 'me.vt_ini' => { '<=', $now }, + 'me.vt_fim' => { '>', $now } + }); + + my $lista_servicos_atendimento = []; + + while (my $servico = $servicos->next) { + push @$lista_servicos_atendimento, + { + (map { $_ => $servico->$_() } + qw/id_servico id_classe nome/ ) + }; + } + + #retorna uma lista dos serviços + $c->stash->{soap}->compile_return + ({ lista_servicos => { servico => $lista_servicos_atendimento } }); + +} + +sub setar_info_interno : WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $informacoes = $query->{servico}{informacoes}; + + #unless ($informacoes) { + # die $c->stash->{soap}->fault + # ({ code => 'Server', + # reason => 'Nao encontrou informacoes associadas ao servico.', + # detail => 'Nao existia informacoes associadas ao servico.' }); + #} + + my $servico_atual = $c->stash->{guiche}->servico_atual->first; + + unless ($servico_atual) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou um servico associado.', + detail => 'Nao existia servico associado ao guiche.' }); + } + + $servico_atual->update + ({ informacoes => $informacoes }); + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} + +sub iniciar_servico_atendimento :WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $id_servico = $query->{servico}{id_servico}; + + #pegando estado atual do guiche + my $estado_guiche = $c->stash->{guiche}->estado_atual->search + ({ }, + { prefetch => 'estado' })->first; + #guiche tem que estar atendimento para iniciar servico atendimento + unless ($estado_guiche && ($estado_guiche->estado->nome eq 'atendimento')) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Guiche deve estar "atendimento" para iniciar um serviço em atendimento.' }); + } + + #pegar atendimento atual do guiche_atendimento + my $atend_guiche = $c->stash->{guiche}->atendimento_atual->find({}); + unless ($atend_guiche) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + #pegar atendimento atual do atendimento + my $atendimento = $atend_guiche->atendimento; + unless ($atendimento) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + + #criando objeto servico_atendimento + $atendimento->servico_atual->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_servico => $id_servico, + informacoes => '' }); + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; + +} + +sub fechar_servico_atendimento: WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $id_servico = $query->{servico}{id_servico}; + + my $now = $c->stash->{now}; + + #pegando estado atual do guiche + my $estado_guiche = $c->stash->{guiche}->estado_atual->search + ({ }, + { prefetch => 'estado' })->first; + #guiche tem que estar atendimento para iniciar servico atendimento + unless ($estado_guiche && ($estado_guiche->estado->nome eq 'atendimento')) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Guiche deve estar "atendimento" para iniciar um serviço em atendimento.' }); + } + + #pegar atendimento atual do guiche_atendimento + my $atend_guiche = $c->stash->{guiche}->atendimento_atual->find({}); + unless ($atend_guiche) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + #pegar atendimento atual do atendimento + my $atendimento = $atend_guiche->atendimento; + unless ($atendimento) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + #pegando servico + my $servico_atual = $atendimento->servico_atual->search + ({ id_servico => $id_servico }); + + #encerra objeto servico + $servico_atual->update + ({ vt_fim => $now }); + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} +sub setar_info_atendimento : WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $informacoes = $query->{servico}{informacoes}; + my $id_servico = $query->{servico}{id_servico}; + + #unless ($informacoes) { + # die $c->stash->{soap}->fault + # ({ code => 'Server', + # reason => 'Nao encontrou informacoes associadas ao servico.', + # detail => 'Nao existia informacoes associadas ao servico.' }); + #} + + unless ($id_servico) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou servico.', + detail => 'Nao existia servico associado.' }); + } + + #pegar atendimento atual do guiche_atendimento + my $atend_guiche = $c->stash->{guiche}->atendimento_atual->find({}); + unless ($atend_guiche) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + #pegar atendimento atual do atendimento + my $atendimento = $atend_guiche->atendimento; + unless ($atendimento) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou atendimento associado.', + detail => 'Nao existia atendimento associado ao guiche.' }); + } + + my $servico_atual = $atendimento->servico_atual->search + ({ id_servico => $id_servico }); + + unless ($servico_atual) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou um servico associado.', + detail => 'Nao existia servico associado ao guiche.' }); + } + + $servico_atual->update + ({ informacoes => $informacoes }); + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} + +sub retornar_pausa : WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI { + my ($self, $c) = @_; + + my $now = $c->stash->{now}; + my $estado_guiche = $c->stash->{guiche}->estado_atual->search + ({ }, + { prefetch => 'estado' })->first; + unless ($estado_guiche && ($estado_guiche->estado->nome eq 'pausa')) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado invalido', + detail => 'Guiche deve estar em "pausa" para voltar da pausa' }); + } + + if($estado_guiche->estado->nome eq 'pausa'){ + my $pausa = $c->stash->{guiche}->pausa_atual->first; + if ($pausa) { + $pausa->update + ({vt_fim => $now}); + } + } + + my $estado_concluido = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'concluido' }); + unless ($estado_concluido) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "concluido"', + detail => 'Ocorreu um erro de configuracao no sistema.' }); + } + + $estado_guiche->update + ({ vt_fim => $now }); + + $c->stash->{guiche}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_concluido->id_estado }); + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; + +} + +sub mudar_senha: WSDLPort('GestaoAtendente') :DBICTransaction('DB') :MI{ + my ($self, $c, $query) = @_; + + my $senhaatual = $query->{guiche}{senha}; + my $novasenha = $query->{guiche}{estado}; + + my $senhabanco = $c->stash->{funcionario}->get_column('password'); + + unless($senhabanco eq md5_hex($senhaatual)){ + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Senhas não conferem', + detail => 'Senha digitada não corresponde à senha atual.' }); + } + + $c->stash->{funcionario}->update( { password => md5_hex($novasenha) }); + $c->stash->{soap}->compile_return({ guiche => { senha => 'Senha alterada com sucesso' } }); + +} + +1; + +__END__ + +=head1 NAME + +Atendente - Funcionalidades do atendente + +=head1 DESCRIPTION + +Este módulo implementa todas as funcionalidades disponíveis para o +atendente. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Guiche.pm b/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Guiche.pm new file mode 100644 index 0000000..ecb298f --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Guiche.pm @@ -0,0 +1,166 @@ +package Fila::Servico::Controller::WS::Gestao::Guiche; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use Net::XMPP2::Util 'bare_jid'; +use DateTime; +use DateTime::Format::Pg; +use DateTime::Format::XSD; +use base + 'Fila::Servico::Controller', + 'Catalyst::Controller::SOAP', + 'Catalyst::Controller::DBIC::Transaction'; + +__PACKAGE__->config->{wsdl} = + {wsdl => '/usr/share/fila/Fila-Servico/schemas/FilaServico.wsdl', + schema => '/usr/share/fila/Fila-Servico/schemas/fila-servico.xsd'}; + +sub auto : Private { + my ($self, $c) = @_; + + return 0 if $c->req->header('XMPP_Stanza') eq 'presence'; + + my $from = $c->req->header('XMPP_Stanza_from'); + $from = bare_jid $from; + + # GestaoGuiche exige que seja um funcionario de um local., então se + # esse "from" não for o funcionario de nenhum local, já retornamos + # um fault daqui, senão guardamos o gerente no stash com prefetch + # do local. + my $now = $c->stash->{now}; + my $funcionario = $c->model('DB::Funcionario')->search + ({ jid => $from, + 'locais.vt_ini' => { '<=' => $now }, + 'locais.vt_fim' => { '>' => $now }, + 'local.vt_ini' => { '<=' => $now }, + 'local.vt_fim' => { '>' => $now }, + 'estados.vt_ini' => { '<=' => $now }, + 'estados.vt_fim' => { '>' => $now }, + 'estado.nome' => ['aberto','senhas_encerradas']}, + { prefetch => { 'locais' => + { 'local' => { 'estados' => 'estado' } }}})->first(); + + if ($funcionario) { + $c->stash->{funcionario} = $funcionario; + $c->stash->{local} = $funcionario->locais->first->local; + $c->stash->{gerente} = $c->stash->{local}->gerentes->first; + } else { + $c->action->prepare_soap_helper($self, $c); + $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Permissao Negada', + detail => 'Funcionario nao trabalha no local ou local nao esta aberto'}); + return 0; + } +} + +sub dados_local :WSDLPort('GestaoGuiche') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + $c->forward('/ws/gestao/local/dados_local'); +} + +sub listar_guiches :WSDLPort('GestaoGuiche') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + my $now = $c->stash->{now}; + + my $guiches = $c->stash->{local}->guiches->search + ({ 'me.vt_ini' => { '<=', $now }, + 'me.vt_fim' => { '>', $now }, + 'estados.vt_ini' => { '<=', $now }, + 'estados.vt_fim' => { '>', $now }}, + { prefetch => { 'estados' => 'estado' }}); + + my $lista_guiches = []; + + while (my $guiche = $guiches->next) { + push @$lista_guiches, + {( map { $_ => $guiche->$_() } + qw/id_local id_guiche identificador/ ), + estado => $guiche->estados->first->estado->nome }; + } + + $c->stash->{soap}->compile_return + ({ lista_guiches => { guiche => $lista_guiches } }); +} + +sub abrir_guiche :WSDLPort('GestaoGuiche') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + #Pega o id do guiche que foi enviado para ser aberto + my $guiche = $c->model('DB::Guiche')->find($query->{guiche}); + + #Pega status do guiche + my $now = $c->stash->{now}; + my $status = $guiche->estados->search + ({ vt_ini => { '<=', $now }, + vt_fim => { '>', $now }}, + { prefetch => 'estado' })->first; + + if ($status && $status->estado->nome ne 'fechado') { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Guiche ja aberto', + detail => 'O guiche precisa estar fechado para ser aberto'}); + } elsif ($status) { + $status->update({ vt_fim => $now }) + } + + my $estado_aberto = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'disponivel' }); + + unless ($estado_aberto) { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Nao pode encontrar estado "disponivel"', + detail => 'Existe um erro de configuracao no banco de dados'}); + } + + $guiche->estados->create + ({ id_estado => $estado_aberto->id_estado, + vt_ini => $now, + vt_fim => 'Infinity' }); + + $guiche->atendentes->create + ({ id_funcionario => $c->stash->{funcionario}->id_funcionario, + vt_ini => $now, + vt_fim => 'Infinity' }); + + $c->stash->{guiche} = $guiche; + $c->stash->{escalonar_senha} = 1; + $c->stash->{refresh_gerente} = 1; + +} + + +__PACKAGE__; + + +__END__ + +=head1 NAME + +Guiche - Permite a abertura do guichê + +=head1 DESCRIPTION + +Esse módulo permite a um funcionário que ainda não está associado a um +guichê, listar os guichês e abrir um. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Local.pm b/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Local.pm new file mode 100644 index 0000000..9153412 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Local.pm @@ -0,0 +1,1244 @@ +package Fila::Servico::Controller::WS::Gestao::Local; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use Net::XMPP2::Util 'bare_jid'; +use DateTime; +use DateTime::Format::Pg; +use DateTime::Format::XSD; +use Carp qw(croak); +use base + 'Fila::Servico::Controller', + 'Catalyst::Controller::SOAP', + 'Catalyst::Controller::DBIC::Transaction'; + +__PACKAGE__->config->{wsdl} = + {wsdl => '/usr/share/fila/Fila-Servico/schemas/FilaServico.wsdl', + schema => '/usr/share/fila/Fila-Servico/schemas/fila-servico.xsd'}; + +sub auto : Private { + my ($self, $c) = @_; + + return 0 if $c->req->header('XMPP_Stanza') eq 'presence'; + + my $from = $c->req->header('XMPP_Stanza_from'); + $from = bare_jid $from; + + # GestaoLocal exige que seja um gerente, então se esse "from" não + # for o gerente de nenhum local, já retornamos um fault daqui, senão + # guardamos o gerente no stash com prefetch do local. + my $now = $c->stash->{now}; + my $funcionario = $c->model('DB::Funcionario')->search + ({ jid => $from, + 'gerentes.vt_ini' => { '<=' => $now }, + 'gerentes.vt_fim' => { '>' => $now }, + 'local.vt_ini' => { '<=' => $now }, + 'local.vt_fim' => { '>' => $now }}, + { prefetch => { 'gerentes' => 'local' } })->first(); + + if ($funcionario) { + $c->stash->{funcionario} = $funcionario; + $c->stash->{gerente} = $funcionario->gerentes->first; + $c->stash->{local} = $c->stash->{gerente}->local; + return 1; + } else { + $c->action->prepare_soap_helper($self, $c); + $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Permissao Negada', + detail => 'Funcionario precisa ser gerente para acessar'}); + return 0; + } +} + +sub refresh_painel :Private { + my ($self, $c) = @_; + return unless $c->stash->{local}; + my $atendimentos = $c->stash->{local}->atendimentos_atuais->search + ({ 'estado.nome' => 'chamando' }, + { prefetch => [{ 'estado_atual' => 'estado' }, + { 'senha' => 'categoria' }, + { 'guiche_atual' => 'guiche' }]}); + my $ret = []; + while (my $atendimento = $atendimentos->next) { + my $id = $atendimento->guiche_atual->first->guiche->identificador; + $id =~ s/(^\s+|\s+$)//gs; + push @$ret, { senha => sprintf('%s%03d', $atendimento->senha->categoria->codigo, + $atendimento->senha->codigo), + guiche => $id }; + } + + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + $c->model('SOAP')->transport->addrs([$c->stash->{local}->jid_painel.'/callback']); + $c->model('SOAP::Painel')->senhas_chamando({ senhas_chamando => { senha => $ret }}); + +} + +sub refresh_gerente :Private { + my ($self, $c) = @_; + # esse método é chamado por outras ações que precisam fazer um + # callback para o gerente do local. As informações todas são + # enviadas, para que possa ser apresentada a tela. + + my $old = $c->stash->{soap}->compile_return(); + + my $local = $self->status_local($c, {}); + my $guiches = $self->status_guiches($c, {}); + my $encaminhamentos = $self->listar_encaminhamentos($c, {}); + + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + $c->model('SOAP')->transport->addrs([$c->stash->{local}->gerente_atual->first->funcionario->jid.'/cb/render/gerente']); + $c->model('SOAP::CB::Gerente')->render_gerente({ %$local, %$guiches, %$encaminhamentos }); + + $c->stash->{soap}->compile_return($old); + +} + + +sub dados_local :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $status = $c->stash->{local}->estados->search + ({ 'me.vt_ini' => { '<=', $now }, + 'me.vt_fim' => { '>', $now }}, + { + prefetch => 'estado' })->first; + + $c->stash->{soap}->compile_return + ({ local => + { + ( map { $_ => $c->stash->{local}->$_() } + qw/ id_local nome / ), + ( map { ( $c->stash->{local}->$_ && + $c->stash->{local}->$_->is_infinite ) ? () : + ($_ => DateTime::Format::XSD->format_datetime + ($c->stash->{local}->$_)) } + qw/ vt_ini vt_fim / ), + estado => $status->estado->nome, + jid_gerente => $c->stash->{local}->gerente_atual->first->funcionario->jid + } + }); +} + +sub abrir_local :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + + my $status = $c->stash->{local}->estados->search + ({ vt_ini => { '<=', $now }, + vt_fim => { '>', $now }}, + { + prefetch => 'estado' })->first; + + if ($status && $status->estado->nome eq 'aberto') { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Local ja aberto', + detail => 'O local ja se encontra aberto'}); + } elsif ($status) { + $status->update({ vt_fim => $now }) + } + + my $estado_aberto = $c->model('DB::TipoEstadoLocal')->find + ({ nome => 'aberto' }); + + unless ($estado_aberto) { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Nao pode encontrar estado "aberto"', + detail => 'Existe um erro de configuracao no banco de dados'}); + } + + $c->stash->{local}->estados->create + ({ id_estado => $estado_aberto->id_estado, + vt_ini => $now, + vt_fim => 'Infinity' }); + + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + $c->model('SOAP')->transport->addrs([$c->stash->{local}->jid_senhas.'/callback']); + $c->model('SOAP::Senha')->local_aberto({ refresh_request => '' }); + + $c->stash->{refresh_gerente} = 1; +} + +sub encerrar_senhas :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $status = $c->stash->{local}->estados->search + ({ vt_ini => { '<=', $now }, + vt_fim => { '>', $now }}, + { + prefetch => 'estado' })->first; + + if ($status && $status->estado->nome ne 'aberto') { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Local nao esta aberto', + detail => 'O local precisa estar aberto'}); + } elsif ($status) { + $status->update({ vt_fim => $now }) + } + + my $estado_senc = $c->model('DB::TipoEstadoLocal')->find + ({ nome => 'senhas_encerradas' }); + + unless ($estado_senc) { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Nao pode encontrar estado "senhas_encerradas"', + detail => 'Existe um erro de configuracao no banco de dados'}); + } + + $c->stash->{local}->estados->create + ({ id_estado => $estado_senc->id_estado, + vt_ini => $now, + vt_fim => 'Infinity' }); + + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + $c->model('SOAP')->transport->addrs([$c->stash->{local}->jid_senhas.'/callback']); + $c->model('SOAP::Senha')->senhas_encerradas({ refresh_request => '' }); + + $c->stash->{refresh_gerente} = 1; +} + +sub status_local :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + my %categorias; + my $agregado = {}; + my $now = $c->stash->{now}; + + my $estado_local_aberto = $c->model('DB::TipoEstadoLocal')->find + ({ nome => 'aberto' }); + + unless ($estado_local_aberto) { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Nao pode encontrar estado "aberto"', + detail => 'Existe um erro de configuracao no banco de dados'}); + } + # minha modificação + + my $id_gerente = $c->stash->{gerente}->id_funcionario; + my $busca_gerente = $c->model('DB::Funcionario')->find + ({ id_funcionario => $id_gerente }); + my $gerente = $busca_gerente->nome; + require Data::Dumper; + print STDERR "O hash é ", Data::Dumper::Dumper( \$gerente ), "\n"; + + # agora tah faltando 'mandar 'o $gerente para ser mostrado no template + + # obter o tempo maximo em espera por categoria, + # o agregado pode ser obtido sem outra consulta. + my $lista = $c->stash->{local}->configuracoes_categoria_atual->search + ({ 'estado.nome' => 'espera' }, + { join => { categoria => + { atendimentos_atuais => + { atendimento => + { + estado_atual => 'estado' }}}}, + select => [ 'me.id_categoria', + 'categoria.codigo', + { + min => 'estado_atual.vt_ini' }, + { + count => 'atendimento.id_atendimento' }, + 'me.limite_tempo_espera', + 'me.limite_pessoas_espera' ], + as => ['id_categoria', + 'codigo', + 'espera_mais_antiga', + 'quantidade_espera', + 'limite_tempo_espera', + 'limite_pessoas_espera'], + group_by => [ 'me.id_categoria', 'categoria.codigo', + 'me.limite_tempo_espera', 'me.limite_pessoas_espera' ]}); + + while (my $categoria = $lista->next) { + my $id_categoria = $categoria->get_column('id_categoria'); + $categorias{$id_categoria} ||= + { + codigo => $categoria->get_column('codigo') }; + + my $espera = $categoria->get_column('espera_mais_antiga'); + + $espera = + DateTime::Format::XSD->format_datetime + (DateTime::Format::Pg->parse_datetime($espera) + ->set_time_zone('local')) + if $espera; + + if ($espera && $categoria->get_column('limite_tempo_espera')) { + my $base = DateTime::Format::XSD->parse_datetime($espera); + my $dif = DateTime->now(time_zone => 'local')->subtract_datetime + ($base); + my $lim = DateTime::Duration->new(seconds => $categoria->get_column('limite_tempo_espera')); + if (DateTime::Duration->compare($dif,$lim,$base) > 0) { + $categorias{$id_categoria}{alert} = 1; + } + } + + $agregado->{espera_mais_antiga} ||= $espera; + $agregado->{espera_mais_antiga} = $espera + if $espera && $espera lt $agregado->{espera_mais_antiga}; + + $categorias{$id_categoria}{espera_mais_antiga} = $espera; + + my $quant = $categoria->get_column('quantidade_espera'); + $agregado->{quantidade_espera} ||= 0; + $agregado->{quantidade_espera} += $quant; + + if ($quant && $quant > $categoria->get_column('limite_pessoas_espera')) { + $categorias{$id_categoria}{alert} = 1; + } + + $categorias{$id_categoria}{quantidade_espera} = $quant; + } + + + { + # obter o tempo média de espera e de atendimento nas últimas 4 horas. + # por categoria + my $lista = $c->stash->{local}->configuracoes_categoria->search + ({ 'me.vt_ini' => { '<=', $now }, + 'me.vt_fim' => { '>', $now }, + -and => + [{ -or => + [{ 'estados.vt_ini' => { '>=', $now->clone->subtract( hours => 4) } }, + { + 'estados.vt_ini' => undef }]}, + { -or => + [{ 'estados.vt_fim' => { '<=', $now } }, + { + 'estados.vt_fim' => undef }]}, + { + 'estado.nome' => [ 'espera', 'atendimento', undef ] }]}, + { join => { categoria => + { atendimentos => + { atendimento => + { + estados => 'estado' }}}}, + select => [ 'me.id_categoria', + 'categoria.codigo', + 'estado.nome', + { 'to_char', + [{ avg => 'estados.vt_fim - estados.vt_ini' },\"'HH24:MI:SS'" #" + ]}], + as => ['id_categoria', + 'codigo', + 'estado', + 'media'], + group_by => [ 'me.id_categoria', 'categoria.codigo', 'estados.id_estado', 'estado.nome' ] }); + + + while (my $categoria_estado = $lista->next) { + my $estado = $categoria_estado->get_column('estado'); + next unless $estado && $estado =~ /^(espera|atendimento)$/; + + my $id_categoria = $categoria_estado->get_column('id_categoria'); + $categorias{$id_categoria} ||= + { + codigo => $categoria_estado->get_column('codigo') }; + + $categorias{$id_categoria}{"tempo_medio_".$estado} = $categoria_estado->get_column('media'); + } + } + + + { + # agregado + my $lista = $c->stash->{local}->configuracoes_categoria->search + ({ 'me.vt_ini' => { '<=', $now }, + 'me.vt_fim' => { '>', $now }, + -and => [ + { -or => [ + { + 'estados.vt_ini' => { '>=', $now->clone->subtract( hours => 4) } }, + { + 'estados.vt_ini' => undef }]}, + { -or => [ + { + 'estados.vt_fim' => { '<=', $now } }, + { + 'estados.vt_fim' => undef }]}, + { + 'estado.nome' => [ 'espera', 'atendimento', undef ] }]}, + { join => { categoria => + { atendimentos => + { atendimento => + { + estados => 'estado' }}}}, + select => [ 'estado.nome', + { + 'to_char', [{ avg => 'estados.vt_fim - estados.vt_ini' },\"'HH24:MI:SS'" #" + ]}], + as => ['estado', + 'media'], + group_by => [ 'estados.id_estado', 'estado.nome' ] }); + + while (my $estado = $lista->next) { + my $strestado = $estado->get_column('estado'); + next unless $strestado && $strestado =~ /^(espera|atendimento)$/; + + $agregado->{"tempo_medio_".$strestado} = $estado->get_column('media'); + } + } + + my $estado_local = $c->stash->{local}->estado_atual->search + ({ }, + { + prefetch => 'estado' })->first; + + #encaminhamentos + + #pegar ultimo vt_ini do ultimo estadoaberto do local. + my $ultimo_aberto = $c->stash->{local}->estados->search + ({ + 'estado.nome' => $estado_local_aberto->nome }, { + join => 'estado', + order_by => 'vt_ini DESC' + })->first; + + my $total_enc=0; + my $total_enc_abertos=0; + + if ($ultimo_aberto) { + + my $enc = $c->model('DB::GuicheEncaminhamento')->find( + { + 'me.vt_ini' => { '>=', $ultimo_aberto->get_column('vt_ini') } + }, + { + select => [ { count => 'me.id_atendimento' } ], + as => [ 'encaminhamentos' ] + } + ); + + $total_enc = $enc->get_column('encaminhamentos'); + + #encaminhamentos ainda sem atendimento + $enc = $c->model('DB::GuicheEncaminhamento')->find( + { + 'me.vt_ini' => { '>=', $ultimo_aberto->get_column('vt_ini') }, + 'me.vt_fim' => 'Infinity' + }, + { + select => [ { count => 'me.id_atendimento' } ], + as => [ 'encaminhamentos' ] + } + ); + + $total_enc_abertos = $enc->get_column('encaminhamentos'); + } + + return $c->stash->{soap}->compile_return + ({ local => + { + estado => $estado_local->estado->nome, + encaminhamentos => $total_enc, + encaminhamentos_abertos => $total_enc_abertos, + ( map { $_ => $c->stash->{local}->$_() } + qw/ id_local nome / ), + ( map { $c->stash->{local}->$_->is_infinite ? () : + ($_ => DateTime::Format::XSD->format_datetime + ($c->stash->{local}->$_)) } + qw/ vt_ini vt_fim / ), + status => + { + agregado => $agregado, + categorias => + { categoria => + [ map { { id_categoria => $_, %{$categorias{$_}} } } + keys %categorias ] } + }} + }); +} + +sub fechar_local_force :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $status = $c->stash->{local}->estados->search + ({ vt_ini => { '<=', $now }, + vt_fim => { '>', $now }}, + { prefetch => 'estado' })->first; + + if ($status && + $status->estado->nome ne 'aberto' && + $status->estado->nome ne 'senhas_encerradas') { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Estado invalido', + detail => 'O local precisa estar aberto ou com senhas encerradas'}); + } elsif ($status) { + $status->update({ vt_fim => $now }) + } + + my $estado_encerrado = $c->model('DB::TipoEstadoAtendimento')->find + ({ nome => 'encerrado' }); + unless ($estado_encerrado) { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Nao pode encontrar estado "encerrado"', + detail => 'Existe um erro de configuracao no banco de dados'}); + } + + my $atendimentos_nao_fechados = $c->stash->{local}->atendimentos_atuais; + while (my $atendimento = $atendimentos_nao_fechados->next) { + # forcar o fechamento do atendimento. + my $estado_atual = $atendimento->estado_atual->first; + $estado_atual->update({ vt_fim => $now }) if $estado_atual; + $atendimento->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_encerrado->id_estado }); + + # ver se esta associado a guiche. + my $guiche_atual = $atendimento->guiche_atual->first; + $guiche_atual->update({ vt_fim => $now }) if $guiche_atual; + + # ver se tem algum servico associado. + my $servico_atual = $atendimento->servico_atual->first; + $servico_atual->update({ vt_fim => $now }) if $servico_atual; + + # encerrar o atendimento + $atendimento->update({ vt_fim => $now }) if $atendimento; + } + + + my $guiches_nao_fechados = $c->stash->{local}->guiches_atuais->search + ({ 'estado.nome' => { '!=', 'fechado' }}, + { prefetch => { estado_atual => 'estado' } }); + + my $estado_fechado_guiche = $c->model('DB::TipoEstadoGuiche')->find + ({ nome => 'fechado' }); + + unless ($estado_fechado_guiche) { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Nao pode encontrar estado "fechado"', + detail => 'Existe um erro de configuracao no banco de dados'}); + } + + while (my $guiche = $guiches_nao_fechados->next) { + # forcar o fechamento do guiche. + my $estado_atual = $guiche->estado_atual->first; + $estado_atual->update({ vt_fim => $now }) if $estado_atual; + $guiche->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_fechado_guiche->id_estado }); + + # dessasociar o atendente. + my $atendente_atual = $guiche->atendente_atual->first; + $atendente_atual->update({ vt_fim => $now }) if $atendente_atual; + + # encerrar alguma pausa + my $pausa_atual = $guiche->pausa_atual->first; + $pausa_atual->update({ vt_fim => $now }) if $pausa_atual; + + # enverrar algum servico + my $servico_atual = $guiche->servico_atual->first; + $servico_atual->update({ vt_fim => $now }) if $servico_atual; + } + + + my $estado_fechado = $c->model('DB::TipoEstadoLocal')->find + ({ nome => 'fechado' }); + + unless ($estado_fechado) { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Nao pode encontrar estado "fechado"', + detail => 'Existe um erro de configuracao no banco de dados'}); + } + + $c->stash->{local}->estados->create + ({ id_estado => $estado_fechado->id_estado, + vt_ini => $now, + vt_fim => 'Infinity' }); + + $c->stash->{refresh_gerente} = 1; +} + +sub fechar_local :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $status = $c->stash->{local}->estados->search + ({ vt_ini => { '<=', $now }, + vt_fim => { '>', $now }}, + { + prefetch => 'estado' })->first; + + if ($status && + $status->estado->nome ne 'aberto' && + $status->estado->nome ne 'senhas_encerradas') { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Estado invalido', + detail => 'O local precisa estar aberto ou com senhas encerradas'}); + } elsif ($status) { + $status->update({ vt_fim => $now }) + } + + my $guiches_nao_fechados = $c->stash->{local}->guiches_atuais->search + ({ 'estado.nome' => { '!=', 'fechado' }}, + { + prefetch => { estado_atual => 'estado' } }); + + if ($guiches_nao_fechados->next) { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Guiches nao estao fechados', + detail => 'O local so pode ser fechado quando todos os ' + .'guiches estiverem fechados'}); + } + + my $atendimentos_nao_fechados = $c->stash->{local}->atendimentos_atuais; + + if ($atendimentos_nao_fechados->next) { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Atendimentos nao estao encerrados', + detail => 'O local so pode ser fechado quando todos os ' + .'atendimentos estiverem encerrados'}); + } + + my $estado_fechado = $c->model('DB::TipoEstadoLocal')->find + ({ nome => 'fechado' }); + + unless ($estado_fechado) { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Nao pode encontrar estado "fechado"', + detail => 'Existe um erro de configuracao no banco de dados'}); + } + + $c->stash->{local}->estados->create + ({ id_estado => $estado_fechado->id_estado, + vt_ini => $now, + vt_fim => 'Infinity' }); + + $c->stash->{refresh_gerente} = 1; +} + +sub status_guiches :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + + my $guiches = $c->stash->{local}->guiches->search + ({ 'me.vt_ini' => { '<=', $now }, + 'me.vt_fim' => { '>', $now }, + 'limites_atuais.id_local' => [ undef, $c->stash->{local}->id_local ] }, + { + 'join' => [{ 'estado_atual' => { 'estado' => 'limites_atuais' } }, + 'pausa_atual', + { + 'servico_atual' => 'servico' }, + { 'atendimento_atual' => { 'atendimento' => + [ { 'senha' => 'categoria' }, + { + 'estado_atual' => 'estado' } ]}}, + { + 'atendente_atual' => 'funcionario' }], + 'select' => [ 'me.id_guiche', + 'me.identificador', + 'me.pular_opiniometro', + 'funcionario.id_funcionario', + 'funcionario.nome', + 'funcionario.jid', + 'estado.nome', + 'estado_atual.vt_ini', + 'categoria.codigo', + 'senha.codigo', + 'estado_2.nome', + 'estado_atual_2.vt_ini', + 'atendimento.id_atendimento', + 'pausa_atual.motivo', + 'servico.nome', + 'limites_atuais.segundos', + ], + 'as' => [ 'id_guiche', + 'identificador', + 'pular_opiniometro', + 'id_funcionario', + 'funcionario', + 'jid', + 'estado', + 'estado_desde', + 'codigo_categoria', + 'codigo_senha', + 'estado_atendimento', + 'estado_atendimento_desde', + 'id_atendimento', + 'pausa_motivo', + 'nome_servico', + 'limite' + ], + 'order_by' => [ 'me.id_guiche' ] + }); + + my $ret = []; + while (my $guiche = $guiches->next) { + + my %dates = + ( map { $guiche->get_column($_) ? + ($_ => DateTime::Format::XSD->format_datetime + (DateTime::Format::Pg->parse_datetime + ($guiche->get_column($_))->set_time_zone('local'))) : () } + qw/ estado_desde estado_atendimento_desde / ); + + my $alert = 0; + if ($dates{estado_desde} && $guiche->get_column('limite')) { + my $base = DateTime::Format::XSD->parse_datetime($dates{estado_desde}); + my $dif = DateTime->now(time_zone => 'local')->subtract_datetime + ($base); + my $sec = DateTime::Duration->new('seconds' => $guiche->get_column('limite')); + if (DateTime::Duration->compare($dif,$sec,$base) > 0) { + $alert = 1; + } + } + + push @$ret, + { + ( map { $_ => $guiche->get_column($_) } + qw( id_guiche identificador pular_opiniometro estado estado_atendimento + funcionario id_funcionario jid id_atendimento pausa_motivo nome_servico ) ), + %dates, + id_local => $c->stash->{local}->id_local, + alert => $alert, + senha => $guiche->get_column('codigo_senha') ? + ( sprintf('%s%03d', ( map { $guiche->get_column($_) || '' } + qw( codigo_categoria codigo_senha ) )) ) : '', + } + } + + $c->stash->{soap}->compile_return + ({ lista_guiches => { guiche => $ret } }); + +} + +sub escalonar_senha :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + my ($self, $c) = @_; + + # descobrir os guiches disponiveis, e atribuir atendimentos para + # eles. + my $now = $c->stash->{now}; + my $guiches = $c->stash->{local}->guiches->search + ({ 'estado.nome' => 'disponivel', + 'estados.vt_ini' => { '<=', $now }, + 'estados.vt_fim' => { '>', $now }, + 'me.vt_ini' => { '<=', $now }, + 'me.vt_fim' => { '>', $now } + }, + { 'prefetch' => { 'estados' => 'estado' }, + 'order_by' => 'estados.vt_ini' + }); + + my $estado_chamando = $c->model('DB::TipoEstadoAtendimento')->find + ({ 'nome' => 'chamando' }); + unless ($estado_chamando) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado de atendimento "chamando" nao encontrado', + detail => 'Ocorreu um erro de configuracao no servidor' }); + } + + my $estado_chamando_guiche = $c->model('DB::TipoEstadoGuiche')->find + ({ 'nome' => 'chamando' }); + unless ($estado_chamando_guiche) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Estado de guiche "chamando" nao encontrado', + detail => 'Ocorreu um erro de configuracao no servidor' }); + } + + + while (my $guiche = $guiches->next) { + + my $encaminhamento = $guiche->encaminhamentos_atuais->first; + my $atendimento; + + if ($encaminhamento) { + $atendimento = $encaminhamento->atendimento; + $encaminhamento->update({ vt_fim => $now }); + } else { + # precisamos descobrir se esse guiche tem categorias + # configuradas, no caso de ele ter, a consulta de + # atendimentos em espera irá se restringir a esse conjunto + # de categorias. + my @ids = map { $_->id_categoria } $guiche->categorias_atuais; + my %restringir; + if (@ids) { + %restringir = ( 'categoria_atual.id_categoria' => { 'IN' => \@ids }); + } + + # descobrir os atendimentos em espera. O escalonamento vai ter o + # conceito de proporção entre o tempo de espera dependendo da + # prioridade da categoria. A prioridade vai representar um + # multiplicador para o tempo de espera, o que significa que, se + # uma categoria tem prioridade 1, o tempo de espera vai ter a + # proporção de 1 para 1. Uma categoria com prioridade 2 significa + # que o tempo de espera vai significar o dobro. Ou seja, se uma + # pessoa está esperando 10 minutos em uma categoria de prioridade + # 2 vai representar para o sistema como se ela já estivesse + # esperando a 20 minutos. + $atendimento = $c->stash->{local}->atendimentos_atuais->find + ({ 'estado.nome' => 'espera', + 'configuracoes_atuais.id_local' => $c->stash->{local}->id_local, + %restringir }, + { 'join' => + [{ 'estado_atual' => 'estado' }, + { 'categoria_atual' => { 'categoria' => 'configuracoes_atuais' }}], + 'order_by' => '((now() - estado_atual.vt_ini) * configuracoes_atuais.prioridade) DESC'}); + } + + if ($atendimento) { + my $outros_guiches = $atendimento->guiches->search + ({ 'me.vt_fim' => { '>', $now }}); + while (my $outro_guiche = $outros_guiches->next) { + $outro_guiche->update + ({ vt_fim => $now }); + } + + my $outros_estados_guiche = $guiche->estados->search + ({ 'me.vt_fim' => { '>', $now }}); + while (my $outro_estado = $outros_estados_guiche->next) { + $outro_estado->update + ({ vt_fim => $now }); + } + + $guiche->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_chamando_guiche->id_estado }); + + $atendimento->guiches->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_guiche => $guiche->id_guiche }); + + my $estados = $atendimento->estados->search + ({ 'me.vt_fim' => { '>', $now }}); + + while (my $outro_estado = $estados->next) { + $estados->update + ({ vt_fim => $now }); + } + + $atendimento->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_chamando->id_estado }); + + $c->stash->{guiche} = $guiche; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $guiche->id_guiche; + } + + } + + # Vamos obter o vt_ini do estado 'chamando' da 3 senha atras... + my $vtinis = $c->stash->{local}->atendimentos->search + ({ 'estado.nome' => 'chamando' }, + { + join => { estados => 'estado' }, + order_by => 'estados.vt_ini DESC', + rows => 1, + offset => 2, + select => [ 'estados.vt_ini' ], + as => [ 'vt_ini' ]})->first; + if ($vtinis) { + my $vt_ini = $vtinis->get_column('vt_ini'); + my $encerrar = $c->stash->{local}->atendimentos_atuais->search + ({ 'estado.nome' => 'no_show', + 'estados.vt_ini' => { '<' => $vt_ini } }, + { join => { estados => 'estado' }}); + while (my $at = $encerrar->next) { + $at->update({ 'vt_fim' => $now }); + } + + } + + $c->stash->{refresh_painel} = 1; + $c->stash->{refresh_gerente} = 1; +} + +sub dados_funcionario :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + #dados_funcionario é utilizado para receber um jid de um funcionario e + #retornar o nome do funcionario. + + my ($self, $c, $query) = @_; + + my $jid = $query->{funcionario}{jid}; + + my $funcionario = $c->model('DB::Funcionario')->find + ({ jid => $jid }); + + if (!$funcionario) { + die $c->stash->{soap}->fault + ({ code => 'Client', + reason => 'Funcionario nao encontrado;', + detail => 'Nao foi encontrado um funcionario com jid '.$jid }); + } + + $c->stash->{soap}->compile_return + ({ funcionario => { nome => $funcionario->nome } }); + +} + +sub encerrar_atendimento :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $atendimento = $c->model('DB::Atendimento')->find + ( $query->{atendimento} ); + + if (!$atendimento) { + die $c->stash->{soap}->fault + ({ code => 'Client', + reason => 'Atendimento nao encontrado;', + detail => 'Nao foi encontrado o atendimento' }); + } + + my $guiche = $atendimento->guiche_atual->first->guiche; + + my $estado_atual = $atendimento->estado_atual->search + ({},{ prefetch => 'estado' })->first; + if ($estado_atual->estado->nome ne 'avaliacao') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Atendimento em estado invalido', + detail => 'O atendimento precisa estar em "avaliacao" para ser encerrado' }); + } + + my $estado_at_encerrado = $c->model('DB::TipoEstadoAtendimento')->find({ nome => 'encerrado' }); + unless ($estado_at_encerrado) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "encerrado"', + detail => 'Ocorreu um erro de configuracao no sistema' }); + } + + my $estado_gu_concluido = $c->model('DB::TipoEstadoGuiche')->find({ nome => 'concluido' }); + unless ($estado_gu_concluido) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "concluido"', + detail => 'Ocorreu um erro de configuracao no sistema' }); + } + + $estado_atual->update({ vt_fim => $now }); + $atendimento->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_at_encerrado->id_estado }); + $atendimento->update({ vt_fim => $now }); + + $atendimento->guiche_atual->first->update({ vt_fim => $now }); + + $guiche->estado_atual->first->update({ vt_fim => $now }); + $guiche->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_gu_concluido->id_estado }); + + $c->model('SOAP')->transport->connection($c->engine->connection($c)); + + $c->model('SOAP')->transport->addrs([$guiche->jid_opiniometro . '/callback/']); + $c->model('SOAP::Opiniometro') + ->encerrar_opiniometro({ refresh_request => '' }); + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $guiche->id_guiche; +} + +sub devolver_senha :WSDLPort('GestaoLocal') :DBITransaction('DB') :MI { + my ($self, $c, $query) = @_; + my $now = $c->stash->{now}; + my $id_guiche = $query->{guiche}{id_guiche}; + + #Checa se existe guiche + unless ($id_guiche) { + die $c->stash->{soap}->fault + ({ code => 'Client', + reason => 'Guiche sem id', + detail => 'É preciso informar guichê usando id.' }); + } + + my $guiche = $c->model('DB::Guiche')->find({ id_guiche => $id_guiche }); + $c->stash->{guiche} = $guiche; + $c->stash->{atendente} = $guiche->atendente_atual->first; + $c->forward('/ws/gestao/atendente/devolver_senha'); +} + +sub fechar_guiche :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + #esse fechar_guiche recebe um id_guiche como parametro para fechar, + #no caso, vou usa-lo quando o gerente fechar algum guiche e passar o id. + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $id_guiche = $query->{guiche}{id_guiche}; + + #Checa se existe guiche + unless ($id_guiche) { + die $c->stash->{soap}->fault + ({ code => 'Client', + reason => 'Guiche sem id', + detail => 'É preciso informar guichê usando id.' }); + } + + my $guiche = $c->model('DB::Guiche')->find({ id_guiche => $id_guiche }); + $c->stash->{guiche} = $guiche; + $c->stash->{atendente} = $guiche->atendente_atual->first; + $c->forward('/ws/gestao/atendente/fechar_guiche'); +} + +sub fechar_todos :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + # esse metodo fecha todos os guiches com estado = concluido ou disponivel + my ($self, $c) = @_; + + my $now = $c->stash->{now}; + + # Pega todos os guiches + my $guiches = $c->model('DB::Guiche')->search + ({ 'me.vt_ini' => { '<=', $now } , + 'me.vt_fim' => { '>', $now } , + 'estados.vt_ini' => { '<=', $now }, + 'estados.vt_fim' => { '>', $now }, + 'estado.nome' => [ 'concluido' , 'disponivel' ]}, + { + prefetch => { 'estados' => 'estado' }}); + + # Checa se existe guiche + unless ($guiches) { + die $c->stash->{soap}->fault + ({ code => 'Client', + reason => 'Sem guichês para fechar', + detail => 'Nenhum guichê encontrado com estado concluido ou disponivel.' }); + } + + while (my $guiche = $guiches->next) { + my $old = $c->stash->{guiche}; + my $olda = $c->stash->{atendente}; + $c->stash->{atendente} = $guiche->atendente_atual->first; + $c->forward('/ws/gestao/atendente/fechar_guiche'); + $c->stash->{guiche} = $old; + $c->stash->{atendente} = $olda; + } +} + +sub concluir_atendimento :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $id_guiche = $query->{guiche}{id_guiche}; + + #Checa se existe guiche + unless ($id_guiche) { + die $c->stash->{soap}->fault + ({ code => 'Client', + reason => 'Guiche sem id', + detail => 'É preciso informar guichê usando id.' }); + } + + my $guiche = $c->model('DB::Guiche')->find({ id_guiche => $id_guiche }); + $c->stash->{guiche} = $guiche; + $c->stash->{atendente} = $guiche->atendente_atual->first; + $c->forward('/ws/gestao/atendente/concluir_atendimento'); +} + +sub pular_opiniometro :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $id_guiche = $query->{guiche}{id_guiche}; + my $valor = $query->{guiche}{pular_opiniometro}; + + #Checa se existe guiche + unless ($id_guiche) { + die $c->stash->{soap}->fault + ({ code => 'Client', + reason => 'Guiche sem id', + detail => 'É preciso informar guichê usando id.' }); + } + + my $guiche = $c->model('DB::Guiche')->find({ id_guiche => $id_guiche }); + + $guiche->update + ({ pular_opiniometro => $valor }); + + $c->stash->{refresh_gerente} = 1; +} + +sub listar_encaminhamentos: WSDLPort('GestaoLocal') :DBICTransaction('DB'): MI { + my ($self, $c, $query) = @_; + + my $estado_local_aberto = $c->model('DB::TipoEstadoLocal')->find + ({ nome => 'aberto' }); + + unless ($estado_local_aberto) { + die $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Nao pode encontrar estado "aberto"', + detail => 'Existe um erro de configuracao no banco de dados'}); + } + + #pegar ultimo vt_ini do ultimo estadoaberto do local. + my $ultimo_aberto = + $c->stash->{local}->estados->search + ({ 'estado.nome' => $estado_local_aberto->nome }, + { join => 'estado', + select => [ 'me.vt_ini' ], + as => [ 'vt_ini' ], + order_by => 'vt_ini DESC' })->first; + + my $ret = []; + if ($ultimo_aberto) { + my $vt_ini = $ultimo_aberto->get_column('vt_ini'); + + my $enc = + $c->model('DB::GuicheEncaminhamento')->search + ({ 'me.vt_ini' => { '>=', $vt_ini } }, + { join => [ 'guiche' , 'guiche_origem' ], + select => [ + 'me.vt_ini', + 'guiche.identificador', + 'guiche_origem.identificador', + 'me.id_atendimento', + 'me.informacoes', + 'me.vt_fim' + ], + as => [ + 'vt_ini' , + 'id_guiche', + 'id_guiche_origem', + 'id_atendimento', + 'informacoes', + 'vt_fim' + ], + order_by => [ 'me.vt_ini DESC' ]}); + + while (my $encaminhamento = $enc->next) { + push @$ret, + { + ( map { $_ => $encaminhamento->get_column($_) } + qw( id_guiche id_guiche_origem id_atendimento informacoes ) + ), + ( map { ($encaminhamento->get_column($_) && $c->stash->{local}->$_->is_infinite) ? + () : ($_ => DateTime::Format::XSD->format_datetime(DateTime::Format::Pg->parse_datetime($encaminhamento->get_column($_))->set_time_zone('local'))) } + qw/ vt_ini vt_fim / + ), + } + } + } + return $c->stash->{soap}->compile_return + ({ lista_encaminhamentos => { encaminhamento => $ret } }); +} + +sub associar_gerente :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + # esse associar_gerente recebe um id_funcionario como parametro + my $now = $c->stash->{now}; + my $id_funcionario = $query->{funcionario}{id_funcionario}; + my $guiche_associado = $c->model('DB::AtendenteGuiche')->find + ({ id_funcionario => $id_funcionario , + vt_fim => 'Infinity'}); + + # Checa se existe o funcionario e se ele está desassociado do guiche + unless ($id_funcionario) { + die $c->stash->{soap}->fault + ({ code => 'Client', + reason => 'Funcionario sem id', + detail => 'É preciso informar funcionario usando id.' }); + } + if ($guiche_associado) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Atendente esta conectado a uma mesa', + detail => 'Atendente nao pode ser gerente se estiver ligado a uma mesa.' }); + } + $c->stash->{gerente}->update({ vt_fim => DateTime->now(time_zone => 'local') }); + + $c->stash->{local}->gerentes->create + ({ id_funcionario => $id_funcionario, + vt_ini => DateTime->now(time_zone => 'local'), + vt_fim => 'Infinity' }); + + return $c->stash->{soap}->compile_return + ({ funcionario => { id_funcionario => $id_funcionario } }); +} + +sub listar_funcionarios :WSDLPort('GestaoLocal') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + + # guarda na variável $funcionarios todos os funcionários do local + my $funcionarios = $c->stash->{local}->funcionarios->search + ({ 'me.vt_ini' => { '<=', $now }, + 'me.vt_fim' => { '>=', $now } }, + { + 'order_by' => 'me.id_funcionario' }); + + my $lista_funcionarios = []; + while (my $funcionario = $funcionarios->next) { + + # verifica se o funcionário está associado a algum guichê... + my $guiche_associado = $c->model('DB::AtendenteGuiche')->find + ({ id_funcionario => $funcionario->id_funcionario, + vt_fim => 'Infinity'}); + + # ...se não tiver, guarda-o na listar_funcionarios. Além + # disso, também não guarda na lista o funcionário que é + # gerente, para que ele não se desconecte à toa. + unless (($guiche_associado) || ($funcionario->id_funcionario == $c->stash->{gerente}->get_column('id_funcionario'))) { + push @$lista_funcionarios, + { + ( map { $_ => $funcionario->funcionario->$_() } + qw/ nome id_funcionario / )}; + } + } + + $c->stash->{soap}->compile_return + ({ lista_funcionarios => { funcionario => $lista_funcionarios } }); + +} + +1; + + +__END__ + +=head1 NAME + +Local - Implementa a lógica do gerente + +=head1 DESCRIPTION + +Esse módulo implementa as funções disponíveis para o gerente. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Opiniometro.pm b/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Opiniometro.pm new file mode 100644 index 0000000..a68dd3b --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Opiniometro.pm @@ -0,0 +1,192 @@ +package Fila::Servico::Controller::WS::Gestao::Opiniometro; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use Net::XMPP2::Util qw(bare_jid); +use DateTime; +use DateTime::Format::Pg; +use DateTime::Format::XSD; +use base + 'Fila::Servico::Controller', + 'Catalyst::Controller::SOAP', + 'Catalyst::Controller::DBIC::Transaction'; + +__PACKAGE__->config->{wsdl} = + {wsdl => '/usr/share/fila/Fila-Servico/schemas/FilaServico.wsdl', + schema => '/usr/share/fila/Fila-Servico/schemas/fila-servico.xsd'}; + +sub auto : Private { + my ($self, $c) = @_; + + return 0 if $c->req->header('XMPP_Stanza') eq 'presence'; + + my $from = $c->req->header('XMPP_Stanza_from'); + $from = bare_jid $from; + + # A gestao de senhas é o serviço utilizado pelo emissor de senhas + my $now = $c->stash->{now}; + my $guiche = $c->model('DB::Guiche')->find + ({ 'me.jid_opiniometro' => $from, + 'me.vt_ini' => { '<=' => $now }, + 'me.vt_fim' => { '>' => $now }, + 'estado.nome' => 'avaliacao' }, + { prefetch => ['atendimento_atual', 'local', { 'estado_atual' => 'estado' }]}); + + if ($guiche) { + $c->stash->{guiche} = $guiche; + $c->stash->{local} = $guiche->local; + $c->stash->{atendimento} = $guiche->atendimento_atual->first->atendimento; + unless ($c->stash->{atendimento}) { + $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Permissao Negada', + detail => 'Nao encontrou atendimento associado a esse guiche'}); + return 0; + } + } else { + + my $local = $c->model('DB::Local')->find + ({ 'me.jid_opiniometro' => $from, + 'me.vt_ini' => { '<=', $now }, + 'me.vt_fim' => { '>', $now } }); + + if ($local) { + $c->stash->{local} = $local; + } else { + $c->action->prepare_soap_helper($self, $c); + $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Permissao Negada', + detail => 'Não é o opiniometro autorizado ou guiche nao esta em avaliacao'}); + return 0; + } + } +} + +sub registrar_avaliacao :WSDLPort('GestaoOpiniometro') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + my $estado_atual = $c->stash->{atendimento}->estado_atual->search({},{prefetch => 'estado'})->first; + unless ($estado_atual && $estado_atual->estado->nome eq 'avaliacao') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Permissao Negada', + detail => 'Atendimento nao esta em avaliacao' }); + } + + my $estado_at_encerrado = $c->model('DB::TipoEstadoAtendimento')->find({ nome => 'encerrado' }); + unless ($estado_at_encerrado) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "encerrado"', + detail => 'Ocorreu um erro de configuracao no sistema' }); + } + + my $estado_gu_concluido = $c->model('DB::TipoEstadoGuiche')->find({ nome => 'concluido' }); + unless ($estado_gu_concluido) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao encontrou estado "concluido"', + detail => 'Ocorreu um erro de configuracao no sistema' }); + } + + $estado_atual->update({ vt_fim => $now }); + $c->stash->{atendimento}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_at_encerrado->id_estado }); + $c->stash->{atendimento}->update({ vt_fim => $now }); + + my $ordem_perguntas = $c->stash->{local}->configuracoes_perguntas->find + ({ 'me.vt_ini' => { '<=' => $now } , + 'me.vt_fim' => { '>' => $now }}); + + unless ($ordem_perguntas) { + die $c->stash->{soap}->fault( + { code => 'Server' , + reason => 'Nao encontrou ordem das perguntas do opiniometro', + detail => 'Ocorreu um erro ao buscar a ordem das perguntas do opiniometro.' } + ); + } + + my %perguntas = map { $_ => $ordem_perguntas->get_column("pergunta$_") } 1..5; + foreach my $resposta (@{$query->{avaliacao_atendimento}{resposta}}) { + $c->stash->{atendimento}->respostas_avaliacao->create + ({ vt_fac => $now, + id_pergunta => $perguntas{$resposta->{id_pergunta}}, + resposta => $resposta->{resposta} }); + } + + $c->stash->{atendimento}->guiche_atual->first->update({ vt_fim => $now }); + + $c->stash->{guiche}->estado_atual->first->update({ vt_fim => $now }); + $c->stash->{guiche}->estados->create + ({ vt_ini => $now, + vt_fim => 'Infinity', + id_estado => $estado_gu_concluido->id_estado }); + + $c->stash->{refresh_gerente} = 1; + $c->stash->{refresh_guiche} ||= []; + push @{$c->stash->{refresh_guiche}}, $c->stash->{guiche}->id_guiche; +} + +sub registrar_avaliacao_praca :WSDLPort('GestaoOpiniometro') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + + my $ordem_perguntas = $c->stash->{local}->configuracoes_perguntas_praca->find + ({ 'me.vt_ini' => { '<=' => $now } , + 'me.vt_fim' => { '>' => $now }}); + + unless ($ordem_perguntas) { + die $c->stash->{soap}->fault( + { code => 'Server' , + reason => 'Nao encontrou ordem das perguntas do opiniometro', + detail => 'Ocorreu um erro ao buscar a ordem das perguntas do opiniometro.' } + ); + } + + my %perguntas = map { $_ => $ordem_perguntas->get_column("pergunta$_") } 1..5; + + foreach my $resposta (@{$query->{avaliacao_atendimento}{resposta}}) { + $c->stash->{local}->respostas_avaliacao->create + ({ vt_fac => $now, + id_pergunta => $perguntas{$resposta->{id_pergunta}}, + resposta => $resposta->{resposta} }); + } + + +} + +1; + +__END__ + +=head1 NAME + +Opiniometro - Funcionalidades para o opiniometro + +=head1 DESCRIPTION + +Este é o módulo que disponibiliza os serviços para o Fila-Opiniometro. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Senha.pm b/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Senha.pm new file mode 100644 index 0000000..d607519 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/Controller/WS/Gestao/Senha.pm @@ -0,0 +1,266 @@ +package Fila::Servico::Controller::WS::Gestao::Senha; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use Net::XMPP2::Util qw(bare_jid); +use DateTime; +use DateTime::Format::Pg; +use DateTime::Format::XSD; +use base + 'Fila::Servico::Controller', + 'Catalyst::Controller::SOAP', + 'Catalyst::Controller::DBIC::Transaction'; + +__PACKAGE__->config->{wsdl} = + {wsdl => '/usr/share/fila/Fila-Servico/schemas/FilaServico.wsdl', + schema => '/usr/share/fila/Fila-Servico/schemas/fila-servico.xsd'}; + +sub auto : Private { + my ($self, $c) = @_; + + return 0 if $c->req->header('XMPP_Stanza') eq 'presence'; + + my $from = $c->req->header('XMPP_Stanza_from'); + $from = bare_jid $from; + + # A gestao de senhas é o serviço utilizado pelo emissor de senhas + my $now = $c->stash->{now}; + + my $local = $c->model('DB::Local')->search + ({ 'me.jid_senhas' => $from, + 'me.vt_ini' => { '<=' => $now }, + 'me.vt_fim' => { '>' => $now }, + 'estados.vt_ini' => { '<=' => $now }, + 'estados.vt_fim' => { '>' => $now }, + 'estado.nome' => 'aberto'}, + { prefetch => { 'estados' => 'estado' }})->first(); + + if ($local) { + $c->stash->{local} = $local; + $c->stash->{gerente} = $local->gerente_atual->first->funcionario; + } else { + $c->action->prepare_soap_helper($self, $c); + $c->stash->{soap}->fault + ({code => 'Server', + reason => 'Permissao Negada', + detail => 'Não é o emissor de senhas autorizado ou local nao esta aberto'}); + return 0; + } +} + +sub dados_local :WSDLPort('GestaoSenha') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + $c->forward('/ws/gestao/local/dados_local'); +} + +sub listar_categorias :WSDLPort('GestaoSenha') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $now = $c->stash->{now}; + + + my $ordem = $c->stash->{local}->configuracoes_categoria->search + ({ 'me.vt_ini' => { '<=' => $now } , + 'me.vt_fim' => { '>' => $now }, + 'me.ordem' => { '<>' => 0 }}, { 'order_by' => 'me.ordem ASC' , prefetch => 'categoria' } ); + + unless ($ordem) { + die $c->stash->{soap}->fault( + { code => 'Server' , + reason => 'Nao encontrou ordem das categorias do emissor', + detail => 'Ocorreu um erro ao buscar a ordem das categorias do emissor.' } + ); + } + + #my $categorias = $c->stash->{local}->configuracoes_categoria->search + # ({ 'me.vt_ini' => { '<=', $now }, + # 'me.vt_fim' => { '>', $now }}, + # { prefetch => 'categoria' }); + + my $cat = []; + + #while (my $categoria = $categorias->next) { + # push @$cat, + # { id_categoria => $categoria->id_categoria, + # nome => $categoria->categoria->nome, + # codigo => $categoria->categoria->codigo }; + #} + while (my $categoria = $ordem->next) { + push @$cat, + { id_categoria => $categoria->categoria->id_categoria, + nome => $categoria->categoria->nome, + codigo => $categoria->categoria->codigo, + ordem => $categoria->ordem }; + } + + + $c->stash->{soap}->compile_return + ({ lista_categorias => { categoria => $cat }}); +} + +sub solicitar_senha :WSDLPort('GestaoSenha') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + # Temos que ver qual é a senha do atendimento mais recente nessa + # categoria, para dar uma senha subsequente. + my $id_categoria = $query->{atendimento}{id_categoria}; + unless ($id_categoria) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Categoria nao Informada', + detail => 'E preciso informar a categoria para solicitar uma senha'}); + } + + my $now = $c->stash->{now}; + + my $categoria = $c->stash->{local}->configuracoes_categoria_atual->search + ({ 'me.id_categoria' => $id_categoria }, + { prefetch => 'categoria' })->first; + unless ($categoria) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Categoria invalida', + detail => 'Categoria nao existe, ou nao tem configuracao nesse local'}); + } + + my $estados = $c->stash->{local}->estado_atual->search + ({ }, + { 'prefetch' => 'estado' })->first; + unless ($estados->estado->nome eq 'aberto') { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Local nao esta aberto', + detail => 'Local precisa estar aberto para solicitar uma senha'}); + } + + my $abertura = $estados->vt_ini; + + # encontrar o atendimento mais recente desde que o local foi + # aberto. + + my $codigo_senha_atual = 0; + my $recente = $c->stash->{local}->atendimentos->search + ({ 'vt_ini' => { '>=', $abertura }, + 'categoria.id_categoria' => $id_categoria }, + { 'order_by' => 'me.vt_ini DESC', + 'prefetch' => { 'senha' => 'categoria' }, + 'rows' => 1 })->first; + if ($recente) { + $codigo_senha_atual = $recente->senha->codigo; + } + + + # se a senha gerada estiver alocada a um atendimento corrente, + # tentar a proxima, até encontrar uma senha válida. + + my $started_at = $codigo_senha_atual; + my $recicled = 0; + + CHECARSENHA: + do { + if ($codigo_senha_atual >= 999) { + # as senhas acabaram, vamos reiniciar. + $codigo_senha_atual = 0; + $recicled = 1; + } + + $codigo_senha_atual++; + + if ($recicled && + $codigo_senha_atual >= $started_at) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Erro ao atribuir senha', + detail => 'Sistema nao conseguiu atribuir uma senha nova.' }); + } + + # verificar se a senha está disponível. + my $verificar = $c->stash->{local}->atendimentos_atuais->search + ({ 'senha.id_categoria' => $id_categoria, + 'senha.codigo' => $codigo_senha_atual }, + { join => 'senha' }); + if ($verificar->first) { + goto CHECARSENHA; + } + }; + + my $senha = $c->stash->{local}->senhas->find + ({ 'me.id_categoria' => $id_categoria, + 'me.codigo' => $codigo_senha_atual }); + unless ($senha) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao conseguiu encontrar senha', + detail => 'Houve um erro de configuracao no sistema.' }); + } + + my $estado_espera = $c->model('DB::TipoEstadoAtendimento')->find + ({ nome => 'espera' }); + unless ($estado_espera) { + die $c->stash->{soap}->fault + ({ code => 'Server', + reason => 'Nao conseguiu encontrar estado de atendimento "espera"', + detail => 'Houve um erro de configuracao no sistema.' }); + } + + # Criar um atendimento novo, associado a essa senha, a categoria + # dessa senha e esse local, com o estado "espera". + my $atendimento = $c->model('DB::Atendimento')->create + ({ id_senha => $senha->id_senha, + id_local => $c->stash->{local}->id_local, + vt_ini => $now, + vt_fim => 'Infinity', + estados => + [{ id_estado => $estado_espera->id_estado, + vt_ini => $now, + vt_fim => 'Infinity' }], + categorias => + [{ id_categoria => $id_categoria, + vt_ini => $now, + vt_fim => 'Infinity' }]}); + + # disparar o escalonamento. + $c->stash->{escalonar_senha} = 1; + + # retornar esse atendimento. + $c->stash->{soap}->compile_return + ({ atendimento => + { id_atendimento => $atendimento->id_atendimento, + vt_ini => DateTime::Format::XSD->format_datetime($now), + id_local => $c->stash->{local}->id_local, + id_senha => $senha->id_senha, + id_categoria => $senha->id_categoria, + senha => sprintf('%s%03d', $categoria->categoria->codigo, $codigo_senha_atual), + estado => 'espera' }}); +} + +1; + +__END__ + +=head1 NAME + +Senha - Regras para o emissor de senhas + +=head1 DESCRIPTION + +Esse módulo implementa os serviços disponíveis para o emissor de senha. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/Controller/WS/Scheduler.pm b/Fila-Servico/lib/Fila/Servico/Controller/WS/Scheduler.pm new file mode 100644 index 0000000..ba65450 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/Controller/WS/Scheduler.pm @@ -0,0 +1,94 @@ +package Fila::Servico::Controller::WS::Scheduler; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use Net::XMPP2::Util 'bare_jid'; +use DateTime; +use DateTime::Format::Pg; +use DateTime::Format::XSD; +use Carp qw(croak); +use base + 'Fila::Servico::Controller', + 'Catalyst::Controller::SOAP', + 'Catalyst::Controller::DBIC::Transaction'; + +__PACKAGE__->config->{wsdl} = + { wsdl => '/usr/share/fila/Fila-Servico/schemas/FilaServico.wsdl', + schema => '/usr/share/fila/Fila-Servico/schemas/fila-servico.xsd', + wsdlservice => 'FilaServico' }; + +sub auto :Private { + my ($self, $c, $query) = @_; + if ($c->req->header('XMPP_Stanza') eq 'presence') { + return 0; + } else { + return 1; + } +} + +# todas essas operações são read-only, então não precisamos fazer +# nenhuma checagem de autenticação. + +sub escalonar_senha :WSDLPort('Scheduler') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $id_local = $query->{local}{id_local}; + $c->stash->{local} = $c->model('DB::Local')->find({ id_local => $id_local }); + $c->stash->{gerente} = $c->stash->{local}->gerente_atual->first; + $c->stash->{funcionario} = $c->stash->{gerente}->funcionario; + $c->forward('/ws/gestao/local/escalonar_senha'); + +} + +sub refresh_gerente :WSDLPort('Scheduler') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $id_local = $query->{local}{id_local}; + $c->stash->{local} = $c->model('DB::Local')->find({ id_local => $id_local }); + $c->stash->{gerente} = $c->stash->{local}->gerente_atual->first; + $c->stash->{funcionario} = $c->stash->{gerente}->funcionario; + $c->forward('/ws/gestao/local/refresh_gerente'); + +} + +sub refresh_painel :WSDLPort('Scheduler') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $id_local = $query->{local}{id_local}; + $c->stash->{local} = $c->model('DB::Local')->find({ id_local => $id_local }); + $c->stash->{gerente} = $c->stash->{local}->gerente_atual->first; + $c->stash->{funcionario} = $c->stash->{gerente}->funcionario; + $c->forward('/ws/gestao/local/refresh_painel'); + +} + +sub refresh_guiche :WSDLPort('Scheduler') :DBICTransaction('DB') :MI { + my ($self, $c, $query) = @_; + + my $id_guiche = $query->{guiche}{id_guiche}; + $c->stash->{guiche} = $c->model('DB::Guiche')->find({ id_guiche => $id_guiche }); + $c->stash->{atendente} = $c->stash->{guiche}->atendente_atual->first; + $c->stash->{funcionario} = $c->stash->{atendente}->funcionario; + $c->stash->{local} = $c->model->{guiche}->local; + $c->stash->{gerente} = $c->stash->{local}->gerente_atual->first; + $c->forward('/ws/gestao/atendente/refresh_atendente'); + +} + +1; diff --git a/Fila-Servico/lib/Fila/Servico/DB.pm b/Fila-Servico/lib/Fila/Servico/DB.pm new file mode 100644 index 0000000..c628a30 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB.pm @@ -0,0 +1,36 @@ +package Fila::Servico::DB; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class::Schema); + +__PACKAGE__->load_classes(); + +1; + +__END__ + +=head1 NAME + +DB - DBIx::Class::Schema + +=head1 DESCRIPTION + +Essa classe prove o schema de banco de dados para uso com o DBIx::Class. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/Agendamento.pm b/Fila-Servico/lib/Fila/Servico/DB/Agendamento.pm new file mode 100644 index 0000000..7e0c0be --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/Agendamento.pm @@ -0,0 +1,70 @@ +package Fila::Servico::DB::Agendamento; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('agendamento'); +__PACKAGE__->add_columns + ( + id_atendimento => + { + data_type => 'integer', + }, + id_agendamento => + { + data_type => 'integer', + }, + nome => + { + data_type => 'varchar' + }, + email => + { + data_type => 'varchar' + }, + tipopessoa => + { + data_type => 'varchar', + }, + cnpjf => + { + data_type => 'varchar', + } + ); + +__PACKAGE__->set_primary_key(qw(id_atendimento)); +__PACKAGE__->belongs_to('atendimento', 'Fila::Servico::DB::Atendimento', + { 'foreign.id_atendimento' => 'self.id_atendimento' }); + +1; + +__END__ + +=head1 NAME + +Agendamento - Informação auxiliar de agendamento + +=head1 DESCRIPTION + +Quando o atendimento a ser realizado foi agendado previamente, essa +tabela deve conter informações acerca do titular do agendamento para +permitir uma verificação por parte do atendente. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/AtendenteGuiche.pm b/Fila-Servico/lib/Fila/Servico/DB/AtendenteGuiche.pm new file mode 100644 index 0000000..69b3a16 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/AtendenteGuiche.pm @@ -0,0 +1,62 @@ +package Fila::Servico::DB::AtendenteGuiche; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('atendente_guiche'); +__PACKAGE__->add_columns + ( + id_funcionario => + { + data_type => 'integer', + }, + id_guiche => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + ); +__PACKAGE__->set_primary_key(qw(id_funcionario id_guiche vt_ini vt_fim)); +__PACKAGE__->belongs_to('funcionario', 'Fila::Servico::DB::Funcionario', + { 'foreign.id_funcionario' => 'self.id_funcionario' }); +__PACKAGE__->belongs_to('guiche', 'Fila::Servico::DB::Guiche', + { 'foreign.id_guiche' => 'self.id_guiche' }); + +1; + +__END__ + +=head1 NAME + +AtendenteGuiche - Registro temporal da associação entre funcionário e guichê. + +=head1 DESCRIPTION + +Do momento em que um funcionário abre o guichê até o momento em que +ele fecha, ele deve estar associado ao guichê. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/Atendimento.pm b/Fila-Servico/lib/Fila/Servico/DB/Atendimento.pm new file mode 100644 index 0000000..fc6ac0e --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/Atendimento.pm @@ -0,0 +1,117 @@ +package Fila::Servico::DB::Atendimento; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('atendimento'); +__PACKAGE__->add_columns + ( + id_atendimento => + { + data_type => 'integer', + is_auto_increment => 1, + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + id_local => + { + data_type => 'integer' + }, + id_senha => + { + data_type => 'integer' + }, + ); + + +__PACKAGE__->set_primary_key(qw(id_atendimento)); +__PACKAGE__->belongs_to('local', 'Fila::Servico::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); +__PACKAGE__->belongs_to('senha', 'Fila::Servico::DB::Senha', + { 'foreign.id_senha' => 'self.id_senha' }, + { 'join_type' => 'left' }); + +__PACKAGE__->might_have('agendamento', 'Fila::Servico::DB::Agendamento', + { 'foreign.id_atendimento' => 'self.id_atendimento' }); + +__PACKAGE__->has_many('estados', 'Fila::Servico::DB::EstadoAtendimento', + {'foreign.id_atendimento' => 'self.id_atendimento'}, + { join_type => 'left' }); + +__PACKAGE__->has_many('estado_atual', 'Fila::Servico::DB::EstadoAtendimento', + {'foreign.id_atendimento' => 'self.id_atendimento', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + {'join_type' => 'left' }); + +__PACKAGE__->has_many('categorias', 'Fila::Servico::DB::CategoriaAtendimento', + {'foreign.id_atendimento' => 'self.id_atendimento'}, + { 'join_type' => 'left' }); + +__PACKAGE__->has_many('categoria_atual', 'Fila::Servico::DB::CategoriaAtendimento', + {'foreign.id_atendimento' => 'self.id_atendimento', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { 'join_type' => 'left' }); + +__PACKAGE__->has_many('guiches', 'Fila::Servico::DB::GuicheAtendimento', + {'foreign.id_atendimento' => 'self.id_atendimento'}); + +__PACKAGE__->has_many('guiche_atual', 'Fila::Servico::DB::GuicheAtendimento', + {'foreign.id_atendimento' => 'self.id_atendimento', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + {'join_type' => 'left' }); + +__PACKAGE__->has_many('servicos', 'Fila::Servico::DB::ServicoAtendimento', + {'foreign.id_atendimento' => 'self.id_atendimento'}); + +__PACKAGE__->has_many('servico_atual', 'Fila::Servico::DB::ServicoAtendimento', + {'foreign.id_atendimento' => 'self.id_atendimento', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + {'join_type' => 'left' }); + +__PACKAGE__->has_many('respostas_avaliacao', 'Fila::Servico::DB::RespostaAvaliacao', + {'foreign.id_atendimento' => 'self.id_atendimento'}); + +1; + +__END__ + +=head1 NAME + +Atendimento - Entidade central do processo de atendimento + +=head1 DESCRIPTION + +Essa entidade agrega todas as informações de um atendimento desde o +momento em que a senha é emitida até o momento em que ele registra a +opinião. Praticamente todos os relacionamentos e atributos são +temporais, com a excessão da senha, que é sempre a mesma ao longo de +toda a vida do atendimento. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/Categoria.pm b/Fila-Servico/lib/Fila/Servico/DB/Categoria.pm new file mode 100644 index 0000000..e432467 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/Categoria.pm @@ -0,0 +1,76 @@ +package Fila::Servico::DB::Categoria; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('categoria'); +__PACKAGE__->add_columns + ( + id_categoria => + { + data_type => 'integer', + is_auto_increment => 1, + }, + nome => + { + data_type => 'varchar', + }, + codigo => + { + data_type => 'char(1)', + }, + ); +__PACKAGE__->set_primary_key(qw(id_categoria)); +__PACKAGE__->has_many('atendimentos', 'Fila::Servico::DB::CategoriaAtendimento', + {'foreign.id_categoria' => 'self.id_categoria'}, + { join_type => 'left' }); + +__PACKAGE__->has_many('atendimentos_atuais', 'Fila::Servico::DB::CategoriaAtendimento', + {'foreign.id_categoria' => 'self.id_categoria', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { join_type => 'left' }); + +__PACKAGE__->has_many('senhas', 'Fila::Servico::DB::Senha', + {'foreign.id_categoria' => 'self.id_categoria'}); + +__PACKAGE__->has_many('configuracoes', 'Fila::Servico::DB::ConfiguracaoCategoria', + {'foreign.id_categoria' => 'self.id_categoria'}); + +__PACKAGE__->has_many('configuracoes_atuais', 'Fila::Servico::DB::ConfiguracaoCategoria', + {'foreign.id_categoria' => 'self.id_categoria', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { join_type => 'left' }); +1; + +__END__ + +=head1 NAME + +Categoria - Lista as categorias de atendimento + +=head1 DESCRIPTION + +Esta tabela lista todas as categorias passíveis de fazer parte do +processo de atendimento, mas a configuração efetiva dessas categorias +no contexto do local acontece na tabela ConfiguracaoCategoria. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/CategoriaAtendimento.pm b/Fila-Servico/lib/Fila/Servico/DB/CategoriaAtendimento.pm new file mode 100644 index 0000000..6f52422 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/CategoriaAtendimento.pm @@ -0,0 +1,65 @@ +package Fila::Servico::DB::CategoriaAtendimento; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('categoria_atendimento'); +__PACKAGE__->add_columns + ( + id_atendimento => + { + data_type => 'integer', + }, + id_categoria => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + ); +__PACKAGE__->set_primary_key(qw(id_atendimento id_categoria vt_ini vt_fim)); +__PACKAGE__->belongs_to('atendimento', 'Fila::Servico::DB::Atendimento', + { 'foreign.id_atendimento' => 'self.id_atendimento' }, + { join_type => 'left' }); +__PACKAGE__->belongs_to('categoria', 'Fila::Servico::DB::Categoria', + { 'foreign.id_categoria' => 'self.id_categoria' }); + +1; + +__END__ + +=head1 NAME + +CategoriaAtendimento - Valores possíveis de categorias + +=head1 DESCRIPTION + +A categorização do atendimento possibilita o estabelecimento de +prioridades no atendimento. Essa tabela registra todas as categorias +em uso no sistema, estejam elas habilitadas para a emissão de senha ou +não, sejam elas utilizadas por um ou por todos os locais. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/ClasseServico.pm b/Fila-Servico/lib/Fila/Servico/DB/ClasseServico.pm new file mode 100644 index 0000000..8f056a1 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/ClasseServico.pm @@ -0,0 +1,53 @@ +package Fila::Servico::DB::ClasseServico; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('classe_servico'); +__PACKAGE__->add_columns + ( + id_classe => + { + data_type => 'integer', + is_auto_increment => 1, + }, + nome => + { + data_type => 'varchar', + } + ); +__PACKAGE__->set_primary_key(qw(id_classe)); +__PACKAGE__->has_many('servicos', 'Fila::Servico::DB::Servico', + { 'foreign.id_classe' => 'self.id_classe' }); + +1; + +__END__ + +=head1 NAME + +ClasseServico - Classificação dos serviços a serem realizados pelos atendentes + +=head1 DESCRIPTION + +Essa tabela define uma estrutura de classificação para os serviços +realizados dentro e fora de atendimento nos guichês. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoCategoria.pm b/Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoCategoria.pm new file mode 100644 index 0000000..d791976 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoCategoria.pm @@ -0,0 +1,81 @@ +package Fila::Servico::DB::ConfiguracaoCategoria; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('configuracao_categoria'); +__PACKAGE__->add_columns + ( + id_local => + { + data_type => 'integer', + }, + id_categoria => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + prioridade => + { + data_type => 'integer' + }, + limite_tempo_espera => + { + data_type => 'integer' + }, + limite_pessoas_espera => + { + data_type => 'integer' + }, + ordem => + { + data_type => 'integer' + } + ); +__PACKAGE__->set_primary_key(qw(id_local id_categoria vt_ini vt_fim)); +__PACKAGE__->belongs_to('local', 'Fila::Servico::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); +__PACKAGE__->belongs_to('categoria', 'Fila::Servico::DB::Categoria', + { 'foreign.id_categoria' => 'self.id_categoria' }, + { join_type => 'left' }); + +1; + +__END__ + +=head1 NAME + +ConfiguracaoCategoria - Configuração de uma categoria em um local + +=head1 DESCRIPTION + +Essa tabela define a configuração de uma categoria na praça, incluindo +questões como a posição dessa categoria no equipamento emissor de +senhas, a prioridade dessa categoria para a chamada das senhas e +limites para alerta. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoLimite.pm b/Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoLimite.pm new file mode 100644 index 0000000..35802a9 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoLimite.pm @@ -0,0 +1,68 @@ +package Fila::Servico::DB::ConfiguracaoLimite; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('configuracao_limite'); +__PACKAGE__->add_columns + ( + id_local => + { + data_type => 'integer', + }, + id_estado => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + segundos => + { + data_type => 'integer' + }, + ); +__PACKAGE__->set_primary_key(qw(id_local id_estado vt_ini vt_fim)); +__PACKAGE__->belongs_to('local', 'Fila::Servico::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); +__PACKAGE__->belongs_to('estado', 'Fila::Servico::DB::TipoEstadoGuiche', + { 'foreign.id_estado' => 'self.id_estado' }, + { join_type => 'left' }); + +1; + +__END__ + +=head1 NAME + +ConfiguracaoLimite - Controle gerencial dos guichês + +=head1 DESCRIPTION + +Essa tabela armazena valores limites em segundos para que um guichê +permaneça no mesmo estado. Se um guichê permanecer por mais tempo do +que os definidos aqui, o gerente deve ser notificado. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoPerguntas.pm b/Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoPerguntas.pm new file mode 100644 index 0000000..2003a2e --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoPerguntas.pm @@ -0,0 +1,86 @@ +package Fila::Servico::DB::ConfiguracaoPerguntas; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('configuracao_perguntas'); +__PACKAGE__->add_columns + ( + id_local => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + pergunta1 => + { + data_type => 'integer' + }, + pergunta2 => + { + data_type => 'integer' + }, + pergunta3 => + { + data_type => 'integer' + }, + pergunta4 => + { + data_type => 'integer' + }, + pergunta5 => + { + data_type => 'integer' + }, + ); +__PACKAGE__->set_primary_key(qw(id_local vt_fim vt_ini)); +__PACKAGE__->belongs_to('local', 'Fila::Servico::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); +__PACKAGE__->belongs_to('pergunta1', 'Fila::Servico::DB::PerguntaAvaliacao', + { 'foreign.id_pergunta' => 'self.pergunta1' }); +__PACKAGE__->belongs_to('pergunta2', 'Fila::Servico::DB::PerguntaAvaliacao', + { 'foreign.id_pergunta' => 'self.pergunta2' }); +__PACKAGE__->belongs_to('pergunta3', 'Fila::Servico::DB::PerguntaAvaliacao', + { 'foreign.id_pergunta' => 'self.pergunta3' }); +__PACKAGE__->belongs_to('pergunta4', 'Fila::Servico::DB::PerguntaAvaliacao', + { 'foreign.id_pergunta' => 'self.pergunta4' }); +__PACKAGE__->belongs_to('pergunta5', 'Fila::Servico::DB::PerguntaAvaliacao', + { 'foreign.id_pergunta' => 'self.pergunta5' }); + +1; + +__END__ + +=head1 NAME + +ConfiguracaoPerguntas - Configuração das perguntas do opiniometro do atendimento + +=head1 DESCRIPTION + +Essa tabela guarda o registro temporal das configurações das perguntas +nos opiniometros dos atendimentos. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoPerguntasPraca.pm b/Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoPerguntasPraca.pm new file mode 100644 index 0000000..c92f751 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/ConfiguracaoPerguntasPraca.pm @@ -0,0 +1,87 @@ +package Fila::Servico::DB::ConfiguracaoPerguntasPraca; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('configuracao_perguntas_praca'); +__PACKAGE__->add_columns + ( + id_local => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + pergunta1 => + { + data_type => 'integer' + }, + pergunta2 => + { + data_type => 'integer' + }, + pergunta3 => + { + data_type => 'integer' + }, + pergunta4 => + { + data_type => 'integer' + }, + pergunta5 => + { + data_type => 'integer' + }, + ); +__PACKAGE__->set_primary_key(qw(id_local vt_fim vt_ini)); +__PACKAGE__->belongs_to('local', 'Fila::Servico::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); +__PACKAGE__->belongs_to('pergunta1', 'Fila::Servico::DB::PerguntaAvaliacaoPraca', + { 'foreign.id_pergunta' => 'self.pergunta1' }); +__PACKAGE__->belongs_to('pergunta2', 'Fila::Servico::DB::PerguntaAvaliacaoPraca', + { 'foreign.id_pergunta' => 'self.pergunta2' }); +__PACKAGE__->belongs_to('pergunta3', 'Fila::Servico::DB::PerguntaAvaliacaoPraca', + { 'foreign.id_pergunta' => 'self.pergunta3' }); +__PACKAGE__->belongs_to('pergunta4', 'Fila::Servico::DB::PerguntaAvaliacaoPraca', + { 'foreign.id_pergunta' => 'self.pergunta4' }); +__PACKAGE__->belongs_to('pergunta5', 'Fila::Servico::DB::PerguntaAvaliacaoPraca', + { 'foreign.id_pergunta' => 'self.pergunta5' }); + +1; + +__END__ + +=head1 NAME + +ConfiguracaoPerguntasPraca - Define a ordem das perguntas no opiniometro geral + +=head1 DESCRIPTION + +Esta tabela mantém um registro temporal da informação da configuração +do opiniometro geral, listando quais são as cinco perguntas a serem +respondidas. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/EstadoAtendimento.pm b/Fila-Servico/lib/Fila/Servico/DB/EstadoAtendimento.pm new file mode 100644 index 0000000..9b84cd3 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/EstadoAtendimento.pm @@ -0,0 +1,65 @@ +package Fila::Servico::DB::EstadoAtendimento; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('estado_atendimento'); +__PACKAGE__->add_columns + ( + id_atendimento => + { + data_type => 'integer', + }, + id_estado => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + ); +__PACKAGE__->set_primary_key(qw(id_atendimento id_estado vt_ini vt_fim)); +__PACKAGE__->belongs_to('atendimento', 'Fila::Servico::DB::Atendimento', + { 'foreign.id_atendimento' => 'self.id_atendimento' }, + { join_type => 'left' }); +__PACKAGE__->belongs_to('estado', 'Fila::Servico::DB::TipoEstadoAtendimento', + { 'foreign.id_estado' => 'self.id_estado' }, + { join_type => 'left' }); + +1; + +__END__ + +=head1 NAME + +EstadoAtendimento - Atributo temporal do atendimento + +=head1 DESCRIPTION + +Esta tabela contém todo o registro temporal do atributo "estado" do +atendimento. Os tipos de estado ficam listados na tabela +TipoEstadoAtendimento. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/EstadoGuiche.pm b/Fila-Servico/lib/Fila/Servico/DB/EstadoGuiche.pm new file mode 100644 index 0000000..148301f --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/EstadoGuiche.pm @@ -0,0 +1,62 @@ +package Fila::Servico::DB::EstadoGuiche; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('estado_guiche'); +__PACKAGE__->add_columns + ( + id_guiche => + { + data_type => 'integer', + }, + id_estado => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + ); +__PACKAGE__->set_primary_key(qw(id_guiche id_estado vt_ini vt_fim)); +__PACKAGE__->belongs_to('guiche', 'Fila::Servico::DB::Guiche', + { 'foreign.id_guiche' => 'self.id_guiche' },{ 'join_type' => 'left' }); +__PACKAGE__->belongs_to('estado', 'Fila::Servico::DB::TipoEstadoGuiche', + { 'foreign.id_estado' => 'self.id_estado' },{ 'join_type' => 'left' }); + +1; + +__END__ + +=head1 NAME + +EstadoGuiche - Registro temporal do atributo "estado" do guiche + +=head1 DESCRIPTION + +Esta tabela lista o registro temporal, bem como o atual, do valor do +atributo "estado" do guiche. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/EstadoLocal.pm b/Fila-Servico/lib/Fila/Servico/DB/EstadoLocal.pm new file mode 100644 index 0000000..38cfe9a --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/EstadoLocal.pm @@ -0,0 +1,61 @@ +package Fila::Servico::DB::EstadoLocal; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('estado_local'); +__PACKAGE__->add_columns + ( + id_local => + { + data_type => 'integer', + }, + id_estado => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + ); +__PACKAGE__->set_primary_key(qw(id_local id_estado vt_ini vt_fim)); +__PACKAGE__->belongs_to('local', 'Fila::Servico::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); +__PACKAGE__->belongs_to('estado', 'Fila::Servico::DB::TipoEstadoLocal', + { 'foreign.id_estado' => 'self.id_estado' }); + +1; + +__END__ + +=head1 NAME + +EstadoLocal - Registro temporal dos estados do local + +=head1 DESCRIPTION + +Registro temporal do valor do atributo "estado" do local. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/Funcionario.pm b/Fila-Servico/lib/Fila/Servico/DB/Funcionario.pm new file mode 100644 index 0000000..31a3106 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/Funcionario.pm @@ -0,0 +1,96 @@ +package Fila::Servico::DB::Funcionario; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('funcionario'); +__PACKAGE__->add_columns + ( + id_funcionario => + { + data_type => 'integer', + is_auto_increment => 1 + }, + nome => + { + data_type => 'varchar', + }, + jid => + { + data_type => 'varchar', + }, + password => + { + data_type => 'varchar', + }, + ); +__PACKAGE__->set_primary_key(qw(id_funcionario)); + +__PACKAGE__->has_many('locais', 'Fila::Servico::DB::FuncionarioLocal', + { 'foreign.id_funcionario' => 'self.id_funcionario' }); + +__PACKAGE__->has_many('local_atual', 'Fila::Servico::DB::FuncionarioLocal', + { 'foreign.id_funcionario' => 'self.id_funcionario', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { join_type => 'left' }); + +__PACKAGE__->has_many('gerentes', 'Fila::Servico::DB::GerenteLocal', + { 'foreign.id_funcionario' => 'self.id_funcionario' }); + +__PACKAGE__->has_many('gerente_atual', 'Fila::Servico::DB::GerenteLocal', + { 'foreign.id_funcionario' => 'self.id_funcionario', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { join_type => 'left' }); + +__PACKAGE__->has_many('atendentes', 'Fila::Servico::DB::AtendenteGuiche', + { 'foreign.id_funcionario' => 'self.id_funcionario' }); + +__PACKAGE__->has_many('atendente_atual', 'Fila::Servico::DB::AtendenteGuiche', + { 'foreign.id_funcionario' => 'self.id_funcionario', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { join_type => 'left' }); + +__PACKAGE__->has_many('pausas', 'Fila::Servico::DB::Pausa', + { 'foreign.id_funcionario' => 'self.id_funcionario' }); + +__PACKAGE__->has_many('pausa_atual', 'Fila::Servico::DB::Pausa', + { 'foreign.id_funcionario' => 'self.id_funcionario', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { join_type => 'left' }); + +1; + +__END__ + +=head1 NAME + +Funcionario - Funcionário que pode trabalhar em qualquer local + +=head1 DESCRIPTION + +A entidade funcionário é transversal aos locais de atendimento, +permitindo que um funcionário tome parte de mais de um local de +atendimento ao longo do tempo. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/FuncionarioLocal.pm b/Fila-Servico/lib/Fila/Servico/DB/FuncionarioLocal.pm new file mode 100644 index 0000000..0e9cf1d --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/FuncionarioLocal.pm @@ -0,0 +1,63 @@ +package Fila::Servico::DB::FuncionarioLocal; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('funcionario_local'); +__PACKAGE__->add_columns + ( + id_funcionario => + { + data_type => 'integer', + }, + id_local => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + ); +__PACKAGE__->set_primary_key(qw(id_funcionario id_local vt_ini vt_fim)); +__PACKAGE__->belongs_to('funcionario', 'Fila::Servico::DB::Funcionario', + { 'foreign.id_funcionario' => 'self.id_funcionario' }); +__PACKAGE__->belongs_to('local', 'Fila::Servico::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); + +1; + +__END__ + +=head1 NAME + +FuncionarioLocal - Associação do Funcionário ao Local + +=head1 DESCRIPTION + +Esta tabela lista os funcionários que estão habilitados a serem +atendentes em um local, ou seja, aqueles que podem abrir um +guichê. Esta tabela mantém o registro temporal dessas associações. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/GerenteLocal.pm b/Fila-Servico/lib/Fila/Servico/DB/GerenteLocal.pm new file mode 100644 index 0000000..2cebaf6 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/GerenteLocal.pm @@ -0,0 +1,63 @@ +package Fila::Servico::DB::GerenteLocal; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('gerente_local'); +__PACKAGE__->add_columns + ( + id_funcionario => + { + data_type => 'integer', + }, + id_local => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + ); +__PACKAGE__->set_primary_key(qw(id_funcionario id_local vt_ini vt_fim)); +__PACKAGE__->belongs_to('funcionario', 'Fila::Servico::DB::Funcionario', + { 'foreign.id_funcionario' => 'self.id_funcionario' }); +__PACKAGE__->belongs_to('local', 'Fila::Servico::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); + +1; + +__END__ + +=head1 NAME + +GerenteLocal - Registro temporal de quem é o gerente + +=head1 DESCRIPTION + +Um local de atendimento precisa, a qualquer momento, ter um, e somente +um, gerente. Essa tabela guarda o registro histórico de quem foi o +gerente em cada momento. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/Guiche.pm b/Fila-Servico/lib/Fila/Servico/DB/Guiche.pm new file mode 100644 index 0000000..1ea28d2 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/Guiche.pm @@ -0,0 +1,143 @@ +package Fila::Servico::DB::Guiche; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('guiche'); +__PACKAGE__->add_columns + ( + id_guiche => + { + data_type => 'integer', + is_auto_increment => 1 + }, + id_local => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + identificador => + { + data_type => 'char(10)', + }, + jid_opiniometro => + { + data_type => 'varchar', + }, + pular_opiniometro => + { + data_type => 'integer', + } + ); +__PACKAGE__->set_primary_key(qw(id_guiche)); +__PACKAGE__->belongs_to('local', 'Fila::Servico::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); + +__PACKAGE__->has_many('categorias', 'Fila::Servico::DB::GuicheCategoria', + { 'foreign.id_guiche' => 'self.id_guiche' }, + { 'join_type' => 'left'}); + +__PACKAGE__->has_many('categorias_atuais', 'Fila::Servico::DB::GuicheCategoria', + { 'foreign.id_guiche' => 'self.id_guiche', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()", #" + }, + { 'join_type' => 'left'}); + +__PACKAGE__->has_many('atendimentos', 'Fila::Servico::DB::GuicheAtendimento', + { 'foreign.id_guiche' => 'self.id_guiche' }, + { 'join_type' => 'left' }); + +__PACKAGE__->has_many('encaminhamentos', 'Fila::Servico::DB::GuicheEncaminhamento', + { 'foreign.id_guiche' => 'self.id_guiche' }, + { 'join_type' => 'left', 'order_by' => 'vt_ini' }); + +__PACKAGE__->has_many('encaminhamentos_atuais', 'Fila::Servico::DB::GuicheEncaminhamento', + { 'foreign.id_guiche' => 'self.id_guiche', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()", #" + }, + { 'join_type' => 'left', 'order_by' => 'vt_ini' }); + +__PACKAGE__->has_many('atendimento_atual', 'Fila::Servico::DB::GuicheAtendimento', + { 'foreign.id_guiche' => 'self.id_guiche', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()", #" + }, + { 'join_type' => 'left' }); + +__PACKAGE__->has_many('estados', 'Fila::Servico::DB::EstadoGuiche', + { 'foreign.id_guiche' => 'self.id_guiche' }); + +__PACKAGE__->has_many('estado_atual', 'Fila::Servico::DB::EstadoGuiche', + { 'foreign.id_guiche' => 'self.id_guiche', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { 'join_type' => 'left' }); + +__PACKAGE__->has_many('atendentes', 'Fila::Servico::DB::AtendenteGuiche', + { 'foreign.id_guiche' => 'self.id_guiche' }); + +__PACKAGE__->has_many('atendente_atual', 'Fila::Servico::DB::AtendenteGuiche', + { 'foreign.id_guiche' => 'self.id_guiche', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { 'join_type' => 'left' }); + +__PACKAGE__->has_many('pausas', 'Fila::Servico::DB::Pausa', + { 'foreign.id_guiche' => 'self.id_guiche' }); + +__PACKAGE__->has_many('pausa_atual', 'Fila::Servico::DB::Pausa', + { 'foreign.id_guiche' => 'self.id_guiche', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { 'join_type' => 'left' }); + +__PACKAGE__->has_many('servicos', 'Fila::Servico::DB::ServicoGuiche', + { 'foreign.id_guiche' => 'self.id_guiche' }); + +__PACKAGE__->has_many('servico_atual', 'Fila::Servico::DB::ServicoGuiche', + { 'foreign.id_guiche' => 'self.id_guiche', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { 'join_type' => 'left' }); +1; + +__END__ + +=head1 NAME + +Guiche - Guichê de atendimento + +=head1 DESCRIPTION + +Esta tabela representa a mesa específica onde são realizados os +atendimentos. Praticamente todos os atributos e relacionamentos são +temporais, com excessão do local, uma vez que um guichê sempre irá +pertencer ao mesmo local. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/GuicheAtendimento.pm b/Fila-Servico/lib/Fila/Servico/DB/GuicheAtendimento.pm new file mode 100644 index 0000000..73f6156 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/GuicheAtendimento.pm @@ -0,0 +1,66 @@ +package Fila::Servico::DB::GuicheAtendimento; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('guiche_atendimento'); +__PACKAGE__->add_columns + ( + id_atendimento => + { + data_type => 'integer', + }, + id_guiche => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + ); +__PACKAGE__->set_primary_key(qw(id_atendimento id_guiche vt_ini vt_fim)); +__PACKAGE__->belongs_to('atendimento', 'Fila::Servico::DB::Atendimento', + { 'foreign.id_atendimento' => 'self.id_atendimento' }, + { 'join_type' => 'left' }); +__PACKAGE__->belongs_to('guiche', 'Fila::Servico::DB::Guiche', + { 'foreign.id_guiche' => 'self.id_guiche' }, + { 'join_type' => 'left' }); + +1; + +__END__ + +=head1 NAME + +GuicheAtendimento - Registro temporal do vínculo entre um atendimento e um guiche + +=head1 DESCRIPTION + +No momento em que uma senha é chamada, o atendimento é vinculado a +aquele guichê, e essa associação deve permanecer válida durante todo o +tempo que o guichê estiver relacionado a esse atendimento. Essa tabela +mantém um registro temporal de todas as vinculações. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/GuicheCategoria.pm b/Fila-Servico/lib/Fila/Servico/DB/GuicheCategoria.pm new file mode 100644 index 0000000..0622bbe --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/GuicheCategoria.pm @@ -0,0 +1,64 @@ +package Fila::Servico::DB::GuicheCategoria; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('guiche_categoria'); +__PACKAGE__->add_columns + ( + id_guiche => + { + data_type => 'integer', + }, + id_categoria => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + ); +__PACKAGE__->set_primary_key(qw(id_guiche id_categoria vt_ini vt_fim)); +__PACKAGE__->belongs_to('guiche', 'Fila::Servico::DB::Guiche', + { 'foreign.id_guiche' => 'self.id_guiche' },{ 'join_type' => 'left' }); +__PACKAGE__->belongs_to('categoria', 'Fila::Servico::DB::Categoria', + { 'foreign.id_categoria' => 'self.id_categoria' },{ 'join_type' => 'left' }); + +1; + +__END__ + +=head1 NAME + +GuicheCategoria - Configura as categorias que determinado guiche atende + +=head1 DESCRIPTION + +Esta tabela lista quais são as categorias para as quais um guichê irá +atender. Isso terá impacto direto no escalonamento das senhas. É +necessário gerir com cuidado isso, para evitar um desequilíbrio das +prioridades. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/GuicheEncaminhamento.pm b/Fila-Servico/lib/Fila/Servico/DB/GuicheEncaminhamento.pm new file mode 100644 index 0000000..d932a81 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/GuicheEncaminhamento.pm @@ -0,0 +1,79 @@ +package Fila::Servico::DB::GuicheEncaminhamento; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('guiche_encaminhamento'); +__PACKAGE__->add_columns + ( + id_atendimento => + { + data_type => 'integer', + }, + id_guiche => + { + data_type => 'integer', + }, + id_guiche_origem => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + informacoes => + { + data_type => 'varchar', + }, + ); +__PACKAGE__->set_primary_key(qw(id_atendimento id_guiche vt_ini vt_fim)); +__PACKAGE__->belongs_to('atendimento', 'Fila::Servico::DB::Atendimento', + { 'foreign.id_atendimento' => 'self.id_atendimento' }, + { 'join_type' => 'left' }); +__PACKAGE__->belongs_to('guiche', 'Fila::Servico::DB::Guiche', + { 'foreign.id_guiche' => 'self.id_guiche' }, + { 'join_type' => 'left' }); +__PACKAGE__->belongs_to('guiche_origem', 'Fila::Servico::DB::Guiche', + { 'foreign.id_guiche' => 'self.id_guiche_origem' }, + { 'join_type' => 'left' }); + +1; + +__END__ + +=head1 NAME + +GuicheEncaminhamento - Lista privada de espera de um guiche + +=head1 DESCRIPTION + +Esta tabela lista os atendimentos com espera prioritária para um +guichê que foram "encaminhados" por outros guichês. É importante notar +que um atendimento só pode ser encaminhado depois de ele ter sido +inicialmente atendido por um outro guichê. Essa funcionalidade permite +o redirecionamento de um atendimento para um profissional melhor +capacitado em uma determinada área. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/Local.pm b/Fila-Servico/lib/Fila/Servico/DB/Local.pm new file mode 100644 index 0000000..cab452b --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/Local.pm @@ -0,0 +1,142 @@ +package Fila::Servico::DB::Local; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('local'); +__PACKAGE__->add_columns + ( + id_local => + { + data_type => 'integer', + is_auto_increment => 1 + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone' + }, + nome => + { + data_type => 'varchar', + }, + jid_senhas => + { + data_type => 'varchar', + }, + jid_painel => + { + data_type => 'varchar', + }, + jid_opiniometro => + { + data_type => 'varchar', + } + ); + +__PACKAGE__->set_primary_key(qw(id_local)); + +__PACKAGE__->has_many('atendimentos', 'Fila::Servico::DB::Atendimento', + { 'foreign.id_local' => 'self.id_local' }); + +__PACKAGE__->has_many('atendimentos_atuais', 'Fila::Servico::DB::Atendimento', + { 'foreign.id_local' => 'self.id_local', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { 'join_type' => 'left' }); + +__PACKAGE__->has_many('senhas', 'Fila::Servico::DB::Senha', + { 'foreign.id_local' => 'self.id_local' }); + +__PACKAGE__->has_many('guiches', 'Fila::Servico::DB::Guiche', + { 'foreign.id_local' => 'self.id_local' }); + +__PACKAGE__->has_many('guiches_atuais', 'Fila::Servico::DB::Guiche', + { 'foreign.id_local' => 'self.id_local', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { 'join_type' => 'left' }); + +__PACKAGE__->has_many('estados', 'Fila::Servico::DB::EstadoLocal', + { 'foreign.id_local' => 'self.id_local' }); + +__PACKAGE__->has_many('estado_atual', 'Fila::Servico::DB::EstadoLocal', + { 'foreign.id_local' => 'self.id_local', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { 'join_type' => 'left' }); + +__PACKAGE__->has_many('configuracoes_categoria', 'Fila::Servico::DB::ConfiguracaoCategoria', + { 'foreign.id_local' => 'self.id_local' }, + { join_type => 'left' }); + +__PACKAGE__->has_many('configuracoes_limite', 'Fila::Servico::DB::ConfiguracaoLimite', + { 'foreign.id_local' => 'self.id_local' }, + { join_type => 'left' }); + +__PACKAGE__->has_many('configuracoes_categoria_atual', 'Fila::Servico::DB::ConfiguracaoCategoria', + { 'foreign.id_local' => 'self.id_local', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { 'join_type' => 'left' }); + +__PACKAGE__->has_many('funcionarios', 'Fila::Servico::DB::FuncionarioLocal', + { 'foreign.id_local' => 'self.id_local' }); + +__PACKAGE__->has_many('funcionarios_atuais', 'Fila::Servico::DB::FuncionarioLocal', + { 'foreign.id_local' => 'self.id_local', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { 'join_type' => 'left' }); + +__PACKAGE__->has_many('gerentes', 'Fila::Servico::DB::GerenteLocal', + { 'foreign.id_local' => 'self.id_local' }); + +__PACKAGE__->has_many('gerente_atual', 'Fila::Servico::DB::GerenteLocal', + { 'foreign.id_local' => 'self.id_local', + 'foreign.vt_ini' => \"<= NOW()", #" + 'foreign.vt_fim' => \"> NOW()"}, #" + { 'join_type' => 'left' }); +__PACKAGE__->has_many('respostas_avaliacao', 'Fila::Servico::DB::RespostaAvaliacaoPraca', + {'foreign.id_local' => 'self.id_local'}); + +__PACKAGE__->has_many('configuracoes_perguntas', 'Fila::Servico::DB::ConfiguracaoPerguntas', + { 'foreign.id_local' => 'self.id_local' }); +__PACKAGE__->has_many('configuracoes_perguntas_praca', 'Fila::Servico::DB::ConfiguracaoPerguntasPraca', + { 'foreign.id_local' => 'self.id_local' }); + +1; + +__END__ + +=head1 NAME + +Local - Praça de atendimento + +=head1 DESCRIPTION + +Essa é a entidade central do sistema, que relaciona a praça de +atendimento, direta ou indiretamente, todas as outras entidades são +relacionadas a um local. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/Pausa.pm b/Fila-Servico/lib/Fila/Servico/DB/Pausa.pm new file mode 100644 index 0000000..7d8fc6a --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/Pausa.pm @@ -0,0 +1,67 @@ +package Fila::Servico::DB::Pausa; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('pausa'); +__PACKAGE__->add_columns + ( + id_funcionario => + { + data_type => 'integer', + }, + id_guiche => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + motivo => + { + data_type => 'varchar', + } + ); +__PACKAGE__->set_primary_key(qw(id_funcionario id_guiche vt_ini vt_fim)); +__PACKAGE__->belongs_to('funcionario', 'Fila::Servico::DB::Funcionario', + { 'foreign.id_funcionario' => 'self.id_funcionario' }); +__PACKAGE__->belongs_to('guiche', 'Fila::Servico::DB::Guiche', + { 'foreign.id_guiche' => 'self.id_guiche' }); + +1; + + +__END__ + +=head1 NAME + +Pausa - Registro temporal das pausas dos atendentes + +=head1 DESCRIPTION + +Esta tabela mantém o registro histórico das pausas realizadas pelos +atendentes ao longo do tempo. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/PerguntaAvaliacao.pm b/Fila-Servico/lib/Fila/Servico/DB/PerguntaAvaliacao.pm new file mode 100644 index 0000000..43ad759 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/PerguntaAvaliacao.pm @@ -0,0 +1,63 @@ +package Fila::Servico::DB::PerguntaAvaliacao; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('pergunta_avaliacao'); +__PACKAGE__->add_columns + ( + id_pergunta => + { + data_type => 'integer', + is_auto_increment => 1, + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + pergunta => + { + data_type => 'varchar' + }, + ); +__PACKAGE__->set_primary_key(qw(id_pergunta)); +__PACKAGE__->has_many('respostas', 'Fila::Servico::DB::RespostaAvaliacao', + { 'foreign.id_pergunta' => 'self.id_pergunta' }); +__PACKAGE__->belongs_to('configuracoes_perguntas', 'Fila::Servico::DB::ConfiguracaoPerguntas', + { 'foreign.id_pergunta' => 'self.id_pergunta' }); + +1; + +__END__ + +=head1 NAME + +PerguntaAvaliacao - Todas as perguntas do opiniometro + +=head1 DESCRIPTION + +Esta tabela lista todas as perguntas que podem ser configuradas no +opiniometro do guiche. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/PerguntaAvaliacaoPraca.pm b/Fila-Servico/lib/Fila/Servico/DB/PerguntaAvaliacaoPraca.pm new file mode 100644 index 0000000..2dee51a --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/PerguntaAvaliacaoPraca.pm @@ -0,0 +1,63 @@ +package Fila::Servico::DB::PerguntaAvaliacaoPraca; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('pergunta_avaliacao_praca'); +__PACKAGE__->add_columns + ( + id_pergunta => + { + data_type => 'integer', + is_auto_increment => 1, + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + pergunta => + { + data_type => 'varchar' + }, + ); +__PACKAGE__->set_primary_key(qw(id_pergunta)); +__PACKAGE__->has_many('respostas', 'Fila::Servico::DB::RespostaAvaliacaoPraca', + { 'foreign.id_pergunta' => 'self.id_pergunta' }); +__PACKAGE__->belongs_to('configuracoes_perguntas_praca', 'Fila::Servico::DB::ConfiguracaoPerguntasPraca', + { 'foreign.id_pergunta' => 'self.id_pergunta' }); + +1; + +__END__ + +=head1 NAME + +PerguntaAvaliacaoPraca - As perguntas que podem ser configuradas no opiniometro geral + +=head1 DESCRIPTION + +Esta tabela lista todas as perguntas que podem ser associadas ao +opiniometro geral da praça. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/RespostaAvaliacao.pm b/Fila-Servico/lib/Fila/Servico/DB/RespostaAvaliacao.pm new file mode 100644 index 0000000..57abe9f --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/RespostaAvaliacao.pm @@ -0,0 +1,62 @@ +package Fila::Servico::DB::RespostaAvaliacao; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('resposta_avaliacao'); +__PACKAGE__->add_columns + ( + id_pergunta => + { + data_type => 'integer', + }, + id_atendimento => + { + data_type => 'integer', + }, + vt_fac => + { + data_type => 'timestamp with time zone', + }, + resposta => + { + data_type => 'integer' + }, + ); +__PACKAGE__->set_primary_key(qw(id_pergunta id_atendimento vt_fac)); +__PACKAGE__->belongs_to('atendimento', 'Fila::Servico::DB::Atendimento', + { 'foreign.id_atendimento' => 'self.id_atendimento' }); +__PACKAGE__->belongs_to('pergunta', 'Fila::Servico::DB::PerguntaAvaliacao', + { 'foreign.id_pergunta' => 'self.id_pergunta' }); + +1; + +__END__ + +=head1 NAME + +RespostaAvaliacao - Registro temporal das respostas do opiniometro + +=head1 DESCRIPTION + +Esta tabela guarda todos os registros de opinião associados aos +atendimentos. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/RespostaAvaliacaoPraca.pm b/Fila-Servico/lib/Fila/Servico/DB/RespostaAvaliacaoPraca.pm new file mode 100644 index 0000000..70c8d31 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/RespostaAvaliacaoPraca.pm @@ -0,0 +1,62 @@ +package Fila::Servico::DB::RespostaAvaliacaoPraca; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('resposta_avaliacao_praca'); +__PACKAGE__->add_columns + ( + id_pergunta => + { + data_type => 'integer', + }, + id_local => + { + data_type => 'integer', + }, + vt_fac => + { + data_type => 'timestamp with time zone', + }, + resposta => + { + data_type => 'integer' + }, + ); +__PACKAGE__->set_primary_key(qw(id_pergunta id_local vt_fac)); +__PACKAGE__->belongs_to('local', 'Fila::Servico::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); +__PACKAGE__->belongs_to('pergunta', 'Fila::Servico::DB::PerguntaAvaliacaoPraca', + { 'foreign.id_pergunta' => 'self.id_pergunta' }); + +1; + +__END__ + +=head1 NAME + +RespostaAvaliacaoPraca - Registro dos preenchimentos no opiniometro geral + +=head1 DESCRIPTION + +Esta tabela contém o registro temporal de todas as avaliações gerais +da praça realizadas. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/Senha.pm b/Fila-Servico/lib/Fila/Servico/DB/Senha.pm new file mode 100644 index 0000000..5a302af --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/Senha.pm @@ -0,0 +1,68 @@ +package Fila::Servico::DB::Senha; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('senha'); +__PACKAGE__->add_columns + ( + id_senha => + { + data_type => 'integer', + is_auto_increment => 1 + }, + id_categoria => + { + data_type => 'integer', + }, + id_local => + { + data_type => 'integer', + }, + codigo => + { + data_type => 'integer', + }, + ); +__PACKAGE__->set_primary_key(qw(id_senha)); +__PACKAGE__->belongs_to('local', 'Fila::Servico::DB::Local', + { 'foreign.id_local' => 'self.id_local' }); +__PACKAGE__->belongs_to('categoria', 'Fila::Servico::DB::Categoria', + { 'foreign.id_categoria' => 'self.id_categoria' }); +__PACKAGE__->has_many('atendimentos', 'Fila::Servico::DB::Atendimento', + { 'foreign.id_senha' => 'self.id_senha' }); + +1; + +__END__ + +=head1 NAME + +Senha - Representação do identificador visível do atendimento + +=head1 DESCRIPTION + +Apesar da senha ser o identificador visível do atendimento, a senha é +reutilizada ao longo do tempo, mas a associação entre senha e +atendimento não é temporal, o que significa que um atendimento mantém +o identificador visível do início ao fim. O sistema deve garantir que +dois atendimentos não estão associados à mesma senha ao mesmo tempo. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/Servico.pm b/Fila-Servico/lib/Fila/Servico/DB/Servico.pm new file mode 100644 index 0000000..73a2585 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/Servico.pm @@ -0,0 +1,66 @@ +package Fila::Servico::DB::Servico; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('servico'); +__PACKAGE__->add_columns + ( + id_servico => + { + data_type => 'integer', + is_auto_increment => 1, + }, + id_classe => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + nome => + { + data_type => 'varchar', + } + ); +__PACKAGE__->set_primary_key(qw(id_servico)); +__PACKAGE__->belongs_to('classe', 'Fila::Servico::DB::ClasseServico', + { 'foreign.id_classe' => 'self.id_classe' }); +__PACKAGE__->has_many('atendimentos', 'Fila::Servico::DB::ServicoAtendimento', + { 'foreign.id_servico' => 'self.id_servico' }); + +1; + +__END__ + +=head1 NAME + +Servico - Serviços que podem ser realizados em um guichê + +=head1 DESCRIPTION + +Contém os serviços que podem ser realizados em um guichê. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/ServicoAtendimento.pm b/Fila-Servico/lib/Fila/Servico/DB/ServicoAtendimento.pm new file mode 100644 index 0000000..f611575 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/ServicoAtendimento.pm @@ -0,0 +1,66 @@ +package Fila::Servico::DB::ServicoAtendimento; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('servico_atendimento'); +__PACKAGE__->add_columns + ( + id_atendimento => + { + data_type => 'integer', + }, + id_servico => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + informacoes => + { + data_type => 'varchar', + } + ); +__PACKAGE__->set_primary_key(qw(id_atendimento id_servico vt_ini vt_fim)); +__PACKAGE__->belongs_to('atendimento', 'Fila::Servico::DB::Atendimento', + { 'foreign.id_atendimento' => 'self.id_atendimento' }); +__PACKAGE__->belongs_to('servico', 'Fila::Servico::DB::Servico', + { 'foreign.id_servico' => 'self.id_servico' }); + +1; + +__END__ + +=head1 NAME + +ServicoAtendimento - Registro histórico dos serviços realizados dentro de um atendimento + +=head1 DESCRIPTION + +Essa tabela contém o registro temporal de todos os serviços realizados +no contexto de um atendimento. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/ServicoGuiche.pm b/Fila-Servico/lib/Fila/Servico/DB/ServicoGuiche.pm new file mode 100644 index 0000000..818d35d --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/ServicoGuiche.pm @@ -0,0 +1,66 @@ +package Fila::Servico::DB::ServicoGuiche; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('servico_guiche'); +__PACKAGE__->add_columns + ( + id_servico => + { + data_type => 'integer', + }, + id_guiche => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + informacoes => + { + data_type => 'varchar', + } + ); +__PACKAGE__->set_primary_key(qw(id_servico id_guiche vt_ini vt_fim)); +__PACKAGE__->belongs_to('servico', 'Fila::Servico::DB::ServicoInterno', + { 'foreign.id_servico' => 'self.id_servico' }); +__PACKAGE__->belongs_to('guiche', 'Fila::Servico::DB::Guiche', + { 'foreign.id_guiche' => 'self.id_guiche' }); + +1; + +__END__ + +=head1 NAME + +ServicoGuiche - Registro temporal dos servicos internos + +=head1 DESCRIPTION + +Essa tabela mantem o registro temporal dos serviços internos, ou seja, +realizados fora do contexto de um atendimento. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/ServicoInterno.pm b/Fila-Servico/lib/Fila/Servico/DB/ServicoInterno.pm new file mode 100644 index 0000000..c9c69e6 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/ServicoInterno.pm @@ -0,0 +1,67 @@ +package Fila::Servico::DB::ServicoInterno; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('servico_interno'); +__PACKAGE__->add_columns + ( + id_servico => + { + data_type => 'integer', + is_auto_increment => 1, + }, + id_classe => + { + data_type => 'integer', + }, + vt_ini => + { + data_type => 'timestamp with time zone', + }, + vt_fim => + { + data_type => 'timestamp with time zone', + }, + nome => + { + data_type => 'varchar', + } + ); +__PACKAGE__->set_primary_key(qw(id_servico)); +__PACKAGE__->belongs_to('classe', 'Fila::Servico::DB::ClasseServico', + { 'foreign.id_classe' => 'self.id_classe' }); +__PACKAGE__->has_many('guiches', 'Fila::Servico::DB::ServicoGuiche', + { 'foreign.id_servico' => 'self.id_servico' }); + +1; + +__END__ + +=head1 NAME + +ServicoInterno - Lista de serviços internos + +=head1 DESCRIPTION + +O serviço interno é um serviço realizado por um atendente em um guichê +fora do contexto de um atendimento. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/TipoEstadoAtendimento.pm b/Fila-Servico/lib/Fila/Servico/DB/TipoEstadoAtendimento.pm new file mode 100644 index 0000000..24f4dc1 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/TipoEstadoAtendimento.pm @@ -0,0 +1,55 @@ +package Fila::Servico::DB::TipoEstadoAtendimento; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('tipo_estado_atendimento'); +__PACKAGE__->add_columns + ( + id_estado => + { + data_type => 'integer', + is_auto_increment => 1, + }, + nome => + { + data_type => 'varchar', + }, + ); +__PACKAGE__->set_primary_key(qw(id_estado)); +__PACKAGE__->has_many('atendimentos', 'Fila::Servico::DB::EstadoAtendimento', + {'foreign.id_estado' => 'self.id_estado'}); + +1; + +__END__ + +=head1 NAME + +TipoEstadoAtendimento - Valores possíveis para o estado de um atendimento + +=head1 DESCRIPTION + +Esta tabela mantém a lista dos valores possíveis para o estado de um +atendimento. Apesar de essa configuração estar em um banco de dados, +existe um conjunto de valores que são obrigatórios para o bom +funcionamento do sistema. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/TipoEstadoGuiche.pm b/Fila-Servico/lib/Fila/Servico/DB/TipoEstadoGuiche.pm new file mode 100644 index 0000000..c5a5aff --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/TipoEstadoGuiche.pm @@ -0,0 +1,59 @@ +package Fila::Servico::DB::TipoEstadoGuiche; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('tipo_estado_guiche'); +__PACKAGE__->add_columns + ( + id_estado => + { + data_type => 'integer', + is_auto_increment => 1, + }, + nome => + { + data_type => 'varchar', + }, + ); +__PACKAGE__->set_primary_key(qw(id_estado)); +__PACKAGE__->has_many('guiches', 'Fila::Servico::DB::EstadoGuiche', + {'foreign.id_estado' => 'self.id_estado'}); + +__PACKAGE__->has_many('limites_atuais', 'Fila::Servico::DB::ConfiguracaoLimite', + {'foreign.id_estado' => 'self.id_estado', + 'foreign.vt_ini' => \" <= NOW()", #"}, + 'foreign.vt_fim' => \" > NOW()" },{ 'join_type' => 'left' }); #"}); + +1; + +__END__ + +=head1 NAME + +TipoEstadoGuiche - Quais os valores de estado de um guichê + +=head1 DESCRIPTION + +Esta tabela lista os valores de estado que um guichê pode ter. Apesar +desses valores estarem configurados em banco de dados, existe um +conjunto de valores mínimos que precisam estar inseridos nessa tabela. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/DB/TipoEstadoLocal.pm b/Fila-Servico/lib/Fila/Servico/DB/TipoEstadoLocal.pm new file mode 100644 index 0000000..443899c --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/DB/TipoEstadoLocal.pm @@ -0,0 +1,54 @@ +package Fila::Servico::DB::TipoEstadoLocal; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use base qw(DBIx::Class); + +__PACKAGE__->load_components(qw(InflateColumn::DateTime PK::Auto Core)); +__PACKAGE__->table('tipo_estado_local'); +__PACKAGE__->add_columns + ( + id_estado => + { + data_type => 'integer', + is_auto_increment => 1, + }, + nome => + { + data_type => 'varchar', + }, + ); +__PACKAGE__->set_primary_key(qw(id_estado)); +__PACKAGE__->has_many('locais', 'Fila::Servico::DB::EstadoLocal', + {'foreign.id_estado' => 'self.id_estado'}); + +1; + +__END__ + +=head1 NAME + +TipoEstadoLocal - Valores possíveis para o atributo "estado" do Local + +=head1 DESCRIPTION + +Esta tabela contém os valores possíveis para o atributo "estado" do +local. Apesar de haver a configuração em banco de dados, existe um +conjunto mínimo de valores obrigatórios. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/Model/DB.pm b/Fila-Servico/lib/Fila/Servico/Model/DB.pm new file mode 100644 index 0000000..a2888c6 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/Model/DB.pm @@ -0,0 +1,38 @@ +package Fila::Servico::Model::DB; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Model::DBIC::Schema'; + + +1; + +__END__ + +=head1 NAME + +DB - Configura o acesso ao DBIx::Class + +=head1 DESCRIPTION + +Seguindo a configuração no arquivo fila_servico.yml, define os meios +de acesso para o banco de dados utilizando o DBIx::Class. + +=cut + diff --git a/Fila-Servico/lib/Fila/Servico/Model/SOAP.pm b/Fila-Servico/lib/Fila/Servico/Model/SOAP.pm new file mode 100644 index 0000000..9d39088 --- /dev/null +++ b/Fila-Servico/lib/Fila/Servico/Model/SOAP.pm @@ -0,0 +1,68 @@ +package Fila::Servico::Model::SOAP; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use XML::CompileX::Transport::SOAPXMPP; +use base 'Catalyst::Model::SOAP'; + +__PACKAGE__->config->{transport} = XML::CompileX::Transport::SOAPXMPP->new(); + +__PACKAGE__->register_wsdl + ({ wsdl => Fila::Servico->path_to('/schemas/FilaWebApp.wsdl'), + schema => Fila::Servico->path_to('/schemas/fila-servico.xsd') }, + { render_gerente => 'CB::Gerente', + render_atendente => 'CB::Atendente', + render_error => 'CB::Error' }); + +__PACKAGE__->register_wsdl + ({ wsdl => Fila::Servico->path_to('/schemas/FilaSenha.wsdl'), + schema => Fila::Servico->path_to('/schemas/fila-servico.xsd') }, + { FilaSenhaCallback => 'Senha' }); + +__PACKAGE__->register_wsdl + ({ wsdl => Fila::Servico->path_to('/schemas/FilaServico.wsdl'), + schema => Fila::Servico->path_to('/schemas/fila-servico.xsd') }, + { Scheduler => 'Scheduler' }); + +__PACKAGE__->register_wsdl + ({ wsdl => Fila::Servico->path_to('/schemas/FilaOpiniometro.wsdl'), + schema => Fila::Servico->path_to('/schemas/fila-servico.xsd') }, + { FilaOpiniometroCallback => 'Opiniometro' }); + +__PACKAGE__->register_wsdl + ({ wsdl => Fila::Servico->path_to('/schemas/FilaPainel.wsdl'), + schema => Fila::Servico->path_to('/schemas/fila-servico.xsd') }, + { FilaPainelCallback => 'Painel' }); + +1; + +__END__ + +=head1 NAME + +SOAP - Permite o acesso para fazer os "callbacks" aos outros +componentes do sistema + +=head1 DESCRIPTION + +Este módulo dá acesso aos outros módulos do sistema para que possam +ser realizados os callbacks, de acordo com a necessidade de cada caso. + +=cut + diff --git a/Fila-Servico/reset-banco.sh b/Fila-Servico/reset-banco.sh new file mode 100755 index 0000000..2c721be --- /dev/null +++ b/Fila-Servico/reset-banco.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +echo "Drop database" +dropdb fila +echo "Create database" +createdb --encoding=utf-8 fila +echo "Recriando tabelas" +./script/fila_servico_db.pl | psql fila + + + + diff --git a/Fila-Servico/schemas/FilaOpiniometro.wsdl b/Fila-Servico/schemas/FilaOpiniometro.wsdl new file mode 100644 index 0000000..ecbd2fb --- /dev/null +++ b/Fila-Servico/schemas/FilaOpiniometro.wsdl @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Fila-Servico/schemas/FilaPainel.wsdl b/Fila-Servico/schemas/FilaPainel.wsdl new file mode 100644 index 0000000..5b11b36 --- /dev/null +++ b/Fila-Servico/schemas/FilaPainel.wsdl @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Fila-Servico/schemas/FilaSenha.wsdl b/Fila-Servico/schemas/FilaSenha.wsdl new file mode 100644 index 0000000..11e8fd0 --- /dev/null +++ b/Fila-Servico/schemas/FilaSenha.wsdl @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Fila-Servico/schemas/FilaServico.wsdl b/Fila-Servico/schemas/FilaServico.wsdl new file mode 100644 index 0000000..4dc69d3 --- /dev/null +++ b/Fila-Servico/schemas/FilaServico.wsdl @@ -0,0 +1,567 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Fila-Servico/schemas/FilaWeb.wsdl b/Fila-Servico/schemas/FilaWeb.wsdl new file mode 100644 index 0000000..3f52693 --- /dev/null +++ b/Fila-Servico/schemas/FilaWeb.wsdl @@ -0,0 +1,387 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Fila-Servico/schemas/FilaWebApp.wsdl b/Fila-Servico/schemas/FilaWebApp.wsdl new file mode 100644 index 0000000..8a00d12 --- /dev/null +++ b/Fila-Servico/schemas/FilaWebApp.wsdl @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Fila-Servico/schemas/fila-servico.xsd b/Fila-Servico/schemas/fila-servico.xsd new file mode 100644 index 0000000..8abfab5 --- /dev/null +++ b/Fila-Servico/schemas/fila-servico.xsd @@ -0,0 +1,264 @@ + + + + + + + + Este schema descreve os tipos XML para a comunicação interna e + externa do sistema de gestão de atendimento Fila. Os tipos + descritos aqui serão utilizados como partes das mensagens SOAP a + serem trocadas entre os vários agentes do sistema. + + Os elementos descritos por esse schema são bastante flexíveis no + que diz respeito ao quão completos os dados precisam ser. A idéia + é permitir que os elementos possam ser reutilizados só para + transferir entidades completas, mas também para transferir + informações incompletas relacionadas a uma entidade, o que pode + ser relevante no caso de consultas, que podem retornar apenas um + conjunto específico de dados, ou para serviços que precisem de + dados do mesmo tipo de uma entidade, mas que não representam uma + entidade já existente no sistema. + + + + + + + + + Este é um conjunto de dados instantâneos sobre o local, serve para + monitorar a capacidade de atendimento e a demanda do local. + + + + + + + + + + + + + + + + + Local representa uma "praça" de atendimento, onde vários guichês + estarão disponíveis para o atendimento ao público. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + O Guiche representa uma das estações em uma praça de atendimento. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Fila-Servico/script/fila_servico_db.pl b/Fila-Servico/script/fila_servico_db.pl new file mode 100755 index 0000000..aa77895 --- /dev/null +++ b/Fila-Servico/script/fila_servico_db.pl @@ -0,0 +1,235 @@ +#!/usr/bin/perl +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use lib 'lib'; +use SQL::Translator; + +my $t = SQL::Translator->new + ( + show_warnings => 1, + add_drop_table => 1, + quote_table_names => 1, + quote_field_names => 1, + validate => 1, + ); +$t->parser_args + ( + 'DBIx::Schema' => 'Fila::Servico::DB', + ); +my $r = $t->translate + ( + from => 'SQL::Translator::Parser::DBIx::Class', + to => 'PostgreSQL', + ) or die $t->error; +print $r; + +print <new + ( + show_warnings => 1, + add_drop_table => 1, + quote_table_names => 1, + quote_field_names => 1, + validate => 1, + producer_args => { + output_type => 'svg', + } + ); +$t->parser_args + ( + 'DBIx::Schema' => 'Fila::Servico::DB', + ); +my $r = $t->translate + ( + from => 'SQL::Translator::Parser::DBIx::Class', + to => 'GraphViz', + ) or die $t->error; +print $r; diff --git a/Fila-Servico/script/fila_servico_xmpp.pl b/Fila-Servico/script/fila_servico_xmpp.pl new file mode 100755 index 0000000..e49f680 --- /dev/null +++ b/Fila-Servico/script/fila_servico_xmpp.pl @@ -0,0 +1,57 @@ +#!/usr/bin/perl -w +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +$ENV{CATALYST_ENGINE} = 'XMPP2'; + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; + +use EV; +use AnyEvent; +use Net::XMPP2::Connection; +use Catalyst::Engine::XMPP2; +{ + no warnings; + *Catalyst::Engine::XMPP2::loop = *EV::loop; +} + +my $debug = 0; +my $help = 0; + +my @argv = @ARGV; + +GetOptions( + 'debug|d' => \$debug, + 'help|?' => \$help, +); + +pod2usage(1) if $help; + +if ( $debug ) { + $ENV{CATALYST_DEBUG} = 1; +} + +require Fila::Servico; + +Fila::Servico->run(); + +1; diff --git a/Fila-Web/cgi-bin/nph-app.cgi b/Fila-Web/cgi-bin/nph-app.cgi new file mode 100755 index 0000000..e73d0cb --- /dev/null +++ b/Fila-Web/cgi-bin/nph-app.cgi @@ -0,0 +1,173 @@ +#!/usr/bin/perl +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; + +use EV; +use AnyEvent; +use lib '/usr/share/fila/Fila-Web/lib'; + +use CGI '-nph'; + +my $query = CGI->new(); +print $query->header(-type => 'text/html', + -charset => 'utf-8', + -nph => 1); + +STDOUT->autoflush(1); + +print 'Sistema de Atendimento

    Carregando...

    '; + +{ package Fila::WebApp; + + use strict; + use warnings; + + use Catalyst::Runtime '5.70'; + use Net::XMPP2::Connection; + + use Catalyst qw/-Debug Unicode Static::Simple Prototype/; + our $VERSION = '0.01'; + + my $app = __PACKAGE__; + + my $user_jid; + my $domain; + if ($query->param('agents')) { + $::major_mode = 'agents'; + $user_jid = $query->param('usuario').'@agents.fila.vhost'; #emissor@agents.fila.vhost + $domain = 'agents.fila.vhost'; #dominio agents.fila.vhost + } else { + $user_jid = $query->param('usuario').'@people.fila.vhost'; #emissor@agents.fila.vhost + $domain = 'people.fila.vhost'; + } + $app->config + ('home' => '/usr/share/fila/Fila-Web/', + 'name' => 'Fila::WebApp', + 'Engine::XMPP2' => { username => $query->param('usuario'), + domain => $domain, + override_host => 'localhost', + password => $query->param('senha') }); + + $::user_guiche = $query->param('guiche'); + $::user_jid = $user_jid; + + $ENV{CATALYST_ENGINE} = 'XMPP2'; + $app->setup; + + { + no warnings; + # Forçar o uso do EV no lugar do Event. + *Catalyst::Engine::XMPP2::loop = *EV::loop; + } + + # neste ponto já temos uma aplicação configurada, e já podemos + # usá-la para montar a tela, não precisamos fazer coisas em CGI ;) + # vamos conectar para autenticar. + + $::connection = Net::XMPP2::Connection->new + (%{$app->config->{'Engine::XMPP2'}}, + resource => 'Main Connection'); + + { + # render the base page + my $req = HTTP::Request->new(GET => '/render/base'); + my $res; + $app->handle_request($req, \$res); + } + + + $::connection->reg_cb + (connection => sub { + my $req = HTTP::Request->new(GET => '/render/connected'); + my $res; + $app->handle_request($req, \$res); + }, + + bind_error => sub { + my $req = HTTP::Request->new(GET => '/render/error'); + my $res; + $app->handle_request($req, \$res); + EV::unloop(EV::UNLOOP_ALL); + }, + + iq_auth_error => sub { + my $req = HTTP::Request->new(GET => '/render/error'); + my $res; + $app->handle_request($req, \$res); + EV::unloop(EV::UNLOOP_ALL); + }, + + sasl_error => sub { + my $req = HTTP::Request->new(GET => '/render/error'); + my $res; + $app->handle_request($req, \$res); + EV::unloop(EV::UNLOOP_ALL); + }, + + disconnect => sub { + my $req = HTTP::Request->new(GET => '/render/disconnected'); + my $res; + $app->handle_request($req, \$res); + EV::unloop(EV::UNLOOP_ALL); + }, + + stream_error => sub { + my $req = HTTP::Request->new(GET => '/render/error'); + my $res; + $app->handle_request($req, \$res); + EV::unloop(EV::UNLOOP_ALL); + }, + + stream_ready => sub { + $::connection->send_presence('available', sub {}); + + { + # notify that we've authenticated. + my $req = HTTP::Request->new(GET => '/render/authenticated'); + my $res; + $app->handle_request($req, \$res); + } + + eval { + Fila::WebApp->run(); + }; + if ($@) { + my $req = HTTP::Request->new(GET => '/render/error'); + my $res; + $app->handle_request($req, \$res); + EV::unloop(EV::UNLOOP_ALL); + } + }); + + unless ($::connection->connect) { + my $req = HTTP::Request->new(GET => '/render/error'); + my $res; + $app->handle_request($req, \$res); + } else { + + my $w = EV::timer 10, 10, sub { + print ''; + }; + + EV::loop; + + } +} +1; diff --git a/Fila-Web/fila_web.yml b/Fila-Web/fila_web.yml new file mode 100644 index 0000000..44318d2 --- /dev/null +++ b/Fila-Web/fila_web.yml @@ -0,0 +1,2 @@ +--- +name: Fila::Web diff --git a/Fila-Web/lib/Fila/Web.pm b/Fila-Web/lib/Fila/Web.pm new file mode 100644 index 0000000..28c695f --- /dev/null +++ b/Fila-Web/lib/Fila/Web.pm @@ -0,0 +1,132 @@ +package Fila::Web; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; + +use Catalyst::Runtime '5.70'; + +use Catalyst qw/Unicode ConfigLoader Static::Simple Session + Session::Store::FastMmap Session::State::Cookie/; + +our $VERSION = '0.01'; + +__PACKAGE__->config( name => 'Fila::Web' ); + +__PACKAGE__->setup; + +use EV; +use AnyEvent; +use Net::XMPP2::Connection; + + +sub connect_xmpp { + warn "Starting Connection."; + + $::connection = Net::XMPP2::Connection->new + ( username => 'apache', + password => 'password', + domain => 'gestao.fila.vhost', + resource => 'Fila::Web', + whitespace_ping_interval => 2, + override_host => 'localhost', + blocking_write => 1); + + Fila::Web::Model::SOAP->config->{transport} + ->connection($::connection); + + my $die_on_unloop = 0; + my $once_connected = 0; + + $::connection->reg_cb + ( stream_ready => sub { + $::connection->send_presence('available', sub {}); + EV::unloop; + }, + + bind_error => sub { + $die_on_unloop = 1; + EV::unloop; + }, + + iq_auth_error => sub { + $die_on_unloop = 1; + EV::unloop; + }, + + sasl_error => sub { + $die_on_unloop = 1; + EV::unloop; + }, + + disconnect => sub { + if ($once_connected) { + warn 'Disconnected!.'; + $die_on_unloop = 1; + exit; + } else { + warn 'Disconnected during Setup!'; + sleep 1; + $die_on_unloop = 1; + EV::unloop; + } + }, + + stream_error => sub { + if ($once_connected) { + warn 'Stream Error! Will try to reconnect.'; + $die_on_unloop = 1; + EV::unloop; + } else { + warn 'Stream Error during Setup!'; + sleep 1; + $die_on_unloop = 1; + EV::unloop; + } + }); + + $::connection->connect() || die 'Could not connect to Jabber server'; + + EV::loop; + + if ($die_on_unloop) { + warn 'Conection failed. Re-starting'; + exit; + } else { + warn 'Connection established.'; + $once_connected = 1; + } +} + +connect_xmpp(); +1; + +__END__ + +=head1 NAME + +Web - Aplicação de callback + +=head1 DESCRIPTION + +Essa aplicação é responsável por receber as solicitações do navegador +e encaminhar para o usuário em questão via XMPP para que a ação seja +efetivamente processada. + +=cut + diff --git a/Fila-Web/lib/Fila/Web/Controller/CB/Atendente.pm b/Fila-Web/lib/Fila/Web/Controller/CB/Atendente.pm new file mode 100644 index 0000000..6a6aaa8 --- /dev/null +++ b/Fila-Web/lib/Fila/Web/Controller/CB/Atendente.pm @@ -0,0 +1,358 @@ +package Fila::Web::Controller::CB::Atendente; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Controller'; + +#recebe os eventos do navegador e os redireciona para filawebapp. + +sub fechar_guiche : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->fechar_guiche + ({ callback_request => + { param => + [ map {( name => $_, + value => $c->req->param($_) )} + keys %{$c->req->params} ]}}); +} + +sub enviar_chat : Local { + my ($self, $c) = @_; + #não pode deixar o name vazio, tem que colocar ele com o nome do gerente dda vez será que pode + my $too = $c->req->param('chatTo'); + my $texto = $c->req->param('txtTexto'); + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->enviar_chat + ({ callback_request => + { param => + [ { name => $too, + value => $texto } ]}}); + +} + +sub listar_guiches_encaminhar : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + + my $req = $c->model('SOAP::Atendente')->listar_guiches_encaminhar + ({ callback_request => + { param => + [ ] }}); +} + +sub encaminhar_atendimento : Local { + my ($self, $c) = @_; + + my $id_guiche = $c->req->param('mesaDestino'); + my $motivo = $c->req->param('motivoEnc'); + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + + my $req = $c->model('SOAP::Atendente')->encaminhar_atendimento + ({ callback_request => + { param => + [ { name => $motivo, + value => $id_guiche } ]}}); +} + +sub devolver_senha : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->devolver_senha + ({ callback_request => + { param => + [ { name => '', + value => '' } ]}}); +} + +sub iniciar_atendimento : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->iniciar_atendimento + ({ callback_request => + { param => + [ { name => '', + value => '' } ]}}); +} + +sub atender_no_show : Local { + my ($self, $c, $id) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->atender_no_show + ({ callback_request => + { param => + [ { name => 'id_atendimento', + value => $id } ]}}); +} + +sub concluir_atendimento : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->concluir_atendimento + ({ callback_request => + { param => + [ { name => '', + value => '' } ]}}); +} + +sub disponivel : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->disponivel + ({ callback_request => + { param => + [ { name => '', + value => '' } ]}}); + +} + +sub listar_no_show : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->listar_no_show + ({ callback_request => + { param => + [ { name => '', + value => '' } ]}}); + +} + +sub registrar_no_show : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->registrar_no_show + ({ callback_request => + { param => + [ { name => '', + value => '' } ]}}); + +} + +sub iniciar_pausa : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->iniciar_pausa + ({ callback_request => + { param => + [ { name => '', + value => '' } ]}}); + + +} + +sub setar_motivo_pausa : Local { + my ($self, $c) = @_; + + my $motivo = $c->req->param('txtMotivo'); + + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->setar_motivo_pausa + ({ callback_request => + { param => + [ { name => 'pausa_motivo', + value => $motivo } ]}}); + + +} + +sub iniciar_servico_interno : Local { + my ($self, $c, $id_servico) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->iniciar_servico_interno + ({ callback_request => + { param => + [ { name => 'id_servico', + value => $id_servico } ]}}); + +} + +sub listar_servicos : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->listar_servicos + ({ callback_request => + { param => + [ { name => '', + value => '' } ]}}); + +} + +sub listar_servicos_atendimento : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->listar_servicos_atendimento + ({ callback_request => + { param => + [ { name => '', + value => '' } ]}}); + +} + +sub fechar_servico_interno : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->fechar_servico_interno + ({ callback_request => + { param => + [ { name => '', + value => '' } ]}}); + +} + +sub setar_info_interno : Local { + my ($self, $c) = @_; + + my $informacoes = $c->req->param('txtInformacoes'); + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->setar_info_interno + ({ callback_request => + { param => + [ { name => 'informacoes', + value => $informacoes } ]}}); + + +} +sub iniciar_servico_atendimento : Local { + my ($self, $c, $id_servico) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->iniciar_servico_atendimento + ({ callback_request => + { param => + [ { name => 'id_servico', + value => $id_servico } ]}}); + +} + +sub fechar_servico_atendimento : Local { + my ($self, $c, $id_servico) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->fechar_servico_atendimento + ({ callback_request => + { param => + [ { name => 'id_servico', + value => $id_servico } ]}}); + +} +sub setar_info_atendimento : Local { + my ($self, $c) = @_; + + my $informacoes = $c->req->param('txtInformacoes'); + my $servico = $c->req->param('id_servico'); + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->setar_info_atendimento + ({ callback_request => + { param => + [ { name => $servico, + value => $informacoes } ]}}); + + +} + +sub retornar_pausa : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/atendente']); + my $req = $c->model('SOAP::Atendente')->retornar_pausa + ({ callback_request => + { param => + [ { name => '', + value => '' } ] } } ); + +} + +sub mudar_senha : Local { + my ($self, $c) = @_; + my $novasenha = $c->req->param('nova_senha'); + my $senhaatual = $c->req->param('senha_atual'); + my $confsenha = $c->req->param('confirmar_senha'); + my $jid = $c->req->param('jid'); + + unless(($confsenha eq $novasenha) || ($confsenha) || ($novasenha) ){ + $c->stash->{error_message} = 'Senhas não conferem ou não foram informadas'; + $c->stash->{mudar_senha} = 'Senhas não conferem ou não foram informadas'; + return $c->forward('/render/error_message'); + } + + $c->model('SOAP')->transport->addrs([$jid]); + + my $req = $c->model('SOAP::Atendente')->mudar_senha + ({ callback_request => + { param => + [ { name => $novasenha, + value => $senhaatual } ] } } ); + +} + + +1; + +__END__ + +=head1 NAME + +Atendente - Callback do atendente + +=head1 DESCRIPTION + +Traduz requisições http para mensagens SOAP+XMPP + +=cut + diff --git a/Fila-Web/lib/Fila/Web/Controller/CB/Gerente.pm b/Fila-Web/lib/Fila/Web/Controller/CB/Gerente.pm new file mode 100644 index 0000000..bfc2916 --- /dev/null +++ b/Fila-Web/lib/Fila/Web/Controller/CB/Gerente.pm @@ -0,0 +1,170 @@ +package Fila::Web::Controller::CB::Gerente; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Controller'; + +#recebe os eventos do navegador e os redireciona para filawebapp. + +sub enviar_chat : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + my $texto = $c->req->param('txtTexto'); + + my $req = $c->model('SOAP::Gerente')->enviar_chat + ({ callback_request => + { param => + [ { name => $c->req->param('select_chat'), + value => $texto } ]}}); + +} + +sub encerrar_atendimento : Local { + my ($self, $c, $id) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + + my $req = $c->model('SOAP::Gerente')->encerrar_atendimento + ({ callback_request => + { param => + [ { name => 'id_atendimento', + value => $id } ]}}); + +} + +sub devolver_senha : Local { + my ($self, $c, $id) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + my $req = $c->model('SOAP::Gerente')->devolver_senha + ({ callback_request => + { param => + [ { name => 'id_guiche', + value => $id } ]}}); + +} + + +sub fechar_guiche : Local { + my ($self, $c, $id) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + + my $req = $c->model('SOAP::Gerente')->fechar_guiche + ({ callback_request => + { param => + [ { name => 'id_guiche', + value => $id } ]}}); + +} + +sub concluir_atendimento : Local { + my ($self, $c, $id) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + + my $req = $c->model('SOAP::Gerente')->concluir_atendimento + ({ callback_request => + { param => + [ { name => 'id_guiche', + value => $id } ]}}); + +} + +sub pular_opiniometro : Local { + my ($self, $c, $valor,$id) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + + my $req = $c->model('SOAP::Gerente')->pular_opiniometro + ({ callback_request => + { param => + [ { name => $id, + value => $valor } ]}}); + +} + +sub listar_encaminhamentos : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + my $req = $c->model('SOAP::Gerente')->listar_encaminhamentos + ({ callback_request => + { param => + [ { name => '', + value => '' } ]}}); + +} +#minha modificação +sub associar_gerente : Local{ + my ($self, $c, $id) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + my $req = $c->model('SOAP::Gerente')->associar_gerente + ({ callback_request => + { param => + [ { name => 'id_funcionario', + value => $id } ]}}); + +} + +sub passar_gerencia : Local{ + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + my $req = $c->model('SOAP::Gerente')->passar_gerencia + ({ callback_request => + { param => + [ { name => '', + value => '' } ]}}); + +} + +1; +__END__ + +=head1 NAME + +Gerente - Callbacks para o gerente + +=head1 DESCRIPTION + +As requisições http são traduzidas para mensagens SOAP+XMPP + +=cut + diff --git a/Fila-Web/lib/Fila/Web/Controller/CB/Guiche.pm b/Fila-Web/lib/Fila/Web/Controller/CB/Guiche.pm new file mode 100644 index 0000000..067e0fd --- /dev/null +++ b/Fila-Web/lib/Fila/Web/Controller/CB/Guiche.pm @@ -0,0 +1,52 @@ +package Fila::Web::Controller::CB::Guiche; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Controller'; + +#recebe os eventos do navegador e os redireciona para filawebapp. + +sub abrir : Local { + my ($self, $c, $id_guiche) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/guiche']); + + my $req = $c->model('SOAP::Guiche')->abrir_guiche + ({ callback_request => + { param => + [ { name => 'id_guiche', + value => $id_guiche } ]}}); + +} + +1; + +__END__ + +=head1 NAME + +Guiche - Callback para a abertura do guiche + +=head1 DESCRIPTION + +Traduz a requisição http para requisição SOAP+XMPP + +=cut + diff --git a/Fila-Web/lib/Fila/Web/Controller/CB/Local.pm b/Fila-Web/lib/Fila/Web/Controller/CB/Local.pm new file mode 100644 index 0000000..6f42c6e --- /dev/null +++ b/Fila-Web/lib/Fila/Web/Controller/CB/Local.pm @@ -0,0 +1,110 @@ +package Fila::Web::Controller::CB::Local; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Controller'; + +#recebe os eventos do navegador e os redireciona para filawebapp. + +sub abrir : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + my $req = $c->model('SOAP::Gerente')->abrir_local + ({ callback_request => + { param => + [ map {( name => $_, + value => $c->req->param($_) )} + keys %{$c->req->params} ]}}); +} + +sub fechar : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + my $req = $c->model('SOAP::Gerente')->fechar_local + ({ callback_request => + { param => + [ map {( name => $_, + value => $c->req->param($_) )} + keys %{$c->req->params} ]}}); +} + +sub fechar_local_force : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + my $req = $c->model('SOAP::Gerente')->fechar_local_force + ({ callback_request => + { param => + [ map {( name => $_, + value => $c->req->param($_) )} + keys %{$c->req->params} ]}}); +} + + +sub encerrar_senhas : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + my $req = $c->model('SOAP::Gerente')->encerrar_senhas + ({ callback_request => + { param => + [ map {( name => $_, + value => $c->req->param($_) )} + keys %{$c->req->params} ]}}); +} + +sub fechar_todos : Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/gerente']); + + my $req = $c->model('SOAP::Gerente')->fechar_todos + ({ callback_request => + { param => + [ { name => '', + value => '' } ]}}); + + +} + +1; + +__END__ + +=head1 NAME + +Local - Callbacks para o gerente + +=head1 DESCRIPTION + +As requisições http são traduzidas para mensagens SOAP+XMPP + +=cut + diff --git a/Fila-Web/lib/Fila/Web/Controller/Emissor.pm b/Fila-Web/lib/Fila/Web/Controller/Emissor.pm new file mode 100644 index 0000000..fff4ba6 --- /dev/null +++ b/Fila-Web/lib/Fila/Web/Controller/Emissor.pm @@ -0,0 +1,61 @@ +package Fila::Web::Controller::Emissor; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use Digest::MD5; +use base 'Catalyst::Controller'; + +sub solicitar_senha : Local { + my ($self, $c, $id_categoria) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/emissor']); + my $req = $c->model('SOAP::Emissor')->solicitar_senha + ({ callback_request => + { param => + [ { name => 'id_categoria', + value => $id_categoria } ] } } ); + + + +} + +sub sair: Local { + my ($self, $c) = @_; + + $c->model('SOAP')->transport + ->addrs([$c->session->{user_jid}.'/cb/emissor']); + my $req = $c->model('SOAP::Emissor')->sair + ({ callback_request => { }}); +} + +1; + +__END__ + +=head1 NAME + +Emissor - Callbacks para o emissor de senha manual + +=head1 DESCRIPTION + +Traduz requisições HTTP em requisições SOAP+XMPP + +=cut + diff --git a/Fila-Web/lib/Fila/Web/Controller/Root.pm b/Fila-Web/lib/Fila/Web/Controller/Root.pm new file mode 100644 index 0000000..30b1099 --- /dev/null +++ b/Fila-Web/lib/Fila/Web/Controller/Root.pm @@ -0,0 +1,88 @@ +package Fila::Web::Controller::Root; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use Digest::MD5; +use base 'Catalyst::Controller'; + +__PACKAGE__->config->{namespace} = ''; + +sub index : Private { + my ($self, $c) = @_; + $c->session->{user_jid} = ''; + $c->forward($c->view); +} + +sub emissor : Local { + my ($self, $c) = @_; + $c->session->{user_jid} = ''; + $c->forward($c->view); +} + +sub authenticated : Local { + my ($self, $c) = @_; + + my $jid = $c->req->param('user_jid'); + my $s = $c->req->param('s'); + + if (Digest::MD5::md5_hex($jid.'senha de controle interno do sistema') + eq $s) { + $c->session->{user_jid} = $c->req->param('user_jid'); + $c->res->body(''); + } else { + $c->res->status(404); + $c->res->body('Usuario invalido'); + } +} + +sub solicitar_senha : Local { + my ($self, $c, $id_categoria) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/senha']); + my $atendimento = $c->model('SOAP::Gestao::Senha')->solicitar_senha( + { atendimento => { + id_categoria => $id_categoria + } + } + ); + + $c->stash->{atendimento} = $atendimento; + + $c->forward('/render/emissor.tt'); +} + +sub end : Private { + $::connection->drain() if $::connection; +} + + +1; + +__END__ + +=head1 NAME + +Root - Características gerais da aplicação + +=head1 DESCRIPTION + +Esse módulo implementa algumas ações gerais para a aplicação de callback. + +=cut + diff --git a/Fila-Web/lib/Fila/Web/Model/SOAP.pm b/Fila-Web/lib/Fila/Web/Model/SOAP.pm new file mode 100644 index 0000000..94f0cac --- /dev/null +++ b/Fila-Web/lib/Fila/Web/Model/SOAP.pm @@ -0,0 +1,48 @@ +package Fila::Web::Model::SOAP; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use XML::CompileX::Transport::SOAPXMPP; +use base 'Catalyst::Model::SOAP'; + +__PACKAGE__->config->{transport} = XML::CompileX::Transport::SOAPXMPP->new(); + +__PACKAGE__->register_wsdl + ({ wsdl => Fila::Web->path_to('/schemas/FilaWeb.wsdl') }, + { FilaWebGerenteCallback => 'Gerente', + FilaWebAtendenteCallback => 'Atendente', + FilaWebGuicheCallback => 'Guiche', + FilaWebEmissorCallback => 'Emissor' }); + +1; + +__END__ + +=head1 NAME + +SOAP - Implementa o acesso de callback para o WebApp + +=head1 DESCRIPTION + +O Fila::Web recebe as requisições http dos links que são renderizados +pelo WebApp. Todas essas requisições devem ser encaminhadas via +SOAP+XMPP para o usuário efetivo da sessão. + +=cut + diff --git a/Fila-Web/lib/Fila/Web/View/TT.pm b/Fila-Web/lib/Fila/Web/View/TT.pm new file mode 100644 index 0000000..9aba5c0 --- /dev/null +++ b/Fila-Web/lib/Fila/Web/View/TT.pm @@ -0,0 +1,39 @@ +package Fila::Web::View::TT; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use base 'Catalyst::View::TT'; + +__PACKAGE__->config( + +TEMPLATE_EXTENSION => '.tt', +DEFAULT_ENCODING => 'utf-8', + +); + +=head1 NAME + +Fila::Web::View::TT - TT View for Fila::Web + +=head1 DESCRIPTION + +TT View for Fila::Web. + +=cut + +1; diff --git a/Fila-Web/lib/Fila/WebApp.pm b/Fila-Web/lib/Fila/WebApp.pm new file mode 100644 index 0000000..e179ab8 --- /dev/null +++ b/Fila-Web/lib/Fila/WebApp.pm @@ -0,0 +1,49 @@ +package Fila::WebApp; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; + +use Catalyst::Runtime '5.70'; + +use Catalyst qw/Unicode ConfigLoader Static::Simple Prototype/; + +our $VERSION = '0.01'; + +__PACKAGE__->config( name => 'Fila::WebApp' ); + +{ + local %ENV; + $ENV{CATALYST_ENGINE} = 'XMPP2'; + __PACKAGE__->setup; +}; + + +__END__ + +=head1 NAME + +WebApp - Aplicação nph + +=head1 DESCRIPTION + +Essa é a aplicação responsável por enviar informações para o navegador +e receber informações pelo XMPP. + +=cut + diff --git a/Fila-Web/lib/Fila/WebApp/Controller/CB/Atendente.pm b/Fila-Web/lib/Fila/WebApp/Controller/CB/Atendente.pm new file mode 100644 index 0000000..9040411 --- /dev/null +++ b/Fila-Web/lib/Fila/WebApp/Controller/CB/Atendente.pm @@ -0,0 +1,365 @@ +package Fila::WebApp::Controller::CB::Atendente; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use Encode; +use base 'Catalyst::Controller::SOAP'; + +__PACKAGE__->config->{wsdl} = + {wsdl => Fila::WebApp->path_to('schemas/FilaWeb.wsdl')}; + +sub registrar_no_show : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $registrar_no_show = $c->model('SOAP::Gestao::Atendente') + ->registrar_no_show({ atendimento => {} }); + +} + +sub listar_no_show : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $lista_no_show = $c->model('SOAP::Gestao::Atendente') + ->listar_no_show({ atendimento => {} }); + + if ($lista_no_show->{Fault}) { + $c->stash->{error_message} = $lista_no_show->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + } + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + $c->stash->{status_guiche} = $c->model('SOAP::Gestao::Atendente') + ->status_guiche({ guiche => {} }); + + $c->stash->{lista_no_show} = $lista_no_show; + + $c->stash->{template} = 'cb/atendente/refresh.tt'; + $c->forward($c->view()); +} + +sub listar_guiches_encaminhar : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/guiche']); + my $lista_guiches = $c->model('SOAP::Gestao::Guiche') + ->listar_guiches({ local => {} }); + + if ($lista_guiches->{Fault}) { + $c->stash->{error_message} = $lista_guiches->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + } + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + $c->stash->{status_guiche} = $c->model('SOAP::Gestao::Atendente') + ->status_guiche({ guiche => {} }); + + $c->stash->{lista_guiches_encaminhar} = $lista_guiches; + + $c->stash->{template} = 'cb/atendente/refresh.tt'; + $c->forward($c->view()); + +} + +sub encaminhar_atendimento : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c,$query) = @_; + + my $id_guiche = $query->{callback_request}{param}[0]{value}; + my $motivo = $query->{callback_request}{param}[0]{name}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $encaminhar_atendimento = $c->model('SOAP::Gestao::Atendente') + ->encaminhar_atendimento({ guiche => { id_guiche => $id_guiche, pausa_motivo => $motivo } }); +} + +sub atender_no_show : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c,$query) = @_; + + my %params = map { $_->{name} => $_->{value} } @{$query->{callback_request}{param}}; + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $iniciar_atendimento = $c->model('SOAP::Gestao::Atendente') + ->atender_no_show({ atendimento => \%params }); +} + +sub fechar_guiche : WSDLPort('FilaWebAtendenteCallback') { + + #fechar_guiche irá disparar o mesmo evento no motor do sistema. + + my ($self, $c, $query) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $fechar_guiche = $c->model('SOAP::Gestao::Atendente') + ->fechar_guiche({ guiche => {} }); + +} + +sub devolver_senha : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $iniciar_atendimento = $c->model('SOAP::Gestao::Atendente') + ->devolver_senha({ atendimento => {} }); +} + +sub iniciar_atendimento : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $iniciar_atendimento = $c->model('SOAP::Gestao::Atendente') + ->iniciar_atendimento({ atendimento => {} }); +} + +sub concluir_atendimento : WSDLPort('FilaWebAtendenteCallback'){ + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $concluir_atendimento = $c->model('SOAP::Gestao::Atendente') + ->concluir_atendimento({ atendimento => {} }); +} + +sub disponivel : WSDLPort('FilaWebAtendenteCallback'){ + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $concluir_atendimento = $c->model('SOAP::Gestao::Atendente') + ->disponivel({ guiche => {} }); +} + +sub setar_motivo_pausa : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c, $query) = @_; + + my $motivo = $query->{callback_request}{param}[0]{value}; + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $setar_motivo_pausa = $c->model('SOAP::Gestao::Atendente') + ->setar_motivo_pausa({ guiche => { pausa_motivo => $motivo } }); + +} + +sub setar_info_interno : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c, $query) = @_; + + my $informacoes = $query->{callback_request}{param}[0]{value}; + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $setar_info_interno = $c->model('SOAP::Gestao::Atendente') + ->setar_info_interno({ servico => { informacoes => $informacoes } }); +} + +sub enviar_chat : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c, $query) = @_; + #Enviar agora como pacote XMPP2 + + #tem que procurar entre os funcionários quem eh gerente no momento, acho que essa busca deve ser feita no fila/web. + my $too = $query->{callback_request}{param}[0]{name}; + $too .= '/cb/gerente/receber_chat'; + #my $too = 'gerente@people.fila.vhost/cb/gerente/receber_chat'; + my $texto = $query->{callback_request}{param}[0]{value}; + + $c->stash->{texto} = $texto; + + $c->engine->send_message($c, $too, 'chat', + sub { + my $writer = shift; + $writer->startTag('Body'); + $writer->characters($texto); + $writer->endTag('Body'); + }); + $c->stash->{now} = DateTime->now(time_zone => 'local')->strftime('%H:%M'); + + $c->stash->{template} = 'cb/atendente/enviar_chat.tt'; + $c->forward($c->view()); +} + +sub receber_chat : Local { + my ($self, $c) = @_; + #Recebido pacote de chat do gerente + + my $texto = $c->req->body . ''; + $c->stash->{now} = DateTime->now(time_zone => 'local')->strftime('%H:%M'); + + return unless $texto =~ s/(^\|\<\/body\>$)//gi; + + $c->stash->{texto} = $texto; + $c->stash->{template} = 'cb/atendente/receber_chat.tt'; + $c->forward($c->view()); +} + +sub iniciar_pausa : WSDLPort('FilaWebAtendenteCallback') { + + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $iniciar_pausa = $c->model('SOAP::Gestao::Atendente') + ->iniciar_pausa({ guiche => {} }); + + +} + +sub iniciar_servico_interno : WSDLPort('FilaWebAtendenteCallback') { + + my ($self, $c, $query) = @_; + + my $id_servico = $query->{callback_request}{param}[0]{value}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $iniciar_servico_interno = $c->model('SOAP::Gestao::Atendente') + ->iniciar_servico_interno({ servico => { id_servico => $id_servico } }); + +} + +sub listar_servicos : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $listar_servicos = $c->model('SOAP::Gestao::Atendente') + ->listar_servicos({ servico => {} }); + + if ($listar_servicos->{Fault}) { + $c->stash->{error_message} = $listar_servicos->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + } + + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + $c->stash->{status_guiche} = $c->model('SOAP::Gestao::Atendente') + ->status_guiche({ guiche => {} }); + + $c->stash->{lista_servicos} = $listar_servicos; + + $c->stash->{template} = 'cb/atendente/refresh.tt'; + $c->forward($c->view()); + + +} + +sub listar_servicos_atendimento : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $listar_servicos_atendimento = $c->model('SOAP::Gestao::Atendente') + ->listar_servicos_atendimento({ servico => {} }); + + if ($listar_servicos_atendimento->{Fault}) { + $c->stash->{error_message} = $listar_servicos_atendimento->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + } + + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + $c->stash->{status_guiche} = $c->model('SOAP::Gestao::Atendente') + ->status_guiche({ guiche => {} }); + + $c->stash->{lista_servicos_atendimento} = $listar_servicos_atendimento; + + $c->stash->{template} = 'cb/atendente/refresh.tt'; + $c->forward($c->view()); + + +} + +sub fechar_servico_interno : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $fechar_servico_interno = $c->model('SOAP::Gestao::Atendente') + ->fechar_servico_interno({ servico => {} }); + +} + +sub iniciar_servico_atendimento : WSDLPort('FilaWebAtendenteCallback') { + + my ($self, $c, $query) = @_; + + my $id_servico = $query->{callback_request}{param}[0]{value}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $iniciar_servico_atendimento = $c->model('SOAP::Gestao::Atendente') + ->iniciar_servico_atendimento({ servico => { id_servico => $id_servico } }); + +} + +sub fechar_servico_atendimento : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c, $query) = @_; + + my $id_servico = $query->{callback_request}{param}[0]{value}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $fechar_servico_atendimento = $c->model('SOAP::Gestao::Atendente') + ->fechar_servico_atendimento({ servico => { id_servico => $id_servico } }); + +} +sub setar_info_atendimento : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c, $query) = @_; + + my $informacoes = $query->{callback_request}{param}[0]{value}; + my $servico = $query->{callback_request}{param}[0]{name}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $setar_info_atendimento = $c->model('SOAP::Gestao::Atendente') + ->setar_info_atendimento({ servico => { informacoes => $informacoes, id_servico => $servico } }); +} + +sub retornar_pausa : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $retornar_pausa = $c->model('SOAP::Gestao::Atendente') + ->retornar_pausa({ guiche => {} }); + +} + +sub mudar_senha : WSDLPort('FilaWebAtendenteCallback') { + my ($self, $c, $query) = @_; + + my $senhaatual = $query->{callback_request}{param}[0]{value}; + my $novasenha = $query->{callback_request}{param}[0]{name}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $mudar_senha = $c->model('SOAP::Gestao::Atendente') + ->mudar_senha({ guiche => { senha => $senhaatual, estado => $novasenha } }); + + if ($mudar_senha->{guiche}{senha} eq 'Senha alterada com sucesso') { + $c->stash->{error_message} = $mudar_senha->{guiche}{senha}; + #reload no atendente + return $c->forward('/render/aviso'); + } else { + $c->stash->{error_message} = $mudar_senha->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + } + + +} + + +1; + +__END__ + +=head1 NAME + +Atendente - Lógica de interface do atendente + +=head1 DESCRIPTION + +Esse é o módulo que recebe os callbacks de acordo com a interação +tanto com o usuário quanto com os outros componentes do sistema no +contexto do atendente. + +=cut + diff --git a/Fila-Web/lib/Fila/WebApp/Controller/CB/Emissor.pm b/Fila-Web/lib/Fila/WebApp/Controller/CB/Emissor.pm new file mode 100644 index 0000000..6879180 --- /dev/null +++ b/Fila-Web/lib/Fila/WebApp/Controller/CB/Emissor.pm @@ -0,0 +1,79 @@ +package Fila::WebApp::Controller::CB::Emissor; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use Encode; +use base 'Catalyst::Controller::SOAP'; +use DateTime::Format::XSD; + +__PACKAGE__->config->{wsdl} = + {wsdl => Fila::WebApp->path_to('schemas/FilaWeb.wsdl')}; + +sub solicitar_senha : WSDLPort('FilaWebEmissorCallback') { + my ($self, $c, $query) = @_; + + my $id_categoria = $query->{callback_request}{param}[0]{value}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/senha']); + my $atendimento = $c->model('SOAP::Gestao::Senha')->solicitar_senha({ + atendimento => { + id_categoria => $id_categoria + } + } + ); + + if ($atendimento) { + my $senha = $atendimento->{atendimento}{senha}; + $c->stash->{senha} = $senha; + + my $vt_ini = (DateTime::Format::XSD->parse_datetime + ($atendimento->{atendimento}{vt_ini})->strftime('%d/%m/%Y %H:%M')); + + $c->stash->{vt_ini} = $vt_ini; + my $id_atendimento = $atendimento->{atendimento}{id_atendimento}; + $c->stash->{id_atendimento} = $id_atendimento; + $c->stash->{template} = 'render/emissor/receber_senha.tt'; + $c->forward($c->view()); + + } else { + $c->stash->{error_message} = $atendimento->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + } +} +sub sair: WSDLPort('FilaWebEmissorCallback') { + my ($self, $c, $query) = @_; + $::connection->disconnect(); +} + + +1; + +__END__ + +=head1 NAME + +Emissor - Emissão manual de senhas + +=head1 DESCRIPTION + +Esse é o controller que implementa a emissão de senhas manual, +comportando-se como o módulo emissor de senhas. + +=cut + diff --git a/Fila-Web/lib/Fila/WebApp/Controller/CB/Gerente.pm b/Fila-Web/lib/Fila/WebApp/Controller/CB/Gerente.pm new file mode 100644 index 0000000..c950aed --- /dev/null +++ b/Fila-Web/lib/Fila/WebApp/Controller/CB/Gerente.pm @@ -0,0 +1,307 @@ +package Fila::WebApp::Controller::CB::Gerente; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use Encode; +use DateTime; +use Net::XMPP2::Util 'bare_jid'; +use base 'Catalyst::Controller::SOAP'; + +__PACKAGE__->config->{wsdl} = + {wsdl => Fila::WebApp->path_to('schemas/FilaWeb.wsdl')}; + +sub abrir_local : WSDLPort('FilaWebGerenteCallback') { + my ($self, $c, $query) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $dados_local = $c->model('SOAP::Gestao::Local') + ->abrir_local({ local => {} }); + +} + +sub fechar_local : WSDLPort('FilaWebGerenteCallback') { + my ($self, $c, $query) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $fechar_local = $c->model('SOAP::Gestao::Local') + ->fechar_local({ local => {} }); +} + +sub fechar_local_force : WSDLPort('FilaWebGerenteCallback') { + my ($self, $c, $query) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $fechar_local = $c->model('SOAP::Gestao::Local') + ->fechar_local_force({ local => {} }); +} + + +sub encerrar_senhas :WSDLPort('FilaWebGerenteCallback') { + my ($self, $c, $query) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $encerrar_senhas = $c->model('SOAP::Gestao::Local') + ->encerrar_senhas({ local => {} }); +} + +sub enviar_chat :WSDLPort('FilaWebGerenteCallback') { + my ($self, $c, $query) = @_; + + #Enviar agora como pacote XMPP2 + + my $too = $query->{callback_request}{param}[0]{name}; + my $texto = $query->{callback_request}{param}[0]{value}; + $c->stash->{now} = DateTime->now(time_zone => 'local')->strftime('%H:%M'); + + #checar se é para envio de broadcast + if ($too eq 'TODOS') { + #enviar para todos os destinatarios. + #buscar no motor todos os usuarios ativos + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $status_guiches = $c->model('SOAP::Gestao::Local')->status_guiches + ({ local => {} }); + + my $guiche; + if ($status_guiches) { + #loop passando por todos os guiches + #while (my $guiche = $status_guiches->{lista_guiches}{guiche}->next) { + foreach $guiche (@{$status_guiches->{lista_guiches}{guiche}}) { + if ($guiche->{estado} ne 'fechado') { + $too = $guiche->{jid}; + $too = $too . "/cb/atendente/receber_chat"; + $c->stash->{texto} = $texto; + $c->engine->send_message($c, $too, 'chat', + sub { + my $writer = shift; + $writer->startTag('Body'); + $writer->characters($texto); + $writer->endTag('Body'); + }); + } + } + $c->stash->{nome} = 'todos'; + } + + } else { + $too = $too . "/cb/atendente/receber_chat"; + $c->stash->{texto} = $texto; + $c->engine->send_message($c, $too, 'chat', + sub { + my $writer = shift; + $writer->startTag('Body'); + $writer->characters($texto); + $writer->endTag('Body'); + }); + + #busca no motor pela funcao dados_funcionario para retornar o nome do funcionario + #enviando o jid como parametro da consulta. + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $dados_funcionario = $c->model('SOAP::Gestao::Local')->dados_funcionario + ({ funcionario => { jid => bare_jid $too } }); + + + if ($dados_funcionario->{Fault}) { + $c->stash->{error_message} = $dados_funcionario->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + } else { + $c->stash->{nome} = $dados_funcionario->{funcionario}{nome}; + } + } + + $c->stash->{template} = 'cb/gerente/enviar_chat.tt'; + $c->forward($c->view()); +} + +sub receber_chat :Local { + my ($self, $c) = @_; + #Recebido pacote de chat dos atendentes + + my $from = $c->req->header('XMPP_Stanza_from'); + $from = bare_jid $from; + my $texto = $c->req->body; + + #remove a tag que é contida dentro do envelope SOAP. + return unless $texto =~ s/(^\|\<\/body\>$)//gi; + + + $c->stash->{now} = DateTime->now(time_zone => 'local')->strftime('%H:%M'); + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $dados_funcionario = $c->model('SOAP::Gestao::Local')->dados_funcionario + ({ funcionario => { jid => $from } }); + + if ($dados_funcionario->{Fault}) { + $c->stash->{error_message} = $dados_funcionario->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + } else { + $c->stash->{nome} = $dados_funcionario->{funcionario}{nome}; + } + + $c->stash->{texto} = $texto; + $c->stash->{remetente} = $from; + $c->stash->{template} = 'cb/gerente/receber_chat.tt'; + $c->forward($c->view()); +} + +sub encerrar_atendimento :WSDLPort('FilaWebGerenteCallback') { + my ($self, $c, $query) = @_; + + my %params = map { $_->{name} => $_->{value} } + @{$query->{callback_request}{param}}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + $c->model('SOAP::Gestao::Local')->encerrar_atendimento + ({ atendimento => { %params } }); + +} + +sub devolver_senha :WSDLPort('FilaWebGerenteCallback') { + my ($self, $c, $query) = @_; + + my %params = map { $_->{name} => $_->{value} } + @{$query->{callback_request}{param}}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + $c->model('SOAP::Gestao::Local')->devolver_senha + ({ guiche => { %params } }); + +} + +sub fechar_guiche :WSDLPort('FilaWebGerenteCallback') { + my ($self, $c, $query) = @_; + + #pegando id do guiche pelo parametro do callback_request passado pelo filaweb + my ($id_guiche) = map { $_->{value} } + grep { $_->{name} eq 'id_guiche' } + @{$query->{callback_request}{param}}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $fechar_guiche = $c->model('SOAP::Gestao::Local') + ->fechar_guiche({ guiche => { id_guiche => $id_guiche } }); +} + +sub fechar_todos :WSDLPort('FilaWebGerenteCallback') { + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $fechar_todos = $c->model('SOAP::Gestao::Local') + ->fechar_todos({ guiche => {} }); +} + +sub concluir_atendimento :WSDLPort('FilaWebGerenteCallback') { + my ($self, $c, $query) = @_; + + #pegando id do guiche pelo parametro do callback_request passado pelo filaweb + my ($id_guiche) = map { $_->{value} } + grep { $_->{name} eq 'id_guiche' } + @{$query->{callback_request}{param}}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $fechar_guiche = $c->model('SOAP::Gestao::Local') + ->concluir_atendimento({ guiche => { id_guiche => $id_guiche } }); + +} + +sub pular_opiniometro :WSDLPort('FilaWebGerenteCallback') { + my ($self, $c, $query) = @_; + + #pegando id do guiche pelo parametro do callback_request passado pelo filaweb + my $id_guiche = $query->{callback_request}{param}[0]{name}; + my $valor = $query->{callback_request}{param}[0]{value}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $pular_opiniometro = $c->model('SOAP::Gestao::Local') + ->pular_opiniometro({ + guiche => { + id_guiche => $id_guiche , + pular_opiniometro => $valor + } + }); + +} + +sub listar_encaminhamentos :WSDLPort('FilaWebGerenteCallback') { + my ($self, $c, $query) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $listar_encaminhamentos = $c->model('SOAP::Gestao::Local') + ->listar_encaminhamentos({ encaminhamento => {} }); + + +} + +#minha modificação +sub associar_gerente :WSDLPort('FilaWebGerenteCallback') { + my ($self, $c, $query) = @_; + + #pegando id do funcionario pelo parametro do callback_request passado pelo filaweb + my ($id_funcionario) = map { $_->{value} } + grep { $_->{name} eq 'id_funcionario' } + @{$query->{callback_request}{param}}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $dados_funcionario = $c->model('SOAP::Gestao::Local') + ->associar_gerente({ funcionario => { id_funcionario => $id_funcionario } }); + + if ($dados_funcionario->{Fault}) { + $c->stash->{error_message} = $dados_funcionario->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + } else { + $::connection->disconnect(); + } + +} + +sub passar_gerencia :WSDLPort('FilaWebGerenteCallback') { + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $lista_funcionarios = $c->model('SOAP::Gestao::Local') + ->listar_funcionarios({ lista_funcionarios => {} }); + + warn $lista_funcionarios; + + if ($lista_funcionarios->{Fault}) { + $c->stash->{error_message} = $lista_funcionarios->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + } + + $c->stash->{lista_funcionarios} = $lista_funcionarios->{lista_funcionarios}; + + $c->stash->{template} = 'cb/gerente/passar_gerencia.tt'; + $c->forward($c->view()); + +} + +1; + +__END__ + +=head1 NAME + +Gerente - Lógica de interface do gerente + +=head1 DESCRIPTION + +Esse é o módulo que recebe os callbacks de acordo com a interação +tanto com o usuário quanto com os outros componentes do sistema no +contexto do gerente. + +=cut + diff --git a/Fila-Web/lib/Fila/WebApp/Controller/CB/Guiche.pm b/Fila-Web/lib/Fila/WebApp/Controller/CB/Guiche.pm new file mode 100644 index 0000000..f39f250 --- /dev/null +++ b/Fila-Web/lib/Fila/WebApp/Controller/CB/Guiche.pm @@ -0,0 +1,71 @@ +package Fila::WebApp::Controller::CB::Guiche; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Controller::SOAP'; + +__PACKAGE__->config->{wsdl} = + {wsdl => Fila::WebApp->path_to('schemas/FilaWeb.wsdl')}; + + +sub abrir_guiche : WSDLPort('FilaWebGuicheCallback') { + my ($self, $c, $query) = @_; + + my %params = map { $_->{name} => $_->{value} } + @{$query->{callback_request}{param}}; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/guiche']); + $c->model('SOAP::Gestao::Guiche') + ->abrir_guiche({ guiche => \%params }); + + $c->forward('/render/atendente'); + $c->forward($c->view()); +} + +sub abrir_user_guiche : Private { + my ($self, $c, $query) = @_; + + my %params = (identificador => $::user_guiche); + $::user_guiche = undef; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/guiche']); + $c->model('SOAP::Gestao::Guiche') + ->abrir_guiche({ guiche => \%params }); + + $c->forward('/render/atendente'); + $c->forward($c->view()); +} + + +1; + +__END__ + +=head1 NAME + +Guichê - Lógica de interface do guiche + +=head1 DESCRIPTION + +Este módulo possibilita a listagem inicial de guichês para que o +usuário possa escolher um guichê para abrir, bem como o processamento +dessa solicitação. + +=cut + diff --git a/Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Atendente.pm b/Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Atendente.pm new file mode 100644 index 0000000..8552f73 --- /dev/null +++ b/Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Atendente.pm @@ -0,0 +1,57 @@ +package Fila::WebApp::Controller::CB::Render::Atendente; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Controller::SOAP'; + +__PACKAGE__->config->{wsdl} = + { wsdl => Fila::WebApp->path_to('schemas/FilaWebApp.wsdl'), + schema => Fila::WebApp->path_to('schemas/fila-servico.xsd') }; + + +sub render_atendente :WSDLPort('render_atendente') { + my ($self, $c, $dados) = @_; + + $c->stash->{status_guiche} = $dados; + + if ($dados->{guiche}{estado} eq 'fechado') { + $c->stash->{template} = 'cb/atendente/fechar_guiche.tt'; + $c->forward($c->view()); + $::connection->disconnect(); + } else { + $c->stash->{template} = 'cb/atendente/refresh.tt'; + $c->forward($c->view()); + } +} + + +1; + +__END__ + +=head1 NAME + +Atendente - Renderização da tela de atendente + +=head1 DESCRIPTION + +Esse é o módulo responsável pela renderização inicial da tela de atendente. + +=cut + diff --git a/Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Error.pm b/Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Error.pm new file mode 100644 index 0000000..cf2e8a6 --- /dev/null +++ b/Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Error.pm @@ -0,0 +1,54 @@ +package Fila::WebApp::Controller::CB::Render::Error; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use XML::Compile::SOAP; +use base 'Catalyst::Controller::SOAP'; + +__PACKAGE__->config->{wsdl} = + { wsdl => Fila::WebApp->path_to('schemas/FilaWebApp.wsdl'), + schema => + [ Fila::WebApp->path_to('schemas/fila-servico.xsd'), + Fila::WebApp->path_to('schemas/soap-envelope.xsd') ]}; + + +sub render_error :WSDLPort('render_error') { + my ($self, $c, $dados) = @_; + + $c->stash->{error_message} = $dados->{Fault}{faultstring}; + $c->stash->{template} = 'render/error_message.tt'; + $c->forward($c->view()); +} + + +1; + +__END__ + +=head1 NAME + +Error - Renderiza pop-up de erro + +=head1 DESCRIPTION + +Esse módulo implementa a renderização de um popup de erro na tela do +usuário quando algum erro acontece. + +=cut + diff --git a/Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Gerente.pm b/Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Gerente.pm new file mode 100644 index 0000000..94120f1 --- /dev/null +++ b/Fila-Web/lib/Fila/WebApp/Controller/CB/Render/Gerente.pm @@ -0,0 +1,52 @@ +package Fila::WebApp::Controller::CB::Render::Gerente; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use base 'Catalyst::Controller::SOAP'; + +__PACKAGE__->config->{wsdl} = + { wsdl => Fila::WebApp->path_to('schemas/FilaWebApp.wsdl'), + schema => Fila::WebApp->path_to('schemas/fila-servico.xsd') }; + + +sub render_gerente :WSDLPort('render_gerente') { + my ($self, $c, $dados) = @_; + + $c->stash->{status_guiches} = $dados; + $c->stash->{status_local} = $dados; + $c->stash->{lista_encaminhamentos} = $dados; + $c->stash->{template} = 'render/refresh_guiches.tt'; + $c->forward($c->view()); +} + +1; + +__END__ + +=head1 NAME + +Gerente - Renderização da tela de Gerente + +=head1 DESCRIPTION + +Esse módulo é responsável pela renderização inicial da tela de +gerente. + +=cut + diff --git a/Fila-Web/lib/Fila/WebApp/Controller/Render.pm b/Fila-Web/lib/Fila/WebApp/Controller/Render.pm new file mode 100644 index 0000000..a208307 --- /dev/null +++ b/Fila-Web/lib/Fila/WebApp/Controller/Render.pm @@ -0,0 +1,285 @@ +package Fila::WebApp::Controller::Render; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use Digest::MD5; +use EV; +use base 'Catalyst::Controller'; + +# usamos o Regex dispatch para não gerar um endpoint +# no XMPP. +sub base : Regex('^render/base$') {} +sub error : Regex('^render/error$') { + my ($self, $c) = @_; + $c->stash->{template} = 'render/error_message.tt'; + $c->forward($c->view()); +} + +sub disconnected : Regex('^render/disconnected$') { + my ($self, $c) = @_; + $c->stash->{template} = 'render/disconnected.tt'; + #$c->forward($c->view()); + $c->view()->process($c); + +} +sub error_message : Private { + my ($self, $c) = @_; + $c->stash->{template} = 'render/error_message.tt'; + $c->forward($c->view()); +} + +sub fechar : Private { + my ($self, $c) = @_; + $c->stash->{template} = 'render/fechar.tt'; + $c->forward($c->view()); +} + +sub aviso : Private { + my ($self, $c) = @_; + $c->stash->{template} = 'render/aviso.tt'; + $c->forward($c->view()); +} + +sub escolher_guiche : Private { + + #escolher_guiche renderiza uma página que lista os guichês disponíveis + #para serem abertos pelo atendente. + + my ($self, $c) = @_; + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/guiche']); + my $lista_guiches= $c->model('SOAP::Gestao::Guiche') + ->listar_guiches({ local => {} }); + + if ($lista_guiches->{Fault}) { + $c->forward('/render/error_message'); + EV::unloop(EV::UNLOOP_ALL); + } else { + $c->stash->{lista_guiches} = $lista_guiches; + $c->stash->{template} = 'render/escolher_guiche.tt'; + } + +} + +sub authenticated : Regex('^render/authenticated$') { + my ($self, $c) = @_; + + # desenhamos logo o template do authenticated... + $c->stash->{user_jid} = $::user_jid; + $c->stash->{'s'} = Digest::MD5::md5_hex($::user_jid.'senha de controle interno do sistema'); + $c->forward($c->view()); + + $c->model('SOAP')->transport->connection($::connection); + + my $mode = 'gerente'; + if ($::major_mode eq 'agents') { + $mode = 'emissor'; + return $c->forward('/render/'.$mode); + } + + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $dados_local = $c->model('SOAP::Gestao::Local') + ->dados_local({ local => {} }); + + if ($dados_local->{Fault} && + $dados_local->{Fault}{faultstring} =~ /Permissao Negada/) { + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/guiche']); + $dados_local = $c->model('SOAP::Gestao::Guiche') + ->dados_local({ local => {} }); + $mode = 'atendente'; + } elsif ($dados_local->{Fault}) { + $c->stash->{error_message} = $dados_local->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + } + + + if ($dados_local->{Fault} && + $dados_local->{Fault}{faultstring} =~ /Permissao Negada/) { + $c->stash->{error_message} = $dados_local->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + EV::unloop(EV::UNLOOP_ALL); + } elsif ($dados_local->{Fault}) { + $c->stash->{error_message} = $dados_local->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + } else { + $c->stash->{dados_local} = $dados_local; + $c->forward('/render/'.$mode); + } + + +} + +sub emissor : Private { + my ($self, $c) = @_; + + $c->stash->{template} = 'render/emissor.tt'; + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/senha']); + my $dados_local = $c->model('SOAP::Gestao::Senha') + ->dados_local({ local => {} }); + + if ($dados_local->{Fault} && + $dados_local->{Fault}{faultstring} =~ /Permissao Negada/) { + $c->stash->{status_local} = 'Local está fechado. Vai esperar uma notificacao.'; + } elsif ($dados_local->{Fault}) { + $c->stash->{status_local} = 'Erro ao obter os dados do local: '.$dados_local->{Fault}{faultstring}; + } else { + $c->stash->{status_local} = 'Abrindo para senhas'; + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/senha']); + my $categorias = $c->model('SOAP::Gestao::Senha')->listar_categorias({ local => {} }); + if ($categorias->{Fault}) { + $c->stash->{error_message} = $categorias->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + } else { + $c->stash->{categorias} = $categorias; + $c->forward('/render/emissor.tt'); + } + } +} + +sub atendente : Private { + my ($self, $c) = @_; + + $c->stash->{template} = 'render/atendente.tt'; + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/atendente']); + my $status_guiche = $c->model('SOAP::Gestao::Atendente') + ->status_guiche({ guiche => {} }); + + if ($status_guiche->{Fault} && + $status_guiche->{Fault}{faultstring} =~ /Permissao Negada/) { + if ($::user_guiche) { + $c->forward('/cb/guiche/abrir_user_guiche'); + } else { + $c->forward('/render/escolher_guiche'); + } + } else { + $status_guiche->{guiche}{identificador} =~ s/\s+$//; + if ($::user_guiche && + $status_guiche->{guiche}{identificador} ne $::user_guiche) { + + $c->stash->{error_message} = 'ATENÇÃO: Você está associado à mesa '. + $status_guiche->{guiche}{identificador}.' mas está agora na mesa '. + $::user_guiche.'. Você precisa fechar a mesa e entrar novamente '. + 'no sistema para corrigir.'; + $c->forward('/render/error_message'); + + } + + $c->stash->{template} = 'render/atendente.tt'; + $c->stash->{status_guiche} = $status_guiche; + } + +} + +sub gerente : Private { + my ($self, $c) = @_; + #PEGANDO INFORMACOES SOBRE OS GUICHÊS + $c->stash->{template} = 'render/gerente.tt'; + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $status_guiches = $c->model('SOAP::Gestao::Local') + ->status_guiches({ local => {} }); + + if ($status_guiches->{Fault}) { + $c->stash->{error_message} = $status_guiches->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + EV::unloop(EV::UNLOOP_ALL); + } else { + $c->stash->{status_guiches} = $status_guiches; + } + + #PEGANDO INFORMACOES SOBRE DADOS_STATUS_LOCAL + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $status_local = $c->model('SOAP::Gestao::Local') + ->status_local({ local => {} }); + + if ($status_local->{Fault}) { + $c->stash->{error_message} = $status_local->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + EV::unloop(EV::UNLOOP_ALL); + } else { + $c->stash->{status_local} = $status_local; + } + + #PEGANDO INFORMACOES SOBRE encaminhamentos + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $lista_encaminhamentos = $c->model('SOAP::Gestao::Local') + ->listar_encaminhamentos({ encaminhamento => {} }); + + if ($lista_encaminhamentos->{Fault}) { + $c->stash->{error_message} = $lista_encaminhamentos->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + EV::unloop(EV::UNLOOP_ALL); + } else { + $c->stash->{lista_encaminhamentos} = $lista_encaminhamentos; + } + + use Data::Dumper; + warn Data::Dumper->Dump([ $c->stash ]); + +} + +sub refresh_guiches : Private { + + #refresh_guiches é utilizado para atualizar o status dos guiches + #na interface do gerente sem sobrescrever as informações já renderizadas na tela. + + my ($self, $c) = @_; + #PEGANDO INFORMACOES SOBRE OS GUICHÊS + $c->stash->{template} = 'render/refresh_guiches.tt'; + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $status_guiches = $c->model('SOAP::Gestao::Local') + ->status_guiches({ local => {} }); + + if ($status_guiches->{Fault}) { + $c->stash->{error_message} = $status_guiches->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + EV::unloop(EV::UNLOOP_ALL); + } else { + $c->stash->{status_guiches} = $status_guiches; + } + + #PEGANDO INFORMACOES SOBRE encaminhamentos + $c->model('SOAP')->transport->addrs(['motor@gestao.fila.vhost/ws/gestao/local']); + my $lista_encaminhamentos = $c->model('SOAP::Gestao::Local') + ->listar_encaminhamentos({ encaminhamento => {} }); + + if ($lista_encaminhamentos->{Fault}) { + $c->stash->{error_message} = $lista_encaminhamentos->{Fault}{faultstring}; + return $c->forward('/render/error_message'); + EV::unloop(EV::UNLOOP_ALL); + } else { + $c->stash->{lista_encaminhamentos} = $lista_encaminhamentos; + } +} + + +1; + +__END__ + +=head1 NAME + +Render - Renderizações gerais + +=head1 DESCRIPTION + +Esse módulo é responsável por renderizações gerais no sistema. É ele +que coordena também a abertura inicial do sistema. + +=cut + diff --git a/Fila-Web/lib/Fila/WebApp/Controller/Root.pm b/Fila-Web/lib/Fila/WebApp/Controller/Root.pm new file mode 100644 index 0000000..f1c1634 --- /dev/null +++ b/Fila-Web/lib/Fila/WebApp/Controller/Root.pm @@ -0,0 +1,70 @@ +package Fila::WebApp::Controller::Root; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use DateTime::Format::XSD; +use base 'Catalyst::Controller'; + +__PACKAGE__->config->{namespace} = ''; + +sub auto : Private { + my ($self, $c) = @_; + $c->stash->{dtf} = DTFormatter->new; + return 0 if $c->req->header('XMPP_Stanza') && + $c->req->header('XMPP_Stanza') eq 'presence'; + return 1; +} + +sub end : Private { + my ($self, $c) = @_; + do { + $c->log->debug('No output being sent for action.'); + return 1; + } if $c->stash->{no_output}; + $c->forward($c->view()); +} + +{ package DTFormatter; + sub new { bless {}, 'DTFormatter' }; + sub f { + my ($self, $dt) = @_; + if ($dt && ref($dt)) { + return $dt->set_time_zone('local')->strftime("%H:%M:%S"); + } elsif ($dt) { + return DateTime::Format::XSD->parse_datetime($dt)->set_time_zone('local')->strftime("%H:%M:%S"); + } else { + return '' + } + + } +} +1; + +__END__ + +=head1 NAME + +Root - Controller raiz do WebApp + +=head1 DESCRIPTION + +Este controller define algumas características comuns a toda a aplicação. + +=cut + diff --git a/Fila-Web/lib/Fila/WebApp/Model/SOAP.pm b/Fila-Web/lib/Fila/WebApp/Model/SOAP.pm new file mode 100644 index 0000000..b50a420 --- /dev/null +++ b/Fila-Web/lib/Fila/WebApp/Model/SOAP.pm @@ -0,0 +1,49 @@ +package Fila::WebApp::Model::SOAP; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use warnings; +use XML::CompileX::Transport::SOAPXMPP; +use base 'Catalyst::Model::SOAP'; + + +__PACKAGE__->config->{transport} = XML::CompileX::Transport::SOAPXMPP->new(); + +__PACKAGE__->register_wsdl + ({ wsdl => Fila::WebApp->path_to('/schemas/FilaServico.wsdl'), + schema => Fila::WebApp->path_to('/schemas/fila-servico.xsd')}, + { GestaoLocal => 'Gestao::Local', + GestaoGuiche => 'Gestao::Guiche', + GestaoAtendente => 'Gestao::Atendente', + GestaoSenha => 'Gestao::Senha' }); + +1; + +__END__ + +=head1 NAME + +SOAP - Acesso ao Fila-Servico + +=head1 DESCRIPTION + +Esse é o módulo responsável por prover acesso à aplicação +Fila::Serviço. + +=cut + diff --git a/Fila-Web/lib/Fila/WebApp/View/NPH.pm b/Fila-Web/lib/Fila/WebApp/View/NPH.pm new file mode 100644 index 0000000..8f1edae --- /dev/null +++ b/Fila-Web/lib/Fila/WebApp/View/NPH.pm @@ -0,0 +1,67 @@ +package Fila::WebApp::View::NPH; +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +use strict; +use base 'Catalyst::View::TT'; + +__PACKAGE__->config(TEMPLATE_EXTENSION => '.tt', + DEFAULT_ENCODING => 'utf-8', + INCLUDE_PATH => [ Fila::WebApp->path_to('root') ]); + + +# Override desse método para renderizar o template para o STDOUT. +sub process { + my ( $self, $c ) = @_; + + my $template = $c->stash->{template} + || $c->action . $self->config->{TEMPLATE_EXTENSION}; + + unless (defined $template) { + $c->log->debug('No template specified for rendering') if $c->debug; + return 0; + } + + my $output = $self->render($c, $template); + + if (UNIVERSAL::isa($output, 'Template::Exception')) { + my $error = qq/Couldn't render template "$output"/; + $c->log->error($error); + return 0; + } + + print $output; + + return 1; +} + + +1; + +__END__ + +=head1 NAME + +NPH - Processamento diferenciado para NPH + +=head1 DESCRIPTION + +Essa classe view tem um processamento diferenciado para funcionar em +NPH, mas é, basicamente, uma subclasse do View::TT. + +=cut + diff --git a/Fila-Web/root/cb/atendente/encerrar_senhas.tt b/Fila-Web/root/cb/atendente/encerrar_senhas.tt new file mode 100644 index 0000000..764f10d --- /dev/null +++ b/Fila-Web/root/cb/atendente/encerrar_senhas.tt @@ -0,0 +1,19 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + diff --git a/Fila-Web/root/cb/atendente/enviar_chat.tt b/Fila-Web/root/cb/atendente/enviar_chat.tt new file mode 100644 index 0000000..6e79849 --- /dev/null +++ b/Fila-Web/root/cb/atendente/enviar_chat.tt @@ -0,0 +1,24 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + + diff --git a/Fila-Web/root/cb/atendente/fechar_guiche.tt b/Fila-Web/root/cb/atendente/fechar_guiche.tt new file mode 100644 index 0000000..b21eda6 --- /dev/null +++ b/Fila-Web/root/cb/atendente/fechar_guiche.tt @@ -0,0 +1,35 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[%# Template que desenha o modulo quando fechar guiche. %] + + diff --git a/Fila-Web/root/cb/atendente/mudar_senha.tt b/Fila-Web/root/cb/atendente/mudar_senha.tt new file mode 100644 index 0000000..100fbed --- /dev/null +++ b/Fila-Web/root/cb/atendente/mudar_senha.tt @@ -0,0 +1,25 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +[% mudar_senha %] + +Fechar + +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Web/root/cb/atendente/noshow.tt b/Fila-Web/root/cb/atendente/noshow.tt new file mode 100644 index 0000000..764f10d --- /dev/null +++ b/Fila-Web/root/cb/atendente/noshow.tt @@ -0,0 +1,19 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + diff --git a/Fila-Web/root/cb/atendente/receber_chat.tt b/Fila-Web/root/cb/atendente/receber_chat.tt new file mode 100644 index 0000000..973c89a --- /dev/null +++ b/Fila-Web/root/cb/atendente/receber_chat.tt @@ -0,0 +1,24 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + + diff --git a/Fila-Web/root/cb/atendente/refresh.tt b/Fila-Web/root/cb/atendente/refresh.tt new file mode 100644 index 0000000..eed840e --- /dev/null +++ b/Fila-Web/root/cb/atendente/refresh.tt @@ -0,0 +1,27 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[%# Atualiza informacoes do atendente %] + + diff --git a/Fila-Web/root/cb/gerente/abrir_local.tt b/Fila-Web/root/cb/gerente/abrir_local.tt new file mode 100644 index 0000000..d317bad --- /dev/null +++ b/Fila-Web/root/cb/gerente/abrir_local.tt @@ -0,0 +1,25 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + + + diff --git a/Fila-Web/root/cb/gerente/encerrar_senhas.tt b/Fila-Web/root/cb/gerente/encerrar_senhas.tt new file mode 100644 index 0000000..e88891b --- /dev/null +++ b/Fila-Web/root/cb/gerente/encerrar_senhas.tt @@ -0,0 +1,25 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + + + diff --git a/Fila-Web/root/cb/gerente/enviar_chat.tt b/Fila-Web/root/cb/gerente/enviar_chat.tt new file mode 100644 index 0000000..e34f30c --- /dev/null +++ b/Fila-Web/root/cb/gerente/enviar_chat.tt @@ -0,0 +1,24 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + + diff --git a/Fila-Web/root/cb/gerente/fechar_local.tt b/Fila-Web/root/cb/gerente/fechar_local.tt new file mode 100644 index 0000000..80a6655 --- /dev/null +++ b/Fila-Web/root/cb/gerente/fechar_local.tt @@ -0,0 +1,25 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + + + diff --git a/Fila-Web/root/cb/gerente/passar_gerencia.tt b/Fila-Web/root/cb/gerente/passar_gerencia.tt new file mode 100644 index 0000000..95cd912 --- /dev/null +++ b/Fila-Web/root/cb/gerente/passar_gerencia.tt @@ -0,0 +1,45 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[%# Template que desenha a janela do passar_gerencia %] + diff --git a/Fila-Web/root/cb/gerente/receber_chat.tt b/Fila-Web/root/cb/gerente/receber_chat.tt new file mode 100644 index 0000000..584f6f8 --- /dev/null +++ b/Fila-Web/root/cb/gerente/receber_chat.tt @@ -0,0 +1,24 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + + diff --git a/Fila-Web/root/emissor.tt b/Fila-Web/root/emissor.tt new file mode 100644 index 0000000..19a0f29 --- /dev/null +++ b/Fila-Web/root/emissor.tt @@ -0,0 +1,33 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
    + +
    +Entrar +

    +

    + +

    +
    + +
    + +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Web/root/favicon.ico b/Fila-Web/root/favicon.ico new file mode 100644 index 0000000..5ad723d Binary files /dev/null and b/Fila-Web/root/favicon.ico differ diff --git a/Fila-Web/root/footer.tt b/Fila-Web/root/footer.tt new file mode 100644 index 0000000..6925a07 --- /dev/null +++ b/Fila-Web/root/footer.tt @@ -0,0 +1,25 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +
    + + + + diff --git a/Fila-Web/root/header.tt b/Fila-Web/root/header.tt new file mode 100644 index 0000000..3b206c9 --- /dev/null +++ b/Fila-Web/root/header.tt @@ -0,0 +1,40 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + + + + Sistema de Atendimento + + + + +
    + +
    +
    diff --git a/Fila-Web/root/index.tt b/Fila-Web/root/index.tt new file mode 100644 index 0000000..3f78532 --- /dev/null +++ b/Fila-Web/root/index.tt @@ -0,0 +1,33 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + +
    + +
    +Entrar +

    +

    +

    +

    +
    + +
    + +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Web/root/render/atendente.tt b/Fila-Web/root/render/atendente.tt new file mode 100644 index 0000000..34c5663 --- /dev/null +++ b/Fila-Web/root/render/atendente.tt @@ -0,0 +1,179 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[%# Template que desenha o modulo do atendente. %] + + + + + + diff --git a/Fila-Web/root/render/authenticated.tt b/Fila-Web/root/render/authenticated.tt new file mode 100644 index 0000000..1dd153d --- /dev/null +++ b/Fila-Web/root/render/authenticated.tt @@ -0,0 +1,42 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + diff --git a/Fila-Web/root/render/aviso.tt b/Fila-Web/root/render/aviso.tt new file mode 100644 index 0000000..8dc2d8a --- /dev/null +++ b/Fila-Web/root/render/aviso.tt @@ -0,0 +1,21 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + diff --git a/Fila-Web/root/render/base.tt b/Fila-Web/root/render/base.tt new file mode 100644 index 0000000..87f57ec --- /dev/null +++ b/Fila-Web/root/render/base.tt @@ -0,0 +1,27 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[% INCLUDE 'header.tt' %] + + + + +[% INCLUDE 'footer.tt' %] diff --git a/Fila-Web/root/render/chat.tt b/Fila-Web/root/render/chat.tt new file mode 100644 index 0000000..34b81fc --- /dev/null +++ b/Fila-Web/root/render/chat.tt @@ -0,0 +1,28 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + diff --git a/Fila-Web/root/render/disconnected.tt b/Fila-Web/root/render/disconnected.tt new file mode 100644 index 0000000..ca40f8a --- /dev/null +++ b/Fila-Web/root/render/disconnected.tt @@ -0,0 +1,38 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + diff --git a/Fila-Web/root/render/emissor.tt b/Fila-Web/root/render/emissor.tt new file mode 100644 index 0000000..3e0b1dc --- /dev/null +++ b/Fila-Web/root/render/emissor.tt @@ -0,0 +1,56 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[%# Template que desenha o modulo do emissor. %] + + + +[% PROCESS 'render/emissor/acoes.tt' %] +[% PROCESS 'render/emissor/main.tt' %] diff --git a/Fila-Web/root/render/emissor/acoes.tt b/Fila-Web/root/render/emissor/acoes.tt new file mode 100644 index 0000000..e4d3051 --- /dev/null +++ b/Fila-Web/root/render/emissor/acoes.tt @@ -0,0 +1,29 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + + diff --git a/Fila-Web/root/render/emissor/error.tt b/Fila-Web/root/render/emissor/error.tt new file mode 100644 index 0000000..7079c54 --- /dev/null +++ b/Fila-Web/root/render/emissor/error.tt @@ -0,0 +1,21 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + diff --git a/Fila-Web/root/render/emissor/main.tt b/Fila-Web/root/render/emissor/main.tt new file mode 100644 index 0000000..3c3b3fd --- /dev/null +++ b/Fila-Web/root/render/emissor/main.tt @@ -0,0 +1,41 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + diff --git a/Fila-Web/root/render/emissor/receber_senha.tt b/Fila-Web/root/render/emissor/receber_senha.tt new file mode 100644 index 0000000..22df1e8 --- /dev/null +++ b/Fila-Web/root/render/emissor/receber_senha.tt @@ -0,0 +1,30 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + diff --git a/Fila-Web/root/render/error.tt b/Fila-Web/root/render/error.tt new file mode 100644 index 0000000..7079c54 --- /dev/null +++ b/Fila-Web/root/render/error.tt @@ -0,0 +1,21 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + diff --git a/Fila-Web/root/render/error_message.tt b/Fila-Web/root/render/error_message.tt new file mode 100644 index 0000000..faaf170 --- /dev/null +++ b/Fila-Web/root/render/error_message.tt @@ -0,0 +1,21 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + diff --git a/Fila-Web/root/render/escolher_guiche.tt b/Fila-Web/root/render/escolher_guiche.tt new file mode 100644 index 0000000..b73e741 --- /dev/null +++ b/Fila-Web/root/render/escolher_guiche.tt @@ -0,0 +1,43 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[%# Template que desenha a tela de escolha dos guiches. %] + + + diff --git a/Fila-Web/root/render/fechar.tt b/Fila-Web/root/render/fechar.tt new file mode 100644 index 0000000..c00f51e --- /dev/null +++ b/Fila-Web/root/render/fechar.tt @@ -0,0 +1,24 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +Clique aqui para fechar + diff --git a/Fila-Web/root/render/gerente.tt b/Fila-Web/root/render/gerente.tt new file mode 100644 index 0000000..36be561 --- /dev/null +++ b/Fila-Web/root/render/gerente.tt @@ -0,0 +1,142 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[%# Template que desenha o modulo do gerente. %] + + +[% PROCESS 'render/chat.tt' %] + + diff --git a/Fila-Web/root/render/guiches.tt b/Fila-Web/root/render/guiches.tt new file mode 100644 index 0000000..2355613 --- /dev/null +++ b/Fila-Web/root/render/guiches.tt @@ -0,0 +1,97 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[%# Template que desenha os guiches. %] + [%# Montando as informações sobre os guichês. %] + [% nova_lista_guiches = BLOCK %] +
    + [% FOREACH guiche IN status_guiches.lista_guiches.guiche %] + + + [% SWITCH guiche.estado %] + [% CASE ['atendimento' 'disponivel' 'chamando' ] %] + + + + + + + + + [% SWITCH guiche.estado %] + [% CASE 'pausa' %] + + [% CASE 'interno' %] + + [% CASE 'chamando' %] + + [% CASE 'concluido' %] + + [% CASE 'atendimento' %] + + [% CASE 'disponivel' %] + + [% CASE %] + [% IF guiche.estado_atendimento == 'avaliacao' %] + + [% ELSE %] + [%# %] + [% END %] + [% END %] +
    [% guiche.identificador %] + [% CASE ['interno' 'pausa'] %] + [% guiche.identificador %] + [% CASE ['avaliacao' 'concluido'] %] + [% guiche.identificador %] + [% CASE ['fechado'] %] + [% guiche.identificador %] + + [% END %] + [% IF guiche.pular_opiniometro == 0 %] + + [% c.prototype.link_to_remote('(Desab.)', { url => '/cb/gerente/pular_opiniometro/1/' _ guiche.id_guiche, confirm => 'confirmar(\'Deseja mesmo desabilitar o opiniometro da mesa?\')' }) %] + + [% ELSE %] + + [% c.prototype.link_to_remote('(Habil.)', { url => '/cb/gerente/pular_opiniometro/0/' _ guiche.id_guiche, confirm => 'confirmar(\'Deseja habilitar o opiniometro da mesa?\')' }) %] + + [% END %] + [% guiche.estado %] [%guiche.senha%] + [% SWITCH guiche.estado %] + [% CASE 'pausa' %] + + (Motivo) + + [% CASE 'interno' %] + + (Serviço) + + [% END %] +
    [% dtf.f(guiche.estado_desde) %] 
    [% guiche.funcionario %] 
    [% c.prototype.link_to_remote('(Fechar Mesa)', { url => '/cb/gerente/fechar_guiche/' _ guiche.id_guiche , confirm => 'confirmar(\'Deseja mesmo fechar a mesa?\')' }) %]
    [% c.prototype.link_to_remote('(Fechar Mesa)', { url => '/cb/gerente/fechar_guiche/' _ guiche.id_guiche , confirm => 'confirmar(\'Deseja mesmo fechar a mesa?\')' }) %]
    [% c.prototype.link_to_remote('(Devolver Senha)', { url => '/cb/gerente/devolver_senha/' _ guiche.id_guiche }) %]
    [% c.prototype.link_to_remote('(Fechar Mesa)', { url => '/cb/gerente/fechar_guiche/' _ guiche.id_guiche , confirm => 'confirmar(\'Deseja mesmo fechar a mesa?\')' }) %]
    [% c.prototype.link_to_remote('(Encerrar)', { url => '/cb/gerente/concluir_atendimento/' _ guiche.id_guiche , confirm => 'confirmar(\'Deseja mesmo concluir o atendimento?\')' }) %]
    [% c.prototype.link_to_remote('(Fechar Mesa)', { url => '/cb/gerente/fechar_guiche/' _ guiche.id_guiche , confirm => 'confirmar(\'Deseja mesmo fechar a mesa?\')' }) %]
    + [% c.prototype.link_to_remote('(Encerrar)', { url => '/cb/gerente/encerrar_atendimento/' _ guiche.id_atendimento }) %] +
     
    + [% END %] +
    + + + + [% END %] + + $('lista_guiches').replace("[% nova_lista_guiches | js %]"); + + diff --git a/Fila-Web/root/render/mesas.tt b/Fila-Web/root/render/mesas.tt new file mode 100644 index 0000000..80465c0 --- /dev/null +++ b/Fila-Web/root/render/mesas.tt @@ -0,0 +1,55 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + [% mesas = BLOCK %] + + + [% END %] + + $('ContainerMesas').replace("[% mesas | js %]"); + + diff --git a/Fila-Web/root/render/refresh_guiches.tt b/Fila-Web/root/render/refresh_guiches.tt new file mode 100644 index 0000000..5c02756 --- /dev/null +++ b/Fila-Web/root/render/refresh_guiches.tt @@ -0,0 +1,33 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] +[%# Atualiza lista do chat e guiches %] + + + [% PROCESS 'render/chat.tt' %] diff --git a/Fila-Web/root/render/status_atendente.tt b/Fila-Web/root/render/status_atendente.tt new file mode 100644 index 0000000..0e953b8 --- /dev/null +++ b/Fila-Web/root/render/status_atendente.tt @@ -0,0 +1,286 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + [%# Montando o espaço de informações sobre o local de atendimento. %] + [% MAIN_INFORMACOES = BLOCK %] +
    + +

    Informações


    +
    + + + + + + + + + + + + + +
    Mesa: [% status_guiche.guiche.identificador %]
    Atendente:[% status_guiche.guiche.funcionario %]
    Estado: [% status_guiche.guiche.estado %]
    +
    + + [% IF status_guiche.guiche.estado == 'concluido' || status_guiche.guiche.estado == 'disponivel' %] + [% IF lista_no_show %] +

    Atendimentos Atrasados:


    +
    +
      + [% FOREACH no_show IN lista_no_show.lista_atendimentos.atendimento %] +
    • + Atendimento: [% no_show.id_atendimento %] - Senha: [% no_show.senha %] [% c.prototype.link_to_remote('Atender', { url => '/cb/atendente/atender_no_show/' _ no_show.id_atendimento }) %] +
    • + [% END %] +
    +
    + [% END %] + [% END %] + + [% IF status_guiche.guiche.estado == 'concluido' || status_guiche.guiche.estado == 'disponivel' %] + [% IF lista_servicos %] +

    Serviços:


    +
    +
      + [% FOREACH servico IN lista_servicos.lista_servicos.servico %] +
    • + Serviço: [% servico.nome %] - Classe: [% servico.id_classe %] [% c.prototype.link_to_remote('Ir para', { url => '/cb/atendente/iniciar_servico_interno/' _ servico.id_servico }) %] +
    • + [% END %] +
    +
    + [% END %] + [% END %] + + [% IF status_guiche.guiche.estado == 'atendimento' %] + [% IF lista_servicos_atendimento %] +

    Serviços:


    +
    +
      + [% FOREACH servico IN lista_servicos_atendimento.lista_servicos.servico %] +
    • + Serviço: [% servico.nome %] - Classe: [% servico.id_classe %] [% c.prototype.link_to_remote('Iniciar Serviço', { url => '/cb/atendente/iniciar_servico_atendimento/' _ servico.id_servico }) %] +
    • + [% END %] +
    +
    + [% END %] + + [% END %] + + [% IF lista_guiches_encaminhar %] +

    Encaminhar para outra mesa

    +
    +
    + Mesas:

    + Motivo:

    + +
    +
    + [% END %] + + [% IF status_guiche.guiche.estado == 'interno' %] +

    Serviço em andamento:


    +
    +
    + + + [% FOREACH servico IN status_guiche.guiche.servicos.servico %] + + + [% IF servico.informacoes %] + + + [% ELSE %] + + + [% END %] + [% END %] + +
    Serviço: [% servico.nome %]Classe: [% servico.id_classe %] ([% servico.informacoes %])
    +
    +
    + [% END %] + + [% IF status_guiche.guiche.estado == 'atendimento' %] + [% IF status_guiche.guiche.servicos.servico %] +

    Serviços em andamento:


    +
    + + [% FOREACH servico IN status_guiche.guiche.servicos.servico %] + + + + + + + [% END %] +
    Serviço: [% servico.nome %]Classe: [% servico.id_classe %] +
    +
    + + [% IF servico.informacoes %] + + + [% ELSE %] + + + [% END %] +
    ([% servico.informacoes %])
    +
    +
    +
    [% c.prototype.link_to_remote('(Encerrar)' , { url => '/cb/atendente/fechar_servico_atendimento/' _ servico.id_servico }) %]
    +
    + [% END %] + [% END %] + + [% IF status_guiche.guiche.estado == 'pausa' %] +

    Motivo da Pausa: [% status_guiche.guiche.pausa_motivo %]


    +
    +
    + + [% IF status_guiche.guiche.pausa_motivo %] + + + + + [% ELSE %] + + + [% END %] +
    +
    +
    + [% END %] + +
    +

    Senha

    +
    [% status_guiche.guiche.senha %]
    +
    + + [% IF status_guiche.guiche.agendamento %] +

    Informações do Agendamento


    +
    +

    Nome: [% status_guiche.guiche.agendamento.nome %]

    +

    Pessoa Física ou Jurídica: [% status_guiche.guiche.agendamento.tipopessoa %]

    +

    CPF/CNPJ: [% status_guiche.guiche.agendamento.cnpjf %]

    +

    Email: [% status_guiche.guiche.agendamento.email %]

    +
    + [% END %] + +
    + + [% END %] + $('bloco_informacoes').replace("[% MAIN_INFORMACOES | js %]"); + + [%# Montando menu das ações disponíveis para o atendente. %] + [% ACOES_ATENDENTE = BLOCK %] +
    + [% SWITCH status_guiche.guiche.estado %] + + [% CASE 'chamando' %] + + [% c.prototype.link_to_remote('Iniciar Atendimento', { url => '/cb/atendente/iniciar_atendimento' }) %] + + + [% c.prototype.link_to_remote('Devolver Senha', { url => '/cb/atendente/devolver_senha' }) %] + + + [% c.prototype.link_to_remote('Registrar Ausência', { url => '/cb/atendente/registrar_no_show' , confirm => 'confirmar(\'Deseja mesmo registrar ausência?\')' }) %] + + + [% CASE 'atendimento' %] + + [% c.prototype.link_to_remote('Ir Para', { url => '/cb/atendente/listar_servicos_atendimento' }) %] + + + [% c.prototype.link_to_remote('Encaminhar', { url => '/cb/atendente/listar_guiches_encaminhar' }) %] + + + [% c.prototype.link_to_remote('Concluir Atendimento', { url => '/cb/atendente/concluir_atendimento' }) %] + + [% CASE 'pausa' %] + + [% c.prototype.link_to_remote('Retornar da Pausa', { url => '/cb/atendente/retornar_pausa' }) %] + + + [% CASE 'interno' %] + + [% c.prototype.link_to_remote('Voltar', { url => '/cb/atendente/fechar_servico_interno' }) %] + + + [% CASE 'concluido' %] + + [% c.prototype.link_to_remote('Fechar Mesa', { url => '/cb/atendente/fechar_guiche' , confirm => 'confirmar(\'Deseja mesmo fechar mesa?\')'}) %] + + + [% c.prototype.link_to_remote('Iniciar Pausa', { url => '/cb/atendente/iniciar_pausa' , confirm => 'confirmar(\'Deseja mesmo iniciar uma pausa?\')'}) %] + + + [% c.prototype.link_to_remote('Atender Ausente', { url => '/cb/atendente/listar_no_show' }) %] + + + [% c.prototype.link_to_remote('Ir Para', { url => '/cb/atendente/listar_servicos' }) %] + + + [% c.prototype.link_to_remote('Disponível', { url => '/cb/atendente/disponivel' }) %] + + + [% CASE 'disponivel' %] + + [% c.prototype.link_to_remote('Fechar Mesa', { url => '/cb/atendente/fechar_guiche', confirm => 'confirmar(\'Deseja mesmo fechar mesa?\')' }) %] + + + [% c.prototype.link_to_remote('Iniciar Pausa', { url => '/cb/atendente/iniciar_pausa' , confirm => 'confirmar(\'Deseja mesmo iniciar uma pausa?\')'}) %] + + + [% c.prototype.link_to_remote('Atender Ausente', { url => '/cb/atendente/listar_no_show' }) %] + + + [% c.prototype.link_to_remote('Ir Para', { url => '/cb/atendente/listar_servicos' }) %] + + + [% CASE 'avaliacao' %] + Aguardando o término da avaliação. + + + [% END %] +
    + [% END %] + $('bloco_lista_acoes').replace("[% ACOES_ATENDENTE | js %]"); + + [% bloco_senha = BLOCK %] + +
    +

    + [% IF status_guiche.guiche.funcionario %] + Usuário: [% status_guiche.guiche.funcionario %]
    + (Mudar Senha)
    + [% END %] + (Ajuda) +

    + [% END %] + + $('header2').replace("[% bloco_senha | js %]"); diff --git a/Fila-Web/root/render/status_local_gerente.tt b/Fila-Web/root/render/status_local_gerente.tt new file mode 100644 index 0000000..386f427 --- /dev/null +++ b/Fila-Web/root/render/status_local_gerente.tt @@ -0,0 +1,88 @@ +[%# +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, +%] + [%# Montando o espaço de informações sobre o local de atendimento. %] + [% MAIN_INFORMACOES = BLOCK %] +
    +

    +

    [% status_local.local.nome %] - [% status_local.local.estado %]

    + + + + + + + [% FOREACH categoria IN status_local.local.status.categorias.categoria %] + + + + + + + + [% END %] +
    Categoria EsperandoDesde
    Media EsperaMedia Atend.
    Todas[% status_local.local.status.agregado.quantidade_espera %] [% dtf.f(status_local.local.status.agregado.espera_mais_antiga) %] 
    [% status_local.local.status.agregado.tempo_medio_espera %] [% status_local.local.status.agregado.tempo_medio_atendimento %] 
    [% categoria.codigo %][% categoria.quantidade_espera %] [% dtf.f(categoria.espera_mais_antiga) %] 
    [% categoria.tempo_medio_espera %] [% categoria.tempo_medio_atendimento %] 
    +

    +
    + [% END %] + + $('bloco_informacoes').replace("[% MAIN_INFORMACOES | js %]"); + + [%# Montando menu das ações disponíveis para o gerente. %] + [% MAIN_ACOES = BLOCK %] +
    + [% IF status_local.local.estado != 'aberto' %] + + [% c.prototype.link_to_remote('Abrir Local', { url => '/cb/local/abrir' }) %] + + [% END %] + + [% IF status_local.local.estado == 'aberto' %] + + [% c.prototype.link_to_remote('Encerrar Senhas', { url => '/cb/local/encerrar_senhas', confirm => 'confirmar(\'Deseja mesmo encerrar senhas?\')' }) %] + + [% END %] + + [% IF status_local.local.estado != 'fechado' %] + + [% c.prototype.link_to_remote('Fechar Local', { url => '/cb/local/fechar' , confirm => 'confirmar(\'Deseja mesmo fechar local?\')' }) %] + + [% END %] + + [% IF status_local.local.estado != 'fechado' %] + + [% c.prototype.link_to_remote('Fechar Todas as Mesas', { url => '/cb/local/fechar_todos' , confirm => 'confirmar(\'Deseja mesmo fechar todas as mesas do local?\')' }) %] + + + [% c.prototype.link_to_remote('Forçar Fechar Local', { url => '/cb/local/fechar_local_force' , confirm => 'confirmar(\'ATENÇÃO! Você irá encerrar todos os atendimentos do local! Deseja realmente fazer isso?\')' }) %] + + [% END %] +
    + [% END %] + $('bloco_lista_acoes').replace("[% MAIN_ACOES | js %]"); + +[% bloco_senha = BLOCK %] +
    +

    + ([% c.prototype.link_to_remote('Passar Gerência', { url => '/cb/gerente/passar_gerencia' }) %]) +
    + (Ajuda
    ) +

    +
    +[% END %] + $('header2').replace("[% bloco_senha | js %]"); diff --git a/Fila-Web/root/static/css/main.css b/Fila-Web/root/static/css/main.css new file mode 100644 index 0000000..bcb8bae --- /dev/null +++ b/Fila-Web/root/static/css/main.css @@ -0,0 +1,218 @@ + +body { + padding : 0; color:#000; + margin : 0; font-size: 12px; + font-family : Arial, Sans-Serif; +} + +a:hover{ + text-decoration: underline; +} + +a:link{ + text-decoration: none; + color: #B20F0F; +} + +.link_dot a:hover { + border-bottom-width: 1px; + border-bottom-style: dotted; + border-bottom-color: #ed1c24; +} + +.link_dot a:active, a:link, a:visited { + text-decoration: none; + color: #ed1c24; +} + +#BackHeader {width: 100%; height : 134px; background: url('../images/bg_cabecalho.gif') repeat-x;} + +#header { + height : 89px; padding:45px 0 0 557px; background: url('../images/bg_cabecalho.jpg') no-repeat; +} + +#header h1 { + margin: 0; padding: 0; font-size : 20px; + color : white; + font-family : Arial; +} + +.titulos {font-size: 16px; padding: 3px 0 5px 5px; border-bottom: 1px solid #ed1c24; margin: 0 0 15px 0;} + +#content_main { + margin : 0; + padding : 0 20px; +} + +#footer { + width : 100%; + clear : both; + margin : 0; + margin-top : 1em; + border-top : 0.05em solid black; +} + +#footer p { + margin : 0.2em; + padding : 0.2em; + font-size: 10px; +} + +label { + display : block; +} + +.error { + color : red; + font-weight : bold; +} + +div #bloco_acoes { + width: 100%; + clear: both; +} + +div #bloco_informacoes { + clear: both; + width: 100%; font-size: 12px; +} + +div #bloco_chat { + clear: both; + width: 100%; +} + +div #bloco_guiches { + clear: both; + width: 100%; +} + +div #senhaemissor{ + background-color: edec85; + margin: 0 15px 15px 0; + padding:30px 30px 30px 30px; + font-size: 14px; + width: 390px; + border: 1px solid gray; +} + +.Cercadura { + border: 1px solid gray; + padding: 5px 5px 5px 5px ; + width: 440px; + margin-bottom: 10px; +} + +#CHAT_WINDOW { + display: block; + clear: both; + width: 100%; + height: 200px; + overflow: auto; + border: 1px solid #999; +} + +#CHAT_SEND { + display: block; + clear: both; + width: 100%; +} + +.botao_acao { + display: block; height: 41px; float: left; margin: 0 15px 15px 0; +} + +.chat_remetente { + display: block; + font-weight: bold; +} + +tbody { + border: solid 1px black; +} +.colunaUm {padding: 0 30px 0 0;} +.botao_acao a {display:block; float: left; font-size:0; text-indent: -999px;} + +#InfoSenhas {font-size: 12px;} +#TitCategoria {background: url('../images/icon_cat.jpg') 0 center no-repeat; padding: 0 0 0 16px;} + +.fechar_local a {background: url('../images/bt_fechar_local.jpg') no-repeat; width: 111px; height:34px;} +.fechar_mesas a {background: url('../images/bt_fechar_mesas.jpg') no-repeat; width: 183px; height:34px;} +.forcar_fechar a {background: url('../images/bt_forcar_fechar.png') no-repeat; width: 153px; height:37px;} + +.acao_abrir a {background: url('../images/bt_abrir_local.jpg') no-repeat; width: 101px; height:34px;} +.encerrar_senhas a {background: url('../images/bt_encerrar_senhas.jpg') no-repeat; width: 139px; height:34px;} + +.acao_iniciar a {background: url('../images/bt_iniciar_atend.png') no-repeat; width: 174px; height:38px;} +.acao_devolver_senha a {background: url('../images/bt_devol_senha.png') 0 5px no-repeat; width: 124px; height:37px;} +.acao_registrar_ausencia a {background: url('../images/bt_registrar_ausencia.png') no-repeat; width: 103px; height:33px;} +.acao_concluir a {background: url('../images/bt_concluir_atend.png') no-repeat; width: 179px; height:41px;} +.acao_ir_para a {background: url('../images/bt_ir_para.png') no-repeat; width: 126px; height:34px;} +.acao_encaminhar a {background: url('../images/bt_encaminhar_atend.png') no-repeat; width: 109px; height:37px;} +.acao_retornar_pausa a {background: url('../images/bt_retornar_pausa.jpg') no-repeat; width: 159px; height:34px;} +.acao_voltar_serv_interno a {background: url('../images/bt_voltar_serv_interno.png') no-repeat; width: 180px; height:37px;} +.acao_fechar_mesa a {background: url('../images/bt_fechar_mesa.jpg') no-repeat; width: 139px; height:34px;} +.acao_iniciar_pausa a {background: url('../images/bt_iniciar_pausa.jpg') no-repeat; width: 119px; height:36px;} +.acao_atender_ausente a {background: url('../images/bt_listar_ausentes.jpg') no-repeat; width: 148px; height:30px;} +.acao_disponivel a {background: url('../images/bt_disponivel.png') no-repeat; width: 105px; height:31px;} +.acao_iniciar_servico a {background: url('../images/bt_iniciar_servico.jpg') no-repeat; width: 165px; height:33px;} + +.opi a {font-size:0; text-indent: -999px; display: block; margin:15px auto 0 auto;} +.acao_opi_on a {background: url('../images/icon_opi_on.png') no-repeat; width: 23px; height:28px;} +.acao_opi_off a {background: url('../images/icon_opi_off.png') no-repeat; width: 23px; height:28px;} +.nick_azul {color: blue; font-size: 12px; font-weight: normal; font-family: Arial; } +.nick_vermelho {color: red; font-size: 12px; font-weight: normal; font-family: Arial; } +.chat_mensagem {color: black; font-size: 12px; font-weight: normal; font-family: Arial;} + +#TitChat {background: url('../images/icon_chat.jpg') 48px 0 no-repeat; height: 24px;} +#ContainerMesas {height: 30px} + +#ContainerMesas h3 {font-weight: normal; margin: 0; padding: 0} +#TitMesas {background: url('../images/icon_mesa.jpg') 65px 0 no-repeat; height: 24px; float: left; width: 200px; text-align: left;} +#TitEncaminhamentos {background: url('../images/icon_encaminhar.png') 0px 0 no-repeat; height: 24px; float: right; width: 315px; +text-align:right} + + +#ContainerSenha {padding-top: 40px;} +#TitSenha {background: url('../images/icon_senha.jpg') 65px 0 no-repeat; height: 24px;} +#Senha {font-size: 50px;} + +#encaminhar {padding: 10px; margin:15px auto 0 auto;} + +.mesas {float: left; border: solid 1px #999; margin: 0.1em; width: 160px; height: 95px; font-size: 12px;} + +.mesas .guiche {color: #FFF; font-size: 25px; width: 28px; text-align: center;} +.mesas .guiche_ativo {background-color: #009933;} +.mesas .guiche_pausa {background-color: #FFCB08;} +.mesas .guiche_inativo {background-color: #ED1C24;} +.mesas .guiche_fechado {background-color: #c0c0c0;} + +#txtTexto, #txtDestinatario {border: 1px solid #999; padding:2px; font-family: Arial; font-size: 12px; color: #636563; margin: 10px 0 0 0;} +#BtEnviar {display:block; font-size:0; text-indent: -999px; padding: 0; margin: 10px auto 0 auto; border:0; +background: url('../images/bt_enviar_chat.jpg') no-repeat; width: 182px; height:22px; } + +#informacoes_status {font-size: 14px; padding-bottom: 20px;} +#informacoes_status .status {font-size: 20px;} +#servicos {padding-bottom: 20px;} +#bloco_informacoes {padding-bottom: 10px;} + +.motivo a { color: black; background: #DDD; text-decoration: none;} +.motivo a:hover { color: black; background: #FF8; text-decoration: none;} + + +#ContainerEncaminhamentos {padding: 10px;} + +#TabEncaminhamentos td {text-align: center;} +#TabEncaminhamentos {font-family: Arial; font-size: 12px;} + +.titulosTabela {background-color: #ed1c24; color:#fff; font-weight:bold;} + +/*************** Ajuda .html *************/ +#ConteudoAjuda h2 { clear: both; text-align: center; border-width: 3px; border-style: outset; border-color: #FF0000; } +#ConteudoAjuda h3 { clear: both; text-align: left; margin: 15px auto 0 15px;} +#ConteudoAjuda h4 { clear: both; text-align: center; } +#ConteudoAjuda img { clear: both; float: left; border: 1; border-width: 1px; border-style: solid; border:1px;border-color: #000000; margin: 0 15px 15px auto;} +#ConteudoAjuda li { font-weight : bold; margin: auto 15px 0 40px;} +#ConteudoAjuda a { color: blue; text-decoration: underline; font-weight : bold;} +#ConteudoAjuda p { text-indent: 30px; margin: 15px 15px 0 15px; text-align: justify;} + diff --git a/Fila-Web/root/static/doc/ajuda.html b/Fila-Web/root/static/doc/ajuda.html new file mode 100644 index 0000000..d3f9836 --- /dev/null +++ b/Fila-Web/root/static/doc/ajuda.html @@ -0,0 +1,139 @@ + + + + + + Sistema de Atendimento + + + + +
    + +
    +
    +

    Apostila do Treinamento

    + +

    Dúvidas mais freqüentes

    + +

    Para facilitar a sua vida, durante a utilização deste sistema, só surgirão na tela ações que você poderá realizar em cada estado. Por isso observa-se uma mudança de botões.

    +

    Perguntas comuns:

    +
      0. Como saber qual o meu estado?
    +
      1. Como ficar “Disponível” e poder chamar senhas?
    +
      2. Como iniciar uma Pausa?
    +
      3. Como iniciar um Serviço durante o atendimento?
    +
      4. Como encaminhar atendimento?
    +
      5. Como faço para me comunicar com o gerente?
    +
      6. Quanto tempo devo esperar por um cidadão cuja senha eu esteja “Chamando”?
    +
      7. Um cidadão chegou na minha mesa mas sua vez já tinha passado. Ele ainda poderá ser atendido?
    +
      8. Como faço para fechar mesa?
    +
      9. Eu poderei mudar a minha senha de acesso?
    +

    Para maiores esclarecimentos, leia o restante desta documentação.

    + +

    Conceitos

    + +
      1. Local: Cada local tem um identificador único. As mesas e o atendente estão sempre associados a um local (físico) específico.
    +
      2. Gerente: O gerente de uma praça é um atendente a quem é atribuído o papel dentro de um intervalo de tempo determinado. Esse tempo pode ter o final em aberto, significando que ele é o gerente até que seja informada outra decisão.
    +
      3. Atendente: O atendente, no momento em que ele assume uma mesa para atendimento, tem um papel temporário naquele local, e pode ser assumido por outro atendente a qualquer momento.
    +
      4. Mesa: A mesa é a estação de atendimento onde o cidadão será recebido (atendido). Tem uma ligação física com o local, uma vez que o equipamento do “Opiniômetro” está associado àquele computador especificamente.
    +
      5. Expediente: Um expediente é o intervalo de tempo entre a abertura e o fechamento da praça. Durante um expediente as mesas podem ser abertas e fechadas de acordo com a necessidade, permitindo que, através do uso de turnos, uma mesma mesa possa ser usada por mais de um atendente.
    +
      6. Senhas: serão sempre seqüenciais dentro de um mesmo expediente, iniciando de 001 para cada categoria. No entanto, se houverem mais de 999 senhas emitidas para uma dada categoria dentro de um mesmo expediente, as senhas podem voltar a 001, sempre utilizando senhas de atendimentos já completamente encerradas e com horário apropriado e impresso.
    +
      7. Atendimento: Um atendimento começa no momento em que o cidadão solicita uma senha no “Emissor de Senha” e termina quando: o atendimento é concluído e o cidadão registra a avaliação do atendimento no opiniômetro, ou, o atendimento é concluído pelo gerente que encerra o atendimento porque o cidadão se recusou a registrar a avaliação ou quando o cidadão não reivindica o atendimento até 3 (senhas) após ser chamada.
    +
      8. Ausente: Este é o conceito que designa o momento em que uma senha é chamada, mas ninguém comparece para o atendimento. O sistema implementa uma tolerância de 3 senhas, o que significa que depois que a senha é chamada, o cidadão pode pedir para ser atendido “em atraso” até de 3 senhas.
    +
      9. Iniciar Serviço: Esta é a situação que descreve o momento em que o atendente precisa realizar alguma atividade “interna” extra SAC, que vai deixá-lo indisponível para novos atendimentos. O sistema permite que seja selecionado um serviço dentre uma lista previamente definida, assim como permite que sejam registradas informações referentes a esse serviço em específico.
    +
      10. Serviço em Atendimento: Da mesma forma que para o serviço interno, também é possível detalhar cada um dos serviços realizados ao longo de um atendimento. Essa informação é importante para possibilitar a extração de informações estatísticas sobre todo o processo de atendimento. Assim como no serviço “interno”, também é possível registrar informações adicionais, como por exemplo, a referência de um protocolo em um outro sistema.
    + +

    Entendendo o processo do atendimento

    + +

    Quando um atendimento é criado, ele começa no estado “espera”, o que significa que ele está na fila para que seja escalonado para atendimento em um das mesas. O escalonamento acontece de acordo com o tempo em espera, priorizado proporcionalmente de acordo com as categorias.

    +

    No momento em que chega a vez de um atendimento, o estado do atendimento passa para “chamando”, a senha é exibida no painel, já vinculado a uma mesa específica. Ao mesmo tempo, também aparece na tela do gerente e do atendente a informação de qual senha está sendo chamada.

    +

    Neste momento existem quatro possibilidades:

    +
  • 1. O cidadão apresenta-se a mesa, e o atendente inicia o atendimento. +
  • 2. Ninguém comparece, e o atendente registra “ausente”.
  • +
  • 3. O atendente encaminha a senha para outra mesa, caso o tipo de atendimento não seja sua especialidade.
  • +
  • 4. O atendente ou o gerente desfazem a chamada, retornando a senha para o estado “espera”, para que o atendente possa entrar em “pausa” .
  • +

    Sendo iniciado o atendimento, o atendente pode:

    +

    1.Ir para, outro sistema(spu, scuma etc.)

    +

    Para isso, basta clicar no botão “Ir Para” e escolher o serviço associado. Será possível então registrar informações adicionais sobre o serviço em execução, como o número do protocolo.

    +

    Ao concluir o serviço, basta clicar no botão “Concluir Serviço” e o sistema retornará ao estado de atendimento, onde pode ser iniciado outro serviço ou o atendimento pode ser concluído.

    +

    2.Concluir o atendimento.

    +

    Para concluir o atendimento, basta clicar no botão “Concluir atendimento”. O opiniômetro irá ser inciado, e logo que o cidadão registrar as respostas, a mesa entrará no estado “concluído”.

    +

    Ao realizar serviços, podem ser registradas informações adicionais, mas em um determinado momento o atendente deverá concluir o atendimento. Quando o atendimento for concluído, o opiniômetro será acionado para que o cidadão registre a avaliação. Caso o cidadão se recuse a registrar a avaliação, o atendente solicita ao gerente para encerrar o atendimento mesmo assim.

    +

    No momento em que o atendimento é encerrado, a mesa coloca-se em estado “concluído”, que permite que o atendente então escolha se vai:

    +

    1.Iniciar uma pausa.

    +

    Para iniciar uma pausa, basta clicar no botão “Iniciar Pausa”. A mesa será já colocada em estado de pausa, e então será possível registrar o motivo da pausa. Para retornar da pausa, basta clicar no botão “Terminar Pausa”.

    +

    2.Iniciar um serviço interno.

    +

    Assim como o “Ir Para” no atendimento, é possível clicar no “Iniciar Serviço”, que irá listar uma lista de serviços possíveis. Pode-se então selecionar o serviço e registrar informações adicionais. Quando estiver concluído, basta clicar no botão “Concluir Serviço”.

    +

    3.Fechar a mesa.

    +

    Fechar a mesa é o jeito correto de encerrar um dia de trabalho. Ao fazer isso a mesa estará então disponível para outro atendente assumir. O usuário será automaticamente deslogado do sistema.

    +

    4.Atender “ausente”.

    +

    Será apresentada uma lista das senhas “ausentes” ainda válidas para iniciar atendimento. Clicando na senha será iniciado o atendimento normalmente.

    +

    5.Ficar “Disponível” para outro atendimento.

    +

    Ao clicar em “disponível” o sistema irá atribuir uma nova senha a essa mesa, se houverem senhas em espera, ou irá fazê-lo logo que uma senha seja emitida.

    +

    O processo de escalonamento só irá enviar senhas para as mesas disponíveis, e vai fazer isso sempre no momento em que o atendente ficar “disponível”. É importante perceber que o estado das mesas estará sempre visível na tela do gerente, exibindo a hora em que o atendente passou para aquele estado, permitindo ao gerente ter um controle sobre a eficiência do atendimento.

    +

    Sempre que uma mesa estiver no estado “concluído”, o atendente também pode atender um “ausente”, desde que a senha ainda esteja dentro do limite de tolerância determinado. É importante sempre conferir que o número do atendimento confere com o número da senha no sistema.

    + +

    Conhecendo a interface do sistema

    + +

    Interface do Atendente

    +

    Para facilitar o uso do sistema, a interface do sistema é desenhada de uma maneira consistente e que é mantida durante todo o uso. A interface é dividida em 3 áreas, que permitem uma fácil navegação.

    +

    As áreas são:

    +
      1. Ações: Todas as ações que podem ser realizadas pelo atendente em qualquer momento estarão sempre agrupadas nessa área da tela, permitindo uma fácil localização. Sempre que uma ação tiver um impacto irreversível será apresentada uma caixa de confirmação para evitar a execução acidental dessas ações.
    +
      2. Chat: A qualquer momento o atendente pode chamar o gerente para conversar com ele com o uso de mensagens instantâneas. Essa opção é util para, por exemplo, solicitar diretamente ao gerente o encerramento de um atendimento quando o cidadão se recusou a fazer a avaliação, ou para solicitar uma pausa.
    +
      3. Informações: Mostra as informações sobre o estado atual, por exemplo, quando está chamando uma senha, mostra qual é a senha sendo chamada, quando vai para uma pausa, abre um espaço para preencher o motivo da pausa.
    + +

    Respostas

    + +

    0.Como saber qual o meu estado?

    +

    Você pode ver qual é o seu estado atual na parte de “Informações”, no lado direito da tela.

    +

    Voltar

    + +

    1. Como ficar “Disponível” e poder chamar senhas?

    +

    Vai depender do seu estado atual.

    +

    Se você estiver em “Avaliação”, deve esperar o fim da avaliação do cidadão. Caso o cidadão não tiver feito a avaliação ou o opiniômetro estiver com defeito, você deve pedir para o gerente encerrar seu atendimento.

    +

    Se você estiver “Concluído”, basta pressionar o botão “Disponível”.

    +

    Se você estiver em “Pausa”, clique em “Retornar da Pausa” e, em seguida, “Disponível”.

    +

    Se você estiver “Interno”, clique em “Encerrar serviço interno” e em seguida “Disponível”.

    +

    Voltar

    + +

    2. Como iniciar uma Pausa?

    +

    Se estiver “Disponível” ou “Concluído”, basta clicar no botão “Iniciar Pausa”.

    +

    Se estiver “Chamando”, clique em “Devolver Senha” e em seguida em “Iniciar Pausa”.

    +

    Aparecerá um campo onde se pode escrever o motivo da pausa. Este motivo ficará armazenado nas estatísticas. Escreva o motivo e em seguida clique em “Registrar”. Pode-se mudar o motivo da pausa. Para tanto, basta clicar em “Redefinir” e digitar o motivo novamente.

    +

    Para retornar da pausa basta clicar o botão “Retornar da Pausa”.

    +

    Voltar

    + +

    3. Como iniciar um Serviço durante o atendimento?

    +

    Para iniciar serviços, como SPU ou SCUMA, clique em “Iniciar Serviço”. Aparecerá na tela uma lista, então clique no link correspondente ao serviço desejado. Aparecerá um campo onde poderá ser feito um detalhamento do serviço, por exemplo: qual o protocolo do serviço, o que está sendo feito, etc. Após concluir o serviço, clique em “Encerrar”. É possível abrir mais de um serviço durante o mesmo atendimento. No entanto, não se pode “Concluir Atendimento” sem antes concluir os serviços abertos.

    +

    Voltar

    + +

    4. Como encaminhar atendimento?

    +

    Durante o atendimento se o cidadão solicitar um serviço que você não souber efetuar ou que não seja sua especialidade, basta clicar em encaminhar. Deve-se escolher a mesa para a qual se deseja encaminhar e em seguida registrar um motivo para o encaminhamento.

    +

    Voltar

    + +

    5. Como faço para me comunicar com o gerente?

    +

    Através do Chat. Digite a mensagem e em seguida clique em “Enviar” ou pressione ENTER.

    +

    Voltar

    + +

    6. Quanto tempo devo esperar por um cidadão cuja senha eu esteja “Chamando”?

    +

    Quanto tempo o gerente achar conveniente. Dentro do sistema há uma alternativa para que não se perca tempo esperando por uma senha que é “Registrar Ausente”. O atendente pode efetuar o registro sem a permissão do gerente.

    +

    Voltar

    + +

    7. Um cidadão chegou na minha mesa mas sua vez já tinha passado. Ele ainda poderá ser atendido?

    +

    Sim, desde que esteja dentro sempre do limite de tolerância determinado. Ao terminar o atendimento atual, pressione “Listar Ausente”. Se a senha ainda estiver listada, clique em “Atender” e inicie o atendimento normalmente.

    +

    Voltar

    + +

    8. Como faço para fechar mesa?

    +

    É necessário estar “Concluído” ou “Disponível”. Em seguida clique em “Fechar Mesa”. Caso esteja acontecendo algum problema, solicite ao gerente o fechamento de sua mesa.

    +

    Voltar

    + +

    9. Eu poderei mudar a minha senha de acesso?

    +

    Sim, no canto superior direito da tela, existe um link “Mudar Senha”. Ao clicar nele, será aberto uma janela onde deverá ser preenchido a “Senha Atual”, ou seja, a senha que está sendo usada até aquele momento, a “Nova Senha”, que é a senha que a partir de então será usada, e “Confirmar Senha”, onde deve ser digitada a nova senha novemente. Lembrando que, se você atualizar a tela após mudar a senha, será mostrada uma mensagem de erro, mas não se desespere: basta “logar” novamente, já utilizando a nova senha.

    +

    Voltar

    + +
    + + + + + diff --git a/Fila-Web/root/static/doc/gerenteajuda.html b/Fila-Web/root/static/doc/gerenteajuda.html new file mode 100644 index 0000000..8c10138 --- /dev/null +++ b/Fila-Web/root/static/doc/gerenteajuda.html @@ -0,0 +1,129 @@ + + + + + + Sistema de Atendimento + + + + +
    + +
    +
    +

    Apostila do Treinamento

    + +

    Dúvidas mais freqüentes

    + +

    -Como dar inicio a emissao das senhas?

    +

    No campo das "Ações" clique em "Abrir Local".

    +

    -Como abrir o local?

    +

    => No campo "Ações" clique em "Abrir Local".

    +

    -Como Encerrar as senhas?

    +

    => No campo "Ações" clique em "Encerrar Senhas".

    +

    -Como fechar o local?

    +

    => Certifique-se de que não há nenhum atendimento em andamento. Em seguida, + no campo "Ações" clique em "Fechar Todas as Mesas" e por último "Fechar Local". + Caso algum problema ocorra, clique em "Forçar Fechamento".

    +

    -Como ver quantas senhas faltam ser atendidas?

    +

    => Através do campo "Informações" do local, existe uma tabela que lista todas as senhas e + quantas estão chamando.

    +

    -Como responder ao chat de um atendente?

    +

    => Selecione o atendente ao qual deseja responder, em seguida, digite a mensagem + e pressione em "Enviar" ou aperte a tecla ENTER.

    +

    -Como enviar avisos ao atendente?

    +

    => Através do chat. Deve-se selecionar o atendente, digitar a mensagem e pressionar + "Enviar" ou apertar a tecla ENTER.

    +

    -Como enviar aviso a todos os atendentes?

    +

    => Existe uma opção TODOS dentro do selecionador que envia a mesma mensagem a todos os atendentes.

    +

    -Como ver quais atendentes estao atendendo?

    +

    => As mesas que estão atendendo ficam na cor verde.

    +

    -Como ver quais atendentes estão ociosos?

    +

    => Os atendentes que em mesas que estão ociosos, são mostrados na tela do gerente na cor vermelha.

    +

    -Como fechar uma mesa que foi desligada de forma incorreta?

    +

    => Vá no quadro da mesa e clique em "Fechar Mesa". Caso a mesa esteja "Chamando" clique em "Devolver Senha". + O estado da mesa passará para "Concluído" e você poderá clicar em "Fechar Mesa".

    +

    -Como ver o motivo da pausa do atendente?

    +

    => O motivo pode ser visualizado na tela do gerente ao colocando o cursor do mouse na palavra “Motivo”.

    +

    -Como ver o servico interno sendo executado pelo atendente?

    +

    => É possível visualizar o tipo de serviço que está sendo realizado colocando o cursor do mouse sobre a palavra “Serviço”.

    +

    -Como desabilitar um opiniometro?

    +

    => No quadro que representa a mesa, clique no ícone do opiniômetro. Aparecerá uma mensagem + de confirmação. Clique em "Ok".

    +

    -Eu posso passar a gerência para outra pessoa?

    +

    => Sim, para isso basta clicar em "(Passar Gerência)". Surgirá um popup "Passar Gerência" e no campo "Mudar Gerente", aparecerão os nomes + de todos os funcionários do local que estiverem aptos a se tornarem gerentes, ou seja, aqueles que não estiverem ligados a uma mesa. + Localizando o nome do funcionário excolhido, clique na palavra "Associar" ao lado. Você será desconectado e no próximo login, entrará no + sistema como Atendente.

    + +

    Para maiores informações, continue a leitura deste Guia de Ajuda.

    + +

    Conceitos

    + +
      1. Local: Cada local tem um identificador único. As mesas e o atendente estão sempre associados a um local (físico) específico.
    +
      2. Gerente: O gerente de uma praça é um atendente a quem é atribuído o papel dentro de um intervalo de tempo determinado. Esse tempo pode ter o final em aberto, significando que ele é o gerente até que seja informada outra decisão.
    +
      3. Atendente: O atendente, no momento em que ele assume uma mesa para atendimento, tem um papel temporário naquele local, e pode ser assumido por outro atendente a qualquer momento.
    +
      4. Mesa: A mesa é a estação de atendimento onde o cidadão será recebido (atendido). Tem uma ligação física com o local, uma vez que o equipamento do “Opiniômetro” está associado àquele computador especificamente.
    +
      5. Expediente: Um expediente é o intervalo de tempo entre a abertura e o fechamento da praça. Durante um expediente as mesas podem ser abertas e fechadas de acordo com a necessidade, permitindo que, através do uso de turnos, uma mesma mesa possa ser usada por mais de um atendente.
    +
      6. Senhas: serão sempre seqüenciais dentro de um mesmo expediente, iniciando de 001 para cada categoria. No entanto, se houverem mais de 999 senhas emitidas para uma dada categoria dentro de um mesmo expediente, as senhas podem voltar a 001, sempre utilizando senhas de atendimentos já completamente encerradas e com horário apropriado e impresso.
    +
      7. Atendimento: Um atendimento começa no momento em que o cidadão solicita uma senha no “Emissor de Senha” e termina quando: o atendimento é concluído e o cidadão registra a avaliação do atendimento no opiniômetro, ou, o atendimento é concluído pelo gerente que encerra o atendimento porque o cidadão se recusou a registrar a avaliação ou quando o cidadão não reivindica o atendimento até 3 (senhas) após ser chamada.
    +
      8. Ausente: Este é o conceito que designa o momento em que uma senha é chamada, mas ninguém comparece para o atendimento. O sistema implementa uma tolerância de 3 senhas, o que significa que depois que a senha é chamada, o cidadão pode pedir para ser atendido “em atraso” até de 3 senhas.
    +
      9. Iniciar Serviço: Esta é a situação que descreve o momento em que o atendente precisa realizar alguma atividade “interna” extra SAC, que vai deixá-lo indisponível para novos atendimentos. O sistema permite que seja selecionado um serviço dentre uma lista previamente definida, assim como permite que sejam registradas informações referentes a esse serviço em específico.
    +
      10. Serviço em Atendimento: Da mesma forma que para o serviço interno, também é possível detalhar cada um dos serviços realizados ao longo de um atendimento. Essa informação é importante para possibilitar a extração de informações estatísticas sobre todo o processo de atendimento. Assim como no serviço “interno”, também é possível registrar informações adicionais, como por exemplo, a referência de um protocolo em um outro sistema.
    + +

    Interface do Gerente

    + +

    Assim como a interface do atendente, a interface do gerente também tem a tela dividida em áreas delimitadas, mas a interface do gerente é dividida em 4 áreas: +

      1.Resumo do Local: Esta área mostra algumas informações estatísticas básicas sobre o estado atual, com o número de pessoas esperando no total, e por categoria, a espera mais antiga, e de cada categoria com as médias de tempo de espera e de atendimento, também para cada categoria, e a média total.
    +
      2.Ações: Esta área mostra todas as ações que podem ser realizadas pelo gerente em um determinado momento. Assim como na tela do atendente, quando as ações tiverem consequências irreversíveis, será exibida uma caixa de confirmação para evitar acidentes.
    +
      3.Chat: A tela de chat do gerente permite falar individualmente com cada um dos atendentes ou com todos de uma só vez, selecionando o nome do atendente dentro de uma caixa de seleção.
    +
      4.Mesas: Mostra o estado atual das mesas e dos atendimentos em cada mesa, e o nome do atendente.
    + +

    Descrição das ações do gerente

    + + +

    Abrir Local: o gerente inicia o expediente, iniciando a emissão de senhas e permitindo o acesso dos atendentes ao sistema.

    +

    Logo após a abertura do local, o bloco de ações ganha alguns botões. Fica assim:

    + +

    Encerrar Senhas: encerra a emissão de senhas durante o expediente, no entanto não se fecha o local.

    +

    Fechar Local: encerra o expediente.

    +

    Fechar todas as mesas: fecha todas as mesas que não estiverem com atendimentos em andamento, desligando todos os atendentes de suas respectivas mesas.

    +

    Forçar fechamento: desliga todos os atendentes de suas respectivas mesas e fecha local. Esta deve ser a opção se ocorrer algum erro durante o “Fechar Local” ou “Fechar todas as mesas”.

    +

    O gerente pode também visualizar os encaminhamentos realizados durante o expediente através do link Encaminhados. Ao ser clicado, surge uma janela com as informações referentes aos encaminhamentos.

    + +

    Descrição dos Estados das Mesas

    + +

    As mesas, como já foi dito, podem assumir diversos estados. Em todos os casos, pode-se visualizar a identificação da mesa (01, 02, 03,...), a condição do opiniômetro (habilitado ou desabilitado), a hora em que essa mesa passou para esse estado e o estado atual. As cores de exibição também ajudam o gerente na melhor visualização do estado de cada mesa. Os estados são:

    +

    1.Fechado (cor cinza)

    + +

    Não existe nenhum atendente ligado à mesa.

    +

    2.Disponível (cor verde)

    + +

    Esse estado acontece quando o atendente está no sistema, podendo atender. Na tela, pode-se visualizar, o atendente que está ligado a essa mesa e a opção “Fechar Mesa”. O gerente pode optar por fechar a mesa se ele perceber que o atendente não se desligou do sistema no fim do expediente ou se ocorrer algum erro inesperado.

    +

    3.Chamando (cor verde)

    + +

    Esse estado acontece quando é atribuído uma senha a uma mesa. Na tela, pode-se visualizar a senha que está sendo chamada, o atendente ligado à mesa e a opção “Devolver Senha”, que consiste em devolver a senha para a fila com prioridade máxima. O gerente opta por isso quando, por algum motivo, o atendente não puder realizar o atendimento.

    +

    4.Atendimento (cor verde)

    + +

    Esse estado ocorre a partir do momento em que o atendimento é iniciado. É mostrado na tela a senha e o horário de início do atendimento, o atendente ligado à mesa e a opção “Encerrar”, que consiste em encerrar o atendimento quando, por algum motivo, o atendente não puder fazê-lo.

    +

    5.Avaliação (cor vermelha)

    + +

    Esse estado começa quando o atendente encerra um atendimento e o cidadão inicia sua avaliação do atendimento. É mostrado na tela, a senha que está em avaliação o atendente ligado à mesa e a opção “Encerrar” que consiste em encerrar um atendimento se o cidadão se recusar a fazer a avaliação ou o opiniômetro estiver com defeito.

    +

    6.Concluído (cor vermelha)

    + +

    Esse estado começa quando o atendimento e a avaliação foram finalizados ou quando uma senha é devolvida. É mostrado o atendente ligado à mesa e a opção “Fechar Mesa” que já foi explicada.

    +

    7.Pausa (cor amarela)

    + +

    Esse estado ocorre quando o atendente inicia uma pausa. Nesse caso, ele pode dar um motivo para sua pausa. Este motivo é visualizado na tela do gerente ao por o mouse na palavra “Motivo”.

    +

    8.Interno (cor amarela)

    + +

    Esse estado ocorre quando o atendente precisa realizar algum trabalho fora do Sistema de Atendimento. Na tela do gerente, é possível visualizar o tipo de serviço que está sendo realizado colocando o mouse sobre a palavra “Serviço”.

    + +

    Em qualquer estado é possível habilitar ou desabilitar o opiniômetro de uma mesa. Para isto, basta clicar no ícone do opiniômetro logo abaixo da identificação da mesa.

    +

    Caso o opiniômetro seja desabilitado, quando o atendimento for encerrado, a mesa passará automaticamente para o estado “concluído”.

    + +
    + + + diff --git a/Fila-Web/root/static/doc/im/Screenshot-1.png b/Fila-Web/root/static/doc/im/Screenshot-1.png new file mode 100644 index 0000000..93e0ac0 Binary files /dev/null and b/Fila-Web/root/static/doc/im/Screenshot-1.png differ diff --git a/Fila-Web/root/static/doc/im/Screenshot.png b/Fila-Web/root/static/doc/im/Screenshot.png new file mode 100644 index 0000000..871714f Binary files /dev/null and b/Fila-Web/root/static/doc/im/Screenshot.png differ diff --git a/Fila-Web/root/static/doc/im/abloc.gif b/Fila-Web/root/static/doc/im/abloc.gif new file mode 100644 index 0000000..5db20b9 Binary files /dev/null and b/Fila-Web/root/static/doc/im/abloc.gif differ diff --git a/Fila-Web/root/static/doc/im/acões.gif b/Fila-Web/root/static/doc/im/acões.gif new file mode 100644 index 0000000..01a3c29 Binary files /dev/null and b/Fila-Web/root/static/doc/im/acões.gif differ diff --git a/Fila-Web/root/static/doc/im/aten.gif b/Fila-Web/root/static/doc/im/aten.gif new file mode 100644 index 0000000..24c2ffd Binary files /dev/null and b/Fila-Web/root/static/doc/im/aten.gif differ diff --git a/Fila-Web/root/static/doc/im/ava.gif b/Fila-Web/root/static/doc/im/ava.gif new file mode 100644 index 0000000..6627243 Binary files /dev/null and b/Fila-Web/root/static/doc/im/ava.gif differ diff --git a/Fila-Web/root/static/doc/im/bt_abrir_local.gif b/Fila-Web/root/static/doc/im/bt_abrir_local.gif new file mode 100644 index 0000000..af15ed8 Binary files /dev/null and b/Fila-Web/root/static/doc/im/bt_abrir_local.gif differ diff --git a/Fila-Web/root/static/doc/im/cham.gif b/Fila-Web/root/static/doc/im/cham.gif new file mode 100644 index 0000000..b5b61b1 Binary files /dev/null and b/Fila-Web/root/static/doc/im/cham.gif differ diff --git a/Fila-Web/root/static/doc/im/conc.gif b/Fila-Web/root/static/doc/im/conc.gif new file mode 100644 index 0000000..22fd1f1 Binary files /dev/null and b/Fila-Web/root/static/doc/im/conc.gif differ diff --git a/Fila-Web/root/static/doc/im/disp.gif b/Fila-Web/root/static/doc/im/disp.gif new file mode 100644 index 0000000..c37f6ad Binary files /dev/null and b/Fila-Web/root/static/doc/im/disp.gif differ diff --git a/Fila-Web/root/static/doc/im/fechado.gif b/Fila-Web/root/static/doc/im/fechado.gif new file mode 100644 index 0000000..2b688fa Binary files /dev/null and b/Fila-Web/root/static/doc/im/fechado.gif differ diff --git a/Fila-Web/root/static/doc/im/int.gif b/Fila-Web/root/static/doc/im/int.gif new file mode 100644 index 0000000..3e2cf6b Binary files /dev/null and b/Fila-Web/root/static/doc/im/int.gif differ diff --git a/Fila-Web/root/static/doc/im/pausa.gif b/Fila-Web/root/static/doc/im/pausa.gif new file mode 100644 index 0000000..bd5fbf1 Binary files /dev/null and b/Fila-Web/root/static/doc/im/pausa.gif differ diff --git a/Fila-Web/root/static/images/bg_cabecalho.gif b/Fila-Web/root/static/images/bg_cabecalho.gif new file mode 100644 index 0000000..8a36c02 Binary files /dev/null and b/Fila-Web/root/static/images/bg_cabecalho.gif differ diff --git a/Fila-Web/root/static/images/bg_cabecalho.jpg b/Fila-Web/root/static/images/bg_cabecalho.jpg new file mode 100644 index 0000000..c8f4a3f Binary files /dev/null and b/Fila-Web/root/static/images/bg_cabecalho.jpg differ diff --git a/Fila-Web/root/static/images/bt_abrir_local.jpg b/Fila-Web/root/static/images/bt_abrir_local.jpg new file mode 100644 index 0000000..82ccc75 Binary files /dev/null and b/Fila-Web/root/static/images/bt_abrir_local.jpg differ diff --git a/Fila-Web/root/static/images/bt_concluir_atend.png b/Fila-Web/root/static/images/bt_concluir_atend.png new file mode 100644 index 0000000..5f4feb1 Binary files /dev/null and b/Fila-Web/root/static/images/bt_concluir_atend.png differ diff --git a/Fila-Web/root/static/images/bt_devol_senha.png b/Fila-Web/root/static/images/bt_devol_senha.png new file mode 100644 index 0000000..df19ed1 Binary files /dev/null and b/Fila-Web/root/static/images/bt_devol_senha.png differ diff --git a/Fila-Web/root/static/images/bt_disponivel.png b/Fila-Web/root/static/images/bt_disponivel.png new file mode 100644 index 0000000..c8e13da Binary files /dev/null and b/Fila-Web/root/static/images/bt_disponivel.png differ diff --git a/Fila-Web/root/static/images/bt_encaminhar_atend.png b/Fila-Web/root/static/images/bt_encaminhar_atend.png new file mode 100644 index 0000000..d769e34 Binary files /dev/null and b/Fila-Web/root/static/images/bt_encaminhar_atend.png differ diff --git a/Fila-Web/root/static/images/bt_encerrar_senhas.jpg b/Fila-Web/root/static/images/bt_encerrar_senhas.jpg new file mode 100644 index 0000000..88c69a0 Binary files /dev/null and b/Fila-Web/root/static/images/bt_encerrar_senhas.jpg differ diff --git a/Fila-Web/root/static/images/bt_entrar_login.jpg b/Fila-Web/root/static/images/bt_entrar_login.jpg new file mode 100644 index 0000000..9ce39d5 Binary files /dev/null and b/Fila-Web/root/static/images/bt_entrar_login.jpg differ diff --git a/Fila-Web/root/static/images/bt_enviar_chat.jpg b/Fila-Web/root/static/images/bt_enviar_chat.jpg new file mode 100644 index 0000000..bbac442 Binary files /dev/null and b/Fila-Web/root/static/images/bt_enviar_chat.jpg differ diff --git a/Fila-Web/root/static/images/bt_fechar_local.jpg b/Fila-Web/root/static/images/bt_fechar_local.jpg new file mode 100644 index 0000000..938c560 Binary files /dev/null and b/Fila-Web/root/static/images/bt_fechar_local.jpg differ diff --git a/Fila-Web/root/static/images/bt_fechar_mesa.jpg b/Fila-Web/root/static/images/bt_fechar_mesa.jpg new file mode 100644 index 0000000..79825d2 Binary files /dev/null and b/Fila-Web/root/static/images/bt_fechar_mesa.jpg differ diff --git a/Fila-Web/root/static/images/bt_fechar_mesas.jpg b/Fila-Web/root/static/images/bt_fechar_mesas.jpg new file mode 100644 index 0000000..d7866d5 Binary files /dev/null and b/Fila-Web/root/static/images/bt_fechar_mesas.jpg differ diff --git a/Fila-Web/root/static/images/bt_forcar_fechar.png b/Fila-Web/root/static/images/bt_forcar_fechar.png new file mode 100644 index 0000000..c0467c6 Binary files /dev/null and b/Fila-Web/root/static/images/bt_forcar_fechar.png differ diff --git a/Fila-Web/root/static/images/bt_iniciar_atend.png b/Fila-Web/root/static/images/bt_iniciar_atend.png new file mode 100644 index 0000000..ace04ec Binary files /dev/null and b/Fila-Web/root/static/images/bt_iniciar_atend.png differ diff --git a/Fila-Web/root/static/images/bt_iniciar_pausa.jpg b/Fila-Web/root/static/images/bt_iniciar_pausa.jpg new file mode 100644 index 0000000..a7af474 Binary files /dev/null and b/Fila-Web/root/static/images/bt_iniciar_pausa.jpg differ diff --git a/Fila-Web/root/static/images/bt_iniciar_servico.jpg b/Fila-Web/root/static/images/bt_iniciar_servico.jpg new file mode 100644 index 0000000..624b4b1 Binary files /dev/null and b/Fila-Web/root/static/images/bt_iniciar_servico.jpg differ diff --git a/Fila-Web/root/static/images/bt_ir_para.png b/Fila-Web/root/static/images/bt_ir_para.png new file mode 100755 index 0000000..eb205fe Binary files /dev/null and b/Fila-Web/root/static/images/bt_ir_para.png differ diff --git a/Fila-Web/root/static/images/bt_listar_ausentes.jpg b/Fila-Web/root/static/images/bt_listar_ausentes.jpg new file mode 100644 index 0000000..3f4927e Binary files /dev/null and b/Fila-Web/root/static/images/bt_listar_ausentes.jpg differ diff --git a/Fila-Web/root/static/images/bt_ok.jpg b/Fila-Web/root/static/images/bt_ok.jpg new file mode 100644 index 0000000..5395197 Binary files /dev/null and b/Fila-Web/root/static/images/bt_ok.jpg differ diff --git a/Fila-Web/root/static/images/bt_registrar_ausencia.png b/Fila-Web/root/static/images/bt_registrar_ausencia.png new file mode 100644 index 0000000..46b4ce4 Binary files /dev/null and b/Fila-Web/root/static/images/bt_registrar_ausencia.png differ diff --git a/Fila-Web/root/static/images/bt_retornar_pausa.jpg b/Fila-Web/root/static/images/bt_retornar_pausa.jpg new file mode 100644 index 0000000..697571d Binary files /dev/null and b/Fila-Web/root/static/images/bt_retornar_pausa.jpg differ diff --git a/Fila-Web/root/static/images/bt_voltar.jpg b/Fila-Web/root/static/images/bt_voltar.jpg new file mode 100644 index 0000000..a7af474 Binary files /dev/null and b/Fila-Web/root/static/images/bt_voltar.jpg differ diff --git a/Fila-Web/root/static/images/bt_voltar_serv_interno.png b/Fila-Web/root/static/images/bt_voltar_serv_interno.png new file mode 100644 index 0000000..1380374 Binary files /dev/null and b/Fila-Web/root/static/images/bt_voltar_serv_interno.png differ diff --git a/Fila-Web/root/static/images/btn_120x50_built.png b/Fila-Web/root/static/images/btn_120x50_built.png new file mode 100644 index 0000000..c709fd6 Binary files /dev/null and b/Fila-Web/root/static/images/btn_120x50_built.png differ diff --git a/Fila-Web/root/static/images/btn_120x50_built_shadow.png b/Fila-Web/root/static/images/btn_120x50_built_shadow.png new file mode 100644 index 0000000..15142fe Binary files /dev/null and b/Fila-Web/root/static/images/btn_120x50_built_shadow.png differ diff --git a/Fila-Web/root/static/images/btn_120x50_powered.png b/Fila-Web/root/static/images/btn_120x50_powered.png new file mode 100644 index 0000000..7249b47 Binary files /dev/null and b/Fila-Web/root/static/images/btn_120x50_powered.png differ diff --git a/Fila-Web/root/static/images/btn_120x50_powered_shadow.png b/Fila-Web/root/static/images/btn_120x50_powered_shadow.png new file mode 100644 index 0000000..e6876c0 Binary files /dev/null and b/Fila-Web/root/static/images/btn_120x50_powered_shadow.png differ diff --git a/Fila-Web/root/static/images/btn_88x31_built.png b/Fila-Web/root/static/images/btn_88x31_built.png new file mode 100644 index 0000000..007b5db Binary files /dev/null and b/Fila-Web/root/static/images/btn_88x31_built.png differ diff --git a/Fila-Web/root/static/images/btn_88x31_built_shadow.png b/Fila-Web/root/static/images/btn_88x31_built_shadow.png new file mode 100644 index 0000000..ccf4624 Binary files /dev/null and b/Fila-Web/root/static/images/btn_88x31_built_shadow.png differ diff --git a/Fila-Web/root/static/images/btn_88x31_powered.png b/Fila-Web/root/static/images/btn_88x31_powered.png new file mode 100644 index 0000000..8f0cd9f Binary files /dev/null and b/Fila-Web/root/static/images/btn_88x31_powered.png differ diff --git a/Fila-Web/root/static/images/btn_88x31_powered_shadow.png b/Fila-Web/root/static/images/btn_88x31_powered_shadow.png new file mode 100644 index 0000000..aa776fa Binary files /dev/null and b/Fila-Web/root/static/images/btn_88x31_powered_shadow.png differ diff --git a/Fila-Web/root/static/images/catalyst_logo.png b/Fila-Web/root/static/images/catalyst_logo.png new file mode 100644 index 0000000..21f1cac Binary files /dev/null and b/Fila-Web/root/static/images/catalyst_logo.png differ diff --git a/Fila-Web/root/static/images/icon_atend_atrasados.jpg b/Fila-Web/root/static/images/icon_atend_atrasados.jpg new file mode 100644 index 0000000..0d20cc9 Binary files /dev/null and b/Fila-Web/root/static/images/icon_atend_atrasados.jpg differ diff --git a/Fila-Web/root/static/images/icon_cat.jpg b/Fila-Web/root/static/images/icon_cat.jpg new file mode 100644 index 0000000..ad2fbd4 Binary files /dev/null and b/Fila-Web/root/static/images/icon_cat.jpg differ diff --git a/Fila-Web/root/static/images/icon_chat.jpg b/Fila-Web/root/static/images/icon_chat.jpg new file mode 100644 index 0000000..29e0f2b Binary files /dev/null and b/Fila-Web/root/static/images/icon_chat.jpg differ diff --git a/Fila-Web/root/static/images/icon_encaminhar.png b/Fila-Web/root/static/images/icon_encaminhar.png new file mode 100755 index 0000000..2e26ec7 Binary files /dev/null and b/Fila-Web/root/static/images/icon_encaminhar.png differ diff --git a/Fila-Web/root/static/images/icon_mesa.jpg b/Fila-Web/root/static/images/icon_mesa.jpg new file mode 100644 index 0000000..e0d2703 Binary files /dev/null and b/Fila-Web/root/static/images/icon_mesa.jpg differ diff --git a/Fila-Web/root/static/images/icon_opi_off.png b/Fila-Web/root/static/images/icon_opi_off.png new file mode 100755 index 0000000..0fbab9a Binary files /dev/null and b/Fila-Web/root/static/images/icon_opi_off.png differ diff --git a/Fila-Web/root/static/images/icon_opi_on.png b/Fila-Web/root/static/images/icon_opi_on.png new file mode 100755 index 0000000..37fef93 Binary files /dev/null and b/Fila-Web/root/static/images/icon_opi_on.png differ diff --git a/Fila-Web/root/static/images/icon_relogio.jpg b/Fila-Web/root/static/images/icon_relogio.jpg new file mode 100644 index 0000000..08ddb51 Binary files /dev/null and b/Fila-Web/root/static/images/icon_relogio.jpg differ diff --git a/Fila-Web/root/static/images/icon_senha.jpg b/Fila-Web/root/static/images/icon_senha.jpg new file mode 100644 index 0000000..1600548 Binary files /dev/null and b/Fila-Web/root/static/images/icon_senha.jpg differ diff --git a/Fila-Web/root/static/images/icon_servico.jpg b/Fila-Web/root/static/images/icon_servico.jpg new file mode 100644 index 0000000..1321f41 Binary files /dev/null and b/Fila-Web/root/static/images/icon_servico.jpg differ diff --git a/Fila-Web/root/static/js/prototype-1.6.0.2.js b/Fila-Web/root/static/js/prototype-1.6.0.2.js new file mode 100644 index 0000000..35a6913 --- /dev/null +++ b/Fila-Web/root/static/js/prototype-1.6.0.2.js @@ -0,0 +1,4221 @@ +/* Prototype JavaScript framework, version 1.6.0.2 + * (c) 2005-2008 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://www.prototypejs.org/ + * + *--------------------------------------------------------------------------*/ + +var Prototype = { + Version: '1.6.0.2', + + Browser: { + IE: !!(window.attachEvent && !window.opera), + Opera: !!window.opera, + WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, + Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1, + MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) + }, + + BrowserFeatures: { + XPath: !!document.evaluate, + ElementExtensions: !!window.HTMLElement, + SpecificElementExtensions: + document.createElement('div').__proto__ && + document.createElement('div').__proto__ !== + document.createElement('form').__proto__ + }, + + ScriptFragment: ']*>([\\S\\s]*?)<\/script>', + JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, + + emptyFunction: function() { }, + K: function(x) { return x } +}; + +if (Prototype.Browser.MobileSafari) + Prototype.BrowserFeatures.SpecificElementExtensions = false; + + +/* Based on Alex Arnell's inheritance implementation. */ +var Class = { + create: function() { + var parent = null, properties = $A(arguments); + if (Object.isFunction(properties[0])) + parent = properties.shift(); + + function klass() { + this.initialize.apply(this, arguments); + } + + Object.extend(klass, Class.Methods); + klass.superclass = parent; + klass.subclasses = []; + + if (parent) { + var subclass = function() { }; + subclass.prototype = parent.prototype; + klass.prototype = new subclass; + parent.subclasses.push(klass); + } + + for (var i = 0; i < properties.length; i++) + klass.addMethods(properties[i]); + + if (!klass.prototype.initialize) + klass.prototype.initialize = Prototype.emptyFunction; + + klass.prototype.constructor = klass; + + return klass; + } +}; + +Class.Methods = { + addMethods: function(source) { + var ancestor = this.superclass && this.superclass.prototype; + var properties = Object.keys(source); + + if (!Object.keys({ toString: true }).length) + properties.push("toString", "valueOf"); + + for (var i = 0, length = properties.length; i < length; i++) { + var property = properties[i], value = source[property]; + if (ancestor && Object.isFunction(value) && + value.argumentNames().first() == "$super") { + var method = value, value = Object.extend((function(m) { + return function() { return ancestor[m].apply(this, arguments) }; + })(property).wrap(method), { + valueOf: function() { return method }, + toString: function() { return method.toString() } + }); + } + this.prototype[property] = value; + } + + return this; + } +}; + +var Abstract = { }; + +Object.extend = function(destination, source) { + for (var property in source) + destination[property] = source[property]; + return destination; +}; + +Object.extend(Object, { + inspect: function(object) { + try { + if (Object.isUndefined(object)) return 'undefined'; + if (object === null) return 'null'; + return object.inspect ? object.inspect() : String(object); + } catch (e) { + if (e instanceof RangeError) return '...'; + throw e; + } + }, + + toJSON: function(object) { + var type = typeof object; + switch (type) { + case 'undefined': + case 'function': + case 'unknown': return; + case 'boolean': return object.toString(); + } + + if (object === null) return 'null'; + if (object.toJSON) return object.toJSON(); + if (Object.isElement(object)) return; + + var results = []; + for (var property in object) { + var value = Object.toJSON(object[property]); + if (!Object.isUndefined(value)) + results.push(property.toJSON() + ': ' + value); + } + + return '{' + results.join(', ') + '}'; + }, + + toQueryString: function(object) { + return $H(object).toQueryString(); + }, + + toHTML: function(object) { + return object && object.toHTML ? object.toHTML() : String.interpret(object); + }, + + keys: function(object) { + var keys = []; + for (var property in object) + keys.push(property); + return keys; + }, + + values: function(object) { + var values = []; + for (var property in object) + values.push(object[property]); + return values; + }, + + clone: function(object) { + return Object.extend({ }, object); + }, + + isElement: function(object) { + return object && object.nodeType == 1; + }, + + isArray: function(object) { + return object != null && typeof object == "object" && + 'splice' in object && 'join' in object; + }, + + isHash: function(object) { + return object instanceof Hash; + }, + + isFunction: function(object) { + return typeof object == "function"; + }, + + isString: function(object) { + return typeof object == "string"; + }, + + isNumber: function(object) { + return typeof object == "number"; + }, + + isUndefined: function(object) { + return typeof object == "undefined"; + } +}); + +Object.extend(Function.prototype, { + argumentNames: function() { + var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip"); + return names.length == 1 && !names[0] ? [] : names; + }, + + bind: function() { + if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; + var __method = this, args = $A(arguments), object = args.shift(); + return function() { + return __method.apply(object, args.concat($A(arguments))); + } + }, + + bindAsEventListener: function() { + var __method = this, args = $A(arguments), object = args.shift(); + return function(event) { + return __method.apply(object, [event || window.event].concat(args)); + } + }, + + curry: function() { + if (!arguments.length) return this; + var __method = this, args = $A(arguments); + return function() { + return __method.apply(this, args.concat($A(arguments))); + } + }, + + delay: function() { + var __method = this, args = $A(arguments), timeout = args.shift() * 1000; + return window.setTimeout(function() { + return __method.apply(__method, args); + }, timeout); + }, + + wrap: function(wrapper) { + var __method = this; + return function() { + return wrapper.apply(this, [__method.bind(this)].concat($A(arguments))); + } + }, + + methodize: function() { + if (this._methodized) return this._methodized; + var __method = this; + return this._methodized = function() { + return __method.apply(null, [this].concat($A(arguments))); + }; + } +}); + +Function.prototype.defer = Function.prototype.delay.curry(0.01); + +Date.prototype.toJSON = function() { + return '"' + this.getUTCFullYear() + '-' + + (this.getUTCMonth() + 1).toPaddedString(2) + '-' + + this.getUTCDate().toPaddedString(2) + 'T' + + this.getUTCHours().toPaddedString(2) + ':' + + this.getUTCMinutes().toPaddedString(2) + ':' + + this.getUTCSeconds().toPaddedString(2) + 'Z"'; +}; + +var Try = { + these: function() { + var returnValue; + + for (var i = 0, length = arguments.length; i < length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) { } + } + + return returnValue; + } +}; + +RegExp.prototype.match = RegExp.prototype.test; + +RegExp.escape = function(str) { + return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); +}; + +/*--------------------------------------------------------------------------*/ + +var PeriodicalExecuter = Class.create({ + initialize: function(callback, frequency) { + this.callback = callback; + this.frequency = frequency; + this.currentlyExecuting = false; + + this.registerCallback(); + }, + + registerCallback: function() { + this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + execute: function() { + this.callback(this); + }, + + stop: function() { + if (!this.timer) return; + clearInterval(this.timer); + this.timer = null; + }, + + onTimerEvent: function() { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.execute(); + } finally { + this.currentlyExecuting = false; + } + } + } +}); +Object.extend(String, { + interpret: function(value) { + return value == null ? '' : String(value); + }, + specialChar: { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '\\': '\\\\' + } +}); + +Object.extend(String.prototype, { + gsub: function(pattern, replacement) { + var result = '', source = this, match; + replacement = arguments.callee.prepareReplacement(replacement); + + while (source.length > 0) { + if (match = source.match(pattern)) { + result += source.slice(0, match.index); + result += String.interpret(replacement(match)); + source = source.slice(match.index + match[0].length); + } else { + result += source, source = ''; + } + } + return result; + }, + + sub: function(pattern, replacement, count) { + replacement = this.gsub.prepareReplacement(replacement); + count = Object.isUndefined(count) ? 1 : count; + + return this.gsub(pattern, function(match) { + if (--count < 0) return match[0]; + return replacement(match); + }); + }, + + scan: function(pattern, iterator) { + this.gsub(pattern, iterator); + return String(this); + }, + + truncate: function(length, truncation) { + length = length || 30; + truncation = Object.isUndefined(truncation) ? '...' : truncation; + return this.length > length ? + this.slice(0, length - truncation.length) + truncation : String(this); + }, + + strip: function() { + return this.replace(/^\s+/, '').replace(/\s+$/, ''); + }, + + stripTags: function() { + return this.replace(/<\/?[^>]+>/gi, ''); + }, + + stripScripts: function() { + return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); + }, + + extractScripts: function() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); + var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + return (this.match(matchAll) || []).map(function(scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }); + }, + + evalScripts: function() { + return this.extractScripts().map(function(script) { return eval(script) }); + }, + + escapeHTML: function() { + var self = arguments.callee; + self.text.data = this; + return self.div.innerHTML; + }, + + unescapeHTML: function() { + var div = new Element('div'); + div.innerHTML = this.stripTags(); + return div.childNodes[0] ? (div.childNodes.length > 1 ? + $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : + div.childNodes[0].nodeValue) : ''; + }, + + toQueryParams: function(separator) { + var match = this.strip().match(/([^?#]*)(#.*)?$/); + if (!match) return { }; + + return match[1].split(separator || '&').inject({ }, function(hash, pair) { + if ((pair = pair.split('='))[0]) { + var key = decodeURIComponent(pair.shift()); + var value = pair.length > 1 ? pair.join('=') : pair[0]; + if (value != undefined) value = decodeURIComponent(value); + + if (key in hash) { + if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; + hash[key].push(value); + } + else hash[key] = value; + } + return hash; + }); + }, + + toArray: function() { + return this.split(''); + }, + + succ: function() { + return this.slice(0, this.length - 1) + + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); + }, + + times: function(count) { + return count < 1 ? '' : new Array(count + 1).join(this); + }, + + camelize: function() { + var parts = this.split('-'), len = parts.length; + if (len == 1) return parts[0]; + + var camelized = this.charAt(0) == '-' + ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) + : parts[0]; + + for (var i = 1; i < len; i++) + camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); + + return camelized; + }, + + capitalize: function() { + return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); + }, + + underscore: function() { + return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); + }, + + dasherize: function() { + return this.gsub(/_/,'-'); + }, + + inspect: function(useDoubleQuotes) { + var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { + var character = String.specialChar[match[0]]; + return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); + }); + if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; + return "'" + escapedString.replace(/'/g, '\\\'') + "'"; + }, + + toJSON: function() { + return this.inspect(true); + }, + + unfilterJSON: function(filter) { + return this.sub(filter || Prototype.JSONFilter, '#{1}'); + }, + + isJSON: function() { + var str = this; + if (str.blank()) return false; + str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); + return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); + }, + + evalJSON: function(sanitize) { + var json = this.unfilterJSON(); + try { + if (!sanitize || json.isJSON()) return eval('(' + json + ')'); + } catch (e) { } + throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); + }, + + include: function(pattern) { + return this.indexOf(pattern) > -1; + }, + + startsWith: function(pattern) { + return this.indexOf(pattern) === 0; + }, + + endsWith: function(pattern) { + var d = this.length - pattern.length; + return d >= 0 && this.lastIndexOf(pattern) === d; + }, + + empty: function() { + return this == ''; + }, + + blank: function() { + return /^\s*$/.test(this); + }, + + interpolate: function(object, pattern) { + return new Template(this, pattern).evaluate(object); + } +}); + +if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { + escapeHTML: function() { + return this.replace(/&/g,'&').replace(//g,'>'); + }, + unescapeHTML: function() { + return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); + } +}); + +String.prototype.gsub.prepareReplacement = function(replacement) { + if (Object.isFunction(replacement)) return replacement; + var template = new Template(replacement); + return function(match) { return template.evaluate(match) }; +}; + +String.prototype.parseQuery = String.prototype.toQueryParams; + +Object.extend(String.prototype.escapeHTML, { + div: document.createElement('div'), + text: document.createTextNode('') +}); + +with (String.prototype.escapeHTML) div.appendChild(text); + +var Template = Class.create({ + initialize: function(template, pattern) { + this.template = template.toString(); + this.pattern = pattern || Template.Pattern; + }, + + evaluate: function(object) { + if (Object.isFunction(object.toTemplateReplacements)) + object = object.toTemplateReplacements(); + + return this.template.gsub(this.pattern, function(match) { + if (object == null) return ''; + + var before = match[1] || ''; + if (before == '\\') return match[2]; + + var ctx = object, expr = match[3]; + var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; + match = pattern.exec(expr); + if (match == null) return before; + + while (match != null) { + var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; + ctx = ctx[comp]; + if (null == ctx || '' == match[3]) break; + expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); + match = pattern.exec(expr); + } + + return before + String.interpret(ctx); + }); + } +}); +Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; + +var $break = { }; + +var Enumerable = { + each: function(iterator, context) { + var index = 0; + iterator = iterator.bind(context); + try { + this._each(function(value) { + iterator(value, index++); + }); + } catch (e) { + if (e != $break) throw e; + } + return this; + }, + + eachSlice: function(number, iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var index = -number, slices = [], array = this.toArray(); + while ((index += number) < array.length) + slices.push(array.slice(index, index+number)); + return slices.collect(iterator, context); + }, + + all: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result = true; + this.each(function(value, index) { + result = result && !!iterator(value, index); + if (!result) throw $break; + }); + return result; + }, + + any: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result = false; + this.each(function(value, index) { + if (result = !!iterator(value, index)) + throw $break; + }); + return result; + }, + + collect: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var results = []; + this.each(function(value, index) { + results.push(iterator(value, index)); + }); + return results; + }, + + detect: function(iterator, context) { + iterator = iterator.bind(context); + var result; + this.each(function(value, index) { + if (iterator(value, index)) { + result = value; + throw $break; + } + }); + return result; + }, + + findAll: function(iterator, context) { + iterator = iterator.bind(context); + var results = []; + this.each(function(value, index) { + if (iterator(value, index)) + results.push(value); + }); + return results; + }, + + grep: function(filter, iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var results = []; + + if (Object.isString(filter)) + filter = new RegExp(filter); + + this.each(function(value, index) { + if (filter.match(value)) + results.push(iterator(value, index)); + }); + return results; + }, + + include: function(object) { + if (Object.isFunction(this.indexOf)) + if (this.indexOf(object) != -1) return true; + + var found = false; + this.each(function(value) { + if (value == object) { + found = true; + throw $break; + } + }); + return found; + }, + + inGroupsOf: function(number, fillWith) { + fillWith = Object.isUndefined(fillWith) ? null : fillWith; + return this.eachSlice(number, function(slice) { + while(slice.length < number) slice.push(fillWith); + return slice; + }); + }, + + inject: function(memo, iterator, context) { + iterator = iterator.bind(context); + this.each(function(value, index) { + memo = iterator(memo, value, index); + }); + return memo; + }, + + invoke: function(method) { + var args = $A(arguments).slice(1); + return this.map(function(value) { + return value[method].apply(value, args); + }); + }, + + max: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result; + this.each(function(value, index) { + value = iterator(value, index); + if (result == null || value >= result) + result = value; + }); + return result; + }, + + min: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result; + this.each(function(value, index) { + value = iterator(value, index); + if (result == null || value < result) + result = value; + }); + return result; + }, + + partition: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var trues = [], falses = []; + this.each(function(value, index) { + (iterator(value, index) ? + trues : falses).push(value); + }); + return [trues, falses]; + }, + + pluck: function(property) { + var results = []; + this.each(function(value) { + results.push(value[property]); + }); + return results; + }, + + reject: function(iterator, context) { + iterator = iterator.bind(context); + var results = []; + this.each(function(value, index) { + if (!iterator(value, index)) + results.push(value); + }); + return results; + }, + + sortBy: function(iterator, context) { + iterator = iterator.bind(context); + return this.map(function(value, index) { + return {value: value, criteria: iterator(value, index)}; + }).sort(function(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }).pluck('value'); + }, + + toArray: function() { + return this.map(); + }, + + zip: function() { + var iterator = Prototype.K, args = $A(arguments); + if (Object.isFunction(args.last())) + iterator = args.pop(); + + var collections = [this].concat(args).map($A); + return this.map(function(value, index) { + return iterator(collections.pluck(index)); + }); + }, + + size: function() { + return this.toArray().length; + }, + + inspect: function() { + return '#'; + } +}; + +Object.extend(Enumerable, { + map: Enumerable.collect, + find: Enumerable.detect, + select: Enumerable.findAll, + filter: Enumerable.findAll, + member: Enumerable.include, + entries: Enumerable.toArray, + every: Enumerable.all, + some: Enumerable.any +}); +function $A(iterable) { + if (!iterable) return []; + if (iterable.toArray) return iterable.toArray(); + var length = iterable.length || 0, results = new Array(length); + while (length--) results[length] = iterable[length]; + return results; +} + +if (Prototype.Browser.WebKit) { + $A = function(iterable) { + if (!iterable) return []; + if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') && + iterable.toArray) return iterable.toArray(); + var length = iterable.length || 0, results = new Array(length); + while (length--) results[length] = iterable[length]; + return results; + }; +} + +Array.from = $A; + +Object.extend(Array.prototype, Enumerable); + +if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; + +Object.extend(Array.prototype, { + _each: function(iterator) { + for (var i = 0, length = this.length; i < length; i++) + iterator(this[i]); + }, + + clear: function() { + this.length = 0; + return this; + }, + + first: function() { + return this[0]; + }, + + last: function() { + return this[this.length - 1]; + }, + + compact: function() { + return this.select(function(value) { + return value != null; + }); + }, + + flatten: function() { + return this.inject([], function(array, value) { + return array.concat(Object.isArray(value) ? + value.flatten() : [value]); + }); + }, + + without: function() { + var values = $A(arguments); + return this.select(function(value) { + return !values.include(value); + }); + }, + + reverse: function(inline) { + return (inline !== false ? this : this.toArray())._reverse(); + }, + + reduce: function() { + return this.length > 1 ? this : this[0]; + }, + + uniq: function(sorted) { + return this.inject([], function(array, value, index) { + if (0 == index || (sorted ? array.last() != value : !array.include(value))) + array.push(value); + return array; + }); + }, + + intersect: function(array) { + return this.uniq().findAll(function(item) { + return array.detect(function(value) { return item === value }); + }); + }, + + clone: function() { + return [].concat(this); + }, + + size: function() { + return this.length; + }, + + inspect: function() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + }, + + toJSON: function() { + var results = []; + this.each(function(object) { + var value = Object.toJSON(object); + if (!Object.isUndefined(value)) results.push(value); + }); + return '[' + results.join(', ') + ']'; + } +}); + +// use native browser JS 1.6 implementation if available +if (Object.isFunction(Array.prototype.forEach)) + Array.prototype._each = Array.prototype.forEach; + +if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) { + i || (i = 0); + var length = this.length; + if (i < 0) i = length + i; + for (; i < length; i++) + if (this[i] === item) return i; + return -1; +}; + +if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) { + i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; + var n = this.slice(0, i).reverse().indexOf(item); + return (n < 0) ? n : i - n - 1; +}; + +Array.prototype.toArray = Array.prototype.clone; + +function $w(string) { + if (!Object.isString(string)) return []; + string = string.strip(); + return string ? string.split(/\s+/) : []; +} + +if (Prototype.Browser.Opera){ + Array.prototype.concat = function() { + var array = []; + for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); + for (var i = 0, length = arguments.length; i < length; i++) { + if (Object.isArray(arguments[i])) { + for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) + array.push(arguments[i][j]); + } else { + array.push(arguments[i]); + } + } + return array; + }; +} +Object.extend(Number.prototype, { + toColorPart: function() { + return this.toPaddedString(2, 16); + }, + + succ: function() { + return this + 1; + }, + + times: function(iterator) { + $R(0, this, true).each(iterator); + return this; + }, + + toPaddedString: function(length, radix) { + var string = this.toString(radix || 10); + return '0'.times(length - string.length) + string; + }, + + toJSON: function() { + return isFinite(this) ? this.toString() : 'null'; + } +}); + +$w('abs round ceil floor').each(function(method){ + Number.prototype[method] = Math[method].methodize(); +}); +function $H(object) { + return new Hash(object); +}; + +var Hash = Class.create(Enumerable, (function() { + + function toQueryPair(key, value) { + if (Object.isUndefined(value)) return key; + return key + '=' + encodeURIComponent(String.interpret(value)); + } + + return { + initialize: function(object) { + this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); + }, + + _each: function(iterator) { + for (var key in this._object) { + var value = this._object[key], pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + }, + + set: function(key, value) { + return this._object[key] = value; + }, + + get: function(key) { + return this._object[key]; + }, + + unset: function(key) { + var value = this._object[key]; + delete this._object[key]; + return value; + }, + + toObject: function() { + return Object.clone(this._object); + }, + + keys: function() { + return this.pluck('key'); + }, + + values: function() { + return this.pluck('value'); + }, + + index: function(value) { + var match = this.detect(function(pair) { + return pair.value === value; + }); + return match && match.key; + }, + + merge: function(object) { + return this.clone().update(object); + }, + + update: function(object) { + return new Hash(object).inject(this, function(result, pair) { + result.set(pair.key, pair.value); + return result; + }); + }, + + toQueryString: function() { + return this.map(function(pair) { + var key = encodeURIComponent(pair.key), values = pair.value; + + if (values && typeof values == 'object') { + if (Object.isArray(values)) + return values.map(toQueryPair.curry(key)).join('&'); + } + return toQueryPair(key, values); + }).join('&'); + }, + + inspect: function() { + return '#'; + }, + + toJSON: function() { + return Object.toJSON(this.toObject()); + }, + + clone: function() { + return new Hash(this); + } + } +})()); + +Hash.prototype.toTemplateReplacements = Hash.prototype.toObject; +Hash.from = $H; +var ObjectRange = Class.create(Enumerable, { + initialize: function(start, end, exclusive) { + this.start = start; + this.end = end; + this.exclusive = exclusive; + }, + + _each: function(iterator) { + var value = this.start; + while (this.include(value)) { + iterator(value); + value = value.succ(); + } + }, + + include: function(value) { + if (value < this.start) + return false; + if (this.exclusive) + return value < this.end; + return value <= this.end; + } +}); + +var $R = function(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +}; + +var Ajax = { + getTransport: function() { + return Try.these( + function() {return new XMLHttpRequest()}, + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')} + ) || false; + }, + + activeRequestCount: 0 +}; + +Ajax.Responders = { + responders: [], + + _each: function(iterator) { + this.responders._each(iterator); + }, + + register: function(responder) { + if (!this.include(responder)) + this.responders.push(responder); + }, + + unregister: function(responder) { + this.responders = this.responders.without(responder); + }, + + dispatch: function(callback, request, transport, json) { + this.each(function(responder) { + if (Object.isFunction(responder[callback])) { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) { } + } + }); + } +}; + +Object.extend(Ajax.Responders, Enumerable); + +Ajax.Responders.register({ + onCreate: function() { Ajax.activeRequestCount++ }, + onComplete: function() { Ajax.activeRequestCount-- } +}); + +Ajax.Base = Class.create({ + initialize: function(options) { + this.options = { + method: 'post', + asynchronous: true, + contentType: 'application/x-www-form-urlencoded', + encoding: 'UTF-8', + parameters: '', + evalJSON: true, + evalJS: true + }; + Object.extend(this.options, options || { }); + + this.options.method = this.options.method.toLowerCase(); + + if (Object.isString(this.options.parameters)) + this.options.parameters = this.options.parameters.toQueryParams(); + else if (Object.isHash(this.options.parameters)) + this.options.parameters = this.options.parameters.toObject(); + } +}); + +Ajax.Request = Class.create(Ajax.Base, { + _complete: false, + + initialize: function($super, url, options) { + $super(options); + this.transport = Ajax.getTransport(); + this.request(url); + }, + + request: function(url) { + this.url = url; + this.method = this.options.method; + var params = Object.clone(this.options.parameters); + + if (!['get', 'post'].include(this.method)) { + // simulate other verbs over post + params['_method'] = this.method; + this.method = 'post'; + } + + this.parameters = params; + + if (params = Object.toQueryString(params)) { + // when GET, append parameters to URL + if (this.method == 'get') + this.url += (this.url.include('?') ? '&' : '?') + params; + else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) + params += '&_='; + } + + try { + var response = new Ajax.Response(this); + if (this.options.onCreate) this.options.onCreate(response); + Ajax.Responders.dispatch('onCreate', this, response); + + this.transport.open(this.method.toUpperCase(), this.url, + this.options.asynchronous); + + if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); + + this.transport.onreadystatechange = this.onStateChange.bind(this); + this.setRequestHeaders(); + + this.body = this.method == 'post' ? (this.options.postBody || params) : null; + this.transport.send(this.body); + + /* Force Firefox to handle ready state 4 for synchronous requests */ + if (!this.options.asynchronous && this.transport.overrideMimeType) + this.onStateChange(); + + } + catch (e) { + this.dispatchException(e); + } + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState > 1 && !((readyState == 4) && this._complete)) + this.respondToReadyState(this.transport.readyState); + }, + + setRequestHeaders: function() { + var headers = { + 'X-Requested-With': 'XMLHttpRequest', + 'X-Prototype-Version': Prototype.Version, + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }; + + if (this.method == 'post') { + headers['Content-type'] = this.options.contentType + + (this.options.encoding ? '; charset=' + this.options.encoding : ''); + + /* Force "Connection: close" for older Mozilla browsers to work + * around a bug where XMLHttpRequest sends an incorrect + * Content-length header. See Mozilla Bugzilla #246651. + */ + if (this.transport.overrideMimeType && + (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) + headers['Connection'] = 'close'; + } + + // user-defined headers + if (typeof this.options.requestHeaders == 'object') { + var extras = this.options.requestHeaders; + + if (Object.isFunction(extras.push)) + for (var i = 0, length = extras.length; i < length; i += 2) + headers[extras[i]] = extras[i+1]; + else + $H(extras).each(function(pair) { headers[pair.key] = pair.value }); + } + + for (var name in headers) + this.transport.setRequestHeader(name, headers[name]); + }, + + success: function() { + var status = this.getStatus(); + return !status || (status >= 200 && status < 300); + }, + + getStatus: function() { + try { + return this.transport.status || 0; + } catch (e) { return 0 } + }, + + respondToReadyState: function(readyState) { + var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); + + if (state == 'Complete') { + try { + this._complete = true; + (this.options['on' + response.status] + || this.options['on' + (this.success() ? 'Success' : 'Failure')] + || Prototype.emptyFunction)(response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + var contentType = response.getHeader('Content-type'); + if (this.options.evalJS == 'force' + || (this.options.evalJS && this.isSameOrigin() && contentType + && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) + this.evalResponse(); + } + + try { + (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); + Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + if (state == 'Complete') { + // avoid memory leak in MSIE: clean up + this.transport.onreadystatechange = Prototype.emptyFunction; + } + }, + + isSameOrigin: function() { + var m = this.url.match(/^\s*https?:\/\/[^\/]*/); + return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ + protocol: location.protocol, + domain: document.domain, + port: location.port ? ':' + location.port : '' + })); + }, + + getHeader: function(name) { + try { + return this.transport.getResponseHeader(name) || null; + } catch (e) { return null } + }, + + evalResponse: function() { + try { + return eval((this.transport.responseText || '').unfilterJSON()); + } catch (e) { + this.dispatchException(e); + } + }, + + dispatchException: function(exception) { + (this.options.onException || Prototype.emptyFunction)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + +Ajax.Response = Class.create({ + initialize: function(request){ + this.request = request; + var transport = this.transport = request.transport, + readyState = this.readyState = transport.readyState; + + if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { + this.status = this.getStatus(); + this.statusText = this.getStatusText(); + this.responseText = String.interpret(transport.responseText); + this.headerJSON = this._getHeaderJSON(); + } + + if(readyState == 4) { + var xml = transport.responseXML; + this.responseXML = Object.isUndefined(xml) ? null : xml; + this.responseJSON = this._getResponseJSON(); + } + }, + + status: 0, + statusText: '', + + getStatus: Ajax.Request.prototype.getStatus, + + getStatusText: function() { + try { + return this.transport.statusText || ''; + } catch (e) { return '' } + }, + + getHeader: Ajax.Request.prototype.getHeader, + + getAllHeaders: function() { + try { + return this.getAllResponseHeaders(); + } catch (e) { return null } + }, + + getResponseHeader: function(name) { + return this.transport.getResponseHeader(name); + }, + + getAllResponseHeaders: function() { + return this.transport.getAllResponseHeaders(); + }, + + _getHeaderJSON: function() { + var json = this.getHeader('X-JSON'); + if (!json) return null; + json = decodeURIComponent(escape(json)); + try { + return json.evalJSON(this.request.options.sanitizeJSON || + !this.request.isSameOrigin()); + } catch (e) { + this.request.dispatchException(e); + } + }, + + _getResponseJSON: function() { + var options = this.request.options; + if (!options.evalJSON || (options.evalJSON != 'force' && + !(this.getHeader('Content-type') || '').include('application/json')) || + this.responseText.blank()) + return null; + try { + return this.responseText.evalJSON(options.sanitizeJSON || + !this.request.isSameOrigin()); + } catch (e) { + this.request.dispatchException(e); + } + } +}); + +Ajax.Updater = Class.create(Ajax.Request, { + initialize: function($super, container, url, options) { + this.container = { + success: (container.success || container), + failure: (container.failure || (container.success ? null : container)) + }; + + options = Object.clone(options); + var onComplete = options.onComplete; + options.onComplete = (function(response, json) { + this.updateContent(response.responseText); + if (Object.isFunction(onComplete)) onComplete(response, json); + }).bind(this); + + $super(url, options); + }, + + updateContent: function(responseText) { + var receiver = this.container[this.success() ? 'success' : 'failure'], + options = this.options; + + if (!options.evalScripts) responseText = responseText.stripScripts(); + + if (receiver = $(receiver)) { + if (options.insertion) { + if (Object.isString(options.insertion)) { + var insertion = { }; insertion[options.insertion] = responseText; + receiver.insert(insertion); + } + else options.insertion(receiver, responseText); + } + else receiver.update(responseText); + } + } +}); + +Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { + initialize: function($super, container, url, options) { + $super(options); + this.onComplete = this.options.onComplete; + + this.frequency = (this.options.frequency || 2); + this.decay = (this.options.decay || 1); + + this.updater = { }; + this.container = container; + this.url = url; + + this.start(); + }, + + start: function() { + this.options.onComplete = this.updateComplete.bind(this); + this.onTimerEvent(); + }, + + stop: function() { + this.updater.options.onComplete = undefined; + clearTimeout(this.timer); + (this.onComplete || Prototype.emptyFunction).apply(this, arguments); + }, + + updateComplete: function(response) { + if (this.options.decay) { + this.decay = (response.responseText == this.lastText ? + this.decay * this.options.decay : 1); + + this.lastText = response.responseText; + } + this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); + }, + + onTimerEvent: function() { + this.updater = new Ajax.Updater(this.container, this.url, this.options); + } +}); +function $(element) { + if (arguments.length > 1) { + for (var i = 0, elements = [], length = arguments.length; i < length; i++) + elements.push($(arguments[i])); + return elements; + } + if (Object.isString(element)) + element = document.getElementById(element); + return Element.extend(element); +} + +if (Prototype.BrowserFeatures.XPath) { + document._getElementsByXPath = function(expression, parentElement) { + var results = []; + var query = document.evaluate(expression, $(parentElement) || document, + null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = 0, length = query.snapshotLength; i < length; i++) + results.push(Element.extend(query.snapshotItem(i))); + return results; + }; +} + +/*--------------------------------------------------------------------------*/ + +if (!window.Node) var Node = { }; + +if (!Node.ELEMENT_NODE) { + // DOM level 2 ECMAScript Language Binding + Object.extend(Node, { + ELEMENT_NODE: 1, + ATTRIBUTE_NODE: 2, + TEXT_NODE: 3, + CDATA_SECTION_NODE: 4, + ENTITY_REFERENCE_NODE: 5, + ENTITY_NODE: 6, + PROCESSING_INSTRUCTION_NODE: 7, + COMMENT_NODE: 8, + DOCUMENT_NODE: 9, + DOCUMENT_TYPE_NODE: 10, + DOCUMENT_FRAGMENT_NODE: 11, + NOTATION_NODE: 12 + }); +} + +(function() { + var element = this.Element; + this.Element = function(tagName, attributes) { + attributes = attributes || { }; + tagName = tagName.toLowerCase(); + var cache = Element.cache; + if (Prototype.Browser.IE && attributes.name) { + tagName = '<' + tagName + ' name="' + attributes.name + '">'; + delete attributes.name; + return Element.writeAttribute(document.createElement(tagName), attributes); + } + if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); + return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); + }; + Object.extend(this.Element, element || { }); +}).call(window); + +Element.cache = { }; + +Element.Methods = { + visible: function(element) { + return $(element).style.display != 'none'; + }, + + toggle: function(element) { + element = $(element); + Element[Element.visible(element) ? 'hide' : 'show'](element); + return element; + }, + + hide: function(element) { + $(element).style.display = 'none'; + return element; + }, + + show: function(element) { + $(element).style.display = ''; + return element; + }, + + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + return element; + }, + + update: function(element, content) { + element = $(element); + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) return element.update().insert(content); + content = Object.toHTML(content); + element.innerHTML = content.stripScripts(); + content.evalScripts.bind(content).defer(); + return element; + }, + + replace: function(element, content) { + element = $(element); + if (content && content.toElement) content = content.toElement(); + else if (!Object.isElement(content)) { + content = Object.toHTML(content); + var range = element.ownerDocument.createRange(); + range.selectNode(element); + content.evalScripts.bind(content).defer(); + content = range.createContextualFragment(content.stripScripts()); + } + element.parentNode.replaceChild(content, element); + return element; + }, + + insert: function(element, insertions) { + element = $(element); + + if (Object.isString(insertions) || Object.isNumber(insertions) || + Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) + insertions = {bottom:insertions}; + + var content, insert, tagName, childNodes; + + for (var position in insertions) { + content = insertions[position]; + position = position.toLowerCase(); + insert = Element._insertionTranslations[position]; + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + insert(element, content); + continue; + } + + content = Object.toHTML(content); + + tagName = ((position == 'before' || position == 'after') + ? element.parentNode : element).tagName.toUpperCase(); + + childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + + if (position == 'top' || position == 'after') childNodes.reverse(); + childNodes.each(insert.curry(element)); + + content.evalScripts.bind(content).defer(); + } + + return element; + }, + + wrap: function(element, wrapper, attributes) { + element = $(element); + if (Object.isElement(wrapper)) + $(wrapper).writeAttribute(attributes || { }); + else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); + else wrapper = new Element('div', wrapper); + if (element.parentNode) + element.parentNode.replaceChild(wrapper, element); + wrapper.appendChild(element); + return wrapper; + }, + + inspect: function(element) { + element = $(element); + var result = '<' + element.tagName.toLowerCase(); + $H({'id': 'id', 'className': 'class'}).each(function(pair) { + var property = pair.first(), attribute = pair.last(); + var value = (element[property] || '').toString(); + if (value) result += ' ' + attribute + '=' + value.inspect(true); + }); + return result + '>'; + }, + + recursivelyCollect: function(element, property) { + element = $(element); + var elements = []; + while (element = element[property]) + if (element.nodeType == 1) + elements.push(Element.extend(element)); + return elements; + }, + + ancestors: function(element) { + return $(element).recursivelyCollect('parentNode'); + }, + + descendants: function(element) { + return $(element).select("*"); + }, + + firstDescendant: function(element) { + element = $(element).firstChild; + while (element && element.nodeType != 1) element = element.nextSibling; + return $(element); + }, + + immediateDescendants: function(element) { + if (!(element = $(element).firstChild)) return []; + while (element && element.nodeType != 1) element = element.nextSibling; + if (element) return [element].concat($(element).nextSiblings()); + return []; + }, + + previousSiblings: function(element) { + return $(element).recursivelyCollect('previousSibling'); + }, + + nextSiblings: function(element) { + return $(element).recursivelyCollect('nextSibling'); + }, + + siblings: function(element) { + element = $(element); + return element.previousSiblings().reverse().concat(element.nextSiblings()); + }, + + match: function(element, selector) { + if (Object.isString(selector)) + selector = new Selector(selector); + return selector.match($(element)); + }, + + up: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(element.parentNode); + var ancestors = element.ancestors(); + return Object.isNumber(expression) ? ancestors[expression] : + Selector.findElement(ancestors, expression, index); + }, + + down: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return element.firstDescendant(); + return Object.isNumber(expression) ? element.descendants()[expression] : + element.select(expression)[index || 0]; + }, + + previous: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); + var previousSiblings = element.previousSiblings(); + return Object.isNumber(expression) ? previousSiblings[expression] : + Selector.findElement(previousSiblings, expression, index); + }, + + next: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); + var nextSiblings = element.nextSiblings(); + return Object.isNumber(expression) ? nextSiblings[expression] : + Selector.findElement(nextSiblings, expression, index); + }, + + select: function() { + var args = $A(arguments), element = $(args.shift()); + return Selector.findChildElements(element, args); + }, + + adjacent: function() { + var args = $A(arguments), element = $(args.shift()); + return Selector.findChildElements(element.parentNode, args).without(element); + }, + + identify: function(element) { + element = $(element); + var id = element.readAttribute('id'), self = arguments.callee; + if (id) return id; + do { id = 'anonymous_element_' + self.counter++ } while ($(id)); + element.writeAttribute('id', id); + return id; + }, + + readAttribute: function(element, name) { + element = $(element); + if (Prototype.Browser.IE) { + var t = Element._attributeTranslations.read; + if (t.values[name]) return t.values[name](element, name); + if (t.names[name]) name = t.names[name]; + if (name.include(':')) { + return (!element.attributes || !element.attributes[name]) ? null : + element.attributes[name].value; + } + } + return element.getAttribute(name); + }, + + writeAttribute: function(element, name, value) { + element = $(element); + var attributes = { }, t = Element._attributeTranslations.write; + + if (typeof name == 'object') attributes = name; + else attributes[name] = Object.isUndefined(value) ? true : value; + + for (var attr in attributes) { + name = t.names[attr] || attr; + value = attributes[attr]; + if (t.values[attr]) name = t.values[attr](element, value); + if (value === false || value === null) + element.removeAttribute(name); + else if (value === true) + element.setAttribute(name, name); + else element.setAttribute(name, value); + } + return element; + }, + + getHeight: function(element) { + return $(element).getDimensions().height; + }, + + getWidth: function(element) { + return $(element).getDimensions().width; + }, + + classNames: function(element) { + return new Element.ClassNames(element); + }, + + hasClassName: function(element, className) { + if (!(element = $(element))) return; + var elementClassName = element.className; + return (elementClassName.length > 0 && (elementClassName == className || + new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); + }, + + addClassName: function(element, className) { + if (!(element = $(element))) return; + if (!element.hasClassName(className)) + element.className += (element.className ? ' ' : '') + className; + return element; + }, + + removeClassName: function(element, className) { + if (!(element = $(element))) return; + element.className = element.className.replace( + new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); + return element; + }, + + toggleClassName: function(element, className) { + if (!(element = $(element))) return; + return element[element.hasClassName(className) ? + 'removeClassName' : 'addClassName'](className); + }, + + // removes whitespace-only text node children + cleanWhitespace: function(element) { + element = $(element); + var node = element.firstChild; + while (node) { + var nextNode = node.nextSibling; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) + element.removeChild(node); + node = nextNode; + } + return element; + }, + + empty: function(element) { + return $(element).innerHTML.blank(); + }, + + descendantOf: function(element, ancestor) { + element = $(element), ancestor = $(ancestor); + var originalAncestor = ancestor; + + if (element.compareDocumentPosition) + return (element.compareDocumentPosition(ancestor) & 8) === 8; + + if (element.sourceIndex && !Prototype.Browser.Opera) { + var e = element.sourceIndex, a = ancestor.sourceIndex, + nextAncestor = ancestor.nextSibling; + if (!nextAncestor) { + do { ancestor = ancestor.parentNode; } + while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode); + } + if (nextAncestor && nextAncestor.sourceIndex) + return (e > a && e < nextAncestor.sourceIndex); + } + + while (element = element.parentNode) + if (element == originalAncestor) return true; + return false; + }, + + scrollTo: function(element) { + element = $(element); + var pos = element.cumulativeOffset(); + window.scrollTo(pos[0], pos[1]); + return element; + }, + + getStyle: function(element, style) { + element = $(element); + style = style == 'float' ? 'cssFloat' : style.camelize(); + var value = element.style[style]; + if (!value) { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css[style] : null; + } + if (style == 'opacity') return value ? parseFloat(value) : 1.0; + return value == 'auto' ? null : value; + }, + + getOpacity: function(element) { + return $(element).getStyle('opacity'); + }, + + setStyle: function(element, styles) { + element = $(element); + var elementStyle = element.style, match; + if (Object.isString(styles)) { + element.style.cssText += ';' + styles; + return styles.include('opacity') ? + element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; + } + for (var property in styles) + if (property == 'opacity') element.setOpacity(styles[property]); + else + elementStyle[(property == 'float' || property == 'cssFloat') ? + (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : + property] = styles[property]; + + return element; + }, + + setOpacity: function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + return element; + }, + + getDimensions: function(element) { + element = $(element); + var display = $(element).getStyle('display'); + if (display != 'none' && display != null) // Safari bug + return {width: element.offsetWidth, height: element.offsetHeight}; + + // All *Width and *Height properties give 0 on elements with display none, + // so enable the element temporarily + var els = element.style; + var originalVisibility = els.visibility; + var originalPosition = els.position; + var originalDisplay = els.display; + els.visibility = 'hidden'; + els.position = 'absolute'; + els.display = 'block'; + var originalWidth = element.clientWidth; + var originalHeight = element.clientHeight; + els.display = originalDisplay; + els.position = originalPosition; + els.visibility = originalVisibility; + return {width: originalWidth, height: originalHeight}; + }, + + makePositioned: function(element) { + element = $(element); + var pos = Element.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + element._madePositioned = true; + element.style.position = 'relative'; + // Opera returns the offset relative to the positioning context, when an + // element is position relative but top and left have not been defined + if (window.opera) { + element.style.top = 0; + element.style.left = 0; + } + } + return element; + }, + + undoPositioned: function(element) { + element = $(element); + if (element._madePositioned) { + element._madePositioned = undefined; + element.style.position = + element.style.top = + element.style.left = + element.style.bottom = + element.style.right = ''; + } + return element; + }, + + makeClipping: function(element) { + element = $(element); + if (element._overflow) return element; + element._overflow = Element.getStyle(element, 'overflow') || 'auto'; + if (element._overflow !== 'hidden') + element.style.overflow = 'hidden'; + return element; + }, + + undoClipping: function(element) { + element = $(element); + if (!element._overflow) return element; + element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; + element._overflow = null; + return element; + }, + + cumulativeOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + positionedOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (element.tagName == 'BODY') break; + var p = Element.getStyle(element, 'position'); + if (p !== 'static') break; + } + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + absolutize: function(element) { + element = $(element); + if (element.getStyle('position') == 'absolute') return; + // Position.prepare(); // To be done manually by Scripty when it needs it. + + var offsets = element.positionedOffset(); + var top = offsets[1]; + var left = offsets[0]; + var width = element.clientWidth; + var height = element.clientHeight; + + element._originalLeft = left - parseFloat(element.style.left || 0); + element._originalTop = top - parseFloat(element.style.top || 0); + element._originalWidth = element.style.width; + element._originalHeight = element.style.height; + + element.style.position = 'absolute'; + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.width = width + 'px'; + element.style.height = height + 'px'; + return element; + }, + + relativize: function(element) { + element = $(element); + if (element.getStyle('position') == 'relative') return; + // Position.prepare(); // To be done manually by Scripty when it needs it. + + element.style.position = 'relative'; + var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); + var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); + + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.height = element._originalHeight; + element.style.width = element._originalWidth; + return element; + }, + + cumulativeScrollOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + getOffsetParent: function(element) { + if (element.offsetParent) return $(element.offsetParent); + if (element == document.body) return $(element); + + while ((element = element.parentNode) && element != document.body) + if (Element.getStyle(element, 'position') != 'static') + return $(element); + + return $(document.body); + }, + + viewportOffset: function(forElement) { + var valueT = 0, valueL = 0; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + // Safari fix + if (element.offsetParent == document.body && + Element.getStyle(element, 'position') == 'absolute') break; + + } while (element = element.offsetParent); + + element = forElement; + do { + if (!Prototype.Browser.Opera || element.tagName == 'BODY') { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while (element = element.parentNode); + + return Element._returnOffset(valueL, valueT); + }, + + clonePosition: function(element, source) { + var options = Object.extend({ + setLeft: true, + setTop: true, + setWidth: true, + setHeight: true, + offsetTop: 0, + offsetLeft: 0 + }, arguments[2] || { }); + + // find page position of source + source = $(source); + var p = source.viewportOffset(); + + // find coordinate system to use + element = $(element); + var delta = [0, 0]; + var parent = null; + // delta [0,0] will do fine with position: fixed elements, + // position:absolute needs offsetParent deltas + if (Element.getStyle(element, 'position') == 'absolute') { + parent = element.getOffsetParent(); + delta = parent.viewportOffset(); + } + + // correct by body offsets (fixes Safari) + if (parent == document.body) { + delta[0] -= document.body.offsetLeft; + delta[1] -= document.body.offsetTop; + } + + // set position + if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; + if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; + if (options.setWidth) element.style.width = source.offsetWidth + 'px'; + if (options.setHeight) element.style.height = source.offsetHeight + 'px'; + return element; + } +}; + +Element.Methods.identify.counter = 1; + +Object.extend(Element.Methods, { + getElementsBySelector: Element.Methods.select, + childElements: Element.Methods.immediateDescendants +}); + +Element._attributeTranslations = { + write: { + names: { + className: 'class', + htmlFor: 'for' + }, + values: { } + } +}; + +if (Prototype.Browser.Opera) { + Element.Methods.getStyle = Element.Methods.getStyle.wrap( + function(proceed, element, style) { + switch (style) { + case 'left': case 'top': case 'right': case 'bottom': + if (proceed(element, 'position') === 'static') return null; + case 'height': case 'width': + // returns '0px' for hidden elements; we want it to return null + if (!Element.visible(element)) return null; + + // returns the border-box dimensions rather than the content-box + // dimensions, so we subtract padding and borders from the value + var dim = parseInt(proceed(element, style), 10); + + if (dim !== element['offset' + style.capitalize()]) + return dim + 'px'; + + var properties; + if (style === 'height') { + properties = ['border-top-width', 'padding-top', + 'padding-bottom', 'border-bottom-width']; + } + else { + properties = ['border-left-width', 'padding-left', + 'padding-right', 'border-right-width']; + } + return properties.inject(dim, function(memo, property) { + var val = proceed(element, property); + return val === null ? memo : memo - parseInt(val, 10); + }) + 'px'; + default: return proceed(element, style); + } + } + ); + + Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( + function(proceed, element, attribute) { + if (attribute === 'title') return element.title; + return proceed(element, attribute); + } + ); +} + +else if (Prototype.Browser.IE) { + // IE doesn't report offsets correctly for static elements, so we change them + // to "relative" to get the values, then change them back. + Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( + function(proceed, element) { + element = $(element); + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + + $w('positionedOffset viewportOffset').each(function(method) { + Element.Methods[method] = Element.Methods[method].wrap( + function(proceed, element) { + element = $(element); + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + // Trigger hasLayout on the offset parent so that IE6 reports + // accurate offsetTop and offsetLeft values for position: fixed. + var offsetParent = element.getOffsetParent(); + if (offsetParent && offsetParent.getStyle('position') === 'fixed') + offsetParent.setStyle({ zoom: 1 }); + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + }); + + Element.Methods.getStyle = function(element, style) { + element = $(element); + style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); + var value = element.style[style]; + if (!value && element.currentStyle) value = element.currentStyle[style]; + + if (style == 'opacity') { + if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) + if (value[1]) return parseFloat(value[1]) / 100; + return 1.0; + } + + if (value == 'auto') { + if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) + return element['offset' + style.capitalize()] + 'px'; + return null; + } + return value; + }; + + Element.Methods.setOpacity = function(element, value) { + function stripAlpha(filter){ + return filter.replace(/alpha\([^\)]*\)/gi,''); + } + element = $(element); + var currentStyle = element.currentStyle; + if ((currentStyle && !currentStyle.hasLayout) || + (!currentStyle && element.style.zoom == 'normal')) + element.style.zoom = 1; + + var filter = element.getStyle('filter'), style = element.style; + if (value == 1 || value === '') { + (filter = stripAlpha(filter)) ? + style.filter = filter : style.removeAttribute('filter'); + return element; + } else if (value < 0.00001) value = 0; + style.filter = stripAlpha(filter) + + 'alpha(opacity=' + (value * 100) + ')'; + return element; + }; + + Element._attributeTranslations = { + read: { + names: { + 'class': 'className', + 'for': 'htmlFor' + }, + values: { + _getAttr: function(element, attribute) { + return element.getAttribute(attribute, 2); + }, + _getAttrNode: function(element, attribute) { + var node = element.getAttributeNode(attribute); + return node ? node.value : ""; + }, + _getEv: function(element, attribute) { + attribute = element.getAttribute(attribute); + return attribute ? attribute.toString().slice(23, -2) : null; + }, + _flag: function(element, attribute) { + return $(element).hasAttribute(attribute) ? attribute : null; + }, + style: function(element) { + return element.style.cssText.toLowerCase(); + }, + title: function(element) { + return element.title; + } + } + } + }; + + Element._attributeTranslations.write = { + names: Object.extend({ + cellpadding: 'cellPadding', + cellspacing: 'cellSpacing' + }, Element._attributeTranslations.read.names), + values: { + checked: function(element, value) { + element.checked = !!value; + }, + + style: function(element, value) { + element.style.cssText = value ? value : ''; + } + } + }; + + Element._attributeTranslations.has = {}; + + $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + + 'encType maxLength readOnly longDesc').each(function(attr) { + Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; + Element._attributeTranslations.has[attr.toLowerCase()] = attr; + }); + + (function(v) { + Object.extend(v, { + href: v._getAttr, + src: v._getAttr, + type: v._getAttr, + action: v._getAttrNode, + disabled: v._flag, + checked: v._flag, + readonly: v._flag, + multiple: v._flag, + onload: v._getEv, + onunload: v._getEv, + onclick: v._getEv, + ondblclick: v._getEv, + onmousedown: v._getEv, + onmouseup: v._getEv, + onmouseover: v._getEv, + onmousemove: v._getEv, + onmouseout: v._getEv, + onfocus: v._getEv, + onblur: v._getEv, + onkeypress: v._getEv, + onkeydown: v._getEv, + onkeyup: v._getEv, + onsubmit: v._getEv, + onreset: v._getEv, + onselect: v._getEv, + onchange: v._getEv + }); + })(Element._attributeTranslations.read.values); +} + +else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1) ? 0.999999 : + (value === '') ? '' : (value < 0.00001) ? 0 : value; + return element; + }; +} + +else if (Prototype.Browser.WebKit) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + + if (value == 1) + if(element.tagName == 'IMG' && element.width) { + element.width++; element.width--; + } else try { + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch (e) { } + + return element; + }; + + // Safari returns margins on body which is incorrect if the child is absolutely + // positioned. For performance reasons, redefine Element#cumulativeOffset for + // KHTML/WebKit only. + Element.Methods.cumulativeOffset = function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) + if (Element.getStyle(element, 'position') == 'absolute') break; + + element = element.offsetParent; + } while (element); + + return Element._returnOffset(valueL, valueT); + }; +} + +if (Prototype.Browser.IE || Prototype.Browser.Opera) { + // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements + Element.Methods.update = function(element, content) { + element = $(element); + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) return element.update().insert(content); + + content = Object.toHTML(content); + var tagName = element.tagName.toUpperCase(); + + if (tagName in Element._insertionTranslations.tags) { + $A(element.childNodes).each(function(node) { element.removeChild(node) }); + Element._getContentFromAnonymousElement(tagName, content.stripScripts()) + .each(function(node) { element.appendChild(node) }); + } + else element.innerHTML = content.stripScripts(); + + content.evalScripts.bind(content).defer(); + return element; + }; +} + +if ('outerHTML' in document.createElement('div')) { + Element.Methods.replace = function(element, content) { + element = $(element); + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + element.parentNode.replaceChild(content, element); + return element; + } + + content = Object.toHTML(content); + var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); + + if (Element._insertionTranslations.tags[tagName]) { + var nextSibling = element.next(); + var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + parent.removeChild(element); + if (nextSibling) + fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); + else + fragments.each(function(node) { parent.appendChild(node) }); + } + else element.outerHTML = content.stripScripts(); + + content.evalScripts.bind(content).defer(); + return element; + }; +} + +Element._returnOffset = function(l, t) { + var result = [l, t]; + result.left = l; + result.top = t; + return result; +}; + +Element._getContentFromAnonymousElement = function(tagName, html) { + var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; + if (t) { + div.innerHTML = t[0] + html + t[1]; + t[2].times(function() { div = div.firstChild }); + } else div.innerHTML = html; + return $A(div.childNodes); +}; + +Element._insertionTranslations = { + before: function(element, node) { + element.parentNode.insertBefore(node, element); + }, + top: function(element, node) { + element.insertBefore(node, element.firstChild); + }, + bottom: function(element, node) { + element.appendChild(node); + }, + after: function(element, node) { + element.parentNode.insertBefore(node, element.nextSibling); + }, + tags: { + TABLE: ['', '
    ', 1], + TBODY: ['', '
    ', 2], + TR: ['', '
    ', 3], + TD: ['
    ', '
    ', 4], + SELECT: ['', 1] + } +}; + +(function() { + Object.extend(this.tags, { + THEAD: this.tags.TBODY, + TFOOT: this.tags.TBODY, + TH: this.tags.TD + }); +}).call(Element._insertionTranslations); + +Element.Methods.Simulated = { + hasAttribute: function(element, attribute) { + attribute = Element._attributeTranslations.has[attribute] || attribute; + var node = $(element).getAttributeNode(attribute); + return node && node.specified; + } +}; + +Element.Methods.ByTag = { }; + +Object.extend(Element, Element.Methods); + +if (!Prototype.BrowserFeatures.ElementExtensions && + document.createElement('div').__proto__) { + window.HTMLElement = { }; + window.HTMLElement.prototype = document.createElement('div').__proto__; + Prototype.BrowserFeatures.ElementExtensions = true; +} + +Element.extend = (function() { + if (Prototype.BrowserFeatures.SpecificElementExtensions) + return Prototype.K; + + var Methods = { }, ByTag = Element.Methods.ByTag; + + var extend = Object.extend(function(element) { + if (!element || element._extendedByPrototype || + element.nodeType != 1 || element == window) return element; + + var methods = Object.clone(Methods), + tagName = element.tagName, property, value; + + // extend methods for specific tags + if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); + + for (property in methods) { + value = methods[property]; + if (Object.isFunction(value) && !(property in element)) + element[property] = value.methodize(); + } + + element._extendedByPrototype = Prototype.emptyFunction; + return element; + + }, { + refresh: function() { + // extend methods for all tags (Safari doesn't need this) + if (!Prototype.BrowserFeatures.ElementExtensions) { + Object.extend(Methods, Element.Methods); + Object.extend(Methods, Element.Methods.Simulated); + } + } + }); + + extend.refresh(); + return extend; +})(); + +Element.hasAttribute = function(element, attribute) { + if (element.hasAttribute) return element.hasAttribute(attribute); + return Element.Methods.Simulated.hasAttribute(element, attribute); +}; + +Element.addMethods = function(methods) { + var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; + + if (!methods) { + Object.extend(Form, Form.Methods); + Object.extend(Form.Element, Form.Element.Methods); + Object.extend(Element.Methods.ByTag, { + "FORM": Object.clone(Form.Methods), + "INPUT": Object.clone(Form.Element.Methods), + "SELECT": Object.clone(Form.Element.Methods), + "TEXTAREA": Object.clone(Form.Element.Methods) + }); + } + + if (arguments.length == 2) { + var tagName = methods; + methods = arguments[1]; + } + + if (!tagName) Object.extend(Element.Methods, methods || { }); + else { + if (Object.isArray(tagName)) tagName.each(extend); + else extend(tagName); + } + + function extend(tagName) { + tagName = tagName.toUpperCase(); + if (!Element.Methods.ByTag[tagName]) + Element.Methods.ByTag[tagName] = { }; + Object.extend(Element.Methods.ByTag[tagName], methods); + } + + function copy(methods, destination, onlyIfAbsent) { + onlyIfAbsent = onlyIfAbsent || false; + for (var property in methods) { + var value = methods[property]; + if (!Object.isFunction(value)) continue; + if (!onlyIfAbsent || !(property in destination)) + destination[property] = value.methodize(); + } + } + + function findDOMClass(tagName) { + var klass; + var trans = { + "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", + "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", + "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", + "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", + "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": + "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": + "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": + "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": + "FrameSet", "IFRAME": "IFrame" + }; + if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName.capitalize() + 'Element'; + if (window[klass]) return window[klass]; + + window[klass] = { }; + window[klass].prototype = document.createElement(tagName).__proto__; + return window[klass]; + } + + if (F.ElementExtensions) { + copy(Element.Methods, HTMLElement.prototype); + copy(Element.Methods.Simulated, HTMLElement.prototype, true); + } + + if (F.SpecificElementExtensions) { + for (var tag in Element.Methods.ByTag) { + var klass = findDOMClass(tag); + if (Object.isUndefined(klass)) continue; + copy(T[tag], klass.prototype); + } + } + + Object.extend(Element, Element.Methods); + delete Element.ByTag; + + if (Element.extend.refresh) Element.extend.refresh(); + Element.cache = { }; +}; + +document.viewport = { + getDimensions: function() { + var dimensions = { }; + var B = Prototype.Browser; + $w('width height').each(function(d) { + var D = d.capitalize(); + dimensions[d] = (B.WebKit && !document.evaluate) ? self['inner' + D] : + (B.Opera) ? document.body['client' + D] : document.documentElement['client' + D]; + }); + return dimensions; + }, + + getWidth: function() { + return this.getDimensions().width; + }, + + getHeight: function() { + return this.getDimensions().height; + }, + + getScrollOffsets: function() { + return Element._returnOffset( + window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, + window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); + } +}; +/* Portions of the Selector class are derived from Jack Slocum’s DomQuery, + * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style + * license. Please see http://www.yui-ext.com/ for more information. */ + +var Selector = Class.create({ + initialize: function(expression) { + this.expression = expression.strip(); + this.compileMatcher(); + }, + + shouldUseXPath: function() { + if (!Prototype.BrowserFeatures.XPath) return false; + + var e = this.expression; + + // Safari 3 chokes on :*-of-type and :empty + if (Prototype.Browser.WebKit && + (e.include("-of-type") || e.include(":empty"))) + return false; + + // XPath can't do namespaced attributes, nor can it read + // the "checked" property from DOM nodes + if ((/(\[[\w-]*?:|:checked)/).test(this.expression)) + return false; + + return true; + }, + + compileMatcher: function() { + if (this.shouldUseXPath()) + return this.compileXPathMatcher(); + + var e = this.expression, ps = Selector.patterns, h = Selector.handlers, + c = Selector.criteria, le, p, m; + + if (Selector._cache[e]) { + this.matcher = Selector._cache[e]; + return; + } + + this.matcher = ["this.matcher = function(root) {", + "var r = root, h = Selector.handlers, c = false, n;"]; + + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + p = ps[i]; + if (m = e.match(p)) { + this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : + new Template(c[i]).evaluate(m)); + e = e.replace(m[0], ''); + break; + } + } + } + + this.matcher.push("return h.unique(n);\n}"); + eval(this.matcher.join('\n')); + Selector._cache[this.expression] = this.matcher; + }, + + compileXPathMatcher: function() { + var e = this.expression, ps = Selector.patterns, + x = Selector.xpath, le, m; + + if (Selector._cache[e]) { + this.xpath = Selector._cache[e]; return; + } + + this.matcher = ['.//*']; + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + if (m = e.match(ps[i])) { + this.matcher.push(Object.isFunction(x[i]) ? x[i](m) : + new Template(x[i]).evaluate(m)); + e = e.replace(m[0], ''); + break; + } + } + } + + this.xpath = this.matcher.join(''); + Selector._cache[this.expression] = this.xpath; + }, + + findElements: function(root) { + root = root || document; + if (this.xpath) return document._getElementsByXPath(this.xpath, root); + return this.matcher(root); + }, + + match: function(element) { + this.tokens = []; + + var e = this.expression, ps = Selector.patterns, as = Selector.assertions; + var le, p, m; + + while (e && le !== e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + p = ps[i]; + if (m = e.match(p)) { + // use the Selector.assertions methods unless the selector + // is too complex. + if (as[i]) { + this.tokens.push([i, Object.clone(m)]); + e = e.replace(m[0], ''); + } else { + // reluctantly do a document-wide search + // and look for a match in the array + return this.findElements(document).include(element); + } + } + } + } + + var match = true, name, matches; + for (var i = 0, token; token = this.tokens[i]; i++) { + name = token[0], matches = token[1]; + if (!Selector.assertions[name](element, matches)) { + match = false; break; + } + } + + return match; + }, + + toString: function() { + return this.expression; + }, + + inspect: function() { + return "#"; + } +}); + +Object.extend(Selector, { + _cache: { }, + + xpath: { + descendant: "//*", + child: "/*", + adjacent: "/following-sibling::*[1]", + laterSibling: '/following-sibling::*', + tagName: function(m) { + if (m[1] == '*') return ''; + return "[local-name()='" + m[1].toLowerCase() + + "' or local-name()='" + m[1].toUpperCase() + "']"; + }, + className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", + id: "[@id='#{1}']", + attrPresence: function(m) { + m[1] = m[1].toLowerCase(); + return new Template("[@#{1}]").evaluate(m); + }, + attr: function(m) { + m[1] = m[1].toLowerCase(); + m[3] = m[5] || m[6]; + return new Template(Selector.xpath.operators[m[2]]).evaluate(m); + }, + pseudo: function(m) { + var h = Selector.xpath.pseudos[m[1]]; + if (!h) return ''; + if (Object.isFunction(h)) return h(m); + return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); + }, + operators: { + '=': "[@#{1}='#{3}']", + '!=': "[@#{1}!='#{3}']", + '^=': "[starts-with(@#{1}, '#{3}')]", + '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", + '*=': "[contains(@#{1}, '#{3}')]", + '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", + '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" + }, + pseudos: { + 'first-child': '[not(preceding-sibling::*)]', + 'last-child': '[not(following-sibling::*)]', + 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', + 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]", + 'checked': "[@checked]", + 'disabled': "[@disabled]", + 'enabled': "[not(@disabled)]", + 'not': function(m) { + var e = m[6], p = Selector.patterns, + x = Selector.xpath, le, v; + + var exclusion = []; + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in p) { + if (m = e.match(p[i])) { + v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m); + exclusion.push("(" + v.substring(1, v.length - 1) + ")"); + e = e.replace(m[0], ''); + break; + } + } + } + return "[not(" + exclusion.join(" and ") + ")]"; + }, + 'nth-child': function(m) { + return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); + }, + 'nth-last-child': function(m) { + return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); + }, + 'nth-of-type': function(m) { + return Selector.xpath.pseudos.nth("position() ", m); + }, + 'nth-last-of-type': function(m) { + return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); + }, + 'first-of-type': function(m) { + m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); + }, + 'last-of-type': function(m) { + m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); + }, + 'only-of-type': function(m) { + var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); + }, + nth: function(fragment, m) { + var mm, formula = m[6], predicate; + if (formula == 'even') formula = '2n+0'; + if (formula == 'odd') formula = '2n+1'; + if (mm = formula.match(/^(\d+)$/)) // digit only + return '[' + fragment + "= " + mm[1] + ']'; + if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b + if (mm[1] == "-") mm[1] = -1; + var a = mm[1] ? Number(mm[1]) : 1; + var b = mm[2] ? Number(mm[2]) : 0; + predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + + "((#{fragment} - #{b}) div #{a} >= 0)]"; + return new Template(predicate).evaluate({ + fragment: fragment, a: a, b: b }); + } + } + } + }, + + criteria: { + tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', + className: 'n = h.className(n, r, "#{1}", c); c = false;', + id: 'n = h.id(n, r, "#{1}", c); c = false;', + attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;', + attr: function(m) { + m[3] = (m[5] || m[6]); + return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m); + }, + pseudo: function(m) { + if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); + return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); + }, + descendant: 'c = "descendant";', + child: 'c = "child";', + adjacent: 'c = "adjacent";', + laterSibling: 'c = "laterSibling";' + }, + + patterns: { + // combinators must be listed first + // (and descendant needs to be last combinator) + laterSibling: /^\s*~\s*/, + child: /^\s*>\s*/, + adjacent: /^\s*\+\s*/, + descendant: /^\s/, + + // selectors follow + tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, + id: /^#([\w\-\*]+)(\b|$)/, + className: /^\.([\w\-\*]+)(\b|$)/, + pseudo: +/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/, + attrPresence: /^\[([\w]+)\]/, + attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ + }, + + // for Selector.match and Element#match + assertions: { + tagName: function(element, matches) { + return matches[1].toUpperCase() == element.tagName.toUpperCase(); + }, + + className: function(element, matches) { + return Element.hasClassName(element, matches[1]); + }, + + id: function(element, matches) { + return element.id === matches[1]; + }, + + attrPresence: function(element, matches) { + return Element.hasAttribute(element, matches[1]); + }, + + attr: function(element, matches) { + var nodeValue = Element.readAttribute(element, matches[1]); + return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]); + } + }, + + handlers: { + // UTILITY FUNCTIONS + // joins two collections + concat: function(a, b) { + for (var i = 0, node; node = b[i]; i++) + a.push(node); + return a; + }, + + // marks an array of nodes for counting + mark: function(nodes) { + var _true = Prototype.emptyFunction; + for (var i = 0, node; node = nodes[i]; i++) + node._countedByPrototype = _true; + return nodes; + }, + + unmark: function(nodes) { + for (var i = 0, node; node = nodes[i]; i++) + node._countedByPrototype = undefined; + return nodes; + }, + + // mark each child node with its position (for nth calls) + // "ofType" flag indicates whether we're indexing for nth-of-type + // rather than nth-child + index: function(parentNode, reverse, ofType) { + parentNode._countedByPrototype = Prototype.emptyFunction; + if (reverse) { + for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { + var node = nodes[i]; + if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; + } + } else { + for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) + if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; + } + }, + + // filters out duplicates and extends all nodes + unique: function(nodes) { + if (nodes.length == 0) return nodes; + var results = [], n; + for (var i = 0, l = nodes.length; i < l; i++) + if (!(n = nodes[i])._countedByPrototype) { + n._countedByPrototype = Prototype.emptyFunction; + results.push(Element.extend(n)); + } + return Selector.handlers.unmark(results); + }, + + // COMBINATOR FUNCTIONS + descendant: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + h.concat(results, node.getElementsByTagName('*')); + return results; + }, + + child: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) { + for (var j = 0, child; child = node.childNodes[j]; j++) + if (child.nodeType == 1 && child.tagName != '!') results.push(child); + } + return results; + }, + + adjacent: function(nodes) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + var next = this.nextElementSibling(node); + if (next) results.push(next); + } + return results; + }, + + laterSibling: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + h.concat(results, Element.nextSiblings(node)); + return results; + }, + + nextElementSibling: function(node) { + while (node = node.nextSibling) + if (node.nodeType == 1) return node; + return null; + }, + + previousElementSibling: function(node) { + while (node = node.previousSibling) + if (node.nodeType == 1) return node; + return null; + }, + + // TOKEN FUNCTIONS + tagName: function(nodes, root, tagName, combinator) { + var uTagName = tagName.toUpperCase(); + var results = [], h = Selector.handlers; + if (nodes) { + if (combinator) { + // fastlane for ordinary descendant combinators + if (combinator == "descendant") { + for (var i = 0, node; node = nodes[i]; i++) + h.concat(results, node.getElementsByTagName(tagName)); + return results; + } else nodes = this[combinator](nodes); + if (tagName == "*") return nodes; + } + for (var i = 0, node; node = nodes[i]; i++) + if (node.tagName.toUpperCase() === uTagName) results.push(node); + return results; + } else return root.getElementsByTagName(tagName); + }, + + id: function(nodes, root, id, combinator) { + var targetNode = $(id), h = Selector.handlers; + if (!targetNode) return []; + if (!nodes && root == document) return [targetNode]; + if (nodes) { + if (combinator) { + if (combinator == 'child') { + for (var i = 0, node; node = nodes[i]; i++) + if (targetNode.parentNode == node) return [targetNode]; + } else if (combinator == 'descendant') { + for (var i = 0, node; node = nodes[i]; i++) + if (Element.descendantOf(targetNode, node)) return [targetNode]; + } else if (combinator == 'adjacent') { + for (var i = 0, node; node = nodes[i]; i++) + if (Selector.handlers.previousElementSibling(targetNode) == node) + return [targetNode]; + } else nodes = h[combinator](nodes); + } + for (var i = 0, node; node = nodes[i]; i++) + if (node == targetNode) return [targetNode]; + return []; + } + return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; + }, + + className: function(nodes, root, className, combinator) { + if (nodes && combinator) nodes = this[combinator](nodes); + return Selector.handlers.byClassName(nodes, root, className); + }, + + byClassName: function(nodes, root, className) { + if (!nodes) nodes = Selector.handlers.descendant([root]); + var needle = ' ' + className + ' '; + for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { + nodeClassName = node.className; + if (nodeClassName.length == 0) continue; + if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) + results.push(node); + } + return results; + }, + + attrPresence: function(nodes, root, attr, combinator) { + if (!nodes) nodes = root.getElementsByTagName("*"); + if (nodes && combinator) nodes = this[combinator](nodes); + var results = []; + for (var i = 0, node; node = nodes[i]; i++) + if (Element.hasAttribute(node, attr)) results.push(node); + return results; + }, + + attr: function(nodes, root, attr, value, operator, combinator) { + if (!nodes) nodes = root.getElementsByTagName("*"); + if (nodes && combinator) nodes = this[combinator](nodes); + var handler = Selector.operators[operator], results = []; + for (var i = 0, node; node = nodes[i]; i++) { + var nodeValue = Element.readAttribute(node, attr); + if (nodeValue === null) continue; + if (handler(nodeValue, value)) results.push(node); + } + return results; + }, + + pseudo: function(nodes, name, value, root, combinator) { + if (nodes && combinator) nodes = this[combinator](nodes); + if (!nodes) nodes = root.getElementsByTagName("*"); + return Selector.pseudos[name](nodes, value, root); + } + }, + + pseudos: { + 'first-child': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + if (Selector.handlers.previousElementSibling(node)) continue; + results.push(node); + } + return results; + }, + 'last-child': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + if (Selector.handlers.nextElementSibling(node)) continue; + results.push(node); + } + return results; + }, + 'only-child': function(nodes, value, root) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) + results.push(node); + return results; + }, + 'nth-child': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root); + }, + 'nth-last-child': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, true); + }, + 'nth-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, false, true); + }, + 'nth-last-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, true, true); + }, + 'first-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, "1", root, false, true); + }, + 'last-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, "1", root, true, true); + }, + 'only-of-type': function(nodes, formula, root) { + var p = Selector.pseudos; + return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); + }, + + // handles the an+b logic + getIndices: function(a, b, total) { + if (a == 0) return b > 0 ? [b] : []; + return $R(1, total).inject([], function(memo, i) { + if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); + return memo; + }); + }, + + // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type + nth: function(nodes, formula, root, reverse, ofType) { + if (nodes.length == 0) return []; + if (formula == 'even') formula = '2n+0'; + if (formula == 'odd') formula = '2n+1'; + var h = Selector.handlers, results = [], indexed = [], m; + h.mark(nodes); + for (var i = 0, node; node = nodes[i]; i++) { + if (!node.parentNode._countedByPrototype) { + h.index(node.parentNode, reverse, ofType); + indexed.push(node.parentNode); + } + } + if (formula.match(/^\d+$/)) { // just a number + formula = Number(formula); + for (var i = 0, node; node = nodes[i]; i++) + if (node.nodeIndex == formula) results.push(node); + } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b + if (m[1] == "-") m[1] = -1; + var a = m[1] ? Number(m[1]) : 1; + var b = m[2] ? Number(m[2]) : 0; + var indices = Selector.pseudos.getIndices(a, b, nodes.length); + for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { + for (var j = 0; j < l; j++) + if (node.nodeIndex == indices[j]) results.push(node); + } + } + h.unmark(nodes); + h.unmark(indexed); + return results; + }, + + 'empty': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + // IE treats comments as element nodes + if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue; + results.push(node); + } + return results; + }, + + 'not': function(nodes, selector, root) { + var h = Selector.handlers, selectorType, m; + var exclusions = new Selector(selector).findElements(root); + h.mark(exclusions); + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!node._countedByPrototype) results.push(node); + h.unmark(exclusions); + return results; + }, + + 'enabled': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!node.disabled) results.push(node); + return results; + }, + + 'disabled': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (node.disabled) results.push(node); + return results; + }, + + 'checked': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (node.checked) results.push(node); + return results; + } + }, + + operators: { + '=': function(nv, v) { return nv == v; }, + '!=': function(nv, v) { return nv != v; }, + '^=': function(nv, v) { return nv.startsWith(v); }, + '$=': function(nv, v) { return nv.endsWith(v); }, + '*=': function(nv, v) { return nv.include(v); }, + '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, + '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); } + }, + + split: function(expression) { + var expressions = []; + expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { + expressions.push(m[1].strip()); + }); + return expressions; + }, + + matchElements: function(elements, expression) { + var matches = $$(expression), h = Selector.handlers; + h.mark(matches); + for (var i = 0, results = [], element; element = elements[i]; i++) + if (element._countedByPrototype) results.push(element); + h.unmark(matches); + return results; + }, + + findElement: function(elements, expression, index) { + if (Object.isNumber(expression)) { + index = expression; expression = false; + } + return Selector.matchElements(elements, expression || '*')[index || 0]; + }, + + findChildElements: function(element, expressions) { + expressions = Selector.split(expressions.join(',')); + var results = [], h = Selector.handlers; + for (var i = 0, l = expressions.length, selector; i < l; i++) { + selector = new Selector(expressions[i].strip()); + h.concat(results, selector.findElements(element)); + } + return (l > 1) ? h.unique(results) : results; + } +}); + +if (Prototype.Browser.IE) { + Object.extend(Selector.handlers, { + // IE returns comment nodes on getElementsByTagName("*"). + // Filter them out. + concat: function(a, b) { + for (var i = 0, node; node = b[i]; i++) + if (node.tagName !== "!") a.push(node); + return a; + }, + + // IE improperly serializes _countedByPrototype in (inner|outer)HTML. + unmark: function(nodes) { + for (var i = 0, node; node = nodes[i]; i++) + node.removeAttribute('_countedByPrototype'); + return nodes; + } + }); +} + +function $$() { + return Selector.findChildElements(document, $A(arguments)); +} +var Form = { + reset: function(form) { + $(form).reset(); + return form; + }, + + serializeElements: function(elements, options) { + if (typeof options != 'object') options = { hash: !!options }; + else if (Object.isUndefined(options.hash)) options.hash = true; + var key, value, submitted = false, submit = options.submit; + + var data = elements.inject({ }, function(result, element) { + if (!element.disabled && element.name) { + key = element.name; value = $(element).getValue(); + if (value != null && (element.type != 'submit' || (!submitted && + submit !== false && (!submit || key == submit) && (submitted = true)))) { + if (key in result) { + // a key is already present; construct an array of values + if (!Object.isArray(result[key])) result[key] = [result[key]]; + result[key].push(value); + } + else result[key] = value; + } + } + return result; + }); + + return options.hash ? data : Object.toQueryString(data); + } +}; + +Form.Methods = { + serialize: function(form, options) { + return Form.serializeElements(Form.getElements(form), options); + }, + + getElements: function(form) { + return $A($(form).getElementsByTagName('*')).inject([], + function(elements, child) { + if (Form.Element.Serializers[child.tagName.toLowerCase()]) + elements.push(Element.extend(child)); + return elements; + } + ); + }, + + getInputs: function(form, typeName, name) { + form = $(form); + var inputs = form.getElementsByTagName('input'); + + if (!typeName && !name) return $A(inputs).map(Element.extend); + + for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { + var input = inputs[i]; + if ((typeName && input.type != typeName) || (name && input.name != name)) + continue; + matchingInputs.push(Element.extend(input)); + } + + return matchingInputs; + }, + + disable: function(form) { + form = $(form); + Form.getElements(form).invoke('disable'); + return form; + }, + + enable: function(form) { + form = $(form); + Form.getElements(form).invoke('enable'); + return form; + }, + + findFirstElement: function(form) { + var elements = $(form).getElements().findAll(function(element) { + return 'hidden' != element.type && !element.disabled; + }); + var firstByIndex = elements.findAll(function(element) { + return element.hasAttribute('tabIndex') && element.tabIndex >= 0; + }).sortBy(function(element) { return element.tabIndex }).first(); + + return firstByIndex ? firstByIndex : elements.find(function(element) { + return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); + }); + }, + + focusFirstElement: function(form) { + form = $(form); + form.findFirstElement().activate(); + return form; + }, + + request: function(form, options) { + form = $(form), options = Object.clone(options || { }); + + var params = options.parameters, action = form.readAttribute('action') || ''; + if (action.blank()) action = window.location.href; + options.parameters = form.serialize(true); + + if (params) { + if (Object.isString(params)) params = params.toQueryParams(); + Object.extend(options.parameters, params); + } + + if (form.hasAttribute('method') && !options.method) + options.method = form.method; + + return new Ajax.Request(action, options); + } +}; + +/*--------------------------------------------------------------------------*/ + +Form.Element = { + focus: function(element) { + $(element).focus(); + return element; + }, + + select: function(element) { + $(element).select(); + return element; + } +}; + +Form.Element.Methods = { + serialize: function(element) { + element = $(element); + if (!element.disabled && element.name) { + var value = element.getValue(); + if (value != undefined) { + var pair = { }; + pair[element.name] = value; + return Object.toQueryString(pair); + } + } + return ''; + }, + + getValue: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + return Form.Element.Serializers[method](element); + }, + + setValue: function(element, value) { + element = $(element); + var method = element.tagName.toLowerCase(); + Form.Element.Serializers[method](element, value); + return element; + }, + + clear: function(element) { + $(element).value = ''; + return element; + }, + + present: function(element) { + return $(element).value != ''; + }, + + activate: function(element) { + element = $(element); + try { + element.focus(); + if (element.select && (element.tagName.toLowerCase() != 'input' || + !['button', 'reset', 'submit'].include(element.type))) + element.select(); + } catch (e) { } + return element; + }, + + disable: function(element) { + element = $(element); + element.blur(); + element.disabled = true; + return element; + }, + + enable: function(element) { + element = $(element); + element.disabled = false; + return element; + } +}; + +/*--------------------------------------------------------------------------*/ + +var Field = Form.Element; +var $F = Form.Element.Methods.getValue; + +/*--------------------------------------------------------------------------*/ + +Form.Element.Serializers = { + input: function(element, value) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + return Form.Element.Serializers.inputSelector(element, value); + default: + return Form.Element.Serializers.textarea(element, value); + } + }, + + inputSelector: function(element, value) { + if (Object.isUndefined(value)) return element.checked ? element.value : null; + else element.checked = !!value; + }, + + textarea: function(element, value) { + if (Object.isUndefined(value)) return element.value; + else element.value = value; + }, + + select: function(element, index) { + if (Object.isUndefined(index)) + return this[element.type == 'select-one' ? + 'selectOne' : 'selectMany'](element); + else { + var opt, value, single = !Object.isArray(index); + for (var i = 0, length = element.length; i < length; i++) { + opt = element.options[i]; + value = this.optionValue(opt); + if (single) { + if (value == index) { + opt.selected = true; + return; + } + } + else opt.selected = index.include(value); + } + } + }, + + selectOne: function(element) { + var index = element.selectedIndex; + return index >= 0 ? this.optionValue(element.options[index]) : null; + }, + + selectMany: function(element) { + var values, length = element.length; + if (!length) return null; + + for (var i = 0, values = []; i < length; i++) { + var opt = element.options[i]; + if (opt.selected) values.push(this.optionValue(opt)); + } + return values; + }, + + optionValue: function(opt) { + // extend element because hasAttribute may not be native + return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; + } +}; + +/*--------------------------------------------------------------------------*/ + +Abstract.TimedObserver = Class.create(PeriodicalExecuter, { + initialize: function($super, element, frequency, callback) { + $super(callback, frequency); + this.element = $(element); + this.lastValue = this.getValue(); + }, + + execute: function() { + var value = this.getValue(); + if (Object.isString(this.lastValue) && Object.isString(value) ? + this.lastValue != value : String(this.lastValue) != String(value)) { + this.callback(this.element, value); + this.lastValue = value; + } + } +}); + +Form.Element.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); + +/*--------------------------------------------------------------------------*/ + +Abstract.EventObserver = Class.create({ + initialize: function(element, callback) { + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + if (this.element.tagName.toLowerCase() == 'form') + this.registerFormCallbacks(); + else + this.registerCallback(this.element); + }, + + onElementEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + }, + + registerFormCallbacks: function() { + Form.getElements(this.element).each(this.registerCallback, this); + }, + + registerCallback: function(element) { + if (element.type) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + Event.observe(element, 'click', this.onElementEvent.bind(this)); + break; + default: + Event.observe(element, 'change', this.onElementEvent.bind(this)); + break; + } + } + } +}); + +Form.Element.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); +if (!window.Event) var Event = { }; + +Object.extend(Event, { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + KEY_INSERT: 45, + + cache: { }, + + relatedTarget: function(event) { + var element; + switch(event.type) { + case 'mouseover': element = event.fromElement; break; + case 'mouseout': element = event.toElement; break; + default: return null; + } + return Element.extend(element); + } +}); + +Event.Methods = (function() { + var isButton; + + if (Prototype.Browser.IE) { + var buttonMap = { 0: 1, 1: 4, 2: 2 }; + isButton = function(event, code) { + return event.button == buttonMap[code]; + }; + + } else if (Prototype.Browser.WebKit) { + isButton = function(event, code) { + switch (code) { + case 0: return event.which == 1 && !event.metaKey; + case 1: return event.which == 1 && event.metaKey; + default: return false; + } + }; + + } else { + isButton = function(event, code) { + return event.which ? (event.which === code + 1) : (event.button === code); + }; + } + + return { + isLeftClick: function(event) { return isButton(event, 0) }, + isMiddleClick: function(event) { return isButton(event, 1) }, + isRightClick: function(event) { return isButton(event, 2) }, + + element: function(event) { + var node = Event.extend(event).target; + return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node); + }, + + findElement: function(event, expression) { + var element = Event.element(event); + if (!expression) return element; + var elements = [element].concat(element.ancestors()); + return Selector.findElement(elements, expression, 0); + }, + + pointer: function(event) { + return { + x: event.pageX || (event.clientX + + (document.documentElement.scrollLeft || document.body.scrollLeft)), + y: event.pageY || (event.clientY + + (document.documentElement.scrollTop || document.body.scrollTop)) + }; + }, + + pointerX: function(event) { return Event.pointer(event).x }, + pointerY: function(event) { return Event.pointer(event).y }, + + stop: function(event) { + Event.extend(event); + event.preventDefault(); + event.stopPropagation(); + event.stopped = true; + } + }; +})(); + +Event.extend = (function() { + var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { + m[name] = Event.Methods[name].methodize(); + return m; + }); + + if (Prototype.Browser.IE) { + Object.extend(methods, { + stopPropagation: function() { this.cancelBubble = true }, + preventDefault: function() { this.returnValue = false }, + inspect: function() { return "[object Event]" } + }); + + return function(event) { + if (!event) return false; + if (event._extendedByPrototype) return event; + + event._extendedByPrototype = Prototype.emptyFunction; + var pointer = Event.pointer(event); + Object.extend(event, { + target: event.srcElement, + relatedTarget: Event.relatedTarget(event), + pageX: pointer.x, + pageY: pointer.y + }); + return Object.extend(event, methods); + }; + + } else { + Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__; + Object.extend(Event.prototype, methods); + return Prototype.K; + } +})(); + +Object.extend(Event, (function() { + var cache = Event.cache; + + function getEventID(element) { + if (element._prototypeEventID) return element._prototypeEventID[0]; + arguments.callee.id = arguments.callee.id || 1; + return element._prototypeEventID = [++arguments.callee.id]; + } + + function getDOMEventName(eventName) { + if (eventName && eventName.include(':')) return "dataavailable"; + return eventName; + } + + function getCacheForID(id) { + return cache[id] = cache[id] || { }; + } + + function getWrappersForEventName(id, eventName) { + var c = getCacheForID(id); + return c[eventName] = c[eventName] || []; + } + + function createWrapper(element, eventName, handler) { + var id = getEventID(element); + var c = getWrappersForEventName(id, eventName); + if (c.pluck("handler").include(handler)) return false; + + var wrapper = function(event) { + if (!Event || !Event.extend || + (event.eventName && event.eventName != eventName)) + return false; + + Event.extend(event); + handler.call(element, event); + }; + + wrapper.handler = handler; + c.push(wrapper); + return wrapper; + } + + function findWrapper(id, eventName, handler) { + var c = getWrappersForEventName(id, eventName); + return c.find(function(wrapper) { return wrapper.handler == handler }); + } + + function destroyWrapper(id, eventName, handler) { + var c = getCacheForID(id); + if (!c[eventName]) return false; + c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); + } + + function destroyCache() { + for (var id in cache) + for (var eventName in cache[id]) + cache[id][eventName] = null; + } + + if (window.attachEvent) { + window.attachEvent("onunload", destroyCache); + } + + return { + observe: function(element, eventName, handler) { + element = $(element); + var name = getDOMEventName(eventName); + + var wrapper = createWrapper(element, eventName, handler); + if (!wrapper) return element; + + if (element.addEventListener) { + element.addEventListener(name, wrapper, false); + } else { + element.attachEvent("on" + name, wrapper); + } + + return element; + }, + + stopObserving: function(element, eventName, handler) { + element = $(element); + var id = getEventID(element), name = getDOMEventName(eventName); + + if (!handler && eventName) { + getWrappersForEventName(id, eventName).each(function(wrapper) { + element.stopObserving(eventName, wrapper.handler); + }); + return element; + + } else if (!eventName) { + Object.keys(getCacheForID(id)).each(function(eventName) { + element.stopObserving(eventName); + }); + return element; + } + + var wrapper = findWrapper(id, eventName, handler); + if (!wrapper) return element; + + if (element.removeEventListener) { + element.removeEventListener(name, wrapper, false); + } else { + element.detachEvent("on" + name, wrapper); + } + + destroyWrapper(id, eventName, handler); + + return element; + }, + + fire: function(element, eventName, memo) { + element = $(element); + if (element == document && document.createEvent && !element.dispatchEvent) + element = document.documentElement; + + var event; + if (document.createEvent) { + event = document.createEvent("HTMLEvents"); + event.initEvent("dataavailable", true, true); + } else { + event = document.createEventObject(); + event.eventType = "ondataavailable"; + } + + event.eventName = eventName; + event.memo = memo || { }; + + if (document.createEvent) { + element.dispatchEvent(event); + } else { + element.fireEvent(event.eventType, event); + } + + return Event.extend(event); + } + }; +})()); + +Object.extend(Event, Event.Methods); + +Element.addMethods({ + fire: Event.fire, + observe: Event.observe, + stopObserving: Event.stopObserving +}); + +Object.extend(document, { + fire: Element.Methods.fire.methodize(), + observe: Element.Methods.observe.methodize(), + stopObserving: Element.Methods.stopObserving.methodize(), + loaded: false +}); + +(function() { + /* Support for the DOMContentLoaded event is based on work by Dan Webb, + Matthias Miller, Dean Edwards and John Resig. */ + + var timer; + + function fireContentLoadedEvent() { + if (document.loaded) return; + if (timer) window.clearInterval(timer); + document.fire("dom:loaded"); + document.loaded = true; + } + + if (document.addEventListener) { + if (Prototype.Browser.WebKit) { + timer = window.setInterval(function() { + if (/loaded|complete/.test(document.readyState)) + fireContentLoadedEvent(); + }, 0); + + Event.observe(window, "load", fireContentLoadedEvent); + + } else { + document.addEventListener("DOMContentLoaded", + fireContentLoadedEvent, false); + } + + } else { + document.write(" + + + + + + diff --git a/Fila-Web/schemas b/Fila-Web/schemas new file mode 120000 index 0000000..3614ccd --- /dev/null +++ b/Fila-Web/schemas @@ -0,0 +1 @@ +../Fila-Servico/schemas/ \ No newline at end of file diff --git a/Fila-Web/script/fila_web_fastcgi.pl b/Fila-Web/script/fila_web_fastcgi.pl new file mode 100755 index 0000000..ac324f1 --- /dev/null +++ b/Fila-Web/script/fila_web_fastcgi.pl @@ -0,0 +1,55 @@ +#!/usr/bin/perl -w +# Copyright 2008, 2009 - Oktiva Comércio e Serviços de Informática Ltda. +# +# Este arquivo é parte do programa FILA - Sistema de Atendimento +# +# O FILA é um software livre; você pode redistribui-lo e/ou modifica-lo +# dentro dos termos da Licença Pública Geral GNU como publicada pela +# Fundação do Software Livre (FSF); na versão 2 da Licença. +# +# Este programa é distribuido na esperança que possa ser util, mas SEM +# NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer +# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o +# título "LICENCA.txt", junto com este programa, se não, escreva para a +# Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, + +BEGIN { $ENV{CATALYST_ENGINE} ||= 'FastCGI' } + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use Fila::Web; + +my $help = 0; +my ( $listen, $nproc, $pidfile, $manager, $detach, $keep_stderr ); + +GetOptions( + 'help|?' => \$help, + 'listen|l=s' => \$listen, + 'nproc|n=i' => \$nproc, + 'pidfile|p=s' => \$pidfile, + 'manager|M=s' => \$manager, + 'daemon|d' => \$detach, + 'keeperr|e' => \$keep_stderr, +); + +pod2usage(1) if $help; + +Fila::Web->run( + $listen, + { nproc => $nproc, + pidfile => $pidfile, + manager => $manager, + detach => $detach, + keep_stderr => $keep_stderr, + } +); + +1; + diff --git a/FilaOLAP.xml b/FilaOLAP.xml new file mode 100644 index 0000000..62cae4e --- /dev/null +++ b/FilaOLAP.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + +
    + + + + + + +
    + + + + + + + + +
    + + + + + + +
    + + + + + + +
    + + + + + + +
    + + + + + + + + + +
    + + + + + + + + +
    + + + + + + + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + ([Measures].[Soma Tempo Espera] / [Measures].[Quantidade]) + + + ([Measures].[Soma Tempo Deslocamento] / [Measures].[Quantidade]) + + + ([Measures].[Soma Tempo Atendimento] / [Measures].[Quantidade]) + + + + + + + +
    + + + + + + + + + + + + + + + + diff --git a/LEIAME b/LEIAME new file mode 100644 index 0000000..f602ca0 --- /dev/null +++ b/LEIAME @@ -0,0 +1,132 @@ + +INTRODUÇÃO +================================================================================ + +Este é o código fonte do Sistema de Atendimento. O sistema é +distribuído em diferentes módulos, segue uma lista dos módulos do +sistema: + + Fila-Administracao: Interface Web para gestão das configurações do + local de atendimento. + + Fila-Agendamento: Interface Web para a realização de agendamentos de + atendimentos. + + Fila-Opiniometro: Módulo de sistema para comunicação com dispositivo + de registro da avaliação dos atendimentos realizados. + + Fila-Painel: Módulo de sistema para a notificação utilizando o + sistema de visualização da praça. + + Fila-Senha: Módulo do sistema para a comunicação com o dispositivo + emissor de senha. + + Fila-Servico: Módulo de regras de negócio responsável por todo o + controle do atendimento. + + Fila-Web: Interface Web para o sistema de atendimento, incluindo + atendente, gerente e interface para emissão de senhas manual. + +Adicionalmente, os códigos-fonte do projeto incluem os seguintes +diretórios: + + Apache2: contém uma configuração de exemplo da interface Web doutiliza + sistema para o sistema de atendimento. + + DJabberd: contém uma configuração de exemplo para o servidor Jabber + DJabberd, parte fundamental do funcionamento do sistema. + + patches: contém dois Patches a serem aplicados em bibliotecas + instaladas no sistema. Esses patches já foram enviados aos autores + originais das bibliotecas, mas ainda não estão incluídos nas + versões atuais. + + ltsp: contém um template para a geração automática de uma página de + entrada para cada usuário no ltsp, já preenchendo a mesa onde o + atendente entrou e o login, para que o usuário precise apenas + preencher a senha. + + documentacao: contém um conjunto diverso de documentações geradas + sobre o sistema, incluindo materiais utilizados em treinamentos. + + + +INSTALACAO DO BANCO DE DADOS +================================================================================ + +O sistema de atendimento sugere a utilização do banco de dados +PostgreSql devido ao uso extensivo de cálculos temporais, +funcionalidade essa que é uma das características fortes desse banco +de dados. + +A configuração do banco de dados é feita nos arquivos: + + Fila-Servico/fila_servico.yml + Fila-Administracao/fila_administracao.yml. + +Esses arquivos contém a configuração dos endereços para conexão e do +nome do banco de dados. A configuração padrão presente no código como +distribuído utiliza o banco de dados em "localhost", no banco de dados +"fila" utilizando o usuário "postgres" com a senha "123". Você deve +personalizar esses arquivos de acordo com a situação real no seu +ambiente. + +Adicionalmente, o sistema de agendamento tem a configuração presente +no arquivo: + + Fila-Agendamento/fila_agendamento.yml + +O sistema de Agendamento usa um banco de dados diferente, para +permitir que o agendamento seja feito em uma máquina diferente ou até +mesmo em uma rede diferente, uma vez que o sistema de agendamento deve +ser visível para a internet, enquanto o sistema de agendamento deve +ser preservado dentro de uma rede privada. + +Para popular os bancos de dados, você pode usar os scripts: + + Fila-Servico/script/fila_servico_db.pl + +e + + Fila-Agendamento/script/fila_agendamento_db.pl + + +para executar cada um desses scripts você deve entrar nos diretórios +Fila-Servico e Fila-Agendamento respectivamente. Esses scripts geram +um conjunto de instruções sql que podem ser utilizadas como entrada +para o psql para a criação das estruturas de dados, incluindo alguns +dados de exemplo. + + +EXECUTANDO O SISTEMA +================================================================================ + +O sistema de atendimento utiliza como "barramento" de comunicação o +servidor DJabberd, e como pode ser visto na configuração de exemplo, o +uso desse servidor especificamente possibilita, através do uso do +plugin DJabberd::Plugin::Balancer, a implementação de um balanceamento +de carga para os serviços. Desta forma, em primeiro lugar é necessário +iniciar o servidor DJabberd. Para fazer isso, pode-se executar: + + djabberd -conf DJabberd/djabberd.conf + +Uma vez o servidor Jabber rodando, é possível iniciar o módulo de +regras de negócio. Para isso, pode-se executar: + + # dentro do diretório Fila-Servico + ./script/fila_servico_server.pl + +Neste momento, pode-se então iniciar o Apache2, utilizando a +configuração de exemplo, que presume a cópia desse diretório para o +diretório /usr/share/fila. + + +DOCUMENTACOES +================================================================================ + +O sistema de atendimento é desenvolvido em Perl, e dessa forma, para +olhar a documentação de cada um dos arquivos, você pode utilizar a +ferramenta "perldoc", que irá exibir de uma maneira intuitiva a +documentação de cada um desses arquivos. + + diff --git a/LICENCA.txt b/LICENCA.txt new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/LICENCA.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/documentacao/Apostila.odt b/documentacao/Apostila.odt new file mode 100644 index 0000000..c6d1c70 Binary files /dev/null and b/documentacao/Apostila.odt differ diff --git a/documentacao/DicionarioDeDadosAgendamento.txt b/documentacao/DicionarioDeDadosAgendamento.txt new file mode 100644 index 0000000..2d45835 --- /dev/null +++ b/documentacao/DicionarioDeDadosAgendamento.txt @@ -0,0 +1,46 @@ +NAME + Atendimento - Armazena os agendamentos realizados + +DESCRIPTION + No sistema de agendamento, ficam armazenados nessa tabela todos os + agendamentos realizados. + +NAME + Expediente - Lista cada expediente do local + +DESCRIPTION + Permite a configuração da hora de inicio e fim de cada dia da semana + para cada local, permitindo configurar, por exemplo, o funcionamento + apenas pela manhã no sábado. + +NAME + Feriado - Dias de não funcionamento dos locais + +DESCRIPTION + Utiliza-se essa tabela para configurar os dias extra-ordinários nos + quais a praça de atendimento não funciona. + +NAME + Fila::Agendamento::DB::IntervalosView - Acesso ao view intervalos + +SYNOPSIS + CREATE VIEW intervalos AS SELECT inicio, inicio + interval '15 + minutes' AS fim FROM (select (date_trunc('day',now()) + dias * + interval '1 day' + hora * interval '1 hour' + atend * interval '15 + minutes') AS inicio from generate_series(0,15) dias, + generate_series(8, 17) hora, generate_series(0,3) atend) AS + t(inicio) WHERE extract(dow FROM t.inicio) between 1 and 5 AND + t.inicio >= NOW() + interval '1 hour'; + +DESCRIPTION + Este view é utilizado para listar os próximos intervalos possiveis + para o registro de novos agendamentos. + +NAME + Local - Define cada local para agendamento + +DESCRIPTION + Cada local de agendamento deve ter o seu registro, e é através dessa + entidade que é montada a grelha dos horários livres ou ocupados que é + exibida na interface. + diff --git a/documentacao/DicionarioDeDadosPrincipal.txt b/documentacao/DicionarioDeDadosPrincipal.txt new file mode 100644 index 0000000..331d96b --- /dev/null +++ b/documentacao/DicionarioDeDadosPrincipal.txt @@ -0,0 +1,269 @@ +NAME + Agendamento - Informação auxiliar de agendamento + +DESCRIPTION + Quando o atendimento a ser realizado foi agendado previamente, essa + tabela deve conter informações acerca do titular do agendamento para + permitir uma verificação por parte do atendente. + +NAME + AtendenteGuiche - Registro temporal da associação entre funcionário e + guichê. + +DESCRIPTION + Do momento em que um funcionário abre o guichê até o momento em que + ele fecha, ele deve estar associado ao guichê. + +NAME + Atendimento - Entidade central do processo de atendimento + +DESCRIPTION + Essa entidade agrega todas as informações de um atendimento desde o + momento em que a senha é emitida até o momento em que ele registra a + opinião. Praticamente todos os relacionamentos e atributos são + temporais, com a excessão da senha, que é sempre a mesma ao longo de + toda a vida do atendimento. + +NAME + CategoriaAtendimento - Valores possiveis de categorias + +DESCRIPTION + A categorização do atendimento possibilita o estabelecimento de + prioridades no atendimento. Essa tabela registra todas as categorias em + uso no sistema, estejam elas habilitadas para a emissão de senha ou + não, sejam elas utilizadas por um ou por todos os locais. + +NAME + Categoria - Lista as categorias de atendimento + +DESCRIPTION + Esta tabela lista todas as categorias passiveis de fazer parte do + processo de atendimento, mas a configuração efetiva dessas categorias + no contexto do local acontece na tabela ConfiguracaoCategoria. + +NAME + ClasseServico - Classificação dos serviços a serem realizados pelos + atendentes + +DESCRIPTION + Essa tabela define uma estrutura de classificação para os serviços + realizados dentro e fora de atendimento nos guichês. + +NAME + ConfiguracaoCategoria - Configuração de uma categoria em um local + +DESCRIPTION + Essa tabela define a configuração de uma categoria na praça, + incluindo questões como a posição dessa categoria no equipamento + emissor de senhas, a prioridade dessa categoria para a chamada das + senhas e limites para alerta. + +NAME + ConfiguracaoLimite - Controle gerencial dos guichês + +DESCRIPTION + Essa tabela armazena valores limites em segundos para que um guichê + permaneça no mesmo estado. Se um guichê permanecer por mais tempo do + que os definidos aqui, o gerente deve ser notificado. + +NAME + ConfiguracaoPerguntas - Configuração das perguntas do opiniometro do + atendimento + +DESCRIPTION + Essa tabela guarda o registro temporal das configurações das perguntas + nos opiniometros dos atendimentos. + +NAME + ConfiguracaoPerguntasPraca - Define a ordem das perguntas no opiniometro + geral + +DESCRIPTION + Esta tabela mantém um registro temporal da informação da + configuração do opiniometro geral, listando quais são as cinco + perguntas a serem respondidas. + +NAME + EstadoAtendimento - Atributo temporal do atendimento + +DESCRIPTION + Esta tabela contém todo o registro temporal do atributo "estado" do + atendimento. Os tipos de estado ficam listados na tabela + TipoEstadoAtendimento. + +NAME + EstadoGuiche - Registro temporal do atributo "estado" do guiche + +DESCRIPTION + Esta tabela lista o registro temporal, bem como o atual, do valor do + atributo "estado" do guiche. + +NAME + EstadoLocal - Registro temporal dos estados do local + +DESCRIPTION + Registro temporal do valor do atributo "estado" do local. + +NAME + FuncionarioLocal - Associação do Funcionário ao Local + +DESCRIPTION + Esta tabela lista os funcionários que estão habilitados a serem + atendentes em um local, ou seja, aqueles que podem abrir um guichê. + Esta tabela mantém o registro temporal dessas associações. + +NAME + Funcionario - Funcionário que pode trabalhar em qualquer local + +DESCRIPTION + A entidade funcionário é transversal aos locais de atendimento, + permitindo que um funcionário tome parte de mais de um local de + atendimento ao longo do tempo. + +NAME + GerenteLocal - Registro temporal de quem é o gerente + +DESCRIPTION + Um local de atendimento precisa, a qualquer momento, ter um, e somente + um, gerente. Essa tabela guarda o registro histórico de quem foi o + gerente em cada momento. + +NAME + GuicheAtendimento - Registro temporal do vinculo entre um atendimento e + um guiche + +DESCRIPTION + No momento em que uma senha é chamada, o atendimento é vinculado a + aquele guichê, e essa associação deve permanecer válida durante todo + o tempo que o guichê estiver relacionado a esse atendimento. Essa + tabela mantém um registro temporal de todas as vinculações. + +NAME + GuicheEncaminhamento - Lista privada de espera de um guiche + +DESCRIPTION + Esta tabela lista os atendimentos com espera prioritária para um + guichê que foram "encaminhados" por outros guichês. É importante + notar que um atendimento só pode ser encaminhado depois de ele ter sido + inicialmente atendido por um outro guichê. Essa funcionalidade permite + o redirecionamento de um atendimento para um profissional melhor + capacitado em uma determinada área. + +NAME + Guiche - Guichê de atendimento + +DESCRIPTION + Esta tabela representa a mesa especifica onde são realizados os + atendimentos. Praticamente todos os atributos e relacionamentos são + temporais, com excessão do local, uma vez que um guichê sempre irá + pertencer ao mesmo local. + +NAME + Local - Praça de atendimento + +DESCRIPTION + Essa é a entidade central do sistema, que relaciona a praça de + atendimento, direta ou indiretamente, todas as outras entidades são + relacionadas a um local. + +NAME + Pausa - Registro temporal das pausas dos atendentes + +DESCRIPTION + Esta tabela mantém o registro histórico das pausas realizadas pelos + atendentes ao longo do tempo. + +NAME + PerguntaAvaliacao - Todas as perguntas do opiniometro + +DESCRIPTION + Esta tabela lista todas as perguntas que podem ser configuradas no + opiniometro do guiche. + +NAME + PerguntaAvaliacaoPraca - As perguntas que podem ser configuradas no + opiniometro geral + +DESCRIPTION + Esta tabela lista todas as perguntas que podem ser associadas ao + opiniometro geral da praça. + +NAME + RespostaAvaliacao - Registro temporal das respostas do opiniometro + +DESCRIPTION + Esta tabela guarda todos os registros de opinião associados aos + atendimentos. + +NAME + RespostaAvaliacaoPraca - Registro dos preenchimentos no opiniometro + geral + +DESCRIPTION + Esta tabela contém o registro temporal de todas as avaliações gerais + da praça realizadas. + +NAME + Senha - Representação do identificador visivel do atendimento + +DESCRIPTION + Apesar da senha ser o identificador visivel do atendimento, a senha é + reutilizada ao longo do tempo, mas a associação entre senha e + atendimento não é temporal, o que significa que um atendimento mantém + o identificador visivel do inicio ao fim. O sistema deve garantir que + dois atendimentos não estão associados i mesma senha ao mesmo tempo. + +NAME + ServicoAtendimento - Registro histórico dos serviços realizados dentro + de um atendimento + +DESCRIPTION + Essa tabela contém o registro temporal de todos os serviços realizados + no contexto de um atendimento. + +NAME + ServicoGuiche - Registro temporal dos servicos internos + +DESCRIPTION + Essa tabela mantem o registro temporal dos serviços internos, ou seja, + realizados fora do contexto de um atendimento. + +NAME + ServicoInterno - Lista de serviços internos + +DESCRIPTION + O serviço interno é um serviço realizado por um atendente em um + guichê fora do contexto de um atendimento. + +NAME + Servico - Serviços que podem ser realizados em um guichê + +DESCRIPTION + Contém os serviços que podem ser realizados em um guichê. + +NAME + TipoEstadoAtendimento - Valores possiveis para o estado de um + atendimento + +DESCRIPTION + Esta tabela mantém a lista dos valores possiveis para o estado de um + atendimento. Apesar de essa configuração estar em um banco de dados, + existe um conjunto de valores que são obrigatórios para o bom + funcionamento do sistema. + +NAME + TipoEstadoGuiche - Quais os valores de estado de um guichê + +DESCRIPTION + Esta tabela lista os valores de estado que um guichê pode ter. Apesar + desses valores estarem configurados em banco de dados, existe um + conjunto de valores minimos que precisam estar inseridos nessa tabela. + +NAME + TipoEstadoLocal - Valores possiveis para o atributo "estado" do Local + +DESCRIPTION + Esta tabela contém os valores possiveis para o atributo "estado" do + local. Apesar de haver a configuração em banco de dados, existe um + conjunto minimo de valores obrigatórios. + diff --git a/documentacao/Documentacao.odt b/documentacao/Documentacao.odt new file mode 100644 index 0000000..a2dc238 Binary files /dev/null and b/documentacao/Documentacao.odt differ diff --git a/documentacao/ajuda_atendente.html b/documentacao/ajuda_atendente.html new file mode 100644 index 0000000..d3f9836 --- /dev/null +++ b/documentacao/ajuda_atendente.html @@ -0,0 +1,139 @@ + + + + + + Sistema de Atendimento + + + + +
    + +
    +
    +

    Apostila do Treinamento

    + +

    Dúvidas mais freqüentes

    + +

    Para facilitar a sua vida, durante a utilização deste sistema, só surgirão na tela ações que você poderá realizar em cada estado. Por isso observa-se uma mudança de botões.

    +

    Perguntas comuns:

    +
      0. Como saber qual o meu estado?
    +
      1. Como ficar “Disponível” e poder chamar senhas?
    +
      2. Como iniciar uma Pausa?
    +
      3. Como iniciar um Serviço durante o atendimento?
    +
      4. Como encaminhar atendimento?
    +
      5. Como faço para me comunicar com o gerente?
    +
      6. Quanto tempo devo esperar por um cidadão cuja senha eu esteja “Chamando”?
    +
      7. Um cidadão chegou na minha mesa mas sua vez já tinha passado. Ele ainda poderá ser atendido?
    +
      8. Como faço para fechar mesa?
    +
      9. Eu poderei mudar a minha senha de acesso?
    +

    Para maiores esclarecimentos, leia o restante desta documentação.

    + +

    Conceitos

    + +
      1. Local: Cada local tem um identificador único. As mesas e o atendente estão sempre associados a um local (físico) específico.
    +
      2. Gerente: O gerente de uma praça é um atendente a quem é atribuído o papel dentro de um intervalo de tempo determinado. Esse tempo pode ter o final em aberto, significando que ele é o gerente até que seja informada outra decisão.
    +
      3. Atendente: O atendente, no momento em que ele assume uma mesa para atendimento, tem um papel temporário naquele local, e pode ser assumido por outro atendente a qualquer momento.
    +
      4. Mesa: A mesa é a estação de atendimento onde o cidadão será recebido (atendido). Tem uma ligação física com o local, uma vez que o equipamento do “Opiniômetro” está associado àquele computador especificamente.
    +
      5. Expediente: Um expediente é o intervalo de tempo entre a abertura e o fechamento da praça. Durante um expediente as mesas podem ser abertas e fechadas de acordo com a necessidade, permitindo que, através do uso de turnos, uma mesma mesa possa ser usada por mais de um atendente.
    +
      6. Senhas: serão sempre seqüenciais dentro de um mesmo expediente, iniciando de 001 para cada categoria. No entanto, se houverem mais de 999 senhas emitidas para uma dada categoria dentro de um mesmo expediente, as senhas podem voltar a 001, sempre utilizando senhas de atendimentos já completamente encerradas e com horário apropriado e impresso.
    +
      7. Atendimento: Um atendimento começa no momento em que o cidadão solicita uma senha no “Emissor de Senha” e termina quando: o atendimento é concluído e o cidadão registra a avaliação do atendimento no opiniômetro, ou, o atendimento é concluído pelo gerente que encerra o atendimento porque o cidadão se recusou a registrar a avaliação ou quando o cidadão não reivindica o atendimento até 3 (senhas) após ser chamada.
    +
      8. Ausente: Este é o conceito que designa o momento em que uma senha é chamada, mas ninguém comparece para o atendimento. O sistema implementa uma tolerância de 3 senhas, o que significa que depois que a senha é chamada, o cidadão pode pedir para ser atendido “em atraso” até de 3 senhas.
    +
      9. Iniciar Serviço: Esta é a situação que descreve o momento em que o atendente precisa realizar alguma atividade “interna” extra SAC, que vai deixá-lo indisponível para novos atendimentos. O sistema permite que seja selecionado um serviço dentre uma lista previamente definida, assim como permite que sejam registradas informações referentes a esse serviço em específico.
    +
      10. Serviço em Atendimento: Da mesma forma que para o serviço interno, também é possível detalhar cada um dos serviços realizados ao longo de um atendimento. Essa informação é importante para possibilitar a extração de informações estatísticas sobre todo o processo de atendimento. Assim como no serviço “interno”, também é possível registrar informações adicionais, como por exemplo, a referência de um protocolo em um outro sistema.
    + +

    Entendendo o processo do atendimento

    + +

    Quando um atendimento é criado, ele começa no estado “espera”, o que significa que ele está na fila para que seja escalonado para atendimento em um das mesas. O escalonamento acontece de acordo com o tempo em espera, priorizado proporcionalmente de acordo com as categorias.

    +

    No momento em que chega a vez de um atendimento, o estado do atendimento passa para “chamando”, a senha é exibida no painel, já vinculado a uma mesa específica. Ao mesmo tempo, também aparece na tela do gerente e do atendente a informação de qual senha está sendo chamada.

    +

    Neste momento existem quatro possibilidades:

    +
  • 1. O cidadão apresenta-se a mesa, e o atendente inicia o atendimento. +
  • 2. Ninguém comparece, e o atendente registra “ausente”.
  • +
  • 3. O atendente encaminha a senha para outra mesa, caso o tipo de atendimento não seja sua especialidade.
  • +
  • 4. O atendente ou o gerente desfazem a chamada, retornando a senha para o estado “espera”, para que o atendente possa entrar em “pausa” .
  • +

    Sendo iniciado o atendimento, o atendente pode:

    +

    1.Ir para, outro sistema(spu, scuma etc.)

    +

    Para isso, basta clicar no botão “Ir Para” e escolher o serviço associado. Será possível então registrar informações adicionais sobre o serviço em execução, como o número do protocolo.

    +

    Ao concluir o serviço, basta clicar no botão “Concluir Serviço” e o sistema retornará ao estado de atendimento, onde pode ser iniciado outro serviço ou o atendimento pode ser concluído.

    +

    2.Concluir o atendimento.

    +

    Para concluir o atendimento, basta clicar no botão “Concluir atendimento”. O opiniômetro irá ser inciado, e logo que o cidadão registrar as respostas, a mesa entrará no estado “concluído”.

    +

    Ao realizar serviços, podem ser registradas informações adicionais, mas em um determinado momento o atendente deverá concluir o atendimento. Quando o atendimento for concluído, o opiniômetro será acionado para que o cidadão registre a avaliação. Caso o cidadão se recuse a registrar a avaliação, o atendente solicita ao gerente para encerrar o atendimento mesmo assim.

    +

    No momento em que o atendimento é encerrado, a mesa coloca-se em estado “concluído”, que permite que o atendente então escolha se vai:

    +

    1.Iniciar uma pausa.

    +

    Para iniciar uma pausa, basta clicar no botão “Iniciar Pausa”. A mesa será já colocada em estado de pausa, e então será possível registrar o motivo da pausa. Para retornar da pausa, basta clicar no botão “Terminar Pausa”.

    +

    2.Iniciar um serviço interno.

    +

    Assim como o “Ir Para” no atendimento, é possível clicar no “Iniciar Serviço”, que irá listar uma lista de serviços possíveis. Pode-se então selecionar o serviço e registrar informações adicionais. Quando estiver concluído, basta clicar no botão “Concluir Serviço”.

    +

    3.Fechar a mesa.

    +

    Fechar a mesa é o jeito correto de encerrar um dia de trabalho. Ao fazer isso a mesa estará então disponível para outro atendente assumir. O usuário será automaticamente deslogado do sistema.

    +

    4.Atender “ausente”.

    +

    Será apresentada uma lista das senhas “ausentes” ainda válidas para iniciar atendimento. Clicando na senha será iniciado o atendimento normalmente.

    +

    5.Ficar “Disponível” para outro atendimento.

    +

    Ao clicar em “disponível” o sistema irá atribuir uma nova senha a essa mesa, se houverem senhas em espera, ou irá fazê-lo logo que uma senha seja emitida.

    +

    O processo de escalonamento só irá enviar senhas para as mesas disponíveis, e vai fazer isso sempre no momento em que o atendente ficar “disponível”. É importante perceber que o estado das mesas estará sempre visível na tela do gerente, exibindo a hora em que o atendente passou para aquele estado, permitindo ao gerente ter um controle sobre a eficiência do atendimento.

    +

    Sempre que uma mesa estiver no estado “concluído”, o atendente também pode atender um “ausente”, desde que a senha ainda esteja dentro do limite de tolerância determinado. É importante sempre conferir que o número do atendimento confere com o número da senha no sistema.

    + +

    Conhecendo a interface do sistema

    + +

    Interface do Atendente

    +

    Para facilitar o uso do sistema, a interface do sistema é desenhada de uma maneira consistente e que é mantida durante todo o uso. A interface é dividida em 3 áreas, que permitem uma fácil navegação.

    +

    As áreas são:

    +
      1. Ações: Todas as ações que podem ser realizadas pelo atendente em qualquer momento estarão sempre agrupadas nessa área da tela, permitindo uma fácil localização. Sempre que uma ação tiver um impacto irreversível será apresentada uma caixa de confirmação para evitar a execução acidental dessas ações.
    +
      2. Chat: A qualquer momento o atendente pode chamar o gerente para conversar com ele com o uso de mensagens instantâneas. Essa opção é util para, por exemplo, solicitar diretamente ao gerente o encerramento de um atendimento quando o cidadão se recusou a fazer a avaliação, ou para solicitar uma pausa.
    +
      3. Informações: Mostra as informações sobre o estado atual, por exemplo, quando está chamando uma senha, mostra qual é a senha sendo chamada, quando vai para uma pausa, abre um espaço para preencher o motivo da pausa.
    + +

    Respostas

    + +

    0.Como saber qual o meu estado?

    +

    Você pode ver qual é o seu estado atual na parte de “Informações”, no lado direito da tela.

    +

    Voltar

    + +

    1. Como ficar “Disponível” e poder chamar senhas?

    +

    Vai depender do seu estado atual.

    +

    Se você estiver em “Avaliação”, deve esperar o fim da avaliação do cidadão. Caso o cidadão não tiver feito a avaliação ou o opiniômetro estiver com defeito, você deve pedir para o gerente encerrar seu atendimento.

    +

    Se você estiver “Concluído”, basta pressionar o botão “Disponível”.

    +

    Se você estiver em “Pausa”, clique em “Retornar da Pausa” e, em seguida, “Disponível”.

    +

    Se você estiver “Interno”, clique em “Encerrar serviço interno” e em seguida “Disponível”.

    +

    Voltar

    + +

    2. Como iniciar uma Pausa?

    +

    Se estiver “Disponível” ou “Concluído”, basta clicar no botão “Iniciar Pausa”.

    +

    Se estiver “Chamando”, clique em “Devolver Senha” e em seguida em “Iniciar Pausa”.

    +

    Aparecerá um campo onde se pode escrever o motivo da pausa. Este motivo ficará armazenado nas estatísticas. Escreva o motivo e em seguida clique em “Registrar”. Pode-se mudar o motivo da pausa. Para tanto, basta clicar em “Redefinir” e digitar o motivo novamente.

    +

    Para retornar da pausa basta clicar o botão “Retornar da Pausa”.

    +

    Voltar

    + +

    3. Como iniciar um Serviço durante o atendimento?

    +

    Para iniciar serviços, como SPU ou SCUMA, clique em “Iniciar Serviço”. Aparecerá na tela uma lista, então clique no link correspondente ao serviço desejado. Aparecerá um campo onde poderá ser feito um detalhamento do serviço, por exemplo: qual o protocolo do serviço, o que está sendo feito, etc. Após concluir o serviço, clique em “Encerrar”. É possível abrir mais de um serviço durante o mesmo atendimento. No entanto, não se pode “Concluir Atendimento” sem antes concluir os serviços abertos.

    +

    Voltar

    + +

    4. Como encaminhar atendimento?

    +

    Durante o atendimento se o cidadão solicitar um serviço que você não souber efetuar ou que não seja sua especialidade, basta clicar em encaminhar. Deve-se escolher a mesa para a qual se deseja encaminhar e em seguida registrar um motivo para o encaminhamento.

    +

    Voltar

    + +

    5. Como faço para me comunicar com o gerente?

    +

    Através do Chat. Digite a mensagem e em seguida clique em “Enviar” ou pressione ENTER.

    +

    Voltar

    + +

    6. Quanto tempo devo esperar por um cidadão cuja senha eu esteja “Chamando”?

    +

    Quanto tempo o gerente achar conveniente. Dentro do sistema há uma alternativa para que não se perca tempo esperando por uma senha que é “Registrar Ausente”. O atendente pode efetuar o registro sem a permissão do gerente.

    +

    Voltar

    + +

    7. Um cidadão chegou na minha mesa mas sua vez já tinha passado. Ele ainda poderá ser atendido?

    +

    Sim, desde que esteja dentro sempre do limite de tolerância determinado. Ao terminar o atendimento atual, pressione “Listar Ausente”. Se a senha ainda estiver listada, clique em “Atender” e inicie o atendimento normalmente.

    +

    Voltar

    + +

    8. Como faço para fechar mesa?

    +

    É necessário estar “Concluído” ou “Disponível”. Em seguida clique em “Fechar Mesa”. Caso esteja acontecendo algum problema, solicite ao gerente o fechamento de sua mesa.

    +

    Voltar

    + +

    9. Eu poderei mudar a minha senha de acesso?

    +

    Sim, no canto superior direito da tela, existe um link “Mudar Senha”. Ao clicar nele, será aberto uma janela onde deverá ser preenchido a “Senha Atual”, ou seja, a senha que está sendo usada até aquele momento, a “Nova Senha”, que é a senha que a partir de então será usada, e “Confirmar Senha”, onde deve ser digitada a nova senha novemente. Lembrando que, se você atualizar a tela após mudar a senha, será mostrada uma mensagem de erro, mas não se desespere: basta “logar” novamente, já utilizando a nova senha.

    +

    Voltar

    + +
    + + + + + diff --git a/documentacao/ajuda_gerente.html b/documentacao/ajuda_gerente.html new file mode 100644 index 0000000..8c10138 --- /dev/null +++ b/documentacao/ajuda_gerente.html @@ -0,0 +1,129 @@ + + + + + + Sistema de Atendimento + + + + +
    + +
    +
    +

    Apostila do Treinamento

    + +

    Dúvidas mais freqüentes

    + +

    -Como dar inicio a emissao das senhas?

    +

    No campo das "Ações" clique em "Abrir Local".

    +

    -Como abrir o local?

    +

    => No campo "Ações" clique em "Abrir Local".

    +

    -Como Encerrar as senhas?

    +

    => No campo "Ações" clique em "Encerrar Senhas".

    +

    -Como fechar o local?

    +

    => Certifique-se de que não há nenhum atendimento em andamento. Em seguida, + no campo "Ações" clique em "Fechar Todas as Mesas" e por último "Fechar Local". + Caso algum problema ocorra, clique em "Forçar Fechamento".

    +

    -Como ver quantas senhas faltam ser atendidas?

    +

    => Através do campo "Informações" do local, existe uma tabela que lista todas as senhas e + quantas estão chamando.

    +

    -Como responder ao chat de um atendente?

    +

    => Selecione o atendente ao qual deseja responder, em seguida, digite a mensagem + e pressione em "Enviar" ou aperte a tecla ENTER.

    +

    -Como enviar avisos ao atendente?

    +

    => Através do chat. Deve-se selecionar o atendente, digitar a mensagem e pressionar + "Enviar" ou apertar a tecla ENTER.

    +

    -Como enviar aviso a todos os atendentes?

    +

    => Existe uma opção TODOS dentro do selecionador que envia a mesma mensagem a todos os atendentes.

    +

    -Como ver quais atendentes estao atendendo?

    +

    => As mesas que estão atendendo ficam na cor verde.

    +

    -Como ver quais atendentes estão ociosos?

    +

    => Os atendentes que em mesas que estão ociosos, são mostrados na tela do gerente na cor vermelha.

    +

    -Como fechar uma mesa que foi desligada de forma incorreta?

    +

    => Vá no quadro da mesa e clique em "Fechar Mesa". Caso a mesa esteja "Chamando" clique em "Devolver Senha". + O estado da mesa passará para "Concluído" e você poderá clicar em "Fechar Mesa".

    +

    -Como ver o motivo da pausa do atendente?

    +

    => O motivo pode ser visualizado na tela do gerente ao colocando o cursor do mouse na palavra “Motivo”.

    +

    -Como ver o servico interno sendo executado pelo atendente?

    +

    => É possível visualizar o tipo de serviço que está sendo realizado colocando o cursor do mouse sobre a palavra “Serviço”.

    +

    -Como desabilitar um opiniometro?

    +

    => No quadro que representa a mesa, clique no ícone do opiniômetro. Aparecerá uma mensagem + de confirmação. Clique em "Ok".

    +

    -Eu posso passar a gerência para outra pessoa?

    +

    => Sim, para isso basta clicar em "(Passar Gerência)". Surgirá um popup "Passar Gerência" e no campo "Mudar Gerente", aparecerão os nomes + de todos os funcionários do local que estiverem aptos a se tornarem gerentes, ou seja, aqueles que não estiverem ligados a uma mesa. + Localizando o nome do funcionário excolhido, clique na palavra "Associar" ao lado. Você será desconectado e no próximo login, entrará no + sistema como Atendente.

    + +

    Para maiores informações, continue a leitura deste Guia de Ajuda.

    + +

    Conceitos

    + +
      1. Local: Cada local tem um identificador único. As mesas e o atendente estão sempre associados a um local (físico) específico.
    +
      2. Gerente: O gerente de uma praça é um atendente a quem é atribuído o papel dentro de um intervalo de tempo determinado. Esse tempo pode ter o final em aberto, significando que ele é o gerente até que seja informada outra decisão.
    +
      3. Atendente: O atendente, no momento em que ele assume uma mesa para atendimento, tem um papel temporário naquele local, e pode ser assumido por outro atendente a qualquer momento.
    +
      4. Mesa: A mesa é a estação de atendimento onde o cidadão será recebido (atendido). Tem uma ligação física com o local, uma vez que o equipamento do “Opiniômetro” está associado àquele computador especificamente.
    +
      5. Expediente: Um expediente é o intervalo de tempo entre a abertura e o fechamento da praça. Durante um expediente as mesas podem ser abertas e fechadas de acordo com a necessidade, permitindo que, através do uso de turnos, uma mesma mesa possa ser usada por mais de um atendente.
    +
      6. Senhas: serão sempre seqüenciais dentro de um mesmo expediente, iniciando de 001 para cada categoria. No entanto, se houverem mais de 999 senhas emitidas para uma dada categoria dentro de um mesmo expediente, as senhas podem voltar a 001, sempre utilizando senhas de atendimentos já completamente encerradas e com horário apropriado e impresso.
    +
      7. Atendimento: Um atendimento começa no momento em que o cidadão solicita uma senha no “Emissor de Senha” e termina quando: o atendimento é concluído e o cidadão registra a avaliação do atendimento no opiniômetro, ou, o atendimento é concluído pelo gerente que encerra o atendimento porque o cidadão se recusou a registrar a avaliação ou quando o cidadão não reivindica o atendimento até 3 (senhas) após ser chamada.
    +
      8. Ausente: Este é o conceito que designa o momento em que uma senha é chamada, mas ninguém comparece para o atendimento. O sistema implementa uma tolerância de 3 senhas, o que significa que depois que a senha é chamada, o cidadão pode pedir para ser atendido “em atraso” até de 3 senhas.
    +
      9. Iniciar Serviço: Esta é a situação que descreve o momento em que o atendente precisa realizar alguma atividade “interna” extra SAC, que vai deixá-lo indisponível para novos atendimentos. O sistema permite que seja selecionado um serviço dentre uma lista previamente definida, assim como permite que sejam registradas informações referentes a esse serviço em específico.
    +
      10. Serviço em Atendimento: Da mesma forma que para o serviço interno, também é possível detalhar cada um dos serviços realizados ao longo de um atendimento. Essa informação é importante para possibilitar a extração de informações estatísticas sobre todo o processo de atendimento. Assim como no serviço “interno”, também é possível registrar informações adicionais, como por exemplo, a referência de um protocolo em um outro sistema.
    + +

    Interface do Gerente

    + +

    Assim como a interface do atendente, a interface do gerente também tem a tela dividida em áreas delimitadas, mas a interface do gerente é dividida em 4 áreas: +

      1.Resumo do Local: Esta área mostra algumas informações estatísticas básicas sobre o estado atual, com o número de pessoas esperando no total, e por categoria, a espera mais antiga, e de cada categoria com as médias de tempo de espera e de atendimento, também para cada categoria, e a média total.
    +
      2.Ações: Esta área mostra todas as ações que podem ser realizadas pelo gerente em um determinado momento. Assim como na tela do atendente, quando as ações tiverem consequências irreversíveis, será exibida uma caixa de confirmação para evitar acidentes.
    +
      3.Chat: A tela de chat do gerente permite falar individualmente com cada um dos atendentes ou com todos de uma só vez, selecionando o nome do atendente dentro de uma caixa de seleção.
    +
      4.Mesas: Mostra o estado atual das mesas e dos atendimentos em cada mesa, e o nome do atendente.
    + +

    Descrição das ações do gerente

    + + +

    Abrir Local: o gerente inicia o expediente, iniciando a emissão de senhas e permitindo o acesso dos atendentes ao sistema.

    +

    Logo após a abertura do local, o bloco de ações ganha alguns botões. Fica assim:

    + +

    Encerrar Senhas: encerra a emissão de senhas durante o expediente, no entanto não se fecha o local.

    +

    Fechar Local: encerra o expediente.

    +

    Fechar todas as mesas: fecha todas as mesas que não estiverem com atendimentos em andamento, desligando todos os atendentes de suas respectivas mesas.

    +

    Forçar fechamento: desliga todos os atendentes de suas respectivas mesas e fecha local. Esta deve ser a opção se ocorrer algum erro durante o “Fechar Local” ou “Fechar todas as mesas”.

    +

    O gerente pode também visualizar os encaminhamentos realizados durante o expediente através do link Encaminhados. Ao ser clicado, surge uma janela com as informações referentes aos encaminhamentos.

    + +

    Descrição dos Estados das Mesas

    + +

    As mesas, como já foi dito, podem assumir diversos estados. Em todos os casos, pode-se visualizar a identificação da mesa (01, 02, 03,...), a condição do opiniômetro (habilitado ou desabilitado), a hora em que essa mesa passou para esse estado e o estado atual. As cores de exibição também ajudam o gerente na melhor visualização do estado de cada mesa. Os estados são:

    +

    1.Fechado (cor cinza)

    + +

    Não existe nenhum atendente ligado à mesa.

    +

    2.Disponível (cor verde)

    + +

    Esse estado acontece quando o atendente está no sistema, podendo atender. Na tela, pode-se visualizar, o atendente que está ligado a essa mesa e a opção “Fechar Mesa”. O gerente pode optar por fechar a mesa se ele perceber que o atendente não se desligou do sistema no fim do expediente ou se ocorrer algum erro inesperado.

    +

    3.Chamando (cor verde)

    + +

    Esse estado acontece quando é atribuído uma senha a uma mesa. Na tela, pode-se visualizar a senha que está sendo chamada, o atendente ligado à mesa e a opção “Devolver Senha”, que consiste em devolver a senha para a fila com prioridade máxima. O gerente opta por isso quando, por algum motivo, o atendente não puder realizar o atendimento.

    +

    4.Atendimento (cor verde)

    + +

    Esse estado ocorre a partir do momento em que o atendimento é iniciado. É mostrado na tela a senha e o horário de início do atendimento, o atendente ligado à mesa e a opção “Encerrar”, que consiste em encerrar o atendimento quando, por algum motivo, o atendente não puder fazê-lo.

    +

    5.Avaliação (cor vermelha)

    + +

    Esse estado começa quando o atendente encerra um atendimento e o cidadão inicia sua avaliação do atendimento. É mostrado na tela, a senha que está em avaliação o atendente ligado à mesa e a opção “Encerrar” que consiste em encerrar um atendimento se o cidadão se recusar a fazer a avaliação ou o opiniômetro estiver com defeito.

    +

    6.Concluído (cor vermelha)

    + +

    Esse estado começa quando o atendimento e a avaliação foram finalizados ou quando uma senha é devolvida. É mostrado o atendente ligado à mesa e a opção “Fechar Mesa” que já foi explicada.

    +

    7.Pausa (cor amarela)

    + +

    Esse estado ocorre quando o atendente inicia uma pausa. Nesse caso, ele pode dar um motivo para sua pausa. Este motivo é visualizado na tela do gerente ao por o mouse na palavra “Motivo”.

    +

    8.Interno (cor amarela)

    + +

    Esse estado ocorre quando o atendente precisa realizar algum trabalho fora do Sistema de Atendimento. Na tela do gerente, é possível visualizar o tipo de serviço que está sendo realizado colocando o mouse sobre a palavra “Serviço”.

    + +

    Em qualquer estado é possível habilitar ou desabilitar o opiniômetro de uma mesa. Para isto, basta clicar no ícone do opiniômetro logo abaixo da identificação da mesa.

    +

    Caso o opiniômetro seja desabilitado, quando o atendimento for encerrado, a mesa passará automaticamente para o estado “concluído”.

    + +
    + + + diff --git a/documentacao/im/Screenshot-1.png b/documentacao/im/Screenshot-1.png new file mode 100644 index 0000000..93e0ac0 Binary files /dev/null and b/documentacao/im/Screenshot-1.png differ diff --git a/documentacao/im/Screenshot.png b/documentacao/im/Screenshot.png new file mode 100644 index 0000000..871714f Binary files /dev/null and b/documentacao/im/Screenshot.png differ diff --git a/documentacao/im/abloc.gif b/documentacao/im/abloc.gif new file mode 100644 index 0000000..5db20b9 Binary files /dev/null and b/documentacao/im/abloc.gif differ diff --git a/documentacao/im/acões.gif b/documentacao/im/acões.gif new file mode 100644 index 0000000..01a3c29 Binary files /dev/null and b/documentacao/im/acões.gif differ diff --git a/documentacao/im/aten.gif b/documentacao/im/aten.gif new file mode 100644 index 0000000..24c2ffd Binary files /dev/null and b/documentacao/im/aten.gif differ diff --git a/documentacao/im/ava.gif b/documentacao/im/ava.gif new file mode 100644 index 0000000..6627243 Binary files /dev/null and b/documentacao/im/ava.gif differ diff --git a/documentacao/im/bt_abrir_local.gif b/documentacao/im/bt_abrir_local.gif new file mode 100644 index 0000000..af15ed8 Binary files /dev/null and b/documentacao/im/bt_abrir_local.gif differ diff --git a/documentacao/im/cham.gif b/documentacao/im/cham.gif new file mode 100644 index 0000000..b5b61b1 Binary files /dev/null and b/documentacao/im/cham.gif differ diff --git a/documentacao/im/conc.gif b/documentacao/im/conc.gif new file mode 100644 index 0000000..22fd1f1 Binary files /dev/null and b/documentacao/im/conc.gif differ diff --git a/documentacao/im/disp.gif b/documentacao/im/disp.gif new file mode 100644 index 0000000..c37f6ad Binary files /dev/null and b/documentacao/im/disp.gif differ diff --git a/documentacao/im/fechado.gif b/documentacao/im/fechado.gif new file mode 100644 index 0000000..2b688fa Binary files /dev/null and b/documentacao/im/fechado.gif differ diff --git a/documentacao/im/int.gif b/documentacao/im/int.gif new file mode 100644 index 0000000..3e2cf6b Binary files /dev/null and b/documentacao/im/int.gif differ diff --git a/documentacao/im/pausa.gif b/documentacao/im/pausa.gif new file mode 100644 index 0000000..bd5fbf1 Binary files /dev/null and b/documentacao/im/pausa.gif differ diff --git a/documentacao/modelo_atemporal.dia b/documentacao/modelo_atemporal.dia new file mode 100644 index 0000000..49e7aef Binary files /dev/null and b/documentacao/modelo_atemporal.dia differ diff --git a/documentacao/olap_cubes.txt b/documentacao/olap_cubes.txt new file mode 100644 index 0000000..d3d4f8d --- /dev/null +++ b/documentacao/olap_cubes.txt @@ -0,0 +1,122 @@ +Cubo: + - Nome: Quantidade de Atendimentos + - Descrição: Conta o número de atendimentos iniciados. + - Dimensões: + - Local + - Categoria + - Guichê + - Atendente + - Tempo + - Medidas: + - TotalAtendimentos + +Cubo: + - Nome: Ocupação dos Guichês + - Descrição: Ancorado no início dos atendimentos, constata + o número de atendimentos simultâneos + - Dimensões: + - Local + - Tempo + - Medidas: + - MediaAtendimentosSimultaneos + - MinimoAtendimentosSimultaneos + - MaximoAtendimentosSimultaneos + +Cubo: + - Nome: Duração dos Atendimentos + - Descrição: Ancorado no final dos atendimentos, constata + a duração dos atendimentos realizados + - Dimensões: + - Local + - Categoria + - Guichê + - Atendente + - Servico + - ClasseServico + - Tempo + - Medidas: + - TotalDuracaoAtendimento + - MediaDuracaoAtendimento + - MinimoDuracaoAtendimento + - MaximoDuracaoAtendimento + + +Cubo 3: + - Nome: Duração dos Deslocamentos + - Descrição: Ancorado no final do "chamando", constata o tempo de + deslocamento. + - Dimensões: + - Local + - Categoria + - Guichê + - Atendente + - Tempo + - Medidas: + - TotalTempoDeslocamento + - MediaTempoDeslocamento + - MinimoTempoDeslocamento + - MaximoTempoDeslocamento + +Cubo 2: + - Nome: Duração da Espera + - Descrição: Anorada no inicio do "chamando", constata a quantidade de + pessoas esperando. + - Dimensões: + - Local + - Categoria + - Tempo + - Medidas: + - TotalTempoEspera + - MediaTempoEspera + - MaximoTempoEspera + - MinimoTempoEspera + - MediaEsperasSimultaneas + - MinimoEsperasSimultaneas + - MaximoEsperasSimultaneas + +Cubo 3: + - Nome: Quantidade Ausentes. + - Dimensões: + - Local + - Categoria + - Tempo + - Medidas: + - TotalAusentes + +Cubo 4: + - Nome: Número de Guichês abertos + - Descrição: Ancorado na abertura do guichê, conta o total de abertos. + - Dimensões: + - Local + - Tempo + - Medidas: + - MediaGuichesAbertos + - MinimoGuichesAbertos + - MaximoGuichesAbertos + +Cubo 5: + - Nome: Ociosidade + - Descrição: Ancorado no início dos estados "concluído" e "disponível", + constata o total de tempo ocioso. + - Dimensões: + - Local + - Atendente + - Guiche + - Tempo + - Medidas: + - TotalTempoOcioso + +Cubo 6: + - Nome: Satisfacao + - Dimensões: + - Local + - Categoria + - Guichê + - Atendente + - Pergunta + - Servico + - ClasseServico + - Tempo + - Resposta + - Medidas: + - TotalRepostas diff --git a/documentacao/temporalidade.txt b/documentacao/temporalidade.txt new file mode 100644 index 0000000..aef5339 --- /dev/null +++ b/documentacao/temporalidade.txt @@ -0,0 +1,76 @@ +Notas de temporalidade do modelo de dados +========================================= + +Todas as entidades/atributos/relacionamentos não listados aqui devem ser entendidos como ATEMPORAIS. + +Atendimento +----------- + +A entidade atendimento é TEMPORAL e tem um /lifespan/ que vai do momento em que uma senha é emitida até o momento em que o atendimento é encerrado. + +- id_atendimento: Chave primária, sequencial; +- categoria: TEMPORAL e pode ser alterada por uma transferência de atendimento; +- senha: ATEMPORAL, uma vez que a senha é a âncora para identificar o atendimento; +- local: ATEMPORAL, uma vez que um atendimento não é transferido de um local para outro; +- guichê: TEMPORAL, uma vez que a relação pode existir no estado em que o atendimento está sendo apenas "chamado", e pode haver tanto um cancelamento da chamada quanto uma re-chamada em um guichê diferente, assim como no caso de redirecionamento do atendimento, o mais provável é que o atendimento seja realizado por guichês diferentes; +- estado: TEMPORAL, uma vez que o estado de um atendimento vai sendo alterado ao longo do tempo; +- serviço: TEMPORAL, um atendimento pode representar a realização de mais de um serviço; + +ConfiguracaoCategoria +--------------------- + +A entidade é TEMPORAL e registra o período durante o qual uma determinada configuração foi válida. + +Local +----- + +A entidade é TEMPORAL, referindo-se ao período de que um local de atendimento é inaugurado até o momento em que ele é desativado. + +- id_local: Chave primária, sequencial; +- nome: ATEMPORAL, mesmo que o nome mude, ainda representa o mesmo local; +- estado: TEMPORAL +- gerente: TEMPORAL + +Guiche +------ + +A entidade é TEMPORAL, possibilitando a representação da alteração do número de guiches em um determinado local. + +- id_guiche: Chave primária, sequencial; +- identificador: ATEMPORAL representa a identificação viual do guichê; +- local: ATEMPORAL, um guichê nunca é transferido de um local para outro; +- estado: TEMPORAL +- atendente: TEMPORAL +- servico: TEMPORAL + +Pausa +----- + +A entidade é TEMPORAL, refletindo apenas os intervalos de indisponibilidade + +- id_pausa: Chave primária, sequencial; +- guiche: ATEMPORAL, uma pausa refere-se a um guichê apenas; +- funcionario: ATEMPORAL, refere-se a apenas um funcionário; +- motivo: ATEMPORAL, mesmo que o motivo mude, a pausa ainda é a mesma; + +Serviço +------- + +A entidade é TEMPORAL, refletindo o período durante o qual aquele serviço poderia ser realizado. + +- id_serviço: Chage primária, sequencial; +- nome: ATEMPORAL, a mudança de nome não muda o que o serviço representa; +- classe: ATEMPORAL, se um serviço mudar de classe, deve ser compreendido como um novo serviço; + +PerguntaAvaliacao +----------------- + +A entidade é TEMPORAL, refletindo o tempo durante o qual aquela pergunta foi realizada. + +- id_pergunta: Chave primária, sequencial; +- pergunta: Mudanças no texto da pergunta não implicam mudança na pergunta em si; + +RespostaAvaliação +----------------- + +A entidade é TEMPORAL, mas INSTANTÂNEA, representando o momento em que a resposta foi dada, o que significa que, uma vez registrada, a resposta não é alterada. diff --git a/ltsp/htmlmesa.html b/ltsp/htmlmesa.html new file mode 100644 index 0000000..8210689 --- /dev/null +++ b/ltsp/htmlmesa.html @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/patches/DBIx-Class-ResultSource.patch b/patches/DBIx-Class-ResultSource.patch new file mode 100644 index 0000000..d15d15c --- /dev/null +++ b/patches/DBIx-Class-ResultSource.patch @@ -0,0 +1,59 @@ +diff --git a/0.08/trunk/lib/DBIx/Class/ResultSource.pm b/0.08/trunk/lib/DBIx/Class/ResultSource.pm +index b723517..58b3483 100644 +--- a/0.08/trunk/lib/DBIx/Class/ResultSource.pm ++++ b/0.08/trunk/lib/DBIx/Class/ResultSource.pm +@@ -480,6 +480,10 @@ will result in the JOIN clause + + You can specify as many foreign => self mappings as necessary. + ++You can also specify a scalar ref as the value on the condition to ++provide arbitrary join conditions, but that must still be used on the ++foreign table fields. ++ + Valid attributes are as follows: + + =over 4 +@@ -792,22 +796,28 @@ sub resolve_condition { + # XXX should probably check these are valid columns + $k =~ s/^foreign\.// || + $self->throw_exception("Invalid rel cond key ${k}"); +- $v =~ s/^self\.// || +- $self->throw_exception("Invalid rel cond val ${v}"); +- if (ref $for) { # Object +- #warn "$self $k $for $v"; +- $ret{$k} = $for->get_column($v) if $for->has_column_loaded($v); +- #warn %ret; +- } elsif (!defined $for) { # undef, i.e. "no object" +- $ret{$k} = undef; +- } elsif (ref $as eq 'HASH') { # reverse hashref +- $ret{$v} = $as->{$k}; +- } elsif (ref $as) { # reverse object +- $ret{$v} = $as->get_column($k); +- } elsif (!defined $as) { # undef, i.e. "no reverse object" +- $ret{$v} = undef; ++ if ($v =~ s/^self\.//) { ++ if (ref $for) { # Object ++ #warn "$self $k $for $v"; ++ $ret{$k} = $for->get_column($v) if $for->has_column_loaded($v); ++ #warn %ret; ++ } elsif (!defined $for) { # undef, i.e. "no object" ++ $ret{$k} = undef; ++ } elsif (ref $as eq 'HASH') { # reverse hashref ++ $ret{$v} = $as->{$k}; ++ } elsif (ref $as) { # reverse object ++ $ret{$v} = $as->get_column($k); ++ } elsif (!defined $as) { # undef, i.e. "no reverse object" ++ $ret{$v} = undef; ++ } else { ++ $ret{"${as}.${k}"} = "${for}.${v}"; ++ } + } else { +- $ret{"${as}.${k}"} = "${for}.${v}"; ++ if (ref $for) { ++ $ret{$k} = $v; ++ } else { ++ $ret{"${as}.${k}"} = $v; ++ } + } + } + return \%ret; diff --git a/patches/DJabberd.patch b/patches/DJabberd.patch new file mode 100644 index 0000000..9b12d68 --- /dev/null +++ b/patches/DJabberd.patch @@ -0,0 +1,211 @@ +diff -uNard DJabberd-0.84/lib/DJabberd/SAXHandler.pm DJabberd-0.84.ruoso/lib/DJabberd/SAXHandler.pm +--- DJabberd-0.84/lib/DJabberd/SAXHandler.pm 2008-12-17 18:29:34.000000000 -0300 ++++ DJabberd-0.84.ruoso/lib/DJabberd/SAXHandler.pm 2009-06-10 09:44:24.000000000 -0300 +@@ -188,7 +188,9 @@ + push @$nodelist, DJabberd::XMLElement->new($ev->[1]{NamespaceURI}, + $ev->[1]{LocalName}, + $attr, +- _nodes_from_events($evlist, $start_idx, $end_idx)); ++ _nodes_from_events($evlist, $start_idx, $end_idx), ++ undef, ++ $ev->[1]{Prefix}); + next; + } + +diff -uNard DJabberd-0.84/lib/DJabberd/XMLElement.pm DJabberd-0.84.ruoso/lib/DJabberd/XMLElement.pm +--- DJabberd-0.84/lib/DJabberd/XMLElement.pm 2008-12-17 18:29:34.000000000 -0300 ++++ DJabberd-0.84.ruoso/lib/DJabberd/XMLElement.pm 2009-06-10 14:09:54.000000000 -0300 +@@ -7,6 +7,7 @@ + 'children', # arrayref of child elements of this same type, or scalars for text nodes + 'raw', # in some cases we have the raw xml and we have to create a fake XMLElement object + # business logic is that as_xml returns the raw stuff if it is exists, children has to be empty -- sky ++ 'prefix', # namepace prefix in use in this element + ); + + use DJabberd::Util; +@@ -23,7 +24,9 @@ + ($self->{ns}, + $self->{element}, + $self->{attrs}, +- $self->{children}) = @_; ++ $self->{children}, ++ $self->{raw}, ++ $self->{prefix}) = @_; + #my ($ns, $elementname, $attrs, $children) = @_; + #Carp::confess("children isn't an arrayref, is: $children") unless ref $children eq "ARRAY"; + +@@ -107,35 +110,92 @@ + return $self->{ns}; + } + ++sub _resolve_prefix { ++ my ($self, $nsmap, $def_ns, $uri, $attr) = @_; ++ if ($def_ns && $def_ns eq $uri) { ++ return ''; ++ } elsif ($uri eq '') { ++ return ''; ++ } elsif ($nsmap->{$uri}) { ++ $nsmap->{$uri}.':'; ++ } else { ++ $nsmap->{___prefix_count} ||= 0; ++ my $count = $nsmap->{___prefix_count}++; ++ my $prefix = "nsp$count"; ++ $nsmap->{$uri} = $prefix; ++ $nsmap->{$prefix} = $uri; ++ $attr->{'{http://www.w3.org/2000/xmlns}'.$prefix} = $uri; ++ return $prefix.':'; ++ } ++} ++ + sub as_xml { + my DJabberd::XMLElement $self = shift; +- my $nsmap = shift || {}; # localname -> uri, uri -> localname +- my $def_ns = shift; ++ ++ my $nsmap = shift || { }; # localname -> uri, uri -> localname ++ ++ # tons of places call as_xml, but nobody seems to care about ++ # the default namespace. It seems, however, that it is a common ++ # usage for "jabber:client" to be this default ns. ++ my $def_ns = shift || 'jabber:client'; + + my ($ns, $el) = ($self->{ns}, $self->{element}); ++ if ($self->{prefix}) { ++ $nsmap->{$self->{prefix}} = $ns; ++ $nsmap->{$ns} = $self->{prefix}; ++ } + + my $attr_str = ""; + my $attr = $self->{attrs}; ++ ++ $nsmap->{xmlns} = 'http://www.w3.org/2000/xmlns'; ++ $nsmap->{'http://www.w3.org/2000/xmlns'} = 'xmlns'; ++ ++ # let's feed the nsmap... + foreach my $k (keys %$attr) { +- next if $k eq "{}xmlns"; +- my $value = $attr->{$k}; +- # FIXME: ignoring all namespaces on attributes +- $k =~ s!^\{(.*)\}!!; +- my $ns = $1; +- $attr_str .= " $k='" . DJabberd::Util::exml($value) . "'"; ++ if ($k =~ /^\{(.*)\}(.+)$/) { ++ my ($nsuri, $name) = ($1, $2); ++ if ($nsuri eq 'xmlns' || ++ $nsuri eq 'http://www.w3.org/2000/xmlns/') { ++ $nsmap->{$name} = $attr->{$k}; ++ $nsmap->{$attr->{$k}} = $name; ++ } elsif ($k eq '{}xmlns') { ++ $def_ns = $attr->{$k}; ++ } ++ } elsif ($k eq 'xmlns') { ++ $def_ns = $attr->{$k}; ++ } + } + +- my $xmlns = (!$ns || +- ($def_ns && $ns eq $def_ns) || +- $ns eq "jabber:server" || +- $ns eq "jabber:component:accept" || +- $ns eq "jabber:client") ? +- "" : " xmlns='$ns'"; +- my $innards = $self->innards_as_xml($nsmap, $ns, $def_ns); ++ my $nsprefix = $self->_resolve_prefix($nsmap, $def_ns, $ns, $attr); ++ ++ foreach my $k (keys %$attr) { ++ my $value = $attr->{$k}; ++ if ($k =~ /^\{(.*)\}(.+)$/) { ++ my ($nsuri, $name) = ($1, $2); ++ if ($nsuri eq 'xmlns' || ++ $nsuri eq 'http://www.w3.org/2000/xmlns/') { ++ $attr_str .= " xmlns:$name=\"" . DJabberd::Util::exml($value) . "\""; ++ } elsif ($k eq '{}xmlns') { ++ $attr_str .= " xmlns=\"".DJabberd::Util::exml($value)."\""; ++ } else { ++ my $nsprefix = $self->_resolve_prefix($nsmap, $def_ns, $nsuri); ++ $attr_str .= " $nsprefix$name=\"".DJabberd::Util::exml($value)."\""; ++ } ++ } else { ++ $attr_str .= " $k=\"" . DJabberd::Util::exml($value) . "\""; ++ } ++ } ++ ++ my $innards = $self->innards_as_xml($nsmap, $def_ns); + $innards = "..." if $DJabberd::ASXML_NO_INNARDS && $innards; +- return length $innards ? +- "<$el$xmlns$attr_str>$innards" : +- "<$el$xmlns$attr_str/>"; ++ ++ my $result = length $innards ? ++ "<$nsprefix$el$attr_str>$innards" : ++ "<$nsprefix$el$attr_str/>"; ++ ++ return $result; ++ + } + + sub innards_as_xml { +@@ -170,6 +230,7 @@ + $clone->{attrs} = { %{ $self->{attrs} } }; + $clone->{children} = [ map { ref($_) ? $_->clone : $_ } @{ $self->{children} } ]; + $clone->{raw} = $self->{raw}; ++ $clone->{prefix} = $self->{prefix}; + return $clone; + } + +diff -uNard DJabberd-0.84/lib/DJabberd.pm DJabberd-0.84.ruoso/lib/DJabberd.pm +--- DJabberd-0.84/lib/DJabberd.pm 2008-12-17 18:48:16.000000000 -0300 ++++ DJabberd-0.84.ruoso/lib/DJabberd.pm 2009-06-10 14:14:00.000000000 -0300 +@@ -41,7 +41,7 @@ + use Carp qw(croak); + use DJabberd::Util qw(tsub as_bool as_num as_abs_path as_bind_addr); + +-our $VERSION = '0.84'; ++our $VERSION = '0.85'; + + our $logger = DJabberd::Log->get_logger(); + our $hook_logger = DJabberd::Log->get_logger("DJabberd::Hook"); +diff -uNard DJabberd-0.84/t/disco.t DJabberd-0.84.ruoso/t/disco.t +--- DJabberd-0.84/t/disco.t 2008-12-17 18:29:34.000000000 -0300 ++++ DJabberd-0.84.ruoso/t/disco.t 2009-06-10 13:14:01.000000000 -0300 +@@ -17,7 +17,7 @@ + + "); + +- like($pa->recv_xml, qr{}, "Say we are a server"); ++ like($pa->recv_xml, qr{}, "Say we are a server"); + + $pa->send_xml(qq{ + }); + +- like($pa->recv_xml, qr{}, "We dont currently return anything"); ++ like($pa->recv_xml, qr{}, "We dont currently return anything"); + }); + +diff -uNard DJabberd-0.84/t/lib/djabberd-test.pl DJabberd-0.84.ruoso/t/lib/djabberd-test.pl +--- DJabberd-0.84/t/lib/djabberd-test.pl 2008-12-17 18:29:34.000000000 -0300 ++++ DJabberd-0.84.ruoso/t/lib/djabberd-test.pl 2009-06-10 13:30:40.000000000 -0300 +@@ -536,7 +536,7 @@ + $self->{ss} = $self->get_stream_start(); + + my $features = $self->recv_xml; +- die "no features" unless $features =~ /^recv_xml; +- like($xml, qr{}, "iq vcard query"); ++ like($xml, qr{}, "iq vcard query"); + like($xml, qr{\btype=.get\b}, "is a get"); + + # now we'll make pb be the broken libgaim. note the bogus from address. -- libgit2 0.21.2