# MelFitness :: Mundipagg
## Documentação de integração
### Infraestrutura
-----------------
#### Banco de dados
**Tabela:** *cad_cliente*
> <font color=purple> Esta tabela já existia no sistema, portanto será informado somente campos novos.</font>
>
Campo|Tipo|Especificação| Obs
-----|----|------------- | -----
id_api | varchar(100)| | Campo de referência para o cadastro do cliente na API.
**Tabela:** *cad_cliente_cartao*
<font color="red">Para proteger os dados do cartão no banco de dados foi desenvolvido uma dll para criptografa e descriptografar os dados na tabela. **Para teste e homologação essa dll ainda será utilizada.**</font>
Campo|Tipo|Especificação | Obs
-----|----|------------- | -----
id | smallint | NOT NULL | PK
cod_cli | smallint | NOT NULL | FK com cad_cliente -> cod_cli
numero_cartao |varchar(250) | NOT NULL | *Criptografar*
bandeira | varchar(250) | NOT NULL | *Criptografar*
nome_cartao | varchar(250) | NOT NULL | *Criptografar*
cpf | varchar(11) | NOT NULL | *Criptografar*
cvc | varchar(3) | NOT NULL | *Criptografar*
val_mes | smallint | NOT NULL | *Criptografar*
val_ano | smallint | NOT NULL | *Criptografar*
status | char(1) | NOT NULL |
id_api | varchar(100)| | Campo de referência para o cadastro do cartão na API.
**Tabela:** *rec_assinatura*
Campo|Tipo|Especificação | Obs
-----|----|------------- | ---
id | int | NOT NULL | PK
dt_inicio | date | NOT NULL | Data de início da assinatura.
intervalo | varchar(250) | NOT NULL | Tipo de intervalo para cobrança da assinatura. 'day', 'week', 'month', 'year'
intervalo_quantidade | smallint | NOT NULL | Número de intervalos para cobrança. Ex: 1 na assinatura do tipo month = assinatura mensal; 3 na assinatura do tipo month = assinatura trimestral. Mesma lógica para os outros tipo EXCETO day.
dia_cobrança | smallint | NOT NULL | Dia de vencimento da fatura
quant_parcelas | smallint | NOT NULL | Aplicada a cobrança da fatura
ciclo | int | NOT NULL | Se 1, então a API se encarrega de gerar os ciclos de fatura automaticamente *Assinatura vitalícia* até o pedido de cancelamento do cliente. Se for maior que um a assinatura tem ciclio de término e o controle passa a ser manual
texto_fatura | varchar(250) | NULL | Texto opcional que será mostrado na fatura
valor_mínimo | currency | NOT NULL | Valor mínimo da assinatura
status | char(1) | NOT NULL | 'A' = ativa / 'C' - cancelada. *O C de cancelada é preenchida pelo retorno da API*
id_api | varchar(100)| | Campo de referência para o cadastro da assinatura na API.
id_cliente | smallint | NOT NULL | FK com cad_clientes -> cod_cli
id_cartao | smallint | NOT NULL | FK com cad_clientes_cartao -> id
**Tabela:** *rec_assinatura_item*
Campo|Tipo|Especificação | Obs
-----|----|------------- | -----
id | int | NOT NULL | PK
dt_inicio | date | NOT NULL | Data de início da assinatura.
descricao | varchar(250) | NOT NULL | Nome da atividade: 'natação', 'musculação', ...
quant | smallint | NOT NULL | Quantidade de unidades da atividade na assinatura
ciclos | smallint | NOT NULL | Ciclos de cobrança. Ex: Um ciclo representa que um item será cobrado apenas uma vez. Caso não seja informado, o item será cobrado até que seja desativado.
status | char(1) | NOT NULL | 'A' = ativa / 'I' - cancelada. *O **I** de inativa é preenchida pelo retorno da API quando essa atividade é solicitada para ser **excluída** da assinatura*
valor | numeric(10,2) | NOT NULL | Valor efetivo da atividade que será cobrada ao cliente
id_api | varchar(100)| | Campo de referência para o cadastro do item de assinatura na API.
id_assinatura | int | NOT NULL | FK com rec_assinatura -> id
**Tabela:** *rec_fatura*
Campo|Tipo|Especificação | Obs
-----|----|------------- | -----
id | int | NOT NULL | PK
url | varchar(250) | NOT NULL | url para acesso direto via browser
forma_pagamento | varchar(250) | NOT NULL | tipo de forma de pagamento
quant_parcelas | smallint | NOT NULL |
valor | currency | NOT NULL | Valor cobrado na fatura
dt_cobranca | datetime | NOT NULL | Preenchimento automático pala API.
dt_vencimento | datetime | NOT NULL | Preenchimento automático pala API.
dt_criacao | date | NOT NULL | Preenchimento automático pala API.
dt_cancelamento | datetime | NOT NULL | Preenchido pela API no retorno do evento de cancelamento ( tabela util_eventos_mundipagg)
dia_cobrança | smallint | NOT NULL | Dia de vencimento da fatura
total_descontos | currency | NOT NULL | Inativo. Preenchido automaticamente
total_acrescimos | currency | NOT NULL | Inativo. Preenchido automaticamente
id_api | varchar(100)| | Campo de referência para o cadastro da fatura na API.
cod_cli | smallint | NOT NULL | FK com cad_clientes -> cod_cli
id_assinatura | smallint | NOT NULL | FK com rec_assintura -> id
status | varchar(50) | NULL | Recebe o status do jeito que está na API. Caso queira mostrar diferente ao cliente, deve converter para apresentação. Valores possíveis: pending, paid, canceled, scheduled ou failed.
**Tabela:** *util_eventos_mundipagg*
Campo|Tipo|Especificação | Obs
-----|----|------------- | -----
id_guid | varchar(60) | NOT NULL | Utilizaçãon interna e de preenchimento automático. Para fins de controlle
dt_evento | datetime | NOT NULL | dia e hora que foi registrado o evento | NOT NULL | Default Date()
processado | char(1) | NOT NULL | 'N' = não processado,'P' = processado pelo sincronizador,'E' = Ocorreu algum erro, verifique o log
sigla | varchar(8) | NOT NULL | <font color='red'>Veja mapa de siglas em fluxo de operações</font>
id_tabela | varchar(8) | NOT NULL | <font color='red'>Código de referência da tabela assiciado ao evento</font>
codaux_1 | varchar(30) | NULL | Codigo auxiliar para referenciar mais de um registro em tabelas associadas.<p> <font color='red'>Veja parametros nas operações</font>
codaux_2 | varchar(30) | NULL | Codigo auxiliar para referenciar mais de um registro em tabelas associadas.<p> <font color='red'>Veja parametros nas operações</font>
**Script de criação da tabela**
```sql
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[util_eventos_mundipagg](
[dt_evento] [datetime] NOT NULL,
[processado] [char](1) NOT NULL,
[sigla] [varchar](8) NOT NULL,
[id_tabela] [varchar](30) NOT NULL,
[codaux_1] [varchar](30) NULL,
[codaux_2] [varchar](30) NULL,
[id_guid] [varchar](60) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[util_eventos_mundipagg] ADD DEFAULT (newid()) FOR [id_guid]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[SYNC_MUNDIPAG] ON [dbo].[util_eventos_mundipagg] AFTER INSERT AS BEGIN DECLARE @Text AS VARCHAR(100) DECLARE @Cmd AS VARCHAR(100) SET @Text = 'sync' SET @Cmd = 'echo ' + @Text + ' > F:\Projetos Freela\MelFitnessAssinaturas\MelFitnessAssinaturas\bin\Debug\_sync.gat' EXECUTE Master.dbo.xp_CmdShell @Cmd END
GO
ALTER TABLE [dbo].[util_eventos_mundipagg] ENABLE TRIGGER [SYNC_MUNDIPAG]
GO
```
**Tabela:** *rec_log_sync*
> Tabela de log com todos os erros e operações realizadas pelos sincronizador. Pode ser visível pelo aplicativo.
Campo|Tipo|Especificação | Obs
-----|----|------------- | ----
dt_evento | datetime | NOT NULL |
tipo | varchar(2) | NOT NULL |
descricao | varchar(255) | NOT NULL |
cliente | varchar(255) | NOT NULL | Nome do cliente que se trata o evento
id_api | varchar(100)| | Campo de referência na API.
valor | currency | NOT NULL | Valor monetário do registro logado.
**Tabela:** *cad_funcionario*
> Campo adicional utilizado para armazendar uma senha de acesso ao aplicativo de integração
Campo|Tipo|Especificação | Obs
-----|----|------------- | ----
senha_api | varchar(50) | |
#### Fluxo de funcionamento
O aplicativo funcionará em modo de background em dois tipos:
1. **Tarefas agendadas** - em um período determindado operações podem ser executadas. <font color='blue'>Atualmente essa opção está desativada, caso veja necessidade no processo podemos ativá-la.</font>
2. **"Escutando" a tabela de eventos** ( util_eventos_mundipagg ) - Toda vez que um novo registro for **inserido** nesta tabela o sincronizador irá fazer uma consulta na tabela de eventos a procura de eventos a processar e executará sequencialmente do mais antigo ao mais recente.
A tabela util_eventos_mundipagg funciona com um gatilho de ações<font color="blue">( através de uma trigger no banco de dados )</font>, para identificar que ação o sincronizador deverá executar.
#### Mapa de Siglas na tabela de EVENTOS
A_N - Nova assinatura
-------
**Parâmetros:**(id_tabela: id > rec_assinatura)
- Coleta as informações da assinatura, juntamente com as atividade, o cliente e cartão associado a ela
- Envia para API, crinado uma assinatura avulsa
A_ECT - Alterar o cartão vinculado à assinatura
-------
**Parâmetros:**(id_tabela: id > rec_assinatura | codaux1: id > cad_cliente_cartão)
> Quando o cliente solicitar a troca de cartão para corbança de uma assinatura vigente.
- Busca do dados da assinatura, baseado no id_tabela
- Busca os dados do novo cartão, de acordo com o parâmetro codaux1
- Envia a assintatura e os dados do novo cartão para API e a troca é realizada para a próxima fatura
A_EDP - Alterar o dia de cobrança da assinatura
-------
**Parâmetros:**(id_tabela: id > rec_assinatura)
> Quando o cliente solicitar alterar a data do vencimento que a cobrança é realizada através do faturamento.
- A data de cobrança na tabela rec_assinatrua ( campo: dia_cobranca ) já deve ter sido atualizada no banco de dados
- Esse evento irá buscar os dados atualizados da assinatura
- Evniará para API para atualizar na plataforma da mundipagg
A_C - Cancelar assinatura
-------
**Parâmetros:**(id_tabela: id > rec_assinatura)
> <font color='red'>Importante: As assinaturas registradas na API, assim como os outros registro não são apagados. Tudo se baseia em assinatura e a forma de remover a referência é informando seu CANCELAMENTO.</font>
- Pega as informações da assinatrua no banco de dados
- Envia a solicitação a API para cancelamento
- Retorna atualizando o status da assinatura para 'C' no banco de dados ( caso já não tenha sido feito)
CLI_E - Cliente foi editado e deseja atualizar seus dado na assinatura
-------
**Parâmetros:**(id_tabela: cod_cli > cad_cliente)
> Na API somente os dados de email e telefone surtirão efeito nessa edição.
- Busca o cliente no banco de dados
- Envia os dados atualizados a API para atualização
IA_N - Incluir um novo item em uma assinatura cadastrada
-------
**Parâmetros:**(id: id > rec_assinatura_item)
- Busca as informações do item no banco de dados
- Verifica a qual assinatura ele está associado e busca os dados da assinatura **>>** *de acordo com o campo de relacionamento com a tabela rec_assinatura*
- Inclui esse item na assinatura na API
IA_E - Alterar uma informação no item já cadastrado em uma assinatura vigente
-------
**Parâmetros:**(id: id > rec_assinatura_item)
> Caso seja necessário alterar o valor ou quantidade do item na assinatura vigente
- Busca as informações do item no banco de dados
- Verifica a qual assinatura ele está associado e busca os dados da assinatura **>>** *de acordo com o campo de relacionamento com a tabela rec_assinatura*
- Atualiza esse item na API
IA_R - Remover um item de um assinatura
-------
**Parâmetros:**(id: id > rec_assinatura_item)
> Caso seja necessário remover o item da assinatura vigente
- Busca as informações do item no banco de dados
- Verifica a qual assinatura ele está associado e busca os dados da assinatura **>>** *de acordo com o campo de relacionamento com a tabela rec_assinatura*
- Inativa o item no banco de dados e na API.
F_AA - Atualizar os dados de todas faturas de uma assinatura
-------
**Parâmetros:**(id: id > rec_assinatura)
> A fatura é gerada pela API do mundipagg, sempre que for necessário atualizar/importar esses dados para que reflitam no banco de dados, esse evento deve ser acionado.
- Busca informações da assinatura
- Pega a lista de todas as faturas associadas a ela geradas na API
- Atualiza essas informações no banco de dados para consulta do usuário
F_C - Cancelar uma fatura emitida
-------
**Parâmetros:**(id: id > rec_assinatura)
- Busca iformações da assinatura
- Cancela a fatura de cobrança na API