diff --git a/Fila-ETL/lib/Fila/ETL/Controller/Opiniao.pm b/Fila-ETL/lib/Fila/ETL/Controller/Opiniao.pm new file mode 100644 index 0000000..fea95e2 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/Controller/Opiniao.pm @@ -0,0 +1,166 @@ +package Fila::ETL::Controller::Opiniao; +# 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 opiniao :Chained('/base') :PathPart :CaptureArgs(0) { + my ($self, $c) = @_; + $c->stash->{vt_base} = $c->stash->{now}; +} + +sub avaliacao :Chained('opiniao') :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 => '/opiniao/avaliacao', + 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', resposta_avaliacao.vt_fac) AS datahora, COUNT(*) AS + quantidade, resposta, categoria.nome, categoria.codigo, + categoria.id_categoria, pergunta_avaliacao.pergunta, funcionario.nome + AS nome_func, funcionario.jid, guiche.identificador + +FROM + resposta_avaliacao INNER JOIN + pergunta_avaliacao USING (id_pergunta) INNER JOIN + atendimento + ON (resposta_avaliacao.id_atendimento=atendimento.id_atendimento AND + atendimento.id_local=?) LEFT JOIN + categoria_atendimento + ON (atendimento.id_atendimento=categoria_atendimento.id_atendimento AND + categoria_atendimento.vt_ini <= resposta_avaliacao.vt_fac AND + categoria_atendimento.vt_fim >= resposta_avaliacao.vt_fac) LEFT JOIN + categoria USING (id_categoria) LEFT JOIN + guiche_atendimento + ON (atendimento.id_atendimento=guiche_atendimento.id_atendimento AND + guiche_atendimento.vt_ini <= resposta_avaliacao.vt_fac AND + guiche_atendimento.vt_fim >= resposta_avaliacao.vt_fac) LEFT JOIN + guiche USING (id_guiche) LEFT JOIN + atendente_guiche + ON (atendente_guiche.id_guiche=guiche.id_guiche AND + atendente_guiche.vt_ini <= resposta_avaliacao.vt_fac AND + atendente_guiche.vt_fim >= resposta_avaliacao.vt_fac) LEFT JOIN + funcionario USING (id_funcionario) + +WHERE + resposta_avaliacao.vt_fac > ? AND + resposta_avaliacao.vt_fac <= ? + +GROUP BY DATE_TRUNC('minute', resposta_avaliacao.vt_fac), resposta, + categoria.nome, categoria.codigo, categoria.id_categoria, pergunta, + funcionario.nome, funcionario.jid, guiche.identificador + +#; + + my $storage = $c->model('Federado')->storage($c, $id); + $storage->ensure_connected; + my $dbi = $storage->dbh; + + my $sth = $dbi->prepare($sql); + $sth->execute( $id, + $c->stash->{last_vt_base}, $c->stash->{vt_base}, + ); + + my $dlocal = $c->model('DB::DLocal')->get_dimension($local); + my $func_cache = {}; + my $cate_cache = {}; + my $guic_cache = {}; + my $perg_cache = {}; + my $resp_cache = {}; + + while (my $item = $sth->fetchrow_hashref) { + my $datahora = $item->{datahora}; + my $datahora_dt = DateTime::Format::Pg->parse_datetime($datahora); + my $data = $c->model('DB::DData')->get_dimension($datahora_dt); + my $horario = $c->model('DB::DHorario')->get_dimension($datahora_dt); + + unless (exists $func_cache->{$item->{jid}}) { + $func_cache->{$item->{jid}} = $c->model('DB::DAtendente') + ->get_dimension({ nome => $item->{nome_func}, jid => $item->{jid}}); + } + my $func = $func_cache->{$item->{jid}}; + + unless (exists $cate_cache->{$item->{id_categoria}}) { + $cate_cache->{$item->{id_categoria}} = + $c->model('DB::DCategoria')->get_dimension($item); + } + my $cate = $cate_cache->{$item->{id_categoria}}; + + unless (exists $guic_cache->{$item->{identificador}}) { + $guic_cache->{$item->{identificador}} = + $c->model('DB::DGuiche')->get_dimension($item->{identificador}); + } + my $guic = $guic_cache->{$item->{identificador}}; + + unless (exists $perg_cache->{$item->{pergunta}}) { + $perg_cache->{$item->{pergunta}} = + $c->model('DB::DPerguntaAvaliacao')->get_dimension($item->{pergunta}); + } + my $perg = $perg_cache->{$item->{pergunta}}; + + unless (exists $resp_cache->{$item->{resposta}}) { + $resp_cache->{$item->{resposta}} = + $c->model('DB::DRespostaAvaliacao')->get_dimension($item->{resposta}); + } + my $resp = $resp_cache->{$item->{resposta}}; + + $c->model('DB::FAvaliacao')->create + ({ id_local => $dlocal, + data => $data, + horario => $horario, + id_guiche => $guic, + id_categoria => $cate, + id_atendente => $func, + id_pergunta => $perg, + id_resposta => $resp, + quantidade => $item->{quantidade} + }); + } + + + $c->model('DB::ActivityLog')->create + ({ activity_type => '/opiniao/avaliacao', + vt_base => $c->stash->{vt_base}, + vt_ini => $c->stash->{now}, + id_local => $id }); + + }); + + +} + +1; diff --git a/Fila-ETL/lib/Fila/ETL/DB/DAtendente.pm b/Fila-ETL/lib/Fila/ETL/DB/DAtendente.pm index 4c4e659..fabaef4 100644 --- a/Fila-ETL/lib/Fila/ETL/DB/DAtendente.pm +++ b/Fila-ETL/lib/Fila/ETL/DB/DAtendente.pm @@ -49,15 +49,23 @@ use base 'DBIx::Class::ResultSet'; sub get_dimension { my ($self, $atendente) = @_; - my $matricula = $atendente->jid; - $matricula =~ s/\@.+$//; + my ($matricula, $nome); + if (ref $atendente ne 'HASH') { + $matricula = $atendente->jid; + $matricula =~ s/\@.+$//; + $nome = $atendente->nome; + } else { + $matricula = $atendente->{jid}; + $matricula =~ s/\@.+$//; + $nome = $atendente->{nome}; + } 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; + nome => $nome })->id_atendente; } } diff --git a/Fila-ETL/lib/Fila/ETL/DB/DCategoria.pm b/Fila-ETL/lib/Fila/ETL/DB/DCategoria.pm index a4c185b..e64d2bd 100644 --- a/Fila-ETL/lib/Fila/ETL/DB/DCategoria.pm +++ b/Fila-ETL/lib/Fila/ETL/DB/DCategoria.pm @@ -55,16 +55,23 @@ use base 'DBIx::Class::ResultSet'; sub get_dimension { my ($self, $categoria) = @_; - my $nome = $categoria->nome; + my ($codigo, $nome); + if (ref $categoria eq 'HASH') { + $codigo = $categoria->{codigo}; + $nome = $categoria->{nome}; + } else { + $codigo = $categoria->{codigo}; + $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 + ({ nome => $nome, + codigo => $codigo, + prioritaria => $nome =~ /(prefer|priorit)/i ? 1 : 0 })->id_categoria; } } diff --git a/Fila-ETL/lib/Fila/ETL/DB/DGuiche.pm b/Fila-ETL/lib/Fila/ETL/DB/DGuiche.pm index 0893340..a861095 100644 --- a/Fila-ETL/lib/Fila/ETL/DB/DGuiche.pm +++ b/Fila-ETL/lib/Fila/ETL/DB/DGuiche.pm @@ -45,7 +45,12 @@ use base 'DBIx::Class::ResultSet'; sub get_dimension { my ($self, $guiche) = @_; - my $ident = $guiche->identificador; + my $ident; + if (ref $guiche) { + $ident = $guiche->identificador; + } else { + $ident = $guiche; + } if (my $dim = $self->find({ identificador => $ident })) { return $dim->id_guiche; } else { diff --git a/Fila-ETL/lib/Fila/ETL/DB/DPerguntaAvaliacao.pm b/Fila-ETL/lib/Fila/ETL/DB/DPerguntaAvaliacao.pm new file mode 100644 index 0000000..20c555f --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/DB/DPerguntaAvaliacao.pm @@ -0,0 +1,69 @@ +package Fila::ETL::DB::DPerguntaAvaliacao; +# 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_pergunta_avaliacao'); +__PACKAGE__->add_columns + ( + id_pergunta => + { + data_type => 'integer', + is_auto_increment => 1 + }, + texto => + { + data_type => 'varchar', + is_nullable => 1, + } + ); + +__PACKAGE__->set_primary_key('id_pergunta'); +__PACKAGE__->resultset_class('Fila::ETL::DB::DAtendente::RS'); + +package Fila::ETL::DB::DPerguntaAvaliacao::RS; +use base 'DBIx::Class::ResultSet'; + +sub get_dimension { + my ($self, $pergunta) = @_; + my $texto = $pergunta->pergunta; + if (my $dim = $self->find({ texto => $texto })) { + return $dim->id_pergunta; + } else { + # TODO: Obter isso de um lugar mais inteligente; + return $self->create + ({ texto => $pergunta->pergunta })->id_pergunta; + } +} + +1; + +__END__ + +=head1 NAME + +DPerguntaAvaliacao - Tabela da dimensão "Pergunta Avaliacao" + +=head1 SYNOPSIS + +Essa tabela lista todas as entradas da dimensão "Pergunta Avaliacao". + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/DB/DRespostaAvaliacao.pm b/Fila-ETL/lib/Fila/ETL/DB/DRespostaAvaliacao.pm new file mode 100644 index 0000000..0fbb9b1 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/DB/DRespostaAvaliacao.pm @@ -0,0 +1,67 @@ +package Fila::ETL::DB::DRespostaAvaliacao; +# 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_resposta_avaliacao'); +__PACKAGE__->add_columns + ( + id_resposta => + { + data_type => 'integer', + is_auto_increment => 1 + }, + valor => + { + data_type => "varchar" + } + ); + +__PACKAGE__->set_primary_key('id_resposta'); +__PACKAGE__->resultset_class('Fila::ETL::DB::DAtendente::RS'); + +package Fila::ETL::DB::DRespostaAvaliacao::RS; +use base 'DBIx::Class::ResultSet'; + +sub get_dimension { + my ($self, $resposta) = @_; + my $valor = (qw(otimo bom regular ruim))[$resposta - 1]; + if (my $dim = $self->find({ id_resposta => $resposta })) { + return $resposta; + } else { + return $self->create + ({ valor => $valor, id_resposta => $resposta })->id_resposta; + } +} + +1; + +__END__ + +=head1 NAME + +DRespostaAvaliacao - Tabela da dimensão "Resposta Avaliacao" + +=head1 SYNOPSIS + +Essa tabela lista todas as entradas da dimensão "Resposta Avaliacao". + +=cut diff --git a/Fila-ETL/lib/Fila/ETL/DB/FAvaliacao.pm b/Fila-ETL/lib/Fila/ETL/DB/FAvaliacao.pm new file mode 100644 index 0000000..c7aa8c4 --- /dev/null +++ b/Fila-ETL/lib/Fila/ETL/DB/FAvaliacao.pm @@ -0,0 +1,79 @@ +package Fila::ETL::DB::FAvaliacao; +# 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_avaliacao'); +__PACKAGE__->add_columns + ( + id_local => + { + data_type => 'integer', + }, + id_guiche => + { + data_type => 'integer', + }, + id_atendente => + { + data_type => 'integer', + }, + id_categoria => + { + data_type => 'integer', + }, + id_pergunta => + { + data_type => 'integer', + }, + id_resposta => + { + data_type => 'integer', + }, + data => + { + data_type => 'char(10)', + }, + horario => + { + data_type => 'char(5)', + }, + quantidade => + { + 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 -- libgit2 0.21.2