class Contabilidade::ContaDoGrupoDeRetencoesDoControleDePg < ApplicationRecord
	has_paper_trail

	belongs_to :agrupamento_de_retencoes_do_controle_de_pg, class_name: "Contabilidade::AgrupamentoDeRetencoesDoControleDePg", foreign_key: "agrupamento_id"
	belongs_to :conta_de_origem, class_name: "Base::ContaBancaria", foreign_key: "conta_origem_id"
	belongs_to :conta_de_destino, class_name: "Base::ContaBancaria", foreign_key: "conta_destino_id"
	belongs_to :unidade_orcamentaria, class_name: "Loa::UnidadeOrcamentaria", foreign_key: :ug_id
	belongs_to :fonte_de_recurso, class_name: "Base::FonteDeRecursos", foreign_key: :fonte_id
	belongs_to :despesa_extra_orcamentaria, class_name: "Contabilidade::DespesaExtraOrcamentaria"
	belongs_to :talao_de_receita, class_name: "Contabilidade::TalaoDeReceita"

	validate :conta_origem_para_tipo_pagar
	validate :conta_origem_para_tipo_pagar_recolher
	validate :conta_destino_para_tipo_pagar_recolher

	def valor_do_grupo
		controle_de_pg = agrupamento_de_retencoes_do_controle_de_pg.controle_de_pagamento
		tipo_de_acao = agrupamento_de_retencoes_do_controle_de_pg.tipo_de_acao
		conta_extra = agrupamento_de_retencoes_do_controle_de_pg.conta_extra_id
		imposto_type = agrupamento_de_retencoes_do_controle_de_pg.imposto_type

		clausula_ug = "loa_subacoes.unidade_orcamentaria_id = #{self.ug_id}" if agrupamento_de_retencoes_do_controle_de_pg.detalhamento_por_ug?
		clausula_fonte = "loa_orcamentos_da_despesa.fonte_de_recursos_id = #{self.fonte_id}" if agrupamento_de_retencoes_do_controle_de_pg.detalhamento_por_fonte?

		if agrupamento_de_retencoes_do_controle_de_pg.folha?
			retencoes_do_grupo = controle_de_pg.retencoes_folha.where(tipo_de_acao: tipo_de_acao, conta_extra_orcamentaria_id: conta_extra)
			retencoes_do_grupo.joins(liquidacao: [empenho: [orcamento_da_despesa: [elemento_de_despesa_por_subacao: :subacao]]]).where(clausula_ug).where(clausula_fonte).sum(:valor_calculado).to_f
		else
			retencoes_do_grupo = controle_de_pg.retencoes.where(imposto_type: imposto_type, tipo_de_acao: tipo_de_acao)
			retencoes_do_grupo.joins(nota_fiscal: [liquidacao: [empenho: [orcamento_da_despesa: [elemento_de_despesa_por_subacao: :subacao]]]]).where(clausula_ug).where(clausula_fonte).sum(:valor_calculado).to_f
		end
	end

	#lista de retencoes do grupo de contas
	def lista_de_retencoes_do_grupo_de_contas
		controle_de_pg = agrupamento_de_retencoes_do_controle_de_pg.controle_de_pagamento
		tipo_de_acao = agrupamento_de_retencoes_do_controle_de_pg.tipo_de_acao
		conta_extra = agrupamento_de_retencoes_do_controle_de_pg.conta_extra_id
		imposto_type = agrupamento_de_retencoes_do_controle_de_pg.imposto_type

		clausula_ug = "loa_subacoes.unidade_orcamentaria_id = #{self.ug_id}" if agrupamento_de_retencoes_do_controle_de_pg.detalhamento_por_ug?
		clausula_fonte = "loa_orcamentos_da_despesa.fonte_de_recursos_id = #{self.fonte_id}" if agrupamento_de_retencoes_do_controle_de_pg.detalhamento_por_fonte?

		if agrupamento_de_retencoes_do_controle_de_pg.folha?
			retencoes_do_grupo = controle_de_pg.retencoes_folha.where(tipo_de_acao: tipo_de_acao, conta_extra_orcamentaria_id: conta_extra)
		else
			retencoes_do_grupo = controle_de_pg.retencoes.where(imposto_type: imposto_type, tipo_de_acao: tipo_de_acao)
		end
	end

	def pessoa_conta_origem
		conta_de_origem.unidade_orcamentaria_principal.unidade_gestora.gestor_no_periodo(Date.today).agente_publico_municipal.pessoa rescue nil
	end

	def pessoa_conta_destino
		conta_de_destino.unidade_orcamentaria_principal.unidade_gestora.gestor_no_periodo(Date.today).agente_publico_municipal.pessoa rescue nil
	end

	def conta_origem_para_tipo_pagar
		errors.add(:conta_origem, "deve ser informada para o tipo pagar") if self.agrupamento_de_retencoes_do_controle_de_pg.try(:pagar?) && self.conta_de_origem.nil?
	end

	def conta_origem_para_tipo_pagar_recolher
		errors.add(:conta_origem, "deve ser informada para o tipo pagar/recolher") if self.agrupamento_de_retencoes_do_controle_de_pg.try(:pagar_recolher?) && self.conta_de_origem.nil?
	end

	def conta_destino_para_tipo_pagar_recolher
		errors.add(:contas_destino, "deve ser informada para o tipo pagar/recolher") if self.agrupamento_de_retencoes_do_controle_de_pg.try(:pagar_recolher?) && self.conta_de_destino.nil?
	end
end
