class Obra::EmpenhoDaMedicaoDaObra < ApplicationRecord
	has_paper_trail

	belongs_to :medicao_da_obra, class_name: 'Contabilidade::MedicaoDaObra'
	belongs_to :empenho, class_name: 'Contabilidade::Empenho'

	validate :valida_se_valor_eh_maior_que_o_disponivel_no_empenho, if: Proc.new { self.empenho.present? && self.valor.present? }

	def to_sim(data_referencia)
		begin
			unidade_orcamentaria = medicao_da_obra.obra.contrato.unidade_orcamentaria_do_exercicio

			texto = ""
			texto << "902".to_s.sim_preenche(3) + ","
			texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + ","
			texto << empenho.orcamento.exercicio.to_s.sim_limite_sem_aspas(4, "00") + ","
			texto << unidade_orcamentaria.orgao.codigo.sim_preenche(2) + ","
			texto << unidade_orcamentaria.codigo.codigo_uo_to_sim + ","
			texto << empenho.data_do_empenho.sim_data + ","
			texto << empenho.numero_do_empenho.sim_limite(8) + ","
			texto << medicao_da_obra.obra.data_de_inicio.sim_data + ","
			texto << medicao_da_obra.obra.tipo_para_o_sim.sim_limite(1)+ ","
			texto << medicao_da_obra.obra.codigo.sim_limite(4) + ","
			texto << medicao_da_obra.numero.to_s.last(2).sim_preenche(2) + ","
			texto << medicao_da_obra.valor.to_f.to_s.sim_valor + ","
			texto << medicao_da_obra.data_inicial.sim_data + ","
			texto << medicao_da_obra.responsavel_da_empresa.cpf.sim_limite(11) + ","
			texto << medicao_da_obra.responsavel_da_empresa.nome.sim_limite(40) + ","
			texto << medicao_da_obra.responsavel_da_prefeitura.cpf.sim_limite(11) + ","
			texto << medicao_da_obra.responsavel_da_prefeitura.nome.sim_limite(40) + ","

			formacao_profissional = medicao_da_obra.obra.responsavel_na_empresa.formacao == 0 ? '"E"' : '"A"'
			texto << formacao_profissional + ","
			texto << medicao_da_obra.obra.responsavel_na_empresa.pessoa.cpf.sim_limite(11) + ","
			texto << medicao_da_obra.obra.responsavel_na_empresa.pessoa.nome.sim_limite(40) + ","
			texto << medicao_da_obra.art.sim_limite(20) + ","
			texto << data_referencia.to_s
	
			return texto
		rescue => e
			if e.class.to_s == "NoMethodError"
				atributo_falho = e.message.split(" ")[2]
				coluna = CSV.parse(texto, :headers => false).last.count
				raise e.mensagem_traduzida(self, "", atributo_falho, coluna)
			else
				raise e
			end
		end
	end

	def valida_se_valor_eh_maior_que_o_disponivel_no_empenho
		if self.valor > self.empenho.saldo
			errors.add(:valor, "Valor não pode ser maior que o disponível no empenho")
		end
	end
end
