require 'active_support/concern'

module RelatoriosPpa
	extend ActiveSupport::Concern

	def relatorio_de_convenios_por_classificacao_da_receita_status_e_ano
		relatorio = []
		receitas_correntes = []
		receita_de_capital = []

		convenios.joins(:valores_do_convenio).distinct.where('ppa_valores_do_convenio.valor > 0').each do |convenio|
			receitas_correntes.push(convenio.receita_corrente) if convenio.receita_corrente
			receita_de_capital.push(convenio.receita_de_capital) if convenio.receita_de_capital
		end

		relatorio << {
			estilo: {negrito: true},
			descricao: 'Receita Corrente',
			status: '',
			valor0: '',
			valor1: '',
			valor2: '',
			valor3: '',
		}

		receitas_correntes.uniq.sort_by(&:codigo).each do |receita|
			relatorio << {
				estilo: {tabulacao: {posicoes:[0], quantidade: 3}},
				descricao: receita.codigo_formatado_e_descricao,
				status: '',
				valor0: '',
				valor1: '',
				valor2: '',
				valor3: '',
			}

			receita.convenios.each do |convenio|

				relatorio << {
					estilo: {tabulacao: {posicoes:[0], quantidade: 6}},
					descricao: convenio.objeto,
					status: convenio.status,
					valor0: convenio.valor_por_exercicio_para_tipo_corrente(exercicio_inicial).real,
					valor1: convenio.valor_por_exercicio_para_tipo_corrente(exercicio_inicial + 1).real,
					valor2: convenio.valor_por_exercicio_para_tipo_corrente(exercicio_inicial + 2).real,
					valor3: convenio.valor_por_exercicio_para_tipo_corrente(exercicio_final).real,
				}
			end
		end

		relatorio << {
			estilo: {negrito: true},
			descricao: 'Receita de capital',
			status: '',
			valor0: '',
			valor1: '',
			valor2: '',
			valor3: '',
		}

		receita_de_capital.uniq.sort_by(&:codigo).each do |receita|

				relatorio << {
					estilo: {tabulacao: {posicoes:[0], quantidade: 3}},
					descricao: receita.codigo_formatado_e_descricao,
					status: '',
					valor0: '',
					valor1: '',
					valor2: '',
					valor3: '',
				}


			receita.convenios.each do |convenio|

				relatorio << {
					estilo: {tabulacao: {posicoes:[0], quantidade: 6}},
					descricao: convenio.objeto,
					status: convenio.status,
					valor0: convenio.valor_por_exercicio_para_tipo_capital(exercicio_inicial).real,
					valor1: convenio.valor_por_exercicio_para_tipo_capital(exercicio_inicial + 1).real,
					valor2: convenio.valor_por_exercicio_para_tipo_capital(exercicio_inicial + 2).real,
					valor3: convenio.valor_por_exercicio_para_tipo_capital(exercicio_final).real,
				}
			end
		end
		relatorio
	end

	def relatorio_fonte_de_recursos
		dados_relatorio = []
		valor_por_exercicio = []
		total_geral_das_receitas = []
		total_ano_inicial = 0.0
		total_tres_anos = 0.0

		unless utiliza_novo_tipo_para_receita?
			codigos_das_receitas = ['2421000000', '2100000000','9500000000']
		else
			codigos_das_receitas = ['24180000', '21000000','95000000']
		end

		codigos_das_receitas.each do |codigo_da_receita|
			receita = projecao_de_receita.receitas.find_by(codigo: codigo_da_receita)
			if receita.present?
				total_ano_inicial += receita.total_agregado(exercicio_inicial).to_f
				total_tres_anos += receita.total_agregado(exercicio_inicial + 1).to_f + receita.total_agregado(exercicio_inicial + 2).to_f + receita.total_agregado(exercicio_final).to_f
			end
		end

		total_geral_das_receitas = [total_ano_inicial, total_tres_anos]

		codigos_das_receitas.each { |codigo_da_receita|
			receita = projecao_de_receita.receitas.find_by(codigo: codigo_da_receita)
			if receita.present?
				valor_por_exercicio = [
					receita.total_agregado(exercicio_inicial).to_f,
					receita.total_agregado(exercicio_inicial + 1).to_f,
					receita.total_agregado(exercicio_inicial + 2).to_f,
					receita.total_agregado(exercicio_final).to_f
				]

				dados_relatorio << {
					descricao: receita.descricao.to_s,
					valor0: valor_por_exercicio[0].real,
					percentual0: (valor_por_exercicio[0] / (total_geral_das_receitas[0].nonzero? || 1)* 100).round(2).real,
					valor1: (valor_por_exercicio[1] + valor_por_exercicio[2] + valor_por_exercicio[3]).real,
					percentual1: ((valor_por_exercicio[1] + valor_por_exercicio[2] + valor_por_exercicio[3]) / (total_geral_das_receitas[1].nonzero? || 1)* 100).round(2).real,
					total: valor_por_exercicio.sum.real,
					percetual_total: (valor_por_exercicio.sum / ((total_geral_das_receitas[0] + total_geral_das_receitas[1]).nonzero? || 1) *100).round(2).real
				}
			end
		}

		dados_relatorio << {
			estilo: {negrito: true},
			descricao: 'Total Geral',
			valor0: total_geral_das_receitas[0].real,
			percentual0: '100,00',
			valor1: total_geral_das_receitas[1].real,
			percentual1: '100,00',
			total: (total_geral_das_receitas[0] + total_geral_das_receitas[1]).real,
			percentual_total: '100,00'
		}

		return dados_relatorio
	end

	def relatorio_de_resumo_financeiro_por_programas
		resumo_por_programa = []

		valor_por_exercicio = [
			valor_total_da_despesa_por_exercicio(exercicio_inicial).to_f,
			valor_total_da_despesa_por_exercicio(exercicio_inicial+1).to_f,
			valor_total_da_despesa_por_exercicio(exercicio_inicial+2).to_f,
			valor_total_da_despesa_por_exercicio(exercicio_final).to_f
		]

		Ppa::TipoDePrograma.all.each do |tipo_de_programa|
			valor_por_tipo_exercicio = [
				valor_total_da_despesa_por_exercicio_e_tipo_de_programa(exercicio_inicial, tipo_de_programa.id).to_f,
				valor_total_da_despesa_por_exercicio_e_tipo_de_programa(exercicio_inicial+1, tipo_de_programa.id).to_f,
				valor_total_da_despesa_por_exercicio_e_tipo_de_programa(exercicio_inicial+2, tipo_de_programa.id).to_f,
				valor_total_da_despesa_por_exercicio_e_tipo_de_programa(exercicio_final, tipo_de_programa.id).to_f
			]

			resumo_por_programa << {
				estilo: {negrito: true},
				descricao: tipo_de_programa.nome,
				valor0: valor_por_tipo_exercicio[0].real, percentual0: (valor_por_tipo_exercicio[0] / valor_por_exercicio[0] * 100).round(2).real,
				valor1: valor_por_tipo_exercicio[1].real, percentual1: (valor_por_tipo_exercicio[1] / valor_por_exercicio[1] * 100).round(2).real,
				valor2: valor_por_tipo_exercicio[2].real, percentual2: (valor_por_tipo_exercicio[2] / valor_por_exercicio[2] * 100).round(2).real,
				valor3: valor_por_tipo_exercicio[3].real, percentual3: (valor_por_tipo_exercicio[3] / valor_por_exercicio[3] * 100).round(2).real
			}

			programas.where(tipo_de_programa_id: tipo_de_programa.id).order(:codigo).each do |programa|
				if programa.projecoes_de_despesa_resumidas['total-geral'] > 0
					resultado = []
					dados = programa.total_por_exercicios

					dados = dados.each.map { |dado| {valor: dado['valor']} }.each_slice(4).to_a
					dados.each_with_index do |dado_por_exercicio, index_1|
						resultado[index_1] = {estilo: {tabulacao: {posicoes:[0], quantidade: 3}}, descricao: programa.nome}
						dado_por_exercicio.each_with_index do |dado, index_2|
							resultado[index_1][('valor'+index_2.to_s).to_sym] = dado[:valor].to_f.real
							resultado[index_1][('percentual'+index_2.to_s).to_sym] = (dado[:valor].to_f / valor_por_tipo_exercicio[index_2] * 100).round(2).real
						end
					end
					resumo_por_programa << resultado
				end
			end
		end

		resumo_por_programa << {
			estilo: {negrito: true},
			descricao: 'Total Geral',
			valor0: valor_por_exercicio[0].real, percentual0: '100,00',
			valor1: valor_por_exercicio[1].real, percentual1: '100,00',
			valor2: valor_por_exercicio[2].real, percentual2: '100,00',
			valor3: valor_por_exercicio[3].real, percentual3: '100,00'
		}
	end

	def relatorio_por_subarea_e_ano
		dados_do_relatorio = []

		sub_areas_tematicas_dos_convenios.each do |sub_area_tematica|
			valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio = [
				sub_area_tematica.total_geral_de_previsao_de_convenios_por_exercicio(exercicio_inicial).to_f,
				sub_area_tematica.total_geral_de_previsao_de_convenios_por_exercicio(exercicio_inicial + 1).to_f,
				sub_area_tematica.total_geral_de_previsao_de_convenios_por_exercicio(exercicio_inicial + 2).to_f,
				sub_area_tematica.total_geral_de_previsao_de_convenios_por_exercicio(exercicio_final).to_f
			]

			dados_do_relatorio << {
				estilo: {negrito: true},
				descricao: sub_area_tematica.nome,
				valor0: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[0].real_contabil,
				valor1: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[1].real_contabil,
				valor2: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[2].real_contabil,
				valor3: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[3].real_contabil,
				total: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio.inject(:+).real_contabil,
			}

			convenios.joins(:valores_do_convenio).distinct.where(sub_area_tematica_id: sub_area_tematica.id).where('ppa_valores_do_convenio.valor > 0').order(:status).each do |convenio|
				dados_do_relatorio << {
					descricao: convenio.objeto,
					exercicio1: convenio.valor_por_exercicio(exercicio_inicial).real_contabil,
					exercicio2: convenio.valor_por_exercicio(exercicio_inicial + 1 ).real_contabil,
					exercicio3: convenio.valor_por_exercicio(exercicio_inicial + 2 ).real_contabil,
					exercicio4: convenio.valor_por_exercicio(exercicio_final).real_contabil,
					total: convenio.valores_do_convenio.sum(:valor).real_contabil,
					estilo: {tabulacao: {posicoes:[0], quantidade: 3}}
				}
			end
		end

		dados_total = [
			total_geral_de_previsao_de_convenios_por_exercicio( exercicio_inicial ).to_f,
			total_geral_de_previsao_de_convenios_por_exercicio( exercicio_inicial + 1 ).to_f,
			total_geral_de_previsao_de_convenios_por_exercicio( exercicio_inicial + 2 ).to_f,
			total_geral_de_previsao_de_convenios_por_exercicio( exercicio_final ).to_f
		]

		dados_do_relatorio << {
			estilo: {negrito: true},
			descricao: 'TOTAL DOS CONVÊNIOS',
			exercicio1: dados_total[0].real_contabil,
			exercicio2: dados_total[1].real_contabil,
			exercicio3: dados_total[2].real_contabil,
			exercicio4: dados_total[3].real_contabil,
			total: dados_total.inject(:+).real_contabil
		}

		return dados_do_relatorio
	end

	def despesa_da_receita_por_receita_corrente esfera
		relatorio = []

		valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio = []
		valor_da_receita_dos_convenios_por_sub_area_tematica_tipo_de_despesa_e_exercicio = []
		convenio_com_receitas_correntes = convenios.where.not(receita_corrente_id: nil)

		convenio_com_receitas_correntes.map {|convenio|
			valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio = [
				convenio.sub_area_tematica.try(:total_geral_de_previsao_de_convenios_por_exercicio, exercicio_inicial).to_f,
				convenio.sub_area_tematica.try(:total_geral_de_previsao_de_convenios_por_exercicio, exercicio_inicial + 1).to_f,
				convenio.sub_area_tematica.try(:total_geral_de_previsao_de_convenios_por_exercicio, exercicio_inicial + 2).to_f,
				convenio.sub_area_tematica.try(:total_geral_de_previsao_de_convenios_por_exercicio, exercicio_final).to_f
			]

			valor_da_receita_dos_convenios_por_sub_area_tematica_tipo_de_despesa_e_exercicio = [
				convenio.sub_area_tematica.try(:total_previsao_de_convenios_correntes_por_exercicio, exercicio_inicial).to_f,
				convenio.sub_area_tematica.try(:total_previsao_de_convenios_correntes_por_exercicio, exercicio_inicial + 1).to_f,
				convenio.sub_area_tematica.try(:total_previsao_de_convenios_correntes_por_exercicio, exercicio_inicial + 2).to_f,
				convenio.sub_area_tematica.try(:total_previsao_de_convenios_correntes_por_exercicio, exercicio_final).to_f
			]
		}

		# segundo nivel
		relatorio << {
			estilo: {negrito: true},
			descricao: 'Receita Corrente',
			codigo_da_receita: '',
			esfera: '',
			valor0: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[0].real,
			valor1: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[1].real,
			valor2: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[2].real,
			valor3: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[3].real,
			total: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio.inject(:+).real
		}.delete_if {|chave_relatorio, valor|	(esfera.eql? 'nao') && (chave_relatorio.eql? :esfera)}

		# primeiro nivel
		sub_areas_tematicas_dos_convenios.each do |sub_area_tematica|
			relatorio << {
				estilo: {negrito: true, tabulacao: {posicoes:[0], quantidade: 3}},
				descricao: sub_area_tematica.nome,
				codigo_da_receita: '',
				esfera: '',
				valor0: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[0].real,
				valor1: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[1].real,
				valor2: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[2].real,
				valor3: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[3].real,
				total: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio.inject(:+).real
			}.delete_if {|chave_relatorio, valor|	(esfera.eql? 'nao') && (chave_relatorio.eql? :esfera)}

			# terceiro nivel
			convenios.joins(:valores_do_convenio).includes(:receita_corrente).distinct.where('ppa_valores_do_convenio.valor > 0 AND sub_area_tematica_id = ? AND receita_corrente_id IS NOT NULL', sub_area_tematica.id).order("projecao_receitas.codigo").each do |convenio|
				valor_da_receita_do_convenio_por_exercicio = [
					convenio.valor_por_exercicio_para_tipo_corrente(exercicio_inicial).to_f,
					convenio.valor_por_exercicio_para_tipo_corrente(exercicio_inicial + 1).to_f,
					convenio.valor_por_exercicio_para_tipo_corrente(exercicio_inicial + 2).to_f,
					convenio.valor_por_exercicio_para_tipo_corrente(exercicio_final).to_f
				]
				codigo = convenio.receita_corrente.codigo
				codigo_da_receita = convenio.receita_corrente.class.codigo_formatado(codigo)

				relatorio << {
					estilo: {tabulacao: {posicoes:[0], quantidade: 6}},
					descricao: convenio.objeto,
					codigo_da_receita: codigo_da_receita,
					esfera: convenio.try(:esfera),
					valor0: valor_da_receita_do_convenio_por_exercicio[0].real,
					valor1: valor_da_receita_do_convenio_por_exercicio[1].real,
					valor2: valor_da_receita_do_convenio_por_exercicio[2].real,
					valor3: valor_da_receita_do_convenio_por_exercicio[3].real,
					total: valor_da_receita_do_convenio_por_exercicio.inject(:+).real
				}.delete_if {|chave_relatorio, valor|	(esfera.eql? 'nao') && (chave_relatorio.eql? :esfera)}
			end
		end

		relatorio
	end

	def despesa_da_receita_por_receita_de_capital esfera
		relatorio = []

		valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio = []
		valor_da_receita_dos_convenios_por_sub_area_tematica_tipo_de_despesa_e_exercicio = []
		convenio_com_receitas_de_capital = convenios.where.not(receita_de_capital_id: nil)

		convenio_com_receitas_de_capital.map {|convenio|

			valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio = [
				convenio.sub_area_tematica.try(:total_geral_de_previsao_de_convenios_por_exercicio, exercicio_inicial).to_f,
				convenio.sub_area_tematica.try(:total_geral_de_previsao_de_convenios_por_exercicio, exercicio_inicial + 1).to_f,
				convenio.sub_area_tematica.try(:total_geral_de_previsao_de_convenios_por_exercicio, exercicio_inicial + 2).to_f,
				convenio.sub_area_tematica.try(:total_geral_de_previsao_de_convenios_por_exercicio, exercicio_final).to_f
			]

			valor_da_receita_dos_convenios_por_sub_area_tematica_tipo_de_despesa_e_exercicio = [
				convenio.sub_area_tematica.try(:total_previsao_de_convenios_de_capital_por_exercicio, exercicio_inicial).to_f,
				convenio.sub_area_tematica.try(:total_previsao_de_convenios_de_capital_por_exercicio, exercicio_inicial + 1).to_f,
				convenio.sub_area_tematica.try(:total_previsao_de_convenios_de_capital_por_exercicio, exercicio_inicial + 2).to_f,
				convenio.sub_area_tematica.try(:total_previsao_de_convenios_de_capital_por_exercicio, exercicio_final).to_f
			]
		}

		# segundo nivel
		relatorio << {
			estilo: {negrito: true},
			descricao: 'Receita de Capital',
			codigo_da_receita: '',
			esfera: '',
			valor0: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[0].real,
			valor1: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[1].real,
			valor2: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[2].real,
			valor3: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[3].real,
			total: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio.inject(:+).real
		}.delete_if {|chave_relatorio, valor|	(esfera.eql? 'nao') && (chave_relatorio.eql? :esfera)}

		# primeiro nivel
		sub_areas_tematicas_dos_convenios.each do |sub_area_tematica|
			relatorio << {
				estilo: {negrito: true, tabulacao: {posicoes:[0], quantidade: 3}},
				descricao: sub_area_tematica.nome,
				codigo_da_receita: '',
				esfera: '',
				valor0: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[0].real,
				valor1: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[1].real,
				valor2: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[2].real,
				valor3: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[3].real,
				total: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio.inject(:+).real
			}.delete_if {|chave_relatorio, valor|	(esfera.eql? 'nao') && (chave_relatorio.eql? :esfera)}

			# terceiro nivel
			convenios.joins(:valores_do_convenio).includes(:receita_de_capital).distinct.where('ppa_valores_do_convenio.valor > 0 AND sub_area_tematica_id = ? AND receita_de_capital_id IS NOT NULL', sub_area_tematica.id).order("projecao_receitas.codigo").each do |convenio|

				valor_da_receita_do_convenio_por_exercicio = [
					convenio.valor_por_exercicio_para_tipo_capital(exercicio_inicial).to_f,
					convenio.valor_por_exercicio_para_tipo_capital(exercicio_inicial + 1).to_f,
					convenio.valor_por_exercicio_para_tipo_capital(exercicio_inicial + 2).to_f,
					convenio.valor_por_exercicio_para_tipo_capital(exercicio_final).to_f
				]
				codigo = convenio.receita_de_capital.codigo
				codigo_da_receita = convenio.receita_de_capital.class.codigo_formatado(codigo)

				relatorio << {
					estilo: {tabulacao: {posicoes:[0], quantidade: 6}},
					descricao: convenio.objeto,
					codigo_da_receita: codigo_da_receita,
					esfera: convenio.try(:esfera),
					valor0: valor_da_receita_do_convenio_por_exercicio[0].real,
					valor1: valor_da_receita_do_convenio_por_exercicio[1].real,
					valor2: valor_da_receita_do_convenio_por_exercicio[2].real,
					valor3: valor_da_receita_do_convenio_por_exercicio[3].real,
					total: valor_da_receita_do_convenio_por_exercicio.inject(:+).real
				}.delete_if {|chave_relatorio, valor|	(esfera.eql? 'nao') && (chave_relatorio.eql? :esfera)}
			end
		end

		relatorio
	end

	def relatorio_de_convenios_por_subarea_tematica_classificacao_ano esfera
		relatorio = []
		relatorio.push despesa_da_receita_por_receita_corrente(esfera)

		relatorio.each do |relatorio_valor|
			if relatorio_valor.last
				despesa_da_receita_por_receita_de_capital(esfera).each do |de_capital|
					relatorio = relatorio_valor.push de_capital
				end
			end
		end

		valor_da_receita_dos_convenios_por_exercicio = [
			total_geral_de_previsao_de_convenios_por_exercicio(exercicio_inicial).to_f,
			total_geral_de_previsao_de_convenios_por_exercicio(exercicio_inicial+1).to_f,
			total_geral_de_previsao_de_convenios_por_exercicio(exercicio_inicial+2).to_f,
			total_geral_de_previsao_de_convenios_por_exercicio(exercicio_final).to_f
		]

		relatorio << {
			estilo: {negrito: true},
			descricao: 'Total',
			codigo_da_receita: '',
			esfera: '',
			valor0: valor_da_receita_dos_convenios_por_exercicio[0].real,
			valor1: valor_da_receita_dos_convenios_por_exercicio[1].real,
			valor2: valor_da_receita_dos_convenios_por_exercicio[2].real,
			valor3: valor_da_receita_dos_convenios_por_exercicio[3].real,
			total: valor_da_receita_dos_convenios_por_exercicio.inject(:+).real
		}.delete_if {|chave_relatorio, valor|	(esfera.eql? 'nao') && (chave_relatorio.eql? :esfera)}

		relatorio
	end

	def relatorio_de_convenios_por_subarea_tematica_status_ano

		relatorio = []

		sub_areas_tematicas_dos_convenios.each do |sub_area_tematica|
			valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio = [
				sub_area_tematica.total_geral_de_previsao_de_convenios_por_exercicio(exercicio_inicial).to_f,
				sub_area_tematica.total_geral_de_previsao_de_convenios_por_exercicio(exercicio_inicial + 1).to_f,
				sub_area_tematica.total_geral_de_previsao_de_convenios_por_exercicio(exercicio_inicial + 2).to_f,
				sub_area_tematica.total_geral_de_previsao_de_convenios_por_exercicio(exercicio_final).to_f
			]

			relatorio << {
				estilo: {negrito: true},
				descricao: sub_area_tematica.nome,
				numero_do_convenio: '',
				status: '',
				valor0: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[0].real,
				valor1: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[1].real,
				valor2: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[2].real,
				valor3: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio[3].real,
				total: valor_da_receita_dos_convenios_por_sub_area_tematica_e_exercicio.inject(:+).real
			}

			convenios.joins(:valores_do_convenio).distinct.where(sub_area_tematica_id: sub_area_tematica.id).where('ppa_valores_do_convenio.valor > 0').order(:status).each do |convenio|
				valor_da_receita_do_convenio_por_exercicio = [
					convenio.valor_por_exercicio(exercicio_inicial).to_f,
					convenio.valor_por_exercicio(exercicio_inicial + 1).to_f,
					convenio.valor_por_exercicio(exercicio_inicial + 2).to_f,
					convenio.valor_por_exercicio(exercicio_final).to_f
				]

				relatorio << {
					estilo: {tabulacao: {posicoes:[0], quantidade: 6}},
					descricao: convenio.objeto,
					numero_do_convenio: convenio.numero_do_convenio,
					status: convenio.status,
					valor0: valor_da_receita_do_convenio_por_exercicio[0].real,
					valor1: valor_da_receita_do_convenio_por_exercicio[1].real,
					valor2: valor_da_receita_do_convenio_por_exercicio[2].real,
					valor3: valor_da_receita_do_convenio_por_exercicio[3].real,
					total: valor_da_receita_do_convenio_por_exercicio.inject(:+).real
				}

			end
		end

		valor_da_receita_dos_convenios_por_exercicio = [
			total_geral_de_previsao_de_convenios_por_exercicio(exercicio_inicial).to_f,
			total_geral_de_previsao_de_convenios_por_exercicio(exercicio_inicial+1).to_f,
			total_geral_de_previsao_de_convenios_por_exercicio(exercicio_inicial+2).to_f,
			total_geral_de_previsao_de_convenios_por_exercicio(exercicio_final).to_f
		]

		relatorio << {
			estilo: {negrito: true},
			descricao: 'Total',
			numero_do_convenio: '',
			status: '',
			valor0: valor_da_receita_dos_convenios_por_exercicio[0].real,
			valor1: valor_da_receita_dos_convenios_por_exercicio[1].real,
			valor2: valor_da_receita_dos_convenios_por_exercicio[2].real,
			valor3: valor_da_receita_dos_convenios_por_exercicio[3].real,
			total: valor_da_receita_dos_convenios_por_exercicio.inject(:+).real
		}
	end

	def relatorio_de_prioridades_e_metas(exercicio)
		dados = ActiveRecord::Base.connection.execute(sql_relatorio_de_prioridades_e_metas(exercicio)).to_a

		dados.map do |dado|
			dado['codigo'] = dado['codigo'].split("|")[1]
			if dado['codigo'].try(:include?, '.')
				dado[:estilo] = {tabulacao: {posicoes:[1], quantidade: 6}}
				dado['codigo'] = ''
				dado['meta'] = dado['meta'].to_f.prettify.to_s
			else
				dado[:estilo] = {negrito: true}
				if dado['codigo'].present?
					dado[:estilo].merge({tabulacao: {posicoes:[1], quantidade: 6}})
				end
			end
		end

		return dados
	end

	private
	def sql_relatorio_de_prioridades_e_metas(exercicio)
		%Q(
		WITH cte_dados AS (
			SELECT eixo.id::text || '|' || programa.tipo_de_programa_id::text || LPAD(programa.codigo::text,3,'0') AS programa_codigo
				, programa.nome AS programa_nome
				, eixo.id::text || '|' || programa.tipo_de_programa_id::text || LPAD(programa.codigo::text,3,'0') || '.' || meta.id::text AS meta_codigo
				, eixo.id::text as eixo_codigo
				, eixo.nome AS eixo_nome
				, meta.descricao AS meta_descricao
				, COALESCE(unidade_medida.descricao, '') AS unidade_de_medida
				, meta_fisica.indice_de_referencia AS valor
				FROM ppa_programas programa
				JOIN ppa_eixos eixo ON (eixo.id = programa.eixo_id)
				JOIN ppa_objetivos objetivo ON (objetivo.programa_id = programa.id)
				JOIN ppa_metas meta ON (meta.objetivo_id = objetivo.id)
				JOIN ppa_quantitativos meta_fisica ON (meta_fisica.meta_id = meta.id)
				LEFT JOIN unidades_de_medida unidade_medida ON (unidade_medida.id = meta_fisica.unidade_de_medida_id)
			WHERE programa.ppa_id = #{id}
				AND meta_fisica.exercicio = #{exercicio}
		), cte_eixos AS (
			SELECT DISTINCT eixo_codigo as codigo
				, eixo_nome as descricao
				, '' as unidade_de_medida
				, '' as meta
			FROM cte_dados
		), cte_programas AS (
			SELECT DISTINCT programa_codigo as codigo
				, programa_nome as descricao
				, '' as unidade_de_medida
				, '' as meta
				FROM cte_dados
		), cte_metas AS (
			SELECT meta_codigo as meta_codigo
				, meta_descricao as descricao
				, valor as meta
				, unidade_de_medida
				FROM cte_dados
		) SELECT codigo, descricao, meta, unidade_de_medida
			FROM cte_eixos eixo
			UNION ALL
			SELECT codigo::text, descricao, meta, unidade_de_medida
			FROM cte_programas programa
			UNION ALL
			SELECT meta_codigo, descricao, meta::text, unidade_de_medida
			FROM cte_metas meta
			ORDER BY 1;
		)
	end
end