# Tutorial
## <img src="https://cdn-icons-png.flaticon.com/512/724/724831.png" style="height: 60px; width: auto;"> Cadastro de Parceiros e Importação de imóveis<br><br>
<span style="color:grey">O intuito deste documento é auxiliar no cadastramento de novos parceiros e na importação de imóveis dos parceiros cadastrados para a base de dados da Netimóveis por meio de arquivos XML.
Qualquer dúvida, contatar o setor de TI (NITI).</span>
<hr>
### <img src="https://cdn-icons-png.flaticon.com/512/265/265674.png" style="height: 40px; width: auto;"> 1. Cadastro de Parceiro<br><br>
1. <span style="color:grey31">Para gerar as consultas referentes ao cadastro de parceiros, é necessário identificar qual banco de dados será utilizado, nesse caso, utilizaremos o banco de dados <strong>Site_Netimoveis_Versao7</strong>:
~~~html
USE Site_Netimoveis_Versao7
~~~
2. <span style="color:grey31">Para listar ==**todas as parceiras cadastradas na Netimóveis**==, basta realizar a seguinte consulta:</span>
~~~html
USE Site_Netimoveis_Versao7
--Tabela exclusiva para as parceiras
SELECT Formato, Ativo,* From Site_ListarAgenciaViewCompletaParceira
--Tabela exclusiva para as associadas
SELECT * From Site_ListarAgenciaViewCompleta
--View que unifica as duas tabelas
SELECT * From Site_ListarAgenciaViewCompletaUniao
~~~
Na View As parceiras são identificadas pelo campo <strong>Rede=0</strong> e as associadas pelo campo <strong>Rede=1</strong><br>
3. <span style="color:grey31">Para listar os ==**imóveis de uma determinada parceira**==, utilizamos a seguinte consulta:</span>
~~~html
USE Site_Netimoveis_Versao7
SELECT * FROM Site_ListarImoveisViewCompletaParceira WHERE AgenciaSan_Id = 99999
~~~
4. <span style="color:grey31">Antes de executarmos o ==**camando SQL**== que inserirá no banco de dados uma nova parceira, é necessário explicarmos sobre alguns campos que deverão ser preenchidos, são eles:</span>
#### logo <span style="color:#b6b6b6"> // Não é necessário preencher o campo de logo na tabela mas é necessário coloar a imagem nos seguintes diretórios e o nome da logo deve ser o ID da Parceira com extensão SVG:
C:\inetpub\wwwroot\core.netimoveis.com\wwwroot\img\parceiras\logo
C:\inetpub\wwwroot\core.netimoveis.com\wwwroot\img\parceiras\logo
><span style="color:#b6b6b6">Tamanho: 100 × 50 px</span>
><span style="color:#b6b6b6">Extensão: SVG</span>
><span style="color:#b6b6b6">Nome: AGENCIASAN_ID.svg | Exemplo: 99999.svg</span>
#### Bairro_Id <span style="color:#b6b6b6"> // utilizar o modelo de query abaixo para pegar esta informação:
~~~html
SELECT * FROM San2017..san_bairro where nomebairro = 'Savassi' AND Cidade_Id = 2754
~~~
#### Cidade_Id <span style="color:#b6b6b6"> // utilizar o modelo de query abaixo para pegar esta informação:
~~~html
SELECT * FROM San2017..san_cidade where nomecidade = 'Belo Horizonte' and Estado_Id = 14
~~~
#### Estado_Id <span style="color:#b6b6b6"> // utilizar o modelo de query abaixo para pegar esta informação:
~~~html
SELECT * FROM San2017..San_Estado where NomeEstado = 'Minas Gerais'
~~~
#### Formato <span style="color:#b6b6b6"> // o ormato do XML pode variar de acordo com o Software da empresa</span>
#### CaminhoXML <span style="color:#b6b6b6"> // é o caminho físico no servidor de banco de dados para a leitura do XML</span>
#### CaminhoURL <span style="color:#b6b6b6"> // é a URL do XML que a parceira disponibilza</span>
#### Ordem <span style="color:#b6b6b6"> // sempre cadastrar como 0. Trata-se de um campo auxiliar alterado todos os dias por um job para alterar a pontuação do imóvel e, assim, a ordem de exibição na listagem de imóveis (Rodizio por pontuação)</span>
#### Agrupamento_Id <span style="color:#b6b6b6"> // campo usado para agrupar os Leads no Dashboard, caso a parceira tenha apenas uma unidade, preencher com um número único</span>
<br>
#### <img src="https://cdn-icons-png.flaticon.com/512/337/337953.png" style="height: 30px; width: auto;"> Comando SQL para inserção de uma nova parceira:</span>
~~~html
INSERT INTO Site_ListarAgenciaViewCompletaParceira (
NomeAgencia, DataHoraAtualizacao, Celula_Id, NomeCelula, ddd, ddi, TelefoneGeral, TelefoneVenda, TelefoneLocacao, EmailGeral, EmailVenda, EmailLocacao, WhatsAppVenda, WhatsAppLocacao, logo, Latitude, Longitude, SiteAgencia, Cep, Logradouro, Numero, Complemento, Bairro_Id, BairroNome, Cidade_Id, CidadeNome, Estado_Id, EstadoNome, Pais_Id, PaisNome, Creci, Regiao_Id, DataHoraMigrado, SiglaEstado, SiglaPais, UrlBairro, UrlCidade, UrlEstado, UrlPais, Formato, CaminhoXML, CaminhoURL, LogoListagem, Ativo, Ordem, Agrupamento_Id, AgrupamentoNome) VALUES (
'Agência Exemplo', GETDATE(), 9999, 'Celula Exemplo', 99, 99, '00000000', '99999999', '99999999', email@email.com.br', 'email@email.com.br', 'email@email.com.br', '3199999999', '3199999999', '', '-00.000000000', '-99.999999999', 'www.exemplo.com.br', '88888-888', 'Logradouro Exemplo', 'Número de Logradouro, 'Complemento do ndereço', 9999, 'Bairro Exemplo', 9999, 'Cidade Exemplo', 99, 'Estado Exemplo', 1, 'País Exemplo', 9999J', 0, GETDATE(), 'Sigla UF Exemplo', 'Sigla País Exemplo', 'url-bairro-exemplo', 'url-cidade-exemplo', url-estado-exemplo', 'url-pais', 'formatoexemplo', 'F:\XML\', 'http://www.formato.com.br/imobiliaria.php/99999999/parceira', '', 0, 0, 99, 'Parceira Imóveis')
~~~
<span style="color:red">Para realizar os testes manuais com a **nova parceira**, é necessário que o campo **'Ativo'** seja preenchido com o valor zero **(0)** para que a importação dos imóveis desta parceira não ocorra automaticamente.</span><br><br>
<hr>
### <img src="https://cdn-icons-png.flaticon.com/512/337/337959.png" style="height: 40px; width: auto;"> 2. Importação dos imóveis através do arquivo XML da parceira <br><br>
<span style="color:grey">Após a realização do cadastro da nova parceira, será necessário importar os imóveis desta parceira para dentro do banco de dados da Netimóveis por meio de arquivo XML fornecido pela parceira cadastrada.</span><br><br>
#### <img src="https://cdn-icons-png.flaticon.com/512/4477/4477837.png" style="height: 30px; width: auto;"> 2.0 Validação de Dados
* <span style="color:grey31"> Para que o XML seja importado, é necessário pelo menos as seguintes informações:
* Codigo imovel
* Tipo do imovel
* Estado
* Cidade
* Bairro
* Valor de venda ou Valor de locação
Testar algumas URLs das fotos para saber estão funcionando corretamente.
#### <img src="https://cdn-icons-png.flaticon.com/512/4477/4477837.png" style="height: 30px; width: auto;"> 2.1 Baixar o XML
* <span style="color:grey31">O primeiro passo para importar os imóveis da nova parceira, é baixar o XML fornecido pela parceira e coloca-lo no servidor do banco de dados na pasta ==**F:\\XML\\**==. O **nome do XML** deve ser o ==**ID da parceira**==
<span style="color:grey">Exemplo: F:\XML\99999.xml</span>
<strong>Observação:</strong> Este processo é automático e roda todos os dias as 17:00 para as parceiras que possuem os campos <strong>'CaminhoXML'</strong> e <strong>'CaminhoURL'</strong> diferentes de **NULL**.
Este processo é realizado por um *Windows Service* instalado no servidor do banco de dados
#### <img src="https://cdn-icons-png.flaticon.com/512/1832/1832215.png" style="height: 30px; width: auto;"> 2.2 Ler arquivo XML e colocá-lo como campo em uma tabela
* <span style="color:grey31">Para que seja possível a importação do arquivo XML, é necessário coloca-lo como sendo um campo de uma tabela.</span>
* <span style="color:grey31">Para isso, realizaremos os seguintes passos:</span>
> <span style="color:grey31">1. Executar a procedure **import_LeArquivoFisicoXML**
<span style="color:grey">Vale ressaltar que esta procedure irá ler o arquivo físico do XML e preecher o campo "XMLData" da tabela **Site_ListarXMLParceiras**. Ao executar, ele altera todos os outros registros para **Ativo=0**, porém, os que acabaram de ser inseridos ficarão como **Ativo=1**.</span> Esta procedure é disparada automaticamente todo dia às 1h da manha pelo JOB **Import_ImportacaoParceirasXML**</span>
Segue exemplo de como ficará o arquivo XML na tabela **Site_ListarXMLParceiras**:
~~~html
SELECT top 1 * FROM Site_ListarXMLParceiras WHERE Ativo=1 AND Parceira_Id = 50034
~~~

* <span style="color:grey31">Para verificar se existe registro da conversão do **XML Físico** para o **campo XMLData**, rodamos a seguinte query: </span>
~~~HTML
SELECT * FROM Site_ListarXMLParceiras WHERE Parceira_id = 99999
~~~

* <span style="color:grey31">Para inserir o registro da conversao do **XML Físico** para o campo **XMLData** é preciso rodar a procedure ==**import_CursorConvertXmlimoveis**== a partir do servidor.</span><br><br>
<img src="https://cdn-icons-png.flaticon.com/512/337/337953.png" style="height: 30px; width: auto;"> Segue a descrição da procedure **import_CursorConvertXmlimoveis**:</span>
~~~html
declare @query as varchar(max);
DECLARE @Parceira_Id int, @Formato VARCHAR(60), @CaminhoXML VARCHAR(100)
SET @Formato = 'inetsoft'
SET @Parceira_Id = 99999
SET @CaminhoXML = 'F:\XML\'
SET @query = 'INSERT INTO Site_ListarXMLParceiras(XMLData, DataHora, Parceira_id, Formato)
SELECT CONVERT(XML, replace(BulkColumn,''</URLArquivo>'','';</URLArquivo>'')) AS BulkColumn, GETDATE(),'+CAST(@Parceira_Id as varchar(10))+','''+@Formato+'''
FROM OPENROWSET(BULK '''+@CaminhoXML+''+CAST(@Parceira_Id as varchar(10))+'.xml'+''', SINGLE_BLOB) AS x;'
exec(@query)
~~~
<span style="color:#9d9d9d; text-align:right">Esta procedure retorna a **lista de Imobiliárias ativas** que possuem um registro de **XMLData** também ativo. A partir desta lista, a procedure ela identifica o campo com o formato XML e chama a procedure de importação dos imóveis que fará a leitura do campo **XMLData** da tabela **Site_ListarXMLParceiras** e inserirá os registros na tabela de imóveis **Site_ListarImoveisViewCompletaParceira**.</span>
#### <img src="https://cdn-icons-png.flaticon.com/512/3498/3498738.png" style="height: 30px; width: auto"> **OBSERVAÇÕES SOBRE A IMPORTAÇÃO**
* <span style="color:grey31">Procurar por: ==**"--EM CASO DE TESTES COMENTAR ESTE INSERT"**== e comentar o comando **INSERT INTO** antes de executar a procedure.</span>
* <span style="color:grey31">Verificar como ocorreu a leitura.</span>
* <span style="color:grey31">No final do dia, retirar este comentário, pois esta procedure será executada de madrugada para rodar o processo automático.</span>
* <span style="color:grey31">Verificar se algum imovel ficou com estes campos em branco: **Tipo do imovel, Estado, Cidade, Valor de venda ou Valor de locação**. Se algum desses campos estiverem em branco é necessário abrir a função que trata o campo e fazer a adequação na função para a tratativa do campo. Seguem as funções que tratam esses campos:</span><span>
* fk_DeParaTipoImovel -> Tipo
* fc_RetornaNomeEstado -> Transforma UF em Nome do estado
* fk_CorrigeNome -> Verifica Cidade e Bairro
* fk_ValorCaracteristica -> ValorLocacao e ValorVenda</span><br><br>
#### <img src="https://cdn-icons-png.flaticon.com/512/337/337953.png" style="height: 40px; width: auto;"> Nesta procedure utilizamos várias funções para adaptar as informações enviadas e coloca-las no formato que precisamos:
~~~html
fc_RetornaNomeEstado(UF,0) -- Retorna o nome do Estado a partir da sua Sigla
SELECT dbo.fc_RetornaNomeEstado('MG',0) -- Nome do estado normal
SELECT dbo.fc_RetornaNomeEstado('MG',1) -- Nome do estado para URL Amigável
fk_CorrigeNome(Cidade), --Retira aspas simples, e outros caratcteres inválidos de Cidade e Bairro
SELECT dbo.fk_CorrigeNome('Olhos d''água')
SELECT dbo.fk_CorrigeNome('Remove, virgula')
fk_DeParaTipoImovel --Pega o tipo de imóvel informado e transforma em tipos válidos do SAN
SELECT dbo.fk_DeParaTipoImovel('Apartamento', 'Apartamento Padrão', 'Padrão', 4 /*QtdDormitorios*/,0)
SELECT dbo.fk_DeParaTipoImovel('Apartamento', 'Apartamento Padrão', 'Padrão', 4 /*QtdDormitorios*/,1)
fk_RetornaPrimeiraFoto(Fotos) as NomeArquivoThumb, -- Retorna o nome da foto principal a partir da lista de fotos
fk_ValorCaracteristica --Valida características em vários formatos, necessário 2 parâmetros, 1: Valor, 2: Tipo esperado
Tipo: moeda, numero, area -> Retorna valor com pontuação apenas de decimal no formato americano
select dbo.fk_ValorCaracteristica('1000','moeda') -> valor esperado 1000.00
select dbo.fk_ValorCaracteristica('1000,00','moeda') -> valor esperado 1000.00
select dbo.fk_ValorCaracteristica('1,000.00','moeda') -> valor esperado 1000.00
select dbo.fk_ValorCaracteristica('1,000','moeda') -> valor esperado 1000.00
select dbo.fk_ValorCaracteristica('1,0A00','moeda') -> valor esperado 0.00
Tipo: validamoeda -> Retorna 0 ou 1 se o valor passado é um valor de imóvel válido
select dbo.fk_ValorCaracteristica('1000','validamoeda') -> valor esperado 1
select dbo.fk_ValorCaracteristica('1000,00','validamoeda') -> valor esperado 1
select dbo.fk_ValorCaracteristica('1,000.00','validamoeda') -> valor esperado 1
select dbo.fk_ValorCaracteristica('1,000','validamoeda') -> valor esperado 1
select dbo.fk_ValorCaracteristica('1,0A00','validamoeda') -> valor esperado 0
Tipo: qtd -> Valida se valor passado é um inteiro, retorna o próprio valor caso seja válido e 0 para inválido
select dbo.fk_ValorCaracteristica('10','qtd') -> 10
select dbo.fk_ValorCaracteristica('10A','qtd') > 0
Tipo: simnao -> Valida valor passado e transforma em 0 ou 1
select dbo.fk_ValorCaracteristica('1','simnao') -> 1
select dbo.fk_ValorCaracteristica('0','simnao') -> 0
select dbo.fk_ValorCaracteristica('Sim','simnao') -> 1
select dbo.fk_ValorCaracteristica('Não','simnao') -> 0
select dbo.fk_ValorCaracteristica('AAAA','simnao') -> 0
fk_RetornaEnderecoOuTipoLogradouro(Endereco, 'T') --Retorna apenas o tipo de logradouro passando como parametro o endereço completo
Select dbo.fk_RetornaEnderecoOuTipoLogradouro('Rua Paraíba', 'T')
Select dbo.fk_RetornaEnderecoOuTipoLogradouro('R Paraíba', 'T')
fk_RetornaEnderecoOuTipoLogradouro(Endereco, 'E') as logradouroPublico --Retorna apenas o logradouro passando como parametro o endereço completo
Select dbo.fk_RetornaEnderecoOuTipoLogradouro('Rua Paraíba', 'E')
Select dbo.fk_RetornaEnderecoOuTipoLogradouro('R Paraíba', 'E')
fk_RetornaTransacaoDescricao(PrecoVenda,PrecoLocacao,'Descricao') as Descricao, --Retorna o nome da transação baseado no valor de Venda e Locação
SELECT dbo.fk_RetornaTransacaoDescricao('1234.12','11111','Descricao') -> Venda ou Locação
SELECT dbo.fk_RetornaTransacaoDescricao('0','11111','Descricao') -> Locação
SELECT dbo.fk_RetornaTransacaoDescricao('1234.12','0','Descricao') -> Venda
SELECT dbo.fk_RetornaTransacaoDescricao('1234.12','11111','DescricaoAl') -> venda-locacao
SELECT dbo.fk_RetornaTransacaoDescricao('0','11111','DescricaoAl') -> locacao
SELECT dbo.fk_RetornaTransacaoDescricao('1234.12','0','DescricaoAl') -> venda
~~~
#### <img src="https://cdn-icons-png.flaticon.com/512/3498/3498738.png" style="height: 30px; width: auto;"> INFORMAÇÕES IMPORTANTES</span>
* <span style="color:grey">Caso sejam inseridos novos imóveis, a antiga importação será apagada</span>
* <span style="color:grey">As fotos removidas e as fotos dos imóveis removidos são alteradas para **status_id=2**</span>
* <span style="color:grey">As novos fotos são colocadas com **status_id=0**</span>
* <span style="color:grey">De madugada, o software baixará as fotos com o **status_id=0**</span>
* <span style="color:grey">As fotos baixadas com sucesso receberão o **status_id=1** e as que estiverem com erro terão o **status_id=2**;</span>
* <span style="color:grey">O software listará todas as fotos com **status_id=2** e as apagará do Blob da Azure</span>
* <span style="color:grey">Quando há mais de 10 mil fotos para downloads, devemos baixa-las manualmente, alterando o **status_id** das fotos de **0** para **10** e além disso, devemos também rodar em nosso computador o software **Importação Parceiras**, alterando a query, para que ela baixe as fotos de **status_id=10** no método **ListaFotosParaDownload()**</span><br><br>
#### <img src="https://cdn-icons-png.flaticon.com/512/337/337953.png" style="height: 30px; width: auto;"> Query 'Importação Parceiras':
<span style="color:grey">Para importar manualmente as fotos utilizaremos a seguinte query:</span>
~~~html
UPDATE top(2500) Site_ListarFotosImoveisViewCompletaParceira SET status_id=10 WHERE AgenciaSan_id = 99999 AND status_id=0 // realizar o update com envios a cada 2500 fotos
~~~
<span style="color:grey"> Para acompanhar a importação manual das fotos, utilizaremos as seguintes consultas:</span>
~~~HTML
FOTOS A SEREM BAIXADAS:
SELECT Count(*) FROM Site_ListarFotosImoveisViewCompletaParceira WHERE AgenciaSan_id = 50034 AND status_id = 10
FOTOS BAIXADAS:
SELECT Count(*) FROM Site_ListarFotosImoveisViewCompletaParceira WHERE AgenciaSan_id = 50034 AND status_id = 1
FOTOS COM FALHAS NO DOWNLOAD:
SELECT Count(*) FROM Site_ListarFotosImoveisViewCompletaParceira WHERE AgenciaSan_id = 50034 AND status_id = 2
~~~
<br>
#### <img src="https://cdn-icons-png.flaticon.com/512/337/337953.png" style="height: 30px; width: auto;"> Após a inserção manual das fotos, podemos alterar a parceira cadastrada para **status=1** e verificar os imóveis inseridos utilizando a seguinte query:
~~~html
UPDATE top(1) Site_ListarAgenciaViewCompletaParceira SET Ativo=1 WHERE AGenciaSAn_id = 99999
~~~
<br><hr>
### <img src="https://cdn-icons-png.flaticon.com/512/1077/1077012.png" style="height: 40px; width: auto;"> Cadastro de Usuário<br>
Os usuário cadastrados terão acesso aos dashboards da parceira.
<span style="color:grey">Para realizar o cadastro de um novo usuário, utilizamos o seguinte comando SQL:</span>
~~~HTML
INSERT INTO Dashboard_User VALUES (
1, 'Nome Parceira', 'email@email.com.br', '/KVKJuUVwAdiEtosLp9ls51PCsbe4aDFwz5u93KfNAQ=', '1900-01-01 00:00:00.000', '', GETDATE(), GETDATE()
)
~~~
<span style="color:grey">Para consultar o usuário cadastrado, utilizamos a seguinte query:</span>
~~~HTML
SELECT * FROM Dashboard_User WHERE id = 99
~~~
<span style="color:grey">Para vincular o novo usuário cadastrado à nova parceira, utilizamos o seguinte comando SQL:</span>
~~~HTML
INSERT INTO Dashboard_UserParceira VALUES (99, 99999)
~~~
<span style="color:grey">Para consultar o vínculo criado entre o usuário e a parceira, utilizamos o seguinte comando SQL:</span>
~~~HTML
SELECT * FROM Dashboard_UserParceira WHERE userid = 99
~~~
<br><hr>
### <img src="https://cdn-icons-png.flaticon.com/512/1293/1293029.png" style="height: 40px; width: auto;"> Finalização<br>
<span style="color:grey">Informar o Gerente de TI e o Suporte sobre a conclusão do cadastro da parceira, enviando para eles os dados de acesso (conforme modelo abaixo).
<span style="color:grey10">Olá, informamos que a parceira XXXXXXX foi cadastrada com sucesso e o XML dos seus imóveis e respectivas fotos foram importados para a nossa base de dados.</span>
<span style="color:grey10">Segue abaixo os dados de acesso ao Dash da parceira:</span>
<span style="color:grey10"> Link de acesso:</span><span style="color:grey10"> https://portal.netimoveis.com/dashboard/</span>
<span style="color:grey10"> Usuário:</span><span style="color:grey10"> email@email.com.br</span>
<span style="color:grey10"> Senha:</span><span style="color:grey10"> netimoveis26anos</span>
<span style="color:grey">Solicitar ao suporte que envie o email de "Boas Vindas" para a nova parceira Netimóveis. O suporte deverá encaminhar o email de boas vindas contendo os dados de acesso ao dashboard.</span>
#### <span style="color:grey31"><img src="https://cdn-icons-png.flaticon.com/512/3498/3498738.png" style="height: 20px; width: auto;"> Observação</span>
<span style="color:grey">No dashboard ainda não aparecerá a listagem de imóveis até que o setor de TI execute o software que gerará a listagem em Json, porém, o total de imóveis já aparecerá no dash.</span>