Boas práticas de programação com Object Calisthenics
i-Educar - 1º Seminário PHP no Serpro
1. Líder em soluções de TI para governo
Sistema de Gestão Escolar
Carlos M. dos Santos
Coordenação Estratégica de Ações Governamentais - CEAGO
1º Seminário de PHP da SERPRO
9 de novembro de 2015
3. Introdução
● Software de gestão escolar
● Desenvolvido inicialmente pela Prefeitura de Itajaí, SC
● Software Livre
● Desenvolvimento ativo
4. Software livre
● Portal do Software Público Brasileiro (SPB)
● Disponível sob licença GPL
● http://softwarepublico.gov.br
5. Histórico
● 2006/2007
● Criação do Software
CTIMA – Prefeitura Municipal de Itajaí
● 2008
● Portal do Software Público Brasileiro
● Parceria com Cobra Tecnologia
● 2010/2011
● Comunidade ativa
● Portabilis Tecnologia
● 2014/2015
● Parceria – SERPRO, Ieducativa Soluções e Portabilis Tecnologia
● Trabalho unificado no novo Portal do SPB
6. Evolução
● CTIMA/Prefeitura de Itajaí
● Desenvolvimento do software
● Cobra Tecnologia
● Refatoração e criação de arquitetura em framework
● Portabilis Tecnologia
● Novas funcionalidades, modelo Software as a Service (SaaS)
● SERPRO
● Migração para PostgreSQL 9.X
● Produção a ser feita em modelo Infrastructure as a Service
(IaaS)
● Importação Educacenso
7. Quem usa?
●Araranguá/SC
●Arapiraca/AL
●Balneário Arroio do Silva/SC
●Balneário Gaivota/SC
●Balneário Rincão/SC
●Benevides/PA
●Bonito/MS
●Botucatu/SP
●Cocal do Sul/SC
●Colégio Tiradentes da Brigada
Militar
Passo Fundo/RS
●Dom Eliseu/PA
●Esplanada/BA
●Estado de Alagoas
●Florianópolis/SC
●Grão Pará/SC
●Içara/SC
●Irecê/BA
●Instituto Mãos de Arte
Paranoá/DF
●Itajaí/SC
●Jacinto Machado/SC
●Jaguaruna/SC
●Lagoa Grande/PE
●Laguna/SC
●Maracajá/SC
●Meleiro/SC
● Montes Claros/MG
● Natuba/PB
● Nova Veneza/SC
● Pacajá/PA
● Pescaria Brava/SC
● Praia Grande/SC
● Polícia Militar da Paraíba
● Sangão/SC
● Santa Rosa do Sul/SC
● São Francisco do
Conde/BA
● Sombrio/SC
● Timbé do Sul/SC
● Sombrio/SC
● Valparaíso de Goiás/GO
8. Programa Cidades Digitais
● Ministério das Comunicações
Secretaria de Inclusão Digital
● 362 municípios contemplados
● Infraestrutura de acesso
● Softwares de Gestão Pública
9. Quem o SERPRO atende?
Valparaíso de Goiás
Acordo de Cooperação
Viçosa do Ceará
Programa Cidades Digitais
10. Módulos principais
● Escola
● Cadastros: Controle de alunos, turmas, matrículas, ...
● Movimentações: Controle de notas, frequência, ...
● Documentos: Emissão de boletins, atestados, certificados, …
● Biblioteca
● Controle de empréstimos
● Inventário do acervo
● Transporte escolar
● Cadastro de prestadores e veículos
● Controle de rotas oferecidas
● Agenda
● Gestão de Pessoas
16. Benefícios
● Menor despesa com sistemas de informação
● Automação dos procedimentos de gestão escolar
● Redução do uso de papel
● Centralização dos cadastros
● Gestão unificada da rede de ensino
● Frequente evolução do software na comunidade
19. Três gerações de código
● 1ª – Gerador de código (ewwww...)
● 2ª – Framework próprio
● 3ª – Migração para API
20. Exploração arqueológica do código
● Aplicação da intranet da Prefeitura de Itajaí
● Stack em Linux, PostgreSQL (8.2!), PHP e Apache
HTTPD
● Diversos sistemas de controle integrados
● Charset ISO-8859-1
21. Código antigo – DAOs primitivos
<?php
class clsPessoaFisica extends clsPessoaFj {
var $idpes;
var $data_nasc;
var $sexo;
var $data_obito;
var $nacionalidade;
var $idmun_nascimento;
function clsPessoaFisica($int_idpes = FALSE, $numeric_cpf = FALSE,
$date_data_nasc = FALSE, $str_sexo = FALSE, …);
function lista($str_nome = FALSE, $numeric_cpf = FALSE,
$inicio_limite = FALSE, $qtd_registros = FALSE, $str_orderBy =
FALSE, …);
function detalhe();
function excluir();
}
?>
23. Código antigo – Um arquivo .php por página
<?php
class clsIndex extends clsBase {
function Formular() {
$this->SetTitulo( "Pessoas Físicas" );
$this->processoAp = 43;
$this->addEstilo( "localizacaoSistema" );
}
}
class indice extends clsListagem {
function Gerar() { /* retorna um monte de HTML em texto */ }
}
$pagina = new clsIndex();
$miolo = new indice();
$pagina->addForm( $miolo );
$pagina->MakeAll();
?>
24. Código antigo – Banco de dados
CREATE TABLE endereco_externo (
idpes numeric(8,0) NOT NULL,
tipo numeric(1,0) NOT NULL,
idtlog character varying(5) NOT NULL,
logradouro character varying(150) NOT NULL,
numero numeric(6,0),
letra character(1),
complemento character varying(20),
bairro character varying(40),
cep numeric(8,0),
cidade character varying(60) NOT NULL,
sigla_uf character(2) NOT NULL,
reside_desde date,
idpes_rev numeric,
data_rev timestamp without time zone,
origem_gravacao character(1) NOT NULL,
idpes_cad numeric,
data_cad timestamp without time zone NOT NULL,
operacao character(1) NOT NULL,
bloco character varying(20),
andar numeric(2,0),
apartamento numeric(6,0),
idsis_rev integer,
idsis_cad integer NOT NULL,
zona_localizacao integer DEFAULT 1,
CONSTRAINT ck_endereco_externo_operacao CHECK
((((operacao = 'I'::bpchar) OR (operacao =
'A'::bpchar)) OR (operacao = 'E'::bpchar))),
CONSTRAINT ck_endereco_externo_origem_gravacao
CHECK (((((origem_gravacao = 'M'::bpchar) OR
(origem_gravacao = 'U'::bpchar)) OR (origem_gravacao
= 'C'::bpchar)) OR (origem_gravacao = 'O'::bpchar))),
CONSTRAINT ck_endereco_externo_tipo CHECK (((tipo
>= (1)::numeric) AND (tipo <= (3)::numeric)))
);
CREATE TABLE endereco_pessoa (
idpes numeric(8,0) NOT NULL,
tipo numeric(1,0) NOT NULL,
cep numeric(8,0) NOT NULL,
idlog numeric(6,0) NOT NULL,
numero numeric(6,0),
letra character(1),
complemento character varying(20),
reside_desde date,
idbai numeric(6,0) NOT NULL,
idpes_rev numeric,
data_rev timestamp without time zone,
origem_gravacao character(1) NOT NULL,
idpes_cad numeric,
data_cad timestamp without time zone NOT NULL,
operacao character(1) NOT NULL,
bloco character varying(20),
andar numeric(2,0),
apartamento numeric(6,0),
idsis_rev integer,
idsis_cad integer NOT NULL,
CONSTRAINT ck_endereco_pessoa_operacao CHECK
((((operacao = 'I'::bpchar) OR (operacao =
'A'::bpchar)) OR (operacao = 'E'::bpchar))),
CONSTRAINT ck_endereco_pessoa_origem_gravacao
CHECK (((((origem_gravacao = 'M'::bpchar) OR
(origem_gravacao = 'U'::bpchar)) OR (origem_gravacao
= 'C'::bpchar)) OR (origem_gravacao = 'O'::bpchar))),
CONSTRAINT ck_endereco_pessoa_tipo CHECK (((tipo
>= (1)::numeric) AND (tipo <= (3)::numeric)))
);
25. Código antigo – Triggers aleatórias
CREATE FUNCTION fcn_aft_ins_endereco_pessoa() RETURNS trigger
LANGUAGE plpgsql
AS $$
DECLARE
v_idpes numeric;
v_tipo_endereco text;
BEGIN
v_idpes := NEW.idpes;
v_tipo_endereco := NEW.tipo;
EXECUTE 'DELETE FROM cadastro.endereco_externo WHERE idpes='||
quote_literal(v_idpes)||' AND tipo='||v_tipo_endereco||';';
RETURN NEW;
END; $$;
26. Código moderno – Framework próprio
~/i/d/i/i/l/CoreExt ls -l master❯❯❯ ⏎
total 140
drwxr-xr-x 2 wolverine xmen 4096 Set 25 17:44 Config
drwxr-xr-x 5 wolverine xmen 4096 Ago 6 10:30 Controller
drwxr-xr-x 2 wolverine xmen 4096 Ago 6 10:30 DataMapper
drwxr-xr-x 2 wolverine xmen 4096 Ago 6 10:30 Entity
drwxr-xr-x 2 wolverine xmen 4096 Ago 6 10:30 Exception
drwxr-xr-x 2 wolverine xmen 4096 Ago 6 10:30 Service
drwxr-xr-x 3 wolverine xmen 4096 Ago 6 10:30 Session
drwxr-xr-x 2 wolverine xmen 4096 Ago 6 10:30 Validate
drwxr-xr-x 3 wolverine xmen 4096 Ago 6 10:30 View
-rw-r--r-- 1 wolverine xmen 7312 Ago 6 10:30 Config.class.php
-rw-r--r-- 1 wolverine xmen 2849 Ago 6 10:30 Configurable.php
-rw-r--r-- 1 wolverine xmen 22526 Ago 6 10:30 DataMapper.php
-rw-r--r-- 1 wolverine xmen 33495 Ago 6 10:30 Entity.php
-rw-r--r-- 1 wolverine xmen 4801 Ago 6 10:30 Enum.php
-rw-r--r-- 1 wolverine xmen 1451 Ago 6 10:30 Exception.php
-rw-r--r-- 1 wolverine xmen 5437 Ago 6 10:30 Locale.php
-rw-r--r-- 1 wolverine xmen 1504 Ago 6 10:30 Session.php
-rw-r--r-- 1 wolverine xmen 3205 Ago 6 10:30 Singleton.php
-rw-r--r-- 1 wolverine xmen 1486 Ago 6 10:30 View.php
35. Futuro para o código
● Premissa: Aprender com o passado
● Merging nos repositórios do SPB
● Migrations: Phinx
● Concluir implementação da API
● Padronizar uma API
● Criar novos clientes – Professor, Gestão, Pais
● Refatorar o backend
42. Próximos passos
Conclusão dos rollouts atuais
- Cidades Digitais
- Valparaíso de Goiás
Entrega do modelo de negócio/serviço
Novas funcionalidades e melhoria contínua
43. "Fazer do SERPRO uma empresa atuante,
parceira e inovadora em soluções de
gestão educacional, escolar e acadêmica
para uma Pátria, de fato, Educadora."
44. "O SERPRO, em atendimento ao Programa Cidades Digitais,
internalizou o i-Educar e agora implanta uma nova linha de
atuação para atendimento educacional, com
desenvolvimento colaborativo em comunidade."
Carlos M. dos Santos
Desenvolvedor de Software
SERPRO Florianópolis
carlos-morais.santos@serpro.gov.br
+55 48 3231 8970