CREATE OR REPLACE VIEW relatorio.view_situacao AS
SELECT matricula.cod_matricula,
       situacao_matricula.cod_situacao,
       matricula_turma.ref_cod_turma AS cod_turma,
       matricula_turma.sequencial,
       CASE
           WHEN matricula_turma.remanejado THEN 'Remanejado'::character varying
           WHEN matricula_turma.transferido THEN 'Transferido'::character varying
           WHEN matricula_turma.reclassificado THEN 'Reclassificado'::character varying
           WHEN matricula_turma.abandono THEN 'Abandono'::character varying
           WHEN matricula.aprovado = 1 THEN 'Aprovado'::character varying
           WHEN matricula.aprovado = 12 THEN 'Ap. Depen.'::character varying
           WHEN matricula.aprovado = 13 THEN 'Ap. Cons.'::character varying
           WHEN matricula.aprovado = 2 THEN 'Reprovado'::character varying
           WHEN matricula.aprovado = 3 THEN 'Cursando'::character varying
           WHEN matricula.aprovado = 4 THEN 'Transferido'::character varying
           WHEN matricula.aprovado = 5 THEN 'Reclassificado'::character varying
           WHEN matricula.aprovado = 6 THEN 'Abandono'::character varying
           WHEN matricula.aprovado = 14 THEN 'Rp. Faltas'::character varying
           WHEN matricula.aprovado = 15 THEN 'Falecido'::character varying
           ELSE 'Recl'::character varying
           END AS texto_situacao,
       CASE
           WHEN matricula_turma.remanejado THEN 'Rem'::character varying
           WHEN matricula_turma.transferido THEN 'Trs'::character varying
           WHEN matricula_turma.reclassificado THEN 'Recl'::character varying
           WHEN matricula_turma.abandono THEN 'Aba'::character varying
           WHEN matricula.aprovado = 1 THEN 'Apr'::character varying
           WHEN matricula.aprovado = 12 THEN 'ApDp'::character varying
           WHEN matricula.aprovado = 13 THEN 'ApCo'::character varying
           WHEN matricula.aprovado = 2 THEN 'Rep'::character varying
           WHEN matricula.aprovado = 3 THEN 'Cur'::character varying
           WHEN matricula.aprovado = 4 THEN 'Trs'::character varying
           WHEN matricula.aprovado = 5 THEN 'Recl'::character varying
           WHEN matricula.aprovado = 6 THEN 'Aba'::character varying
           WHEN matricula.aprovado = 14 THEN 'RpFt'::character varying
           WHEN matricula.aprovado = 15 THEN 'Fal'::character varying
           ELSE 'Recl'::character varying
           END AS texto_situacao_simplificado
FROM relatorio.situacao_matricula,
     matricula
         JOIN escola ON escola.cod_escola = matricula.ref_ref_cod_escola
         JOIN instituicao ON instituicao.cod_instituicao = escola.ref_cod_instituicao
         LEFT JOIN matricula_turma ON matricula_turma.ref_cod_matricula = matricula.cod_matricula
WHERE true AND matricula.ativo = 1 AND
    CASE
        WHEN instituicao.data_base_remanejamento IS NULL THEN COALESCE(matricula_turma.remanejado, false) = false
        ELSE true
        END AND
    CASE
        WHEN matricula.aprovado = 4 THEN matricula_turma.ativo = 1 OR matricula_turma.transferido OR matricula_turma.reclassificado OR matricula_turma.remanejado OR matricula_turma.sequencial = (( SELECT max(mt.sequencial) AS max
                                                                                                                                                                                                     FROM matricula_turma mt
                                                                                                                                                                                                     WHERE mt.ref_cod_matricula = matricula.cod_matricula))
        WHEN matricula.aprovado = 6 THEN matricula_turma.ativo = 1 OR matricula_turma.abandono OR (matricula_turma.transferido OR matricula_turma.reclassificado OR matricula_turma.remanejado) AND matricula_turma.sequencial < (( SELECT max(mt.sequencial) AS max
                                                                                                                                                                                                                                    FROM matricula_turma mt
                                                                                                                                                                                                                                    WHERE mt.ref_cod_matricula = matricula.cod_matricula))
        WHEN matricula.aprovado = 15 THEN matricula_turma.ativo = 1 OR matricula_turma.falecido
        ELSE matricula_turma.ativo = 1 OR matricula_turma.transferido OR matricula_turma.reclassificado OR matricula_turma.abandono OR matricula_turma.remanejado OR matricula_turma.falecido AND matricula_turma.sequencial < (( SELECT max(mt.sequencial) AS max
                                                                                                                                                                                                                                  FROM matricula_turma mt
                                                                                                                                                                                                                                  WHERE mt.ref_cod_matricula = matricula.cod_matricula))
        END AND
    CASE
        WHEN situacao_matricula.cod_situacao = 10 THEN matricula.aprovado = ANY (ARRAY[1, 2, 3, 4, 5, 6, 12, 13, 14, 15])
        WHEN situacao_matricula.cod_situacao = 9 THEN (matricula.aprovado = ANY (ARRAY[1, 2, 3, 5, 12, 13, 14])) AND (NOT matricula_turma.reclassificado OR matricula_turma.reclassificado IS NULL) AND (NOT matricula_turma.abandono OR matricula_turma.abandono IS NULL) AND (NOT matricula_turma.remanejado OR matricula_turma.remanejado IS NULL) AND (NOT matricula_turma.transferido OR matricula_turma.transferido IS NULL) AND (NOT matricula_turma.falecido OR matricula_turma.falecido IS NULL)
        WHEN situacao_matricula.cod_situacao = 2 THEN (matricula.aprovado = ANY (ARRAY[2, 14])) AND (NOT matricula_turma.reclassificado OR matricula_turma.reclassificado IS NULL) AND (NOT matricula_turma.abandono OR matricula_turma.abandono IS NULL) AND (NOT matricula_turma.remanejado OR matricula_turma.remanejado IS NULL) AND (NOT matricula_turma.transferido OR matricula_turma.transferido IS NULL) AND (NOT matricula_turma.falecido OR matricula_turma.falecido IS NULL)
        WHEN situacao_matricula.cod_situacao = 1 THEN (matricula.aprovado = ANY (ARRAY[1, 12, 13])) AND (NOT matricula_turma.reclassificado OR matricula_turma.reclassificado IS NULL) AND (NOT matricula_turma.abandono OR matricula_turma.abandono IS NULL) AND (NOT matricula_turma.remanejado OR matricula_turma.remanejado IS NULL) AND (NOT matricula_turma.transferido OR matricula_turma.transferido IS NULL) AND (NOT matricula_turma.falecido OR matricula_turma.falecido IS NULL)
        WHEN situacao_matricula.cod_situacao = ANY (ARRAY[3, 12, 13]) THEN matricula.aprovado = situacao_matricula.cod_situacao AND (NOT matricula_turma.reclassificado OR matricula_turma.reclassificado IS NULL) AND (NOT matricula_turma.abandono OR matricula_turma.abandono IS NULL) AND (NOT matricula_turma.remanejado OR matricula_turma.remanejado IS NULL) AND (NOT matricula_turma.transferido OR matricula_turma.transferido IS NULL) AND (NOT matricula_turma.falecido OR matricula_turma.falecido IS NULL)
        ELSE matricula.aprovado = situacao_matricula.cod_situacao
        END
  AND matricula_turma.sequencial = (
    SELECT max(sequencial)
    FROM pmieducar.matricula_turma mt
    WHERE mt.ref_cod_turma = matricula_turma.ref_cod_turma
      AND mt.ref_cod_matricula = matricula.cod_matricula
);
