<?PHP
/*
 * DIREITOS AUTORAIS RESERVADOS (C) 2007 UFRJ
 * 
 * ESTE PROGRAMA É SOFTWARE LIVRE; VOCÊ PODE REDISTRIBUÍ-LO E/OU MODIFICÁ-LO SOB OS
 * TERMOS DA LICENÇA PÚBLICA GERAL GNU CONFORME PUBLICADA PELA FREE SOFTWARE FOUNDATION;
 * TANTO A VERSÃO 2 DA LICENÇA, COMO (A SEU CRITÉRIO) QUALQUER VERSÃO POSTERIOR.

 * ESTE PROGRAMA É DISTRIBUÍDO NA EXPECTATIVA DE QUE SEJA ÚTIL, PORÉM, SEM NENHUMA GARANTIA;
 * NEM MESMO A GARANTIA IMPLÍCITA DE COMERCIABILIDADE OU ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA.
 * CONSULTE A LICENÇA PÚBLICA GERAL DO GNU PARA MAIS DETALHES.
 * 
 * VOCÊ DEVE TER RECEBIDO UMA CÓPIA DA LICENÇA PÚBLICA GERAL DO GNU JUNTO COM ESTE PROGRAMA; 
 * SE NÃO, ACESSE <<HTTP://WWW.GNU.ORG/LICENSES/LICENSES.PT-BR.HTML>>
 */

<?

require_once 'autoload.php';
require_once 'config_local.php';

Doctrine_Manager::connection($cfg['dburi']);
Doctrine::loadModels('classes');

echo "Populando pessoas...\n";

$db = '/home/public/DB_CNS_28_09_09.GDB';
$conn_orig = ibase_connect($db, 'SYSDBA','rlima') 
	or die(ibase_errmsg());

// Vou usar conexao direta sem passar pelo Doctrine p/ acelerar as coisas
// já que são muitos registros
$conn_dest = pg_connect('dbname=cadusa user=rodolfo password=rlima')
	or die(pg_last_error());
pg_set_client_encoding('LATIN1');

pg_query('begin transaction');

$map_pessoa = array();

$res = ibase_query($conn_orig, 
	<<<EOT
	select  NO_USUARIO, 
		    NO_MAE, 
			CO_SEXO, 
			DT_NASCIMENTO, 
			CO_MUNICIPIO_NASC, 
			CO_PAIS, 
			CO_RACA, 
			CO_ESCOLARIDADE,
			DS_EMAIL, 
			DT_INCLUSAO, 

			CO_NUMERO_CARTAO, 
			CO_NUMERO_PIS,

			TB_MS_USUARIO.CO_USUARIO
	from TB_MS_USUARIO
	left join TB_MS_USUARIO_CNS_ELOS cns on TB_MS_USUARIO.CO_USUARIO = cns.CO_USUARIO
	left join TB_MS_USUARIO_PIS_ELOS pis on TB_MS_USUARIO.CO_USUARIO = pis.CO_USUARIO
EOT
);
	

pg_prepare('insert_pessoa',
<<<EOT
		insert into pessoa (nome, nome_mae, idsexo, data_nascimento,
			idmunicipio_nascimento, idpais_nascimento, brasileiro, idraca,
			idescolaridade, email, data_criacao, data_atualizacao) values ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12);
EOT
);

pg_prepare('insert_cns', 'insert into cns (idpessoa,numero) values ($1,$2)');
pg_prepare('insert_pis', 'insert into pis (idpessoa,numero) values ($1,$2)');

$usuarios_repetidos = array();

$counter = 0;
$value = array();
while($row = ibase_fetch_row($res))
{
	$key = $row[0].'_'.$row[1];

	if(isset($usuarios_repetidos[$key]))
		continue;

	$usuarios_repetidos[$key] = true;

	if((++$counter % 1000) == 0)
		echo $counter."\n";

	if($row[1] == 'IGNORADA' || $row[1] == 'I G N O R A D A')
		$row[1] = NULL;

	$value[0] = $row[0]; // NO_USUARIO
	$value[1] = $row[1]; // NO_MAE
	$value[2] = $row[2]; // CO_SEXO
	$value[3] = $row[3]; // DT_NASCIMENTO

	// CO_MUNICIPIO_NASC
	if(!$row[4] || $row[4] == '999999' || $row[4] == '666666')
		$value[4] = NULL;
	else
		$value[4] = (int)$row[4];

	// CO_PAIS
	if(!$row[5] || $row[5] == '999' || $row[5] == '20')
		$value[5] = NULL;
	else if($row[5] == 50)
		$value[5] = 999;
	else
		$value[5] = $row[5];

	$value[6] = $row[5] == '010' ? 'true' : 'false'; // eh brasileiro?

	// CO_RACA
	if(!$row[6] || $row[6] == '9' || $row[6] == 'X')
		$value[7] = NULL;
	else if($row[6] == 3)
		$value[7] = 4;
	else if($row[6] == 4)
		$value[7] = 3;
	else
		$value[7] = (int)$row[6];

	// CO_ESCOLARIDADE
	if(!$row[7] || $row[7] == '99' || $row[7] == 'XX')
		$value[8] = NULL;
	else
		$value[8] = (int)$row[7];

	$value[9] = $row[8]; // DS_EMAIL
	$value[10] = $row[9]; // DT_INCLUSAO
	$value[11] = $row[9]; // atualizacao == DT_INCLUSAO

	pg_execute('insert_pessoa', $value) or die(pg_last_error());

	$idpessoa = pg_fetch_result(pg_query("select currval('pessoa_id_seq')"),0,0);
	if($idpessoa === NULL)
		die('Erro pegando id da pessoa adicionada');

	if($row[10]) // tem cns?
	{
		if(!cns_valido($row[10]))
			echo "CNS invalido: {$row[10]}\n";
		else
			pg_execute('insert_cns', array($idpessoa, $row[10]));
	}

	if($row[11]) // tem pis?
	{
		if(!pis_valido($row[11]))
			echo "PIS invalido: {$row[11]}\n";
		else
			pg_execute('insert_pis', array($idpessoa, $row[11]));
	}

	$map_pessoa[$row[12]] = $idpessoa;
}
echo "$counter pessoas\n";
/*

$fd = fopen('map.txt','w');
foreach($map_pessoa as $old => $new)
{
	fprintf($fd, "%s %s\n", $old, $new);
}

fclose($fd);


$fd = fopen('map.txt','r');

while($data = fscanf($fd, '%s %s'))
{
	$map_pessoa[$data[0]] = $data[1];
}

echo count($map_pessoa)." pessoas\n";

fclose($fd);

 */

pg_prepare('insert_telefone', 'insert into telefone (idpessoa,idtipo,ddd,numero) values ($1,$2,$3,$4)');

$res = ibase_query($conn_orig, 
<<<EOT
	select NU_DDD, NU_TELEFONE, RL_MS_USUARIO_ENDERECO.CO_USUARIO 
		from TB_MS_ENDERECO
		inner join RL_MS_USUARIO_ENDERECO on TB_MS_ENDERECO.CO_ENDERECO = RL_MS_USUARIO_ENDERECO.CO_ENDERECO where NU_TELEFONE is not null and NU_DDD is not null
EOT
);

$counter = 0;
$values = array();
while($row = ibase_fetch_row($res))
{
	if(!isset($map_pessoa[$row[2]]))
		continue;

	if(strlen($row[0]) != 3)
		continue;

	if(strlen($row[1]) != 8 || $row[1][0] <= 1)
		continue;

	if((++$counter % 1000) == 0)
		echo $counter."\n";

	$values[0] = $map_pessoa[$row[2]];
	switch($row[1][0])
	{
	case 7:
	case 8:
	case 9:
		$values[1] = TipoTelefone::CELULAR;
		break;
	default:
		$values[1] = TipoTelefone::RESIDENCIAL;
		break;
	}

	$values[2] = substr($row[0],1,2);
	$values[3] = $row[1];

	pg_execute('insert_telefone', $values);
}

$sigla_estado = array();

$estados = Doctrine::getTable('Estado')->findAll();
foreach($estados as $e)
	$sigla_estado[$e->sigla] = $e->id;

$res = ibase_query($conn_orig, "select CO_USUARIO, NU_DOCUMENTO, CO_TIPO_DOCUMENTO, NU_SECAO_ELEITORAL, NU_ZONA_ELEITORAL, NU_SERIE, SG_UF, DT_EMISSAO, NU_FOLHA, NU_TERMO, NU_LIVRO, NO_CARTORIO from RL_MS_USUARIO_DOCUMENTOS");

pg_prepare('insert_tit', 'insert into titulo_eleitor (idpessoa,numero,secao,zona) values ($1,$2,$3,$4)');
pg_prepare('insert_cpf', 'insert into cpf (idpessoa,numero) values ($1,$2)');
pg_prepare('insert_ctps', 'insert into ctps (idpessoa,numero,serie,idestado,data_emissao) values ($1,$2,$3,$4,$5)');
pg_prepare('insert_certidao', 'insert into certidao (idpessoa,idtipo,folha,termo,livro,cartorio,data_emissao) values ($1,$2,$3,$4,$5,$6,$7)');
pg_prepare('insert_rg', 'insert into rg (idpessoa,numero,idestado,idorgao,data_emissao) values ($1,$2,$3,$4,$5)');

$cpf_count = 0;
$cpf_invalido = 0;
$cpf_duplicado = 0;
$tit_count = 0;
$tit_invalido = 0;
$tit_duplicado = 0;
$ctps_count = 0;
$ctps_invalido = 0;
$ctps_duplicado = 0;
$certidao_count = 0;
$certidao_invalido = 0;
$certidao_duplicado = 0;
$rg_count = 0;
$rg_invalido = 0;
$rg_duplicado = 0;
$nao_processado = 0;

$titulos_eleitor = array();
$certidoes = array();
$rgs = array();
$ctps = array();

$counter = 0;
while($row = ibase_fetch_row($res))
{
	if(!isset($map_pessoa[$row[0]]))
		continue;

	$idpessoa = $map_pessoa[$row[0]];

	for($i=0; $i<12; ++$i)
	{
		$row[$i] = trim($row[$i]);

		if(!$row[$i])
			$row[$i] = NULL;
	}

	if((++$counter % 1000) == 0)
		echo $counter."\n";

	switch($row[2])
	{
	case '02': // CPF
		$row[1] = str_pad($row[1], 11, '0', STR_PAD_LEFT);
		if(cpf_valido($row[1]))
		{
			$cpf_count++;
			pg_execute('insert_cpf', array($idpessoa, $row[1]))
				or die(pg_last_error());
		}
		else
			$cpf_invalido++;

		break;
	case '03': // Titulo Eleitor
		$row[1] = str_pad($row[1], 13, '0', STR_PAD_LEFT);
		if(titulo_eleitor_valido($row[1]))
		{
			if(isset($titulos_eleitor[$row[1]]))
			{
				$tit_duplicado++;
				break;
			}
			$titulos_eleitor[$row[1]] = true;

			$tit_count++;

			pg_execute('insert_tit', array($idpessoa, $row[1], $row[3], $row[4]))
				or die(pg_last_error());
		}
		else
			$tit_invalido++;
		break;
	case '04': // CTPS
		if($row[1] && $row[5] && $sigla_estado[$row[6]])
		{
			$row[1] = ltrim($row[1],'0');
			$row[5] = ltrim($row[5],'0');

			$key = (int)$row[1].(int)$row[5].$row[6];
			if(isset($ctps[$key]))
			{
				$ctps_duplicado++;
				break;
			}
			$ctps[$key] = true;

			$ctps_count++;
			pg_execute('insert_ctps', array($idpessoa, $row[1], $row[5], $sigla_estado[$row[6]], $row[7]))
				or die(pg_last_error());
		}
		else
			$ctps_invalido++;
		break;
	case '91':
	case '92':
	case '93':
	case '94':
	case '95': // certidões
		// termo eh numerico
		if($row[8] && $row[9] && $row[10] && certidao_valida($row[8],$row[9],$row[10]))
		{
			$row[8] = ltrim(strtoupper(str_replace(' ','',$row[8])),'0');
			$row[7] = ltrim($row[7],'0');
			$row[10] = ltrim(strtoupper(str_replace(' ','',$row[10])),'0');

			$key = $row[8].(int)$row[9].$row[10];
			if(isset($certidoes[$key]))
			{
				$certidao_duplicado++;
				break;
			}
			$certidoes[$key] = true;

			$certidao_count++;
			pg_execute('insert_certidao', array($idpessoa, $row[2], $row[8],$row[9],$row[10],$row[11], $row[7]))
					or die(pg_last_error());
		}
		else
			$certidao_invalido++;
		break;
	default:
		// rg
		if($row[2] >= 10 && $row[2] <= 83)
		{
			$row[1] = ltrim(strtoupper(str_replace(' ','',$row[1])),'0');
			if($sigla_estado[$row[6]] && $row[1])
			{
				$key = $row[1].$row[6].$row[2];
				if(isset($rgs[$key]))
				{
					$rg_duplicado++;
					break;
				}
				$rgs[$key] = true;

				$rg_count++;
				pg_execute('insert_rg', array($idpessoa, $row[1], $sigla_estado[$row[6]], $row[2], $row[7])) 
					or die(pg_last_error());
			}
			else
				$rg_invalido++;
		}
		else
			$nao_processado++;
	}
}

echo "CPF: $cpf_invalido($cpf_duplicado)/$cpf_count\n";
echo "Título eleitor: $tit_invalido($tit_duplicado)/$tit_count\n";
echo "CTPS: $ctps_invalido($ctps_invalido)/$ctps_count\n";
echo "Certidão: $certidao_invalido($certidao_duplicado)/$certidao_count\n";
echo "RG: $rg_invalido($rg_duplicado)/$rg_count\n";
echo "Não processado: $nao_processado\n";

pg_query('commit');

?>
