class Contabilidade::ConfiguracaoDoEventoContabil < ApplicationRecord
	has_paper_trail

	belongs_to :evento_contabil
	belongs_to :conta_pcasp, class_name: "Contabilidade::Conta", foreign_key: :conta_pcasp_id
	belongs_to :conta_pcasp_da_conta_bancaria, class_name: "Contabilidade::Conta", foreign_key: :conta_pcasp_da_conta_bancaria_id
	belongs_to :conta_pcasp_do_lancamento_manual, class_name: "Contabilidade::Conta", foreign_key: :conta_pcasp_do_lancamento_manual_id
	belongs_to :conta_pcasp_destino, class_name: "Contabilidade::Conta", foreign_key: :conta_pcasp_destino_id

	attribute :movimentacao_pode_ter_valores_repetidos, default: false

	has_many :sub_elementos_de_despesa_da_configuracao_contabil, class_name: "Contabilidade::SubElementoDeDespesaDaConfiguracaoContabil"
	has_many :naturezas_da_receita_da_configuracao_contabil, class_name:'Contabilidade::NaturezaDaReceitaDaConfiguracaoContabil'
	has_many :fontes_da_configuracao_contabil, class_name: 'Contabilidade::FonteDaConfiguracaoContabil'

	validates_presence_of :evento_contabil_id
	validates_presence_of :tipo_de_reconhecimento_do_passivo, if: Proc.new { self.evento_contabil.empenho? && !self.inversao_de_superavit_financeiro? && (self.evento_contabil.classe.include?("retencoes_e_registros_de_obrigacoes") || self.evento_contabil.classe.include?("apropriacoes_de_vpd")) }
	#validates_presence_of :status, if: Proc.new { self.eh_evento_que_precisa_de_status? }

	accepts_nested_attributes_for :sub_elementos_de_despesa_da_configuracao_contabil, allow_destroy: true
	accepts_nested_attributes_for :naturezas_da_receita_da_configuracao_contabil, allow_destroy: true
	accepts_nested_attributes_for :fontes_da_configuracao_contabil, allow_destroy: true

	after_save :deleta_nesteds, if: Proc.new {self.sub_elementos_de_despesa_da_configuracao_contabil.any? && self.naturezas_da_receita_da_configuracao_contabil.any? }

	enum status: {
		solicitado: 1,
		enviado_para_controladoria: 2,
		enviado_para_copfin: 3,
		enviado_para_contabilidade: 4,
		confirmado: 5,
		anulado: 6,
		recebido: 7,
		enviado_para_administrativo: 8,
		aguardando_alteracao_do_orcamento: 9,
		retornado_pela_controladoria: 10,
		retornado_pela_contabilidade: 11,

		#Contabilidade::Pagamento
		aguardando_lote: 12,
		lote_gerado: 13,
		confirmado_por_lote_bancario: 14,
		estorno:28,

		#GestaoDeEstoque::RecebimentoDeMaterial
		aberto: 15,
		devolvido_ao_fornecedor: 16,

		#Contabilidade::Liquidacao
		enviado_para_o_financeiro: 17,
		recebido_pelo_financeiro: 18,
		autorizado: 19,

		#Planejamento::Loa // Planejamento::PPA
		aprovado: 20,
		em_alteracao: 21,
		enviado_para_votacao:22,
		
		#Medição da obra
		lancada: 24,

		#Requisição de material
		atendido:25,
		aberta: 26,

		#Contrato
		fechado: 27,

		#Bloqueio de Dotações
		bloqueado: 28,
		desbloqueado: 29,

		#CONSUMO
		consumido: 30
	}

	enum modalidade_do_empenho: {
		ordinario: 1,
		global: 2,
		estimativo: 3,
		global_ou_estimativo: 4
	}

	enum tipo_de_pessoa: {
		pessoa_fisica: 1,
		pessoa_juridica: 2,
		outros: 3,
		folha_de_pagamento:4,
		diversos_contribuintes: 5,
		pessoa_fisica_ou_pessoa_juridica: 6,
		pessoa_fisica_ou_pessoa_juridica_ou_demais_contribuintes: 7
	}

	enum modulo_de_ativacao: {
		administrativo: 1,
		contabilidade: 2,
		licitacao: 3,
		controladoria: 4,
		gestao_de_estoque: 5,
		planejamento: 6,
		gestao_de_obra: 7
	}

	enum tipo_de_evento: {
		inclusivo_de_dotacoes: 1,
		exclusivo_de_dotacoes: 2,
		inclusivo_de_receitas: 3,
		exclusivo_de_receitas: 4,
		inclusivo_de_fontes: 5
	}

	enum alteracao_no_saldo: { #Loa/Ppa
		acrescimo: 1,
		decrescimo: 2
	}

	enum tipo_de_projecao: { #Loa
		projecao_de_receita: 1,
		projecao_de_despesa: 2
	}

	enum tipo_de_obra: {
		obra: 1,
		servico: 2
	}

	enum uso_do_bem: {
		especial: 1,
		dominical: 2,
		comum_do_povo: 3,
		outros_bens_imoveis: 4
	}

	enum origem_da_retencao: {
		liquidacao: 1,
		pagamento: 2,
		nota_fiscal: 3
	}

	enum classificacao_da_receita:{
		divida_ativa: 1,
		divida_ativa_nao_tributaria: 2
	}

	enum tipo_de_resto_a_pagar: {
		rp_processado: 1,
		rp_nao_processado: 2
	}

	enum motivo_cancelamento: {
		insuficiencia_de_saldo_financeiro: 1,
		inscricoes_indevidas: 2,
		prescricao: 3,
		outros_motivos_cancelamento: 4,
		valores_e_ou_inscricoes_indevidas: 5,
		prescricao_ou_outros: 6
	}

	enum tipo_de_credito:{
		credito_suplementar: 1,
		credito_especial: 2,
		credito_extraordinario: 3,
		credito_de_reducao: 4
	}

	enum origem_do_recurso:{
		anulacao_de_dotacao: 1,
		outros_recursos: 2,
		execesso_de_arrecadacao: 3,
		superavit_financeiro: 4,
		revigoramento_de_credito: 5,
		operacao_de_credito: 6,
		revigoramento_de_credito_especial: 7,
		revigoramento_de_credito_extraordinario: 8,
		reserva_de_contigencia: 9
	}

	enum tipo_de_previsao:{
		reestimativa: 1,
		correcao: 2,
		reestimativa_ou_correcao: 3,
		anulacao: 4
	}

	enum modalidade_do_aditivo: {
		aditivo_acrescimo: 0,
		aditivo_reducao: 1,
		aditivo_por_prazo: 2,
		aditivo_reajuste_de_valor_acrescimo: 3,
		aditivo_nova_unidade_orcamentaria: 4,
		aditivo_reajuste_de_valor_decrescimo: 5,
		aditivo_mudanca_de_item: 6,
		aditivo_alteracao_contratual: 7,
		aditivo_rescisao_contratual: 8,
		aditivo_qualitativo: 9
	}

	enum classe_da_conta_pcasp: {
		classe_passiva: 1,
		classe_ativa: 2,
		classe_vpd: 3,
		classe_vpa: 4,
		classe_controle_aprovacao: 5,
		classe_controle_execucao: 6,
		classe_controle_devedor: 7,
		classe_controle_credor: 8
	}

	enum origem_da_fonte: {
		exercicio_vigente: 1,
		exercicio_anterior: 2
	}

	enum tipo_de_reconhecimento_do_passivo: {
		reconhecido_na_liquidacao_da_despesa: 1,
		reconhecimento_pelo_controle_de_consumo: 2,
		reconhecimento_programado: 3,
		reconhecimento_eventual: 4,
		reconhecido_antes_da_liquidacao_nesse_exercicio: 5,
		reconhecido_antes_da_liquidacao_exercicio_anterior: 6,
		reconhecimento_no_exercicio_vigente: 7,
		reconhecimento_no_exercicio_anterior: 8
	}

	enum classificacao_vpd: {
		no_pais: 1,
		no_exterior: 2,
		pessoal_civil: 3,
		colaboradores_eventuais: 4,
		conselheiros: 5,
		premiacoes_culturais: 6,
		premiacoes_artisticas: 7,
		premiacoes_cientificas: 8,
		premiacoes_desportivas: 9,
		ordens_honorificas: 10,
		outras_premiacoes: 98,
		outras: 99
	}

	enum regime: {
		rpps: 1,
		rgps: 2
	}

	enum tipo_de_entidade: {
		federal: 1,
		estadual: 2,
		outro_municipio: 3,
		mesmo_municipio: 4,
		nenhuma: 5
	}

	enum classificacao_pcasp: {
		obras_em_andamento: 1,
		estudos_e_projetos: 2,
		instalacoes: 3,
		benfeitorias_em_propriedade_de_terceiros: 4
	}

	enum tipo_de_conta_pcasp: {
		ativo: 1,
		passivo: 2
	}

	enum detalhamento_vpd_da_liquidacao:{
		aposentadoria_por_invalidez: 1,
		aposentadoria_especial_atividade_de_risco: 2,
		aposentadoria_especial_agentes_nocivos: 3,
		aposentadoria_especial_deficiencia: 4,
		aposentadoria_professor: 5,
		aposentadoria_por_tempo_de_contribuicao: 6,
		aposentadoria_compulsoria: 7,
		outras_aposentadorias_especiais: 8,
		outras_aposentadorias: 9,
		auxilio_funeral_ativo_civil: 10,
		auxilio_funeral_inativo_civil: 11,
		auxilio_funeral_pensionista_civil: 12,
		auxilio_natalidade_ativo_civil: 13,
		auxilio_natalidade_inativo_civil: 14,
		auxilio_natalidade_pensionista_civil: 15,
		auxilio_reclusao_ativo_civil: 16,
		auxilio_reclusao_inativo_civil: 17,
		auxilio_reclusao_pensionista_civil: 18,
		salario_familia_ativo_pessoal_civil: 19,
		salario_familia_inativo_pessoal_civil: 20,
		salario_familia_pensionista_pessoal_civil: 21,
		demais_beneficios_previdenciarios_e_assistenciais_servidor_civil: 22,
		vantagem_pecuniaria_individual: 23,
		abono_provisorio_pessoal_civil: 24,
		gratificacoes_especiais: 25,
		gratificacao_por_atividades_expostas: 26,
		representacao_mensal: 27,
		complementacao_salarial: 28,
		adicional_teto_parlamentar: 29,
		gratificacao_por_exercicio_de_cargo_em_comissao: 30,
		outros_vencimentos_e_vantagens_fixas_pessoal_civil_rpps: 31,
		adicional_variavel: 32,
		licenca_sem_remuneracao_incentivada: 33,
		convocacao_extraordinaria_legislativa: 34,
		indenizacoes_e_restituicoes_trabalhistas: 35,
		indeniz_e_restit_decorr_de_planos_de_demissao_voluntaria: 36,
		outros_vencimentos_e_vantagens_fixas_pessoal_civil_rgps: 37,
		adicional_de_transferencia_art_469_clt: 38,
		remuneracao_de_diretores: 39,
		aviso_previo:40,
		servicos_extraordinarios_contrato_temporario: 41,
		servicos_extraordinarios_noturno_cont_temp: 42

	}

	enum tipo_de_ug: {
		origem: 1,
		destino: 2
	}

	enum exercicio_restos_a_pagar: {
		anterior: 1,
		outros_exercicios: 2
	}

	enum modalidade_operacao_de_credito:{
		divida_mobiliaria: 1,
		outros_titulos_emprestimo_internos: 2,
		contratos_de_emprestimo_internos: 3,
		antecipacao_da_receita_orcamentaria: 4,
		outros_contratos_emprestimos_internos: 5,
		outros_emprestimos_a_curto_prazo_interno: 6,
		outros_emprestimos_a_curto_prazo_externo: 7,
		emprestimos_externos_em_titulos: 8,
		emprestimos_externos_em_contratos: 9
	}

	enum tipo_ddr: {
		empenho_ddr: 1,
		anulacao_do_empenho_ddr: 2,
		liquidacao_ddr: 3,
		estorno_de_liquidacao_ddr: 4,
		talao_de_receita_ddr: 5,
		anulacao_do_talao_de_receita_ddr: 6,
		despesa_extra_orcamentaria_ddr: 7,
		estorno_de_despesa_extra_orcamentaria_ddr: 8,
		pagamento_ddr: 9,
		estorno_de_pagamento_ddr: 10,
		transferencia_financeira_ddr: 11
	}

	enum tipo_de_poder:{
		legislativo: 1,
		executivo: 2
	}

	enum grupo_pcasp: {
		circulante: 1,
		nao_circulante: 2
	}

	enum tipo_de_material: {
		consumo: 0,
		permanente: 1,
		consumo_distribuicao_gratuita: 2
	}

	enum classificacao: {
		doacao: 0,
		devolucao_estorno: 1,
		ajuste_de_inventario: 2,
		transferencia: 3 ,
		remoto: 4,
		requisicao: 5,
		confeccao: 6,
		compra: 7,
		cessao: 8,
		comodato: 9,
		implantacao: 10,
		locacao: 11,
		permuta: 12,
		reintegracao: 13
	}

	enum tipo_de_entrada: {
		definitivo: 0,
		provisorio: 1,
		remota: 2
	}

	enum status_de_reconhecimento:{
		aguardando_reconhecimento: 1,
		reconhecido: 2
	}

	enum codigo_sim: {
		salario_familia: "00010000",
		salario_maternidade: "00020000",
		contribuicao_previdenciaria_regime_proprio: "00030000",
		contribuicao_previdenciaria_inss: "00040000",
		pasep: "00050000",
		iss: "00060000",
		irrf: "00070000",
		aro: "00080000",
		outros_codigo: "00000000",
		repasse_duodecimo_para_a_camara: "99999999"
	}

	def eh_evento_que_precisa_de_status?
		evento_contabil.empenho? || evento_contabil.liquidacao? || evento_contabil.pagamento? ||
		evento_contabil.recebimento_de_material?
	end

	def deleta_nesteds
		if self.inclusivo_de_receitas? || self.exclusivo_de_receitas?
			self.sub_elementos_de_despesa_da_configuracao_contabil.destroy_all
		else
			self.naturezas_da_receita_da_configuracao_contabil.destroy_all
		end
	end

	def eh_evento_com_sub_elemento_invalido?
		self.sub_elementos_de_despesa_da_configuracao_contabil.where(sub_elemento_de_despesa_id: nil).any?
	end

end
