class Contabilidade::Relatorios::BalancetesDeVerificacoesController < ApplicationController
	include ControllerConcern
	include ContabilidadeControllerConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:imprimir]
	before_action :disponibiliza_dependencias

	def imprimir
		bloqueia_usuario_com_base_em :read, "contabilidade/balancetes_de_verificacoes"
		relatorio = params[:relatorio]

		if respond_to? relatorio.to_s, :private
			if request.format.xlsx?
				send(relatorio)
			else
				loa = CombinePDF.new
				loa << CombinePDF.parse(send(relatorio))
				loa.number_pages(location: :bottom_right, margin_from_height: 0, number_format: '%s', font_size: 8)
				send_data loa.to_pdf, filename: "#{relatorio}.pdf", type: "application/pdf", disposition: 'inline'
			end
		else
			redirect_to :back, alert: 'Relatório selecionado não existe'
		end
	end

	def consulta_balancete
		@data_inicial = params[:data_inicial]
		@data_final = params[:data_final]
		grupo_de_conta_id = params[:grupo_de_conta]
		@grupo_de_conta = Contabilidade::GrupoDeConta.find(grupo_de_conta_id) if grupo_de_conta_id.present?
		unidade_gestora_ids = params[:unidade_gestora].to_a.reject(&:blank?)
		@unidades_gestoras_filtro = Loa::UnidadeGestora.where(id: unidade_gestora_ids.to_a) if unidade_gestora_ids.present? && unidade_gestora_ids.size > 0
		clausula_unidade_gestora = {loa_unidades_gestoras: {id: unidade_gestora_ids.to_a}} if unidade_gestora_ids.present? && unidade_gestora_ids.size > 0

		@contas = contabilidade_atual.contas.where(grupo_de_conta_id: grupo_de_conta_id)
			.joins(contas_por_eventos_contabeis: [movimentacoes_do_plano_de_contas: [ unidade_orcamentaria: :unidade_gestora]])
				.includes(contas_por_eventos_contabeis: [movimentacoes_do_plano_de_contas: [ unidade_orcamentaria: :unidade_gestora]])
					.where('(contabilidade_movimentacoes_do_plano_de_contas.data_de_lancamento >= ? and contabilidade_movimentacoes_do_plano_de_contas.data_de_lancamento <= ?)', @data_inicial.to_date, @data_final.to_date)
						.where(clausula_unidade_gestora).distinct.order(:codigo)

		if @unidades_gestoras_filtro.nil?
			@unidades_gestoras = contabilidade_atual.unidades_gestoras.order(:codigo)
		else
			@unidades_gestoras = @unidades_gestoras_filtro
		end

		render_to_string pdf: "balancete",
			template: "contabilidade/relatorios/balancetes_de_verificacoes/consulta_balancete.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: "Consulta de Balancete de Verificação",
						titulo2: "Período: #{@data_inicial.to_date} a #{@data_final.to_date}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	def balancete
		@codigo_start = params[:codigo_start]

		@somente_com_movimentos = params[:somente_com_movimento].to_i == 1 ? true : false
		
		unidade_gestora_ids = params[:unidade_gestora].to_a.reject(&:blank?)
		@unidades_gestoras_filtro = Loa::UnidadeGestora.where(id: unidade_gestora_ids.to_a) if unidade_gestora_ids.present? && unidade_gestora_ids.size > 0

		@balancete_de_verificacao = Contabilidade::BalanceteDeVerificacao.find(params[:balancete_id].to_i)

		@dados_balancete_de_verificacao = @balancete_de_verificacao.dados_balancete_de_verificacao.joins(:conta).includes(:conta)
		@dados_agregado_balancete_de_verificacao = Contabilidade::DadoBalanceteDeVerificacao
			.where(exercicio: @balancete_de_verificacao.orcamento.exercicio)
			.where("competencia <= ?", Contabilidade::BalanceteDeVerificacao.mes_de_referencias[@balancete_de_verificacao.mes_de_referencia])
			.includes(:unidade_orcamentaria)

		if params[:somente_com_movimento].to_i == 1
			@contas = Contabilidade::Conta.where(orcamento_id: @balancete_de_verificacao.orcamento_id).where(analitica: true).where(id: [@balancete_de_verificacao.movimentacoes_das_contas_do_balancete.map { |i| i.conta_id }.uniq]).order(:codigo)
		else
			@contas = Contabilidade::Conta.where(orcamento_id: @balancete_de_verificacao.orcamento_id).order(:codigo)
		end

		if !@codigo_start.gsub(".","").blank?
			codigo_start = @codigo_start.to_s.gsub(".","").reverse.to_i.to_s.reverse.ljust(9, '_')
			@dados_balancete_de_verificacao = @dados_balancete_de_verificacao.where("codigo_da_conta like any (array['#{codigo_start}'])")
			@dados_agregado_balancete_de_verificacao = @dados_agregado_balancete_de_verificacao.where("codigo_da_conta like any (array['#{codigo_start}'])")

			@contas = @contas.where("codigo like any (array['#{codigo_start}'])").all
		end

		if params[:grupo_de_conta].present?
			@dados_balancete_de_verificacao = @dados_balancete_de_verificacao.where("contabilidade_contas.grupo_de_conta_id = ?", params[:grupo_de_conta].to_i)
		end

		if unidade_gestora_ids.present? && unidade_gestora_ids.size > 0
			unidades_titulo = ''
			@unidades_gestoras_filtro.each do |unidade|
				unidades_titulo = unidades_titulo + ', ' unless  unidades_titulo == ''
				unidades_titulo = unidades_titulo + unidade.nome
			end
		else
			unidades_titulo = 'CONSOLIDADO'
		end

		@dados_agregado_balancete_de_verificacao = @dados_agregado_balancete_de_verificacao.all.map { |i| 
			{
				conta_id: i.conta_id,
				codigo_da_conta: i.codigo_da_conta,
				tipo_de_lancamento: i.tipo_de_lancamento,
				valor: i.valor,
				unidade_orcamentaria_id: i.unidade_orcamentaria_id,
				unidade_gestora_id: i.unidade_orcamentaria&.unidade_gestora_id
			}
		}

		@dados_balancete_de_verificacao = @dados_balancete_de_verificacao.includes({ unidade_orcamentaria: [:unidade_gestora]}).all.map { |i|
			{
				id: i.id,
				conta_id: i.conta_id,
				codigo_da_conta: i.codigo_da_conta,
				unidade_orcamentaria_id: i.unidade_orcamentaria_id,
				unidade_gestora_id: i.unidade_orcamentaria&.unidade_gestora_id,
				tipo_de_lancamento: i.tipo_de_lancamento,
				exercicio: i.exercicio,
				competencia: i.competencia,
				valor: i.valor,
				tipo_de_saldo: i.tipo_de_saldo,
				balancete_de_verificacao_id: i.balancete_de_verificacao_id
			}
		}

		mes_de_referencia = @balancete_de_verificacao.mes_de_referencia.to_s.upcase
		@origem = 'balancete'

		if @unidades_gestoras_filtro.nil?
			nome_do_arquivo = 'balancete'
		else
			nome_do_arquivo = 'balancete_por_unidades'
		end
		render_to_string pdf: "balancete",
			template: "contabilidade/relatorios/balancetes_de_verificacoes/#{nome_do_arquivo}.pdf.slim",
			orientation: 'Landscape',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: unidades_titulo,
						titulo2: "Balancete de Verificação - Mês de Referência: #{mes_de_referencia}",
						titulo3: ""
					}
				},
				spacing: 3
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	def balancete_geral
		@codigo_start = params[:codigo_start]
		@data_inicial = params[:data_inicial]
		@data_final = params[:data_final]
		grupo_de_conta_id = params[:grupo_de_conta]
		@grupo_de_conta = Contabilidade::GrupoDeConta.find(grupo_de_conta_id) if grupo_de_conta_id.present?
		clausula_grupo_de_conta = {contabilidade_contas: {grupo_de_conta_id: grupo_de_conta_id}} if grupo_de_conta_id.present?
		unidade_gestora_ids = params[:unidade_gestora].to_a.reject(&:blank?)
		@unidades_gestoras_filtro = Loa::UnidadeGestora.where(id: unidade_gestora_ids.to_a) if unidade_gestora_ids.present? && unidade_gestora_ids.size > 0
		clausula_unidade_gestora = {loa_unidades_gestoras: {id: unidade_gestora_ids.to_a}} if unidade_gestora_ids.present? && unidade_gestora_ids.size > 0

		@movimentacoes_das_contas_do_balancete = Contabilidade::MovimentacaoDaContaDoBalancete
			.left_outer_joins(:conta, movimentacao_do_plano_de_contas: [ unidade_orcamentaria: :unidade_gestora])
				.includes(movimentacao_do_plano_de_contas: [ unidade_orcamentaria: :unidade_gestora])
					.where('(contabilidade_movimentacoes_do_plano_de_contas.data_de_lancamento >= ? and contabilidade_movimentacoes_do_plano_de_contas.data_de_lancamento <= ?)', @data_inicial.to_date, @data_final.to_date)
						.where(clausula_grupo_de_conta).where(clausula_unidade_gestora).order('contabilidade_contas.codigo')

		if !@codigo_start.gsub(".","").blank?
			codigo_start = preenche_codigo_com_zero(@codigo_start.gsub(".",""))
			codigo_final = preenche_codigo_com_nove(@codigo_start.gsub(".",""))
			@movimentacoes_das_contas_do_balancete = @movimentacoes_das_contas_do_balancete.where("contabilidade_contas.codigo >= ? and contabilidade_contas.codigo <= ?", codigo_start, codigo_final)
		end

		render_to_string pdf: "balancete",
			template: "contabilidade/relatorios/balancetes_de_verificacoes/balancete_geral.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: "Balancete de Verificação",
						titulo2: ""
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	def relatorio_ics
		@conta = Contabilidade::Conta.find(params[:conta_id].to_i)
		@unidade_orcamentaria = contexto_atual.unidades_orcamentarias.where(id: params[:unidade_orcamentaria]).first
		if params[:sub_conta_id].present?
			@sub_conta_pcasp = Contabilidade::SubContaPcasp.find(params[:sub_conta_id])
		end

		if @conta.present? && @unidade_orcamentaria.present?
			@movimentacoes = Contabilidade::MovimentacaoDoPlanoDeContas.where(codigo_da_conta: @conta.codigo).order(:data_de_lancamento)

			unidades = @unidade_orcamentaria.unidades_orcamentaria_vinculada.map(&:unidade_orcamentaria_vinculada_id) + [@unidade_orcamentaria.id]
			@movimentacoes = @movimentacoes.where(unidade_orcamentaria_id: unidades)

			@movimentacoes = @movimentacoes.where(ic_po: params[:ic_po]) if params[:ic_po].present?
			@movimentacoes = @movimentacoes.where(ic_fp: params[:ic_fp]) if params[:ic_fp].present?
			@movimentacoes = @movimentacoes.where(ic_dc: params[:ic_dc]) if params[:ic_dc].present?
			@movimentacoes = @movimentacoes.where(ic_fr: params[:ic_fr]) if params[:ic_fr].present?
			@movimentacoes = @movimentacoes.where(ic_co: params[:ic_co]) if params[:ic_co].present?
			@movimentacoes = @movimentacoes.where(ic_cf: params[:ic_cf]) if params[:ic_cf].present?
			@movimentacoes = @movimentacoes.where(ic_nr: params[:ic_nr]) if params[:ic_nr].present?
			@movimentacoes = @movimentacoes.where(ic_nd: params[:ic_nd]) if params[:ic_nd].present?
			@movimentacoes = @movimentacoes.where(ic_fs: params[:ic_fs]) if params[:ic_fs].present?
			@movimentacoes = @movimentacoes.where(ic_es: params[:ic_es]) if params[:ic_es].present?
			@movimentacoes = @movimentacoes.where(ic_ai: params[:ic_ai]) if params[:ic_ai].present?

			@movimentacoes = @movimentacoes.where(sub_conta_pcasp_id: [Contabilidade::SubContaPcasp.all.select { |i| i.codigo_formatado == @sub_conta_pcasp.codigo_formatado }.pluck(:id)]) if params[:sub_conta_id].present?

		else
			@movimentacoes = []
		end

		render_to_string pdf: "relatorio_ics",
			template: "contabilidade/relatorios/balancetes_de_verificacoes/relatorio_ics.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Conferência de Lançamentos por ICS",
						titulo2: "Conta: #{@conta.codigo_formatado_e_nome}",
						titulo3: "UO: #{@unidade_orcamentaria.sigla}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	def livro_razao
		@data_inicial = Date.new(contexto_atual.exercicio, 1, 1)

		@data_final = params[:data_final]
		@data_final = Date.today unless @data_final.present?

		@data_inicial_movimentacoes = params[:data_inicial].present? ? params[:data_inicial].to_date : nil
		@data_inicial_movimentacoes = Date.new(contexto_atual.exercicio, 1, 1) - 1.day unless @data_inicial_movimentacoes.present?

		@conta = Contabilidade::Conta.find(params[:conta_id].to_i)
		if params[:unidade_orcamentaria].present?
			@unidade = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria])
			@movimentacoes_do_plano_de_contas = @conta.movimentacoes_do_plano_de_contas_e_movimentacoes_filhas(@data_inicial.to_date, @data_final.to_date, @unidade.id).flatten.sort_by { |m| m.conta_por_evento_contabil.conta.codigo}.sort_by { |m| [m.data_de_lancamento, m.created_at] }
			@nome_da_unidade = @unidade.codigo_e_nome_e_exercicio
		else
			@movimentacoes_do_plano_de_contas = @conta.movimentacoes_do_plano_de_contas_e_movimentacoes_filhas(@data_inicial.to_date, @data_final.to_date).flatten.sort_by { |m| m.conta_por_evento_contabil.conta.codigo}.sort_by { |m| [m.data_de_lancamento, m.created_at] }
			@nome_da_unidade = "CONSOLIDADO"
		end

		if @data_inicial_movimentacoes.month == 1 || @data_inicial_movimentacoes.year == contexto_atual.exercicio - 1
			@saldo_anterior = @conta.saldo_inicial_da_conta(@unidade.try(:id))
			@tipo_de_saldo = @conta.tipo_de_saldo_inicial(@unidade.try(:id))
		else
			if @data_inicial_movimentacoes.present?
				@saldo_anterior = @conta.saldo_da_conta(@data_inicial_movimentacoes.to_date - 1.day, @unidade.try(:id))
				@tipo_de_saldo = @conta.tipo_de_saldo(@data_inicial_movimentacoes.to_date - 1.day, @unidade.try(:id))
			else
				@saldo_anterior = @conta.saldo_da_conta(Date.new(contexto_atual.exercicio, 1, 1) - 1.day, @unidade.try(:id))
				@tipo_de_saldo = @conta.tipo_de_saldo(Date.new(contexto_atual.exercicio, 1, 1) - 1.day, @unidade.try(:id))
			end
		end

		@saldo_atual = @conta.saldo_da_conta(@data_final, @unidade.try(:id))

		if params[:por_subconta_resumido].to_i == 1
			titulo1 = 'Resumo do Razão'
			template = "contabilidade/relatorios/balancetes_de_verificacoes/livro_razao_por_subconta_resumido.pdf.slim"
		else
			titulo1 = 'Livro Razão'
			if params[:por_subconta].to_i == 1
				template = "contabilidade/relatorios/balancetes_de_verificacoes/livro_razao_por_subconta.pdf.slim"
			else 
				template = "contabilidade/relatorios/balancetes_de_verificacoes/livro_razao.pdf.slim"
			end
		end

		@exibir_ics = params[:exibir_ics].present? && params[:exibir_ics].to_i == 1 ? true : false

		
		if request.format.xlsx?
			render xlsx: 'livro_razao', template: 'contabilidade/relatorios/balancetes_de_verificacoes/livro_razao.xlsx.axlsx', filename: "livro_razao_conta_#{@conta.codigo}"
		else
			render_to_string pdf: "livro_razao",
				template: "#{template}",
				orientation: 'Portrait',
				disable_smart_shrinking: true,
				
				dpi: '96',
				header: {
					html: {
						template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
						locals: {
							titulo1: "#{titulo1}",
							titulo2: "#{@nome_da_unidade}",
							titulo3: "Conta: #{@conta.codigo_formatado_e_nome} - No período de #{@data_inicial_movimentacoes} a #{@data_final}"
						}
					},
					spacing: 5
				},
				footer: {
					html: {
						template: 'layouts/_rodape_pdf.html.slim'
					}
				},
				margin: @configuracoes.margens_customizadas(top: 10)
		end
	end

	def dcasp
		@ente = ::Configuracao.last.nome_da_prefeitura
		@exercicio_anterior = Orcamento.find_by(exercicio: contexto_atual.exercicio - 1)
		@exercicio_atual = Orcamento.find(contexto_atual.id)
		final_do_mes_exercicio_atual = Date.new(contexto_atual.exercicio, params[:mes_de_referencia].to_i).end_of_month
		@data = Date.new(contexto_atual.exercicio, params[:mes_de_referencia].to_i).end_of_month
		final_do_mes_exercicio_anterior = Date.new(@exercicio_anterior.exercicio, 12).end_of_month
		@contas = contabilidade_atual.contas
		@inicio_do_ano_anterior = Date.new(@exercicio_anterior.exercicio, 1, 1)
		@fim_do_ano_anterior = Date.new(@exercicio_anterior.exercicio, 12).end_of_month
		@inicio_do_ano_atual = Date.new(contexto_atual.exercicio, 1, 1)
		@fim_do_periodo = Date.new(contexto_atual.exercicio, params[:mes_de_referencia].to_i).end_of_month
		
		
		if params[:unidade_gestora].present?
			@unidade_gestora = Loa::UnidadeGestora.find(params[:unidade_gestora].to_i)
			titulo2 = @unidade_gestora&.nome
			@consolidado = false
			

			# Essa busca só vai ser feita para o caso do chamado 3223, que foi feito dessa forma a pedido da gestão
			ids_unidades_orcamentarias = @unidade_gestora.unidades_orcamentarias.joins(:orgao).where("loa_orgaos.orcamento_id = ?", @exercicio_atual.id).pluck(:id)
			@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(ids_unidades_orcamentarias)
			@array_empenhos = Contabilidade::Empenho.confirmados.do_orcamento.where("unidade_orcamentaria_id in (?) AND data_do_empenho <= ? AND restos_a_pagar = ?", ids_unidades_orcamentarias, @data, false)
			
		else
			titulo2 = "CONSOLIDADO"
			@consolidado = true

			# Essa busca só via ser feita para o caso do chamado 3223, que foi feito dessa forma a pedido da gestão
			@array_empenhos = contexto_atual.empenhos.confirmados.do_orcamento.where("data_do_empenho <= ? AND restos_a_pagar = ?", @data, false)
		end
	
		# Essa busca só via ser feita para o caso do chamado 3223, que foi feito dessa forma a pedido da gestão
		@empenhos = Contabilidade::Empenho.where("contabilidade_empenhos.id in (?)", @array_empenhos.pluck(:id))
		
		@movimentacoes_do_plano_de_contas_exercicio_atual = params[:unidade_gestora].present? ? contexto_atual.movimentacoes_do_plano_de_contas.sem_encerramento.where('data_de_lancamento <= ? and unidade_orcamentaria_id in (?)', final_do_mes_exercicio_atual, @unidade_gestora.unidades_orcamentarias.ids) : contexto_atual.movimentacoes_do_plano_de_contas.sem_encerramento.where('data_de_lancamento <= ?', final_do_mes_exercicio_atual)
		@movimentacao_do_plano_de_contas_exercicio_anterior = params[:unidade_gestora].present? ? @exercicio_anterior.movimentacoes_do_plano_de_contas.sem_encerramento.where('data_de_lancamento <= ? and unidade_orcamentaria_id in (?)', final_do_mes_exercicio_anterior, @unidade_gestora.unidades_orcamentarias.ids) : @exercicio_anterior.movimentacoes_do_plano_de_contas.sem_encerramento.where('data_de_lancamento <= ?', final_do_mes_exercicio_anterior)

		versao_relatorio = @unidade_gestora.present? ? '_por_unidade' : ''
	
		@analitico = params[:analitico].to_i == 1 ? true : false
		orientacao = 'Portrait'
		if params[:relatorio_dcasp] == 'balanco'
			template_relatorio = "balanco_patrimonial#{versao_relatorio}.pdf.slim"
			titulo1 = "Balanço Patrimonial"
		elsif params[:relatorio_dcasp] == "dfc"
			template_relatorio = "demonstracao_do_fluxo_de_caixa#{versao_relatorio}.pdf.slim"
			titulo1 = "Demonstração dos Fluxos de Caixa"
			@movimentacoes_do_plano_de_contas_exercicio_das_contas_bancarias = @movimentacoes_do_plano_de_contas_exercicio_atual.where(gerador_type: 'Base::ContaBancaria')
			@movimentacoes_do_plano_de_contas_exercicio_das_contas_bancarias_exercicio_anterior = @movimentacao_do_plano_de_contas_exercicio_anterior.where(gerador_type: 'Base::ContaBancaria')

			# regra adicionada por Isaaac em 28/01/2025, não usar lançamentos manuais na DFC
			@movimentacoes_do_plano_de_contas_exercicio_atual = @movimentacoes_do_plano_de_contas_exercicio_atual.where("(coalesce(contabilidade_movimentacoes_do_plano_de_contas.lancamento_manual, 0) = 0)")
			@movimentacao_do_plano_de_contas_exercicio_anterior = @movimentacao_do_plano_de_contas_exercicio_anterior.where("(coalesce(contabilidade_movimentacoes_do_plano_de_contas.lancamento_manual, 0) = 0)")
		elsif params[:relatorio_dcasp] == "dmpl"
			template_relatorio = "dmpl.pdf.slim"
			titulo1 = "DMPL"
		elsif params[:relatorio_dcasp] == "dvp"
			if @analitico == true
				template_relatorio = "dvp#{versao_relatorio}_analitico.pdf.slim"
			else
				template_relatorio = "dvp#{versao_relatorio}.pdf.slim"
			end
			titulo1 = "Demonstração das Variações Patrimoniais"
		elsif params[:relatorio_dcasp] == "bf"
			if @analitico == true
				template_relatorio = "bf_analitico.pdf.slim"
				orientacao = 'Landscape'
			else
				template_relatorio = "bf.pdf.slim"
			end
			titulo1 = "Balanço Financeiro"
			@movimentacoes_do_plano_de_contas_exercicio_das_contas_bancarias = @movimentacoes_do_plano_de_contas_exercicio_atual.where(gerador_type: 'Base::ContaBancaria')
			@movimentacoes_do_plano_de_contas_exercicio_atual_completo = @movimentacoes_do_plano_de_contas_exercicio_atual
			@movimentacoes_do_plano_de_contas_exercicio_atual_manual = @movimentacoes_do_plano_de_contas_exercicio_atual_completo.where('gerador_id is null')
			@movimentacoes_do_plano_de_contas_exercicio_atual = @movimentacoes_do_plano_de_contas_exercicio_atual_completo.where('gerador_id is not null')
			@movimentacoes_do_plano_de_contas_exercicio_das_contas_bancarias_exercicio_anterior = @movimentacao_do_plano_de_contas_exercicio_anterior.where(gerador_type: 'Base::ContaBancaria')
			@movimentacao_do_plano_de_contas_exercicio_anterior_completo = @movimentacao_do_plano_de_contas_exercicio_anterior
			@movimentacao_do_plano_de_contas_exercicio_anterior = @movimentacao_do_plano_de_contas_exercicio_anterior_completo.where('gerador_id is not null')
			@movimentacoes_do_plano_de_contas_exercicio_anterior_manual = @movimentacao_do_plano_de_contas_exercicio_anterior_completo.where('gerador_id is null')
			@fontes_educacao = contexto_atual.fontes_de_recursos.where(fonte_vinculada: true, tipo_de_vinculo: 0).map{ |f| f.id }
			@fontes_saude = contexto_atual.fontes_de_recursos.where(fonte_vinculada: true, tipo_de_vinculo: 1).map{ |f| f.id  }
			@fontes_previdencia_rpps = contexto_atual.fontes_de_recursos.where(fonte_vinculada: true, tipo_de_vinculo: 2).map{ |f| f.id  }
			@fontes_previdencia_rgps = contexto_atual.fontes_de_recursos.where(fonte_vinculada: true, tipo_de_vinculo: 3).map{ |f| f.id  }
			@fontes_assistencia_social = contexto_atual.fontes_de_recursos.where(fonte_vinculada: true, tipo_de_vinculo: 4).map{ |f| f.id  }
			@fontes_outras_destinacoes = contexto_atual.fontes_de_recursos.where(fonte_vinculada: true, tipo_de_vinculo: 5).map{ |f| f.id  }
			@fontes_nao_vinculadas = contexto_atual.fontes_de_recursos.where(fonte_vinculada: false).map{ |f| f.id  }

			@fontes_educacao_exercicio_anterior = @exercicio_anterior.fontes_de_recursos.where(fonte_vinculada: true, tipo_de_vinculo: 0).map{ |f| f.id }
			@fontes_saude_exercicio_anterior = @exercicio_anterior.fontes_de_recursos.where(fonte_vinculada: true, tipo_de_vinculo: 1).map{ |f| f.id  }
			@fontes_previdencia_rpps_exercicio_anterior = @exercicio_anterior.fontes_de_recursos.where(fonte_vinculada: true, tipo_de_vinculo: 2).map{ |f| f.id  }
			@fontes_previdencia_rgps_exercicio_anterior = @exercicio_anterior.fontes_de_recursos.where(fonte_vinculada: true, tipo_de_vinculo: 3).map{ |f| f.id  }
			@fontes_assistencia_social_exercicio_anterior = @exercicio_anterior.fontes_de_recursos.where(fonte_vinculada: true, tipo_de_vinculo: 4).map{ |f| f.id  }
			@fontes_outras_destinacoes_exercicio_anterior = @exercicio_anterior.fontes_de_recursos.where(fonte_vinculada: true, tipo_de_vinculo: 5).map{ |f| f.id  }
			@fontes_nao_vinculadas_exercicio_anterior = @exercicio_anterior.fontes_de_recursos.where(fonte_vinculada: false).map{ |f| f.id  }

			if @analitico == true

				filtro_unidades = params[:unidade_gestora].present? ? "contabilidade_movimentacoes_do_plano_de_contas.unidade_orcamentaria_id in (#{@unidade_gestora.unidades_orcamentarias.ids.join(',')})" : ""

				# quadro c. Detalhamento por Fonte de Recurso

				grupos_de_fontes = Contabilidade::MovimentacaoDoPlanoDeContas.includes(:fonte_de_recursos).sem_encerramento
					.where(filtro_unidades)
					.where("codigo_da_conta like any (array['6212%', '6213%', '62213%']) and data_de_lancamento between ? and ?", Date.new(@exercicio_atual.exercicio, 1, 1), @data)
					.group_by { |i| i.fonte_de_recursos }
				
				fontes_de_recursos_orcamento_atual = grupos_de_fontes.map do |grupo, movimentacoes|
					conta_6212_credito = movimentacoes.select{ |i| (i[:codigo_da_conta][0..3] == '6212') && i[:tipo_de_lancamento] == 'credito'}.map{ |i| i[:valor] }.sum
					conta_6212_debito = movimentacoes.select{ |i| (i[:codigo_da_conta][0..3] == '6212') && i[:tipo_de_lancamento] == 'debito'}.map{ |i| i[:valor] }.sum
					conta_6213_credito = movimentacoes.select{ |i| (i[:codigo_da_conta][0..3] == '6213') && i[:tipo_de_lancamento] == 'credito'}.map{ |i| i[:valor] }.sum
					conta_6213_debito = movimentacoes.select{ |i| (i[:codigo_da_conta][0..3] == '6213') && i[:tipo_de_lancamento] == 'debito'}.map{ |i| i[:valor] }.sum

					{
						tipo: grupo.fonte_vinculada == false || grupo.fonte_vinculada.nil? ? :ordinaria : :vinculada, 
						descricao: grupo.descricao,
						codigo_completo: grupo.codigo_completo,
						valor_receita: (conta_6212_credito - conta_6212_debito) - (conta_6213_debito - conta_6213_credito),
						valor_despesa: movimentacoes.select{ |i| i[:codigo_da_conta][0..4] == '62213' && i[:tipo_de_lancamento] == 'credito'}.map{ |i| i[:valor] }.sum - movimentacoes.select{ |i| i[:codigo_da_conta][0..4] == '62213' && i[:tipo_de_lancamento] == 'debito'}.map{ |i| i[:valor] }.sum,
					}
				end

				fontes_de_recursos_orcamento_atual = fontes_de_recursos_orcamento_atual.group_by { |i| [i[:codigo_completo], i[:descricao]] }.map do |grupo, itens|
					{
						tipo: itens.first[:tipo],
						descricao: grupo[1],
						codigo_completo: grupo[0],
						valor_receita: itens.map{ |i| i[:valor_receita] }.sum,
						valor_despesa: itens.map{ |i| i[:valor_despesa] }.sum
					}
				end

				grupos_de_fontes_orcamento_anterior = Contabilidade::MovimentacaoDoPlanoDeContas.includes(:fonte_de_recursos).sem_encerramento
					.where(filtro_unidades)
					.where("codigo_da_conta like any (array['6212%', '6213%', '62213%']) and data_de_lancamento between ? and ?", Date.new(@exercicio_anterior.exercicio, 1, 1), Date.new(@exercicio_anterior.exercicio, 12, 31))
					.group_by { |i| i.fonte_de_recursos }

				fontes_de_recursos_orcamento_anterior = grupos_de_fontes_orcamento_anterior.map do |grupo, movimentacoes|
					conta_6212_credito = movimentacoes.select{ |i| (i[:codigo_da_conta][0..3] == '6212') && i[:tipo_de_lancamento] == 'credito'}.map{ |i| i[:valor] }.sum
					conta_6212_debito = movimentacoes.select{ |i| (i[:codigo_da_conta][0..3] == '6212') && i[:tipo_de_lancamento] == 'debito'}.map{ |i| i[:valor] }.sum
					conta_6213_credito = movimentacoes.select{ |i| (i[:codigo_da_conta][0..3] == '6213') && i[:tipo_de_lancamento] == 'credito'}.map{ |i| i[:valor] }.sum
					conta_6213_debito = movimentacoes.select{ |i| (i[:codigo_da_conta][0..3] == '6213') && i[:tipo_de_lancamento] == 'debito'}.map{ |i| i[:valor] }.sum

					{
						tipo: grupo.fonte_vinculada == false || grupo.fonte_vinculada.nil? ? :ordinaria : :vinculada, 
						descricao: grupo.descricao,
						codigo_completo: grupo.codigo_completo,
						valor_receita_exercicio_anterior: (conta_6212_credito - conta_6212_debito) - (conta_6213_debito - conta_6213_credito),
						valor_despesa_exercicio_anterior: movimentacoes.select{ |i| i[:codigo_da_conta][0..4] == '62213' && i[:tipo_de_lancamento] == 'credito'}.map{ |i| i[:valor] }.sum - movimentacoes.select{ |i| i[:codigo_da_conta][0..4] == '62213' && i[:tipo_de_lancamento] == 'debito'}.map{ |i| i[:valor] }.sum
					}
				end

				fontes_de_recursos_orcamento_anterior = fontes_de_recursos_orcamento_anterior.group_by { |i| [i[:codigo_completo], i[:descricao]] }.map do |grupo, itens|
					{
						tipo: itens.first[:tipo],
						descricao: grupo[1],
						codigo_completo: grupo[0],
						valor_receita_exercicio_anterior: itens.map{ |i| i[:valor_receita_exercicio_anterior] }.sum,
						valor_despesa_exercicio_anterior: itens.map{ |i| i[:valor_despesa_exercicio_anterior] }.sum
					}
				end

				@lista_fontes_de_recursos = fontes_de_recursos_orcamento_atual.map do |fonte|
					item_correspondente = fontes_de_recursos_orcamento_anterior.find { |i| i[:tipo] == fonte[:tipo] && i[:descricao] == fonte[:descricao] && i[:codigo_completo] == fonte[:codigo_completo] }
					item_correspondente ? fonte.merge(item_correspondente) : fonte
				end

				fontes_de_recursos_orcamento_anterior.each do |fonte|
					unless @lista_fontes_de_recursos.any? { |item| item[:tipo] == fonte[:tipo] && item[:descricao] == fonte[:descricao] && item[:codigo_completo] == fonte[:codigo_completo] }
						@lista_fontes_de_recursos << fonte
					end
				end

				# quadro d - detalhamaento por contas bancarias

				grupos_de_contas_bancarias_saldo_inicial = Contabilidade::MovimentacaoDoPlanoDeContas.sem_encerramento
					.includes(conta_bancaria: { agencia: :banco })
					.where(filtro_unidades)
					.where("conta_bancaria_id > 0 and codigo_da_conta like any (array['11111%']) and data_de_lancamento between ? and ?", Date.new(@exercicio_anterior.exercicio, 1, 1), @data)
					.group_by { |i| [i.conta_bancaria, i.codigo_da_conta] }

				@saldo_das_contas_bancarias = grupos_de_contas_bancarias_saldo_inicial.map do |grupo, movimentacoes|
					valor_inicial_orcamento_atual = movimentacoes.select{ |i| i[:codigo_da_conta] == grupo[1] && i[:lancamento_manual] == 'abertura' && i[:tipo_de_lancamento] == 'debito' && i[:data_de_lancamento] >= Date.new(@exercicio_atual.exercicio, 1, 1) && i[:data_de_lancamento] <= @data}.map{ |i| i[:valor] }.sum - movimentacoes.select{ |i| i[:codigo_da_conta] == grupo[1] && i[:lancamento_manual] == 'abertura' && i[:tipo_de_lancamento] == 'credito' && i[:data_de_lancamento] >= Date.new(@exercicio_atual.exercicio, 1, 1) && i[:data_de_lancamento] <= @data}.map{ |i| i[:valor] }.sum
					valor_inicial_orcamento_anterior = movimentacoes.select{ |i| i[:codigo_da_conta] == grupo[1] && i[:lancamento_manual] == 'abertura' && i[:tipo_de_lancamento] == 'debito' && i[:data_de_lancamento] >= Date.new(@exercicio_anterior.exercicio, 1, 1) && i[:data_de_lancamento] <= Date.new(@exercicio_anterior.exercicio, 12, 31)}.map{ |i| i[:valor] }.sum - movimentacoes.select{ |i| i[:codigo_da_conta] == grupo[1] && i[:lancamento_manual] == 'abertura' && i[:tipo_de_lancamento] == 'credito' && i[:data_de_lancamento] >= Date.new(@exercicio_atual.exercicio, 1, 1) && i[:data_de_lancamento] <= Date.new(@exercicio_anterior.exercicio, 12, 31)}.map{ |i| i[:valor] }.sum
					valor_final_orcamento_atual = movimentacoes.select{ |i| i[:codigo_da_conta] == grupo[1] && i[:tipo_de_lancamento] == 'debito' && i[:data_de_lancamento] >= Date.new(@exercicio_atual.exercicio, 1, 1) && i[:data_de_lancamento] <= @data}.map{ |i| i[:valor] }.sum - movimentacoes.select{ |i| i[:codigo_da_conta] == grupo[1] && i[:tipo_de_lancamento] == 'credito' && i[:data_de_lancamento] >= Date.new(@exercicio_atual.exercicio, 1, 1) && i[:data_de_lancamento] <= @data}.map{ |i| i[:valor] }.sum
					valor_final_orcamento_anterior = movimentacoes.select{ |i| i[:codigo_da_conta] == grupo[1] && i[:tipo_de_lancamento] == 'debito' && i[:data_de_lancamento] >= Date.new(@exercicio_anterior.exercicio, 1, 1) && i[:data_de_lancamento] <= Date.new(@exercicio_anterior.exercicio, 12, 31)}.map{ |i| i[:valor] }.sum - movimentacoes.select{ |i| i[:codigo_da_conta] == grupo[1] && i[:tipo_de_lancamento] == 'credito' && i[:data_de_lancamento] >= Date.new(@exercicio_anterior.exercicio, 1, 1) && i[:data_de_lancamento] <= Date.new(@exercicio_anterior.exercicio, 12, 31)}.map{ |i| i[:valor] }.sum

					{
						codigo_da_conta: grupo[0].tipo_de_conta_pcasp.to_s.humanize.upcase, 
						numero_da_conta: grupo[0]&.numero_da_conta,
						numero_da_conta_ordem: grupo[0]&.numero_da_conta.gsub(/-(.*)/, "").gsub(/[,.-]/, '').gsub(/[Xx]/, '0').to_i,
						descricao: grupo[0].nomenclatura_e_numero,
						sigla_banco: grupo[0].agencia&.banco&.sigla,
						valor_inicial_orcamento_atual: valor_inicial_orcamento_atual,
						valor_inicial_orcamento_anterior: valor_inicial_orcamento_anterior,
						valor_final_orcamento_atual: valor_final_orcamento_atual,
						valor_final_orcamento_anterior: valor_final_orcamento_anterior
					}
				end

				grupos_de_contas_extras_1 = Contabilidade::MovimentacaoDoPlanoDeContas.sem_encerramento
					.where(filtro_unidades)
					.where("gerador_type is not null and codigo_da_conta like any (array['2188%']) and data_de_lancamento between ? and ?", Date.new(@exercicio_atual.exercicio, 1, 1), @data)
					.group_by { |i| i.gerador.conta_extra_orcamentaria }

				@contas_extras_1 = grupos_de_contas_extras_1.map do |grupo, movimentacoes|
					{
						codigo: grupo.codigo,
						descricao: grupo.descricao,
						codigo_completo_e_descricao: grupo.codigo_completo_e_descricao,
						receita_exercicio_atual: movimentacoes.select { |i| i.gerador.conta_extra_orcamentaria.codigo == grupo.codigo && i[:tipo_de_lancamento] == 'credito' && i[:data_de_lancamento] >= Date.new(@exercicio_atual.exercicio, 1, 1) && i[:data_de_lancamento] <= @data}.map{ |i| i[:valor] }.sum,
						receita_exercicio_anterior: movimentacoes.select { |i| i.gerador.conta_extra_orcamentaria.codigo == grupo.codigo && i[:tipo_de_lancamento] == 'credito' && i[:data_de_lancamento] >= Date.new(@exercicio_anterior.exercicio, 1, 1) && i[:data_de_lancamento] <= Date.new(@exercicio_anterior.exercicio, 12, 31)}.map{ |i| i[:valor] }.sum,
						despesa_exercicio_atual: movimentacoes.select { |i| i.gerador.conta_extra_orcamentaria.codigo == grupo.codigo && i[:tipo_de_lancamento] == 'debito' && i[:data_de_lancamento] >= Date.new(@exercicio_atual.exercicio, 1, 1) && i[:data_de_lancamento] <= @data}.map{ |i| i[:valor] }.sum,
						despesa_exercicio_anterior: movimentacoes.select { |i| i.gerador.conta_extra_orcamentaria.codigo == grupo.codigo && i[:tipo_de_lancamento] == 'credito' && i[:data_de_lancamento] >= Date.new(@exercicio_anterior.exercicio, 1, 1) && i[:data_de_lancamento] <= Date.new(@exercicio_anterior.exercicio, 12, 31)}.map{ |i| i[:valor] }.sum,
					}
				end

				grupos_de_contas_extras_2 = Contabilidade::MovimentacaoDoPlanoDeContas.sem_encerramento
					.where(filtro_unidades)
					.where("gerador_type is not null and codigo_da_conta like any (array['1138%']) and data_de_lancamento between ? and ?", Date.new(@exercicio_atual.exercicio, 1, 1), @data)
					.group_by { |i| i.gerador.conta_extra_orcamentaria }

				@contas_extras_2 = grupos_de_contas_extras_2.map do |grupo, movimentacoes|
					{
						codigo: grupo.codigo,
						descricao: grupo.descricao,
						codigo_completo_e_descricao: grupo.codigo_completo_e_descricao,
						receita_exercicio_atual: movimentacoes.select { |i| i.gerador.conta_extra_orcamentaria.codigo == grupo.codigo && i[:tipo_de_lancamento] == 'credito' && i[:data_de_lancamento] >= Date.new(@exercicio_atual.exercicio, 1, 1) && i[:data_de_lancamento] <= @data}.map{ |i| i[:valor] }.sum,
						receita_exercicio_anterior: movimentacoes.select { |i| i.gerador.conta_extra_orcamentaria.codigo == grupo.codigo && i[:tipo_de_lancamento] == 'credito' && i[:data_de_lancamento] >= Date.new(@exercicio_anterior.exercicio, 1, 1) && i[:data_de_lancamento] <= Date.new(@exercicio_anterior.exercicio, 12, 31)}.map{ |i| i[:valor] }.sum,
						despesa_exercicio_atual: movimentacoes.select { |i| i.gerador.conta_extra_orcamentaria.codigo == grupo.codigo && i[:tipo_de_lancamento] == 'debito' && i[:data_de_lancamento] >= Date.new(@exercicio_atual.exercicio, 1, 1) && i[:data_de_lancamento] <= @data}.map{ |i| i[:valor] }.sum,
						despesa_exercicio_anterior: movimentacoes.select { |i| i.gerador.conta_extra_orcamentaria.codigo == grupo.codigo && i[:tipo_de_lancamento] == 'credito' && i[:data_de_lancamento] >= Date.new(@exercicio_anterior.exercicio, 1, 1) && i[:data_de_lancamento] <= Date.new(@exercicio_anterior.exercicio, 12, 31)}.map{ |i| i[:valor] }.sum,
					}
				end
			end

		elsif params[:relatorio_dcasp] == 'bo'
			template_relatorio = "bo#{versao_relatorio}.pdf.slim"
			titulo1 = 'Balanço Orçamentário'
		end

		render_to_string pdf: "demonstracao_do_fluxo_de_caixa",
			template: "contabilidade/relatorios/balancetes_de_verificacoes/" + template_relatorio,
			orientation: orientacao,
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: titulo2,
						titulo3: "Período: #{final_do_mes_exercicio_atual}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def relatorio_rp_funcao
		@exercicio_anterior = Orcamento.find_by(exercicio: contexto_atual.exercicio - 1)
		@exercicio_atual = Orcamento.find(contexto_atual.id)
		final_do_mes_exercicio_atual = Date.new(contexto_atual.exercicio, params[:mes_de_referencia].to_i).end_of_month
		final_do_mes_exercicio_anterior = Date.new(@exercicio_anterior.exercicio, params[:mes_de_referencia].to_i).end_of_month
		ransack_params = {}
		unidades_anteriores = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria]).unidades_orcamentarias_de_exercicios_anteriores_ids if params[:unidade_orcamentaria].present?
		ransack_params["unidade_orcamentaria_id_in"] = unidades_anteriores if params[:unidade_orcamentaria].present?
		
		@movimentacoes = @exercicio_atual.movimentacoes_do_plano_de_contas
		@subfuncoes = @exercicio_atual.subfuncoes

		@movimentacoes_processado_exercicio_anterior = @movimentacoes.sem_encerramento
    .where('data_de_lancamento <= ?', final_do_mes_exercicio_atual)
    .joins(conta_por_evento_contabil: :conta)
    .where(contabilidade_contas_por_eventos_contabeis: { conta_id: Contabilidade::Conta.where(
			classe: '5', grupo: '3', subgrupo: '2', titulo: '1', subtitulo: '0').pluck(:id) })
    .ransack(ransack_params).result
		
		@movimentacoes_processado_exercicios_anteriores = @movimentacoes.sem_encerramento
		.where('data_de_lancamento <= ?', final_do_mes_exercicio_atual)
		.joins(conta_por_evento_contabil: :conta)
		.where(
			contabilidade_contas_por_eventos_contabeis: {
				conta_id: Contabilidade::Conta.where(
					"(classe = ? AND grupo = ? AND subgrupo = ? AND titulo = ? AND subtitulo = ?) OR
					(classe = ? AND grupo = ? AND subgrupo = ? AND titulo = ? AND subtitulo = ?) OR
					(classe = ? AND grupo = ? AND subgrupo = ? AND titulo = ? AND subtitulo = ?)",
					'5', '3', '2', '2', '0', # Para '5.3.2.2.0.00.00'
					'5', '3', '2', '6', '0', # Para '5.3.2.6.0.00.00'
					'6', '3', '2', '6', '0'  # Para '6.3.2.6.0.00.00'
				).pluck(:id)
			}
		)
		.ransack(ransack_params).result

		@movimentacoes_pago = @movimentacoes.sem_encerramento
		.where('data_de_lancamento <= ?', final_do_mes_exercicio_atual)
		.joins(conta_por_evento_contabil: :conta)
		.where(
			contabilidade_contas_por_eventos_contabeis: {
				conta_id: Contabilidade::Conta.where(
					classe: '6', grupo: '3', subgrupo: '2', titulo: '2', subtitulo: '0'
				).pluck(:id)
			}
		)
		.ransack(ransack_params).result

		@movimentacoes_cancelado_processado = @movimentacoes.sem_encerramento
		.where('data_de_lancamento <= ?', final_do_mes_exercicio_atual)
		.joins(conta_por_evento_contabil: :conta)
		.where(
			contabilidade_contas_por_eventos_contabeis: {
				conta_id: Contabilidade::Conta.where(
					classe: '6', grupo: '3', subgrupo: '2', titulo: '9', subtitulo: '0'
				).pluck(:id)
			}
		)
		.ransack(ransack_params).result

		@movimentacoes_nao_processado_exercicio_anterior = @movimentacoes.sem_encerramento
		.where('data_de_lancamento <= ?', final_do_mes_exercicio_atual)
    .joins(conta_por_evento_contabil: :conta)
    .where(contabilidade_contas_por_eventos_contabeis: { conta_id: Contabilidade::Conta.where(
			classe: '5', grupo: '3', subgrupo: '1', titulo: '1', subtitulo: '0').pluck(:id) })
    .ransack(ransack_params).result

		@movimentacoes_nao_processado_exercicios_anteriores =  @movimentacoes.sem_encerramento
		.where('data_de_lancamento <= ?', final_do_mes_exercicio_atual)
		.joins(conta_por_evento_contabil: :conta)
		.where(
			contabilidade_contas_por_eventos_contabeis: {
				conta_id: Contabilidade::Conta.where(
					"(classe = ? AND grupo = ? AND subgrupo = ? AND titulo = ? AND subtitulo = ?) OR
					(classe = ? AND grupo = ? AND subgrupo = ? AND titulo = ? AND subtitulo = ?) OR
					(classe = ? AND grupo = ? AND subgrupo = ? AND titulo = ? AND subtitulo = ?) OR
					(classe = ? AND grupo = ? AND subgrupo = ? AND titulo = ? AND subtitulo = ?)", 
					'5', '3', '1', '2', '0', # Para '5.3.1.2.0.00.00'
					'5', '3', '1', '3', '0', # Para '5.3.1.3.0.00.00'
					'5', '3', '1', '6', '0', # Para '5.3.1.6.0.00.00'
					'6', '3', '1', '6', '0'  # Para '6.3.1.6.0.00.00'
				).pluck(:id)
			}
		)
		.ransack(ransack_params).result

		@movimentacoes_liquidado_nao_processado = @movimentacoes.sem_encerramento
    .where('data_de_lancamento <= ?', final_do_mes_exercicio_atual)
		.joins(conta_por_evento_contabil: :conta)
		.where(
			contabilidade_contas_por_eventos_contabeis: {
				conta_id: Contabilidade::Conta.where(
					"(classe = ? AND grupo = ? AND subgrupo = ? AND titulo = ? AND subtitulo = ?) OR
					(classe = ? AND grupo = ? AND subgrupo = ? AND titulo = ? AND subtitulo = ?)",
					'6', '3', '1', '3', '0', # Para '6.3.1.3.0.00.00'
					'6', '3', '1', '4', '0', # Para '6.3.1.4.0.00.00'
				).pluck(:id)
			}
		)
    .ransack(ransack_params).result

		@movimentacoes_pago_nao_processado = @movimentacoes.sem_encerramento
    .where('data_de_lancamento <= ?', final_do_mes_exercicio_atual)
    .joins(conta_por_evento_contabil: :conta)
    .where(contabilidade_contas_por_eventos_contabeis: { conta_id: Contabilidade::Conta.where(
			classe: '6', grupo: '3', subgrupo: '1', titulo: '4', subtitulo: '0').pluck(:id) })
    .ransack(ransack_params).result

		@movimentacoes_cancelado_nao_processado = @movimentacoes.sem_encerramento
    .where('data_de_lancamento <= ?', final_do_mes_exercicio_atual)
    .joins(conta_por_evento_contabil: :conta)
    .where(contabilidade_contas_por_eventos_contabeis: { conta_id: Contabilidade::Conta.where(
			classe: '6', grupo: '3', subgrupo: '1', titulo: '9', subtitulo: '9').pluck(:id) })
    .ransack(ransack_params).result
		
		if params[:unidade_orcamentaria].present?
			@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria].to_i)
			titulo3 = @unidade_orcamentaria&.nome
			@consolidado = false
		else
			titulo3 = "CONSOLIDADO"
			@consolidado = true
		end

		render_to_string pdf: "relatorio_rp_funcao",
			template: "contabilidade/relatorios/siconfi/relatorio_de_rp_funcao_e_subfuncao.html.slim",
			orientation: 'Landscape',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_relatorios_balancetes.html.slim',
					locals: {
						titulo1: 'Relatório de Restos a Pagar por Função e Subfunção',
						titulo2: "Período: #{final_do_mes_exercicio_atual}",
						titulo3: titulo3
						}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas(top: 10)

	end

	def relatorio_rp_classificacao

		@sub_elementos_de_despesa = contexto_atual.sub_elementos_de_despesa.includes(elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]).map { |i| 
			{
				codigo: i.codigo, 
				descricao: i.descricao,
				elemento_de_despesa: {
					codigo: i.elemento_de_despesa.codigo,
					descricao: i.elemento_de_despesa.descricao,
					modalidade_de_aplicacao: { 
						codigo: i.elemento_de_despesa.modalidade_de_aplicacao.codigo,
						descricao: i.elemento_de_despesa.modalidade_de_aplicacao.descricao,
						grupo_de_natureza_da_despesa: {
							codigo: i.elemento_de_despesa.modalidade_de_aplicacao.grupo_de_natureza_da_despesa.codigo,
							descricao: i.elemento_de_despesa.modalidade_de_aplicacao.grupo_de_natureza_da_despesa.descricao,
							categoria_economica: {
								codigo: i.elemento_de_despesa.modalidade_de_aplicacao.grupo_de_natureza_da_despesa.categoria_economica.codigo,
								descricao: i.elemento_de_despesa.modalidade_de_aplicacao.grupo_de_natureza_da_despesa.categoria_economica.descricao,
							}
						}
					}
				}
			}
		}
		@exercicio_anterior = Orcamento.find_by(exercicio: contexto_atual.exercicio - 1)
		@exercicio_atual = Orcamento.find(contexto_atual.id)
		final_do_mes_exercicio_atual = Date.new(contexto_atual.exercicio, params[:mes_de_referencia].to_i).end_of_month
		final_do_mes_exercicio_anterior = Date.new(@exercicio_anterior.exercicio, params[:mes_de_referencia].to_i).end_of_month
		ransack_params = {}
		unidades_anteriores = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria]).unidades_orcamentarias_de_exercicios_anteriores_ids if params[:unidade_orcamentaria].present?
		ransack_params["unidade_orcamentaria_id_in"] = unidades_anteriores if params[:unidade_orcamentaria].present?
		
		@movimentacoes = @exercicio_atual.movimentacoes_do_plano_de_contas.sem_encerramento.ransack(ransack_params).result.map do |i|
			{
				id: i.id,
				data_de_lancamento: i.data_de_lancamento,
				codigo_da_conta: i.codigo_da_conta,
				tipo_de_lancamento: i.tipo_de_lancamento,
				valor: i.valor,
				gerador_type: i.gerador_type,
				ic_nd: i.ic_nd
			}
		end
		
		@movimentacoes_processado_exercicio_anterior = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual && movimentacao[:codigo_da_conta] == '532100000'
		end
		
		@movimentacoes_processado_exercicios_anteriores = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual &&
				['532200000', '532600000', '632600000'].include?(movimentacao[:codigo_da_conta])
		end
		
		# Movimentações pagas
		@movimentacoes_pago_credito = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual && movimentacao[:tipo_de_lancamento] == "credito" &&
				movimentacao[:codigo_da_conta] == '632200000'
		end

		@movimentacoes_pago_debito = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual && movimentacao[:tipo_de_lancamento] == "debito" &&
				movimentacao[:codigo_da_conta] == '632200000'
		end
		
		# Movimentações canceladas processadas
		@movimentacoes_cancelado_processado_credito = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual && movimentacao[:tipo_de_lancamento] == "credito" &&
				movimentacao[:codigo_da_conta] == '632900000'
		end

		@movimentacoes_cancelado_processado_debito = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual && movimentacao[:tipo_de_lancamento] == "debito" &&
				movimentacao[:codigo_da_conta] == '632900000'
		end

		@movimentacoes_nao_processado_exercicio_anterior = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual &&
				movimentacao[:codigo_da_conta] == '531100000'
		end

		@movimentacoes_nao_processado_exercicios_anteriores = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual &&
				['531200000', '531300000', '531600000', '631600000'].include?(movimentacao[:codigo_da_conta])
		end

		@movimentacoes_liquidado_nao_processado_credito = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual && movimentacao[:tipo_de_lancamento] == "credito" &&
				['631300000', '631400000'].include?(movimentacao[:codigo_da_conta])
		end

		@movimentacoes_liquidado_nao_processado_debito = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual && movimentacao[:tipo_de_lancamento] == "debito" &&
				['631300000', '631400000'].include?(movimentacao[:codigo_da_conta])
		end

		@movimentacoes_pago_nao_processado_credito = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual && movimentacao[:tipo_de_lancamento] == "credito" &&
				movimentacao[:codigo_da_conta] == '631400000'
		end

		@movimentacoes_pago_nao_processado_debito = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual && movimentacao[:tipo_de_lancamento] == "debito" &&
				movimentacao[:codigo_da_conta] == '631400000'
		end

		@movimentacoes_cancelado_nao_processado_credito = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual && movimentacao[:tipo_de_lancamento] == "credito" &&
				movimentacao[:codigo_da_conta] == '631990000'
		end

		@movimentacoes_cancelado_nao_processado_debito = @movimentacoes.select do |movimentacao|
			movimentacao[:data_de_lancamento] <= final_do_mes_exercicio_atual && movimentacao[:tipo_de_lancamento] == "debito" &&
				movimentacao[:codigo_da_conta] == '631990000'
		end

		if params[:unidade_orcamentaria].present?
			@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria].to_i)
			titulo3 = @unidade_orcamentaria&.nome
			@consolidado = false
		else
			titulo3 = "CONSOLIDADO"
			@consolidado = true
		end

		render_to_string pdf: "relatorio_rp_classificacao",
			template: 'contabilidade/relatorios/siconfi/relatorio_de_rp_por_classificacao.html.slim',
			orientation: 'Landscape',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_relatorios_balancetes.html.slim',
					locals: {
						titulo1: 'Relatório de Restos a Pagar por Classificação Econômica',
						titulo2: "Período: #{final_do_mes_exercicio_atual}",
						titulo3: titulo3
						}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	def balancete_despesa
		#Balancete Pago
		if params[:unidade_orcamentaria].blank?
			titulo2 = 'Todas as Unidades'
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.all
			@todas = true
		elsif params[:unidade_orcamentaria] == 'consolidado'
			titulo2 = 'Consolidado'
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.all
			@consolidado = true
		else
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(id: params[:unidade_orcamentaria]).all
			titulo2 = "Unidade Gestora #{@unidades_orcamentarias.last.codigo_e_nome}"
			@consolidado = false
			@todas = false
		end

		@relatorio_da_contabilidade = params[:relatorio]

		@data_final = params[:data_final].to_date
		@data_inicial = @data_final.beginning_of_month
		@inicio_do_ano = Date.parse("01/01/#{contexto_atual.exercicio}").to_date

		@sub_elementos_de_despesa = contexto_atual.sub_elementos_de_despesa

		@total_empenhado_ate_o_mes_da_unidade = 0
		@total_estornado_no_mes_da_unidade = 0
		@total_pago_no_mes_da_unidade = 0
		@total_pago_ate_o_mes_da_unidade = 0
		@total_empenhado_e_a_pagar_da_unidade = 0

		@total_estorno_de_despesa_extra_no_mes_da_unidade = 0
		@total_pagamento_de_despesa_extra_no_mes_da_unidade = 0
		@total_pagamento_de_despesa_extra_ate_o_mes_da_unidade = 0

		@total_transferencia_de_estorno_da_unidade = 0
		@total_transferencia_regular_da_unidade = 0
		@total_transferencias_da_unidade = 0

		render_to_string pdf: "balancete_despesa",
			template: "contabilidade/relatorios/balancetes_de_verificacoes/balancete_despesa.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_relatorios_balancetes.html.slim',
					locals: {
						titulo1: 'Balancete da Despesa Financeiro',
						titulo2: titulo2,
						titulo3: "Período até: #{@data_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_com_assinatura.pdf.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	def balancete_despesa_liquidacao
		# Balancete Liquidado
		if params[:unidade_orcamentaria].blank?
			titulo2 = 'Todas as Unidades'
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
			@todas = true
		elsif params[:unidade_orcamentaria] == 'consolidado'
			titulo2 = 'Consolidado'
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
			@consolidado = true
		else
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(id: params[:unidade_orcamentaria])
			titulo2 = "Unidade Gestora #{@unidades_orcamentarias.last.codigo_e_nome}"
			@consolidado = false
			@todas = false
		end

		@total_empenhado_ate_o_mes_unidades = 0
		@total_estornado_no_mes_unidades = 0
		@total_liquidado_no_mes_unidades = 0
		@total_liquidado_ate_o_mes_unidades = 0
		@total_empenhado_e_a_liquidar_unidades = 0

		@relatorio_da_contabilidade = params[:relatorio]

		@data_final = params[:data_final].to_date
		@data_inicial = @data_final.beginning_of_month
		@inicio_do_ano = Date.parse("01/01/#{contexto_atual.exercicio}").to_date
		
		render_to_string pdf: "balancete_despesa_liquidacao",
		template: "contabilidade/relatorios/balancetes_de_verificacoes/balancete_despesa_liquidacao.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,
		
		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_relatorios_balancetes.html.slim',
				locals: {
					titulo1: 'Balancete da Liquidação',
					titulo2: titulo2,
					titulo3: "Período até: #{@data_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_com_assinatura.pdf.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 10)
	end

	def balancete_receita
		if params[:unidade_orcamentaria].blank?
			titulo2 = 'Todas as Unidades'
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
		elsif params[:unidade_orcamentaria] == 'consolidado'
			titulo2 = 'Consolidado'
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
			@consolidado = true
		else
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(id: params[:unidade_orcamentaria])
			titulo2 = "Unidade Gestora #{@unidades_orcamentarias.last.codigo_e_nome}"
		end

		if params[:sem_fonte_de_recursos] == '1'
			@sem_fonte = params[:sem_fonte_de_recursos]
		end

		@total_previsao_orcamentario = 0
		@total_anulado_no_mes_orcamentario = 0
		@total_anulado_ate_o_mes_orcamentario = 0
		@total_arrecadado_antes_do_mes_orcamentario = 0
		@total_arrecadado_no_mes_orcamentario = 0
		@total_arrecadado_ate_o_mes_orcamentario = 0

		@total_anulado_no_mes_extra_orcamentario = 0
		@total_anulado_ate_o_mes_extra_orcamentario = 0
		@total_arrecadado_anterior_ao_mes_extra_orcamentario = 0
		@total_arrecadado_no_mes_extra_orcamentario = 0
		@total_arrecadado_ate_o_mes_extra_orcamentario = 0

		@total_anulado_no_mes_transferencia = 0
		@total_anulado_ate_o_mes_transferencia = 0
		@total_arrecadado_anterior_ao_mes_transferencia = 0
		@total_arrecadado_no_mes_transferencia = 0
		@total_arrecadado_ate_o_mes_transferencia = 0

		@relatorio_da_contabilidade = params[:relatorio]

		@data_final = params[:data_final].to_date
		@data_inicial = @data_final.beginning_of_month
		@inicio_do_ano = Date.parse("01/01/#{contexto_atual.exercicio}").to_date
		
		render_to_string pdf: "balancete_receita",
		template: "contabilidade/relatorios/balancetes_de_verificacoes/balancete_receita.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,
		
		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_relatorios_balancetes.html.slim',
				locals: {
					titulo1: 'Balancete da Receita',
					titulo2: titulo2,
					titulo3: "Período até: #{@data_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_com_assinatura.pdf.slim'
			},
			spacing: 5
		},
		margin: @configuracoes.margens_customizadas(top: 10)
	end

	def balancete_conta_bancaria

		@data_inicial = params[:data_inicial].present? ? params[:data_inicial].to_date : Date.today.beginning_of_month
		@data_final = params[:data_final].present? ? params[:data_final].to_date : @data_inicial.end_of_month
		@contas_bancarias = params[:conta_bancaria].present? ? Base::ContaBancaria.where(id: params[:conta_bancaria]) : Base::ContaBancaria.all
		@unidades_orcamentarias = params[:unidade_orcamentaria].present? ? Loa::UnidadeOrcamentaria.where(id: params[:unidade_orcamentaria]) : contexto_atual.unidades_orcamentarias
		contas_bancaria_por_unidades_orcamentarias = Base::ContaBancariaPorUnidadeOrcamentaria.joins(unidade_orcamentaria: :orgao).where("loa_orgaos.orcamento_id = ?", contexto_atual.id)
		contas_bancaria_por_unidades_orcamentarias = contas_bancaria_por_unidades_orcamentarias.where(conta_bancaria_id: @contas_bancarias.ids).where(unidade_orcamentaria_id: @unidades_orcamentarias.ids)
		@contas_bancaria_por_unidades_orcamentarias = contas_bancaria_por_unidades_orcamentarias
		
		unless params[:sem_movimentacao].to_boolean
			@contas_bancaria_por_unidades_orcamentarias = @contas_bancaria_por_unidades_orcamentarias.select{|conta| conta.movimentacoes_da_conta_bancaria.where("data_da_movimentacao >= ? AND data_da_movimentacao <= ? AND modulo_type <> ?", @data_inicial, @data_final, 'Base::ContaBancariaPorUnidadeOrcamentaria').any?}
		end
		
		unless params[:sem_saldo].to_boolean
			@contas_bancaria_por_unidades_orcamentarias = @contas_bancaria_por_unidades_orcamentarias.select{|conta| conta.total_movimentado_ate_a_data(contexto_atual, @data_final) > 0}
		end

		titulo2 = "#{@data_inicial} a #{@data_final}"
		render_to_string pdf: "balancete_conta_bancaria",
		template: "contabilidade/relatorios/balancetes_de_verificacoes/balancete_conta_bancaria.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,
		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_pdf.html.slim',
				locals: {
					titulo1: 'Relatório de Balancete de Conta Bancária',
					titulo2: titulo2
				}
			},
			spacing: 5
		},
		margin: @configuracoes.margens_customizadas(top: 10)
	end

	def balancete_financeiro_ate_o_mes
		if params[:unidade_orcamentaria].blank?
			titulo2 = 'Todas as Unidades'
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
		elsif params[:unidade_orcamentaria] == 'consolidado'
			titulo2 = 'Consolidado'
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
			@consolidado = true
		else
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(id: params[:unidade_orcamentaria])
			titulo2 = "Unidade Gestora #{@unidades_orcamentarias.last.codigo_e_nome}"
		end

		@total_receita_orcamentario = 0
		@total_pagamento_orcamentario = 0

		@total_receita_extra_orcamentaria = 0
		@total_despesa_extra_orcamentaria = 0

		@total_transferencia_destino = 0
		@total_transferencia_origem = 0

		@data_final = params[:data_final].to_date

		@relatorio_da_contabilidade = params[:relatorio]

		render_to_string pdf: "balancete_financeiro_ate_o_mes",
		template: "contabilidade/relatorios/balancetes_de_verificacoes/balancete_financeiro_ate_o_mes.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,
		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_pdf.html.slim',
				locals: {
					titulo1: 'Balanço Financeiro Até o Mês',
					titulo2: titulo2,
					titulo3: "Período até: #{@data_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_com_assinatura.pdf.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 10)
	end

	def balancete_orcamentario
		if params[:unidade_orcamentaria].blank?
			titulo2 = 'Todas as Unidades'
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
		elsif params[:unidade_orcamentaria] == 'consolidado'
			titulo2 = 'Consolidado'
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
			@consolidado = true
		else
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(id: params[:unidade_orcamentaria])
			titulo2 = "Unidade Gestora #{@unidades_orcamentarias.last.codigo_e_nome}"
		end

		@relatorio_da_contabilidade = params[:relatorio]

		@data_final = params[:data_final].to_date
		@data_inicial = @data_final.beginning_of_month

		render_to_string pdf: "balancete_orcamentario",
		template: "contabilidade/relatorios/balancetes_de_verificacoes/balancete_orcamentario.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,
		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_relatorios_balancetes.html.slim',
				locals: {
					titulo1: 'Balancete Orçamentário',
					titulo2: titulo2,
					titulo3: "Período até: #{@data_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_com_assinatura.pdf.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 10)
	end


	def resumo_balancete
		#Balancete Pago
		if params[:unidade_orcamentaria].blank?
			titulo2 = 'Todas as Unidades'
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.all
			@todas = true
		elsif params[:unidade_orcamentaria] == 'consolidado'
			titulo2 = 'Consolidado'
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.all
			@consolidado = true
		else
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(id: params[:unidade_orcamentaria]).all
			titulo2 = "Unidade Orçamentária #{@unidades_orcamentarias.last.codigo_e_nome}"
			@consolidado = false
			@todas = false
		end

		@relatorio_da_contabilidade = params[:relatorio]

		@data_final = params[:data_final].to_date
		@data_inicial = @data_final.beginning_of_month
		@inicio_do_ano = Date.parse("01/01/#{contexto_atual.exercicio}").to_date

		@sub_elementos_de_despesa = contexto_atual.sub_elementos_de_despesa

		@total_fixada_geral = 0
		@total_empenhado_ate_o_mes_da_unidade_geral  = 0
		@total_dotacao_atualizada_geral  = 0
		@total_liquidado_ate_o_mes_da_unidade_geral = 0
		@total_pago_ate_o_mes_da_unidade_geral  = 0
		@saldo_orcamentario_da_unidade_geral  = 0

		@data_final = params[:data_final].to_date
		@data_inicial = @data_final.beginning_of_month
		render_to_string pdf: "resumo_balancete",
		template: "contabilidade/relatorios/balancetes_de_verificacoes/resumo_balancete.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,
		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_relatorios_balancetes.html.slim',
				locals: {
					titulo1: 'Balancete Resumido',
					titulo2: titulo2,
					titulo3: "Período até: #{@data_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_com_assinatura.pdf.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 10)
	end

	def balancete_financeiro_no_mes_ate_o_mes
		@data_final = params[:data_final].to_date
		@inicio_do_mes = @data_final.beginning_of_month
		@inicio_do_ano = Date.parse("01/01/#{contexto_atual.exercicio}").to_date

		if (params[:unidade_orcamentaria].blank? || params[:unidade_orcamentaria] == 'consolidado')
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
			@unidade = params[:unidade_orcamentaria] == 'consolidado' ? 'Consolidado' : 'Todas as Unidades'
		else
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(id: params[:unidade_orcamentaria])
			@unidade = "Unidade Orçamentária #{@unidades_orcamentarias.last.codigo_e_nome}"
		end

		@data_inicial = @data_final.beginning_of_month
		@relatorio_da_contabilidade = params[:relatorio]

		@total_receita_orcamentario_no_mes = 0
		@total_receita_orcamentario_ate_o_mes = 0
		@total_pagamento_orcamentario_no_mes = 0
		@total_pagamento_orcamentario_ate_o_mes = 0

		@total_receita_extra_orcamentaria_no_mes = 0
		@total_receita_extra_orcamentaria_ate_o_mes = 0
		@total_despesa_extra_orcamentaria_no_mes = 0
		@total_despesa_extra_orcamentaria_ate_o_mes = 0

		@total_transferencia_destino_no_mes = 0
		@total_transferencia_origem_no_mes = 0
		@total_transferencia_destino_ate_o_mes = 0
		@total_transferencia_origem_ate_o_mes = 0

		render_to_string pdf: "balancete_financeiro_no_mes_ate_o_mes",
		template: "contabilidade/relatorios/balancetes_de_verificacoes/balancete_financeiro_no_mes_ate_o_mes.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,
		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_pdf.html.slim',
				locals: {
					titulo1: 'Balanço Demonstrativo Financeiro no Mês até o Mês',
					titulo2: @unidade,
					titulo3: "Período até: #{@data_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_com_assinatura.pdf.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 10)
	end

	def livro_diario
		@centros_de_custos = Controladoria::CentroDeCusto.all
		ransack_params = {}
		ransack_params["data_de_lancamento_gteq"] = params[:data_inicial].to_date if params[:data_inicial].present?
		ransack_params["data_de_lancamento_lteq"] = params[:data_final].to_date if params[:data_final].present?
		ransack_params["centro_de_custo_id_eq"] = params[:centro_de_custo].to_i if params[:centro_de_custo].present?
		if params[:unidade_gestora] == "consolidado" || params[:unidade_gestora].blank?
			@nome_da_unidade = params[:unidade_gestora] == "consolidado" ? "CONSOLIDADO" : "TODAS AS UNIDADES"
			@unidades_orc_ids = current_usuario.unidades_orcamentarias.joins(:orcamento).where("orcamentos.id = ?", contexto_atual.id).pluck(:id)
			ransack_params["unidade_orcamentaria_id_in"] = @unidades_orc_ids
		else
			@unidade_gestora = Loa::UnidadeGestora.find(params[:unidade_gestora])
			@nome_da_unidade = @unidade_gestora.nome
			ransack_params["unidade_orcamentaria_id_in"] = @unidade_gestora.unidades_orcamentarias.pluck(:id)
		end
		ransack_params["conta_por_evento_contabil_conta_id_eq"] = params[:conta_id].to_i if params[:conta_id].present?
		if params[:conta_id].present?
			@conta_pcasp_nome = Contabilidade::Conta.find(params[:conta_id].to_i).codigo_formatado_e_nome
		else
			@conta_pcasp_nome = "TODAS AS CONTAS"
		end

		@data_inicial_movimentacoes = params[:data_inicial].present? ? params[:data_inicial].to_date : nil
		@data_inicial_movimentacoes = Date.new(contexto_atual.exercicio, 1, 1) - 1.day unless @data_inicial_movimentacoes.present?

		movimentacao_plano_de_contas_ransack = Contabilidade::MovimentacaoDoPlanoDeContas.ransack(ransack_params).result(distinct: true)
		@movimentacoes_do_plano_de_contas = movimentacao_plano_de_contas_ransack

		render_to_string pdf: "livro_diario",
			template: "contabilidade/relatorios/balancetes_de_verificacoes/livro_diario.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Livro Diário",
						titulo2: "#{@nome_da_unidade}",
						titulo3: "#{@conta_pcasp_nome}",
						titulo4: "Periodo de #{params[:data_inicial]} até #{params[:data_final]}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	def disponibiliza_dependencias
		@configuracoes = Configuracao.last
		@funcoes = contexto_atual.funcoes.order(:codigo)
		@subfuncoes = contexto_atual.subfuncoes.order(:codigo)
	end

	def remove_zeros(codigo)
		string = codigo
		string.split('').reverse.each do |num|
			if num == "0"
				codigo = codigo.chomp('0')
			end
			return codigo if num != "0"
		end
		return codigo
	end

	def preenche_codigo_com_nove(codigo)
		codigo = remove_zeros(codigo)
		if codigo.strip.length > 9
			'"' + I18n.transliterate(codigo.strip[0..(9 - 1)]) + '"'
		elsif codigo.strip.length < 9
			'"' + I18n.transliterate(codigo.strip.ljust(9, '9')) + '"'
		else
			'"' + I18n.transliterate(codigo) + '"'
		end
	end

	def preenche_codigo_com_zero(codigo)
		if codigo.strip.length > 9
			'"' + I18n.transliterate(codigo.strip[0..(9 - 1)]) + '"'
		elsif codigo.strip.length < 9
			'"' + I18n.transliterate(codigo.strip.ljust(9, '0')) + '"'
		else
			'"' + I18n.transliterate(codigo) + '"'
		end
	end
end
