====== API de integração ======
===== Resumo =====
A API de integração tem por objetivo ser um canal de comunicação entre o Geoserviços e os demais sistemas da Tecsystem.
===== Descrição =====
A integração entre os sistemas se dará através de uma interface que fará a comunicação com o banco de dados do Geoserviços e, opcionalmente, com o Monnae através da [[softwares:monnae:requisitos:modulos:api_integracao|API do Monnae]].
Essa interface é compilada e distribuída como um pacote padrão Delphi (dcp/bpl) chamado GeoServicosAPI. Para que um sistema possa utilizá-la é necessário incluir esse pacote na lista de Runtime packages do projeto e sempre distribuí-lo junto com a aplicação.
A API fornece também acesso às classes de domínio necessárias para transferir dados entre os sistemas.
===== Inicialização da API =====
Para que a API possa ser utilizada, é necessário obter acesso à interface que dá acesso aos serviços disponíveis. Isso é feito chamando a função ''getGeoServicosProxy''.
function getGeoServicosProxy(const CaminhoBanco: string; const CaminhoIntegracaoMonnae: string = ''): IProxy;
uses IntProxy, ClsGeoservicosProxy;
var Proxy: IPRoxy;
Proxy := getGeoServicosProxy('CaminhoBancoGeoServicos', 'CaminhoBancoMonnae');
Se o caminho do banco de dados do Monnae estiver em branco, ele será ignorado. A função só retornará uma instância do proxy se conseguir conectar com sucesso no(s) banco(s) de dados informado(s). O banco de dados precisa estar na mesma versão que a API. A validação do banco de dados do Monnae é feita pela API do Monnae.
==== Exceções ====
* **ECaminhoBancoMonnaeInvalido**: quando a API do Monnae indicar que o caminho é inválido.
* **EErroIntegracaoMonnae**: quando houver qualquer outro erro com a API do Monnae.
* **VersaoIncompativelException**: quando o versão do banco de dados não for igual à da API.
* **BancoInvalidoException**: quando o banco de dados estiver indisponível ou não for possível verificar a versão.
* **CaminhoBancoVazioException**: quando o caminho do banco do Geoserviços for vazio.
* **CaminhoInvalidoException**: quando não for possível acessar o bando de dados.
* **ConexaoRedeIndisponivelException**: quando não for possível acessar o servidor.
===== Pessoas =====
==== Inclusão/alteração ====
function PersistirPessoa(const Pessoa: TPessoaGSP): integer;
Este método deve receber uma pessoa como parâmetro de entrada e persistir essa pessoa no banco de dados do Geoserviços.
Caso a pessoa passada como parâmetro de entrada já exista no banco de dados do Geoserviços o sistema irá fazer apenas um atualização dos dados. Caso contrário, o sistema se encarregará de inserir essa pessoa no Geoserviços. O primeiro critério a ser verificado é o CPF/CNPJ. Se já existir uma pessoa cadastrada com o número do documento igual ao da pessoa enviada pela API, a operação será de atualização. Caso o documento não exista, a atualização só será feita se a pessoa passada como parâmetro tiver um código.
Retorna o código da pessoa.
=== Exceções ===
* **ECPFCNPJObrigatorio**: quando o documento não for informado.
* **ECPFCNPJInvalido**: quando o documento for inválido.
* **EDataNascimentoFutura**: quando a data de nascimento for posterior à data corrente.
* **EDataMaior**: quando a data de cadastro for posterior à data corrente.
* **EPessoaNaoDefinidaException**: quando o objeto TPessoaGSP for nulo.
* **EErroIntegracaoMonnae**: quando houver um erro com a API do Monnae.
==== Exclusão ====
procedure ExcluirPessoa(const CodigoPessoaGeoServicos: integer);
Este método deve receber como parâmetro de entrada um código referente a uma pessoa. Caso este código exista no Geoserviços o cadastro da pessoa será excluído do sistema.
=== Exceções ===
* **EErroExclusaoPessoaException**: quando não for possível excluir a pessoa.
* **EErroIntegracaoMonnae**: quando houver um erro com a API do Monnae.
===== Pontos de atendimento =====
==== Inclusão/alteração ====
function PersistirPontoAtendimento(const PontoAtendimento: TPontoAtendimentoGSP): TPontoAtendimentoGSP;
Este método deve receber um ponto de atendimento como parâmetro e persistir esse ponto no banco de dados do Geoserviços.
Caso o ponto de atendimento já exista no Geoserviços o sistema irá fazer uma atualização dos dados. Caso contrário, o sistema irá inserir um novo ponto de atendimento no Geoserviços. O primeiro critério a ser verificado é o número do documento junto com a categoria do ponto. Se já existir um ponto com o número do documento e categoria iguais aos do ponto enviado pela API, a operação será de atualização. Caso o ponto não exista, a atualização só será feita se o ponto enviado tiver um código.
Retorna o próprio ponto de atendimento com seu código e os códigos dos cadastros vinculados atualizados.
=== Exceções ===
* **ENomeObrigatorio**: quando o nome do ponto estiver em branco.
* **EPontoAtendimentoDuplicado**: quando um ponto de atendimento como mesmo nome já existir.
* **EPessoaDuplicada**: quando uma pessoa for vinculada mais de uma vez no mesmo ponto.
* **EResponsavelNaoEncontrado**: quando não for definido um responsável pelo ponto.
* **EAtividadeDuplicada**: quando uma atividade for vinculada mais de uma vez no mesmo ponto.
* **ECategoriaObrigatoria**: quando a categoria não for definida.
* **ETipoDocumentoObrigatorio**: quando o tipo do documento não for definido.
* **EDocumentoInvalido**: quando o documento for inválido.
* **EErroIntegracaoMonnae**: quando houver um erro com a API do Monnae.
==== Exclusão ====
procedure ExcluirPontoAtendimento(const CodigoPontoAtendimento: integer);
Este método deve receber como parâmetro de entrada um código referente a um ponto de atendimento. Caso este código exista no Geoserviços o cadastro será excluído do sistema.
=== Exceções ===
* **EErroExclusaoPontoException**: quando não for possível excluir o ponto.
* **EErroIntegracaoMonnae**: quando houver um erro com a API do Monnae.
===== Departamentos =====
==== Listar ====
function RecuperarListaDepartamentos: TDepartamentosGSP;
Este método deve retornar uma lista de departamentos existentes no sistema.
Se nenhum departamento for encontrado, retorna uma lista vazia.
===== Categorias =====
==== Listar ====
function RecuperarListaCategorias: TCategoriasGSP;
Este método deve retornar uma lista das categorias existentes no sistema.
Se nenhuma categoria for encontrada, retorna uma lista vazia.
===== Atendimentos =====
==== Inclusão/alteração ====
function PersistirAtendimento(const Atendimento: TAtendimentoGSP): TAtendimentoGSP;
Este método deve receber como parâmetro um atendimento para ser persistido no banco de dados do Geoserviços.
Retorna o código do atendimento.
=== Exceções ===
* **EDataInvalida**: quando a data do cadastro for inválida ou não informada.
* **EPessoaObrigatoria**: quando o solicitante não for informado.
* **EPontoAtendimentoObrigatorio**: quando o ponto de atendimento não for informado.
* **EDadosObrigatorios**: quando a lista de serviços não for definida ou estiver vazia.
* **EServicoInvalido**: quando algum serviço vinculado ao atendimento não for definido.
* **EStatusInvalido**: quando o status de algum serviço vinculado ao atendimento não for definido.
===== Serviços =====
==== Listar ====
function RecuperarListaServicos: TServicosGSP;
Este método deve retornar uma lista dos serviços cadastrados no sistema.
Se nenhum serviço for encontrado, retorna uma lista vazia.
==== Listar status finais ====
function RecuperarListaStatusFinais(const CodigoServico: integer): TStatusServicosGSP;
Este método recebe um código de serviço.
Retorna uma lista dos estados do tipo "final" do serviço informado.
Se nenhum estado for encontrado, retorna uma lista vazia.
==== Listar serviços por ponto de atendimento ====
function RecuperarServicosPontoAtendimento(const CodigoPontoAtendimento: integer): TServicosPontoGSP; overload;
function RecuperarServicosPontoAtendimento(const CodigoPontoAtendimento: integer; const DataExecucao: TDateTime): TServicosPontoGSP; overload;
Este método deve retornar um objeto do tipo ''TServicosPontoGSP'', uma lista de ''TServicoPontoGSP'' que contém os dados do serviço e da execução do serviço num dado atendimento. O sistema que está consumindo a API poderá chamar o método passando como parâmetro, além do código do ponto de atendimento, o período de execução do serviço (data) para recuperar a lista de serviços do ponto de atendimento.
Retorna todos os serviços prestados em atendimentos vinculados ao ponto cujo código foi informado.
Se for informada a data, somente os serviços com data de execução no mesmo ano da data informada serão retornados.
Se nenhum serviço for encontrado, retorna uma lista vazia.
===== Pontos de verificação =====
==== Conexão ====
* Fica a cargo da API verificar a autenticidade do banco de dados do Geoserviços, caso a validação falhe a API deve lançar uma exceção que deverá ser capturada pelo sistema que a está utilizando.
* Fica a cargo da API verificar se a versão do BD do Geoserviços utilizado é compatível com a API encontrada no pacote do sistema que a utiliza. Caso não seja compatível a API deverá lançar uma exceção informando que a versão da API não é compatível com a versão do BD do Geoserviços.
* Fica a cargo do software cliente informar a API a localização do banco de dados do Geoserviços que será utilizado na integração.
==== Utilização ====
* Fica a cargo do sistema que está utilizando a API o tratamento das exceções lançadas pela mesma.
* A API deve se encarregar de registrar as ações executadas no Geoserviços.
===== Observações =====
~~DISCUSSION|Sugira mudanças, aponte falhas ou contribua de alguma forma aqui:~~