# Integração de Romaneio de colheita
### Preparação para integração
#### SAP
- [x] Testar endpoint "Apontamento produção" da SPRO
- não conseguium retorno com sucesso, pois não tenho um código de `orderNumber` válido. Erro: `{"root":{"Sistema":"AGROT","MatDoc":"310000348","Status":"101","Desc":"Erro: Ordem 310000348 não existe ou sem autorização para movimento de mercadorias 310000348 "}}`
#### Worker
- [x] Entender como usar o kafka (criar tópico, publicar mensagem).
- utilizar http://kmanager.knet.agrotis.local/clusters/Plataforma.
- adicionar a linha `10.0.0.10 vmpkube001.agrotis.local knet.agrotis.local dashboard.knet.agrotis.local grafana.knet.agrotis.local kmanager.knet.agrotis.local` no arquivo *hosts*.
- [x] Entender como rodar o projeto integrador jotabasso.
- utilizar o eclipse e rodar como é explicado em https://bitbucket.org/agrotis/integrador-jotabasso/src/master/.
- [x] Criar tópico no kafka exclusivo `PlatArmRomaneioColheitaJotabasso`.
- [x] Criar grupo no kafka exclusivo `Jotabasso.
- [x] Criar uma classe exclusiva listener **PlataformaKafkaListenerApontamentoProducao** para o tópico `PlatArmRomaneioColheitaJotabasso`.
- utilizar a annotation `@Service` na classe.
- implmentar método `listen()` com a annotation `@KafkaListener`, assim o spring já inicializa o consumer para o tópico.
- instancia o json lido do tópico em **RomaneioColheitaAgrotis**.
- chama `gerarApontamentoProducaoIn()` em **ApontamentoProducaoIn**.
- [x] Criar uma classe para gerar/enviar apontamento de produção **ApontamentoProducaoIn**.
- utilizar a annotation `@Component` na classe.
- implementar método `gerarApontamentoProducaoIn()`:
- converter **RomaneioColheitaAgrotis** em **RomaneioColheitaSAP**.
- chamar endpoint https://l400325-iflmap.hcisbp.br1.hana.ondemand.com/http/PP/ApontamentoProducao
- atualiza operacao armazenagem na plataforma.
- [x] Criar diretório */integracao/plataforma/romaneioColheita*.
- [x] Criar classe **RomaneioColheitaAgrotis**.
- será lido do tópico um json com esses dados.
- precisa ter os seguintes atributos: `Long id`, `Long idEmpresa`, `Date data`, `Long idProdutoArmazenagem`, `Long quantidade`.
- [x] Criar classe **RomaneioColheitaSAP**.
- será enviado como json para o endpoint "Apontamento produção".
- utilizar a annotation `@Builder` na classe.
- [x] Criar classe **MaterialRomaneioSAP**.
- é objeto `Materias` dentro de **RomaneioColheitaSAP**.
#### Plataforma
- [x] Criar classe **RomaneioColheitaIntegracaoApi**
- utilizar tópico `PlatArmRomaneioColheitaJotabasso`.
- precisa ter os seguintes atributos: `Long id`, `Long idEmpresa`, `Date data`, `Long idProdutoArmazenagem`, `Long quantidade`.
- [x] Implementar método `notificarMensageriaJotabasso()` em **OperacaoArmazenagemRn**
- se o `statusIntegracao` for `NAO_NOTIFICAR` ou `INTEGRADO` não faz nada.
- alterar o `statusIntegracao` para `NOTIFICANDO` no início do método e para `NOTIFICADO` no final do método.
---
### Processo
1. Persiste romaneio com campo de produção
- status de integração pendente.
- notifica tópico no kafka com **RomaneioColheitaIntegracaoApi**.
2. Worker processa mensagem no kafka
- verifica mensagem recebida no tópico
- converte o objeto **RomaneioAgrotis** em **RomaneioEntradaSAP**.
- chama endpoint 'Apontamento Produção In' com **RomaneioEntradaSAP**.
- atualizar status de integração do romaneio como integrado.
- criar objeto **OperacaoSap** através de endpoint na plataforma.
### Endpoint SPRO/SAP
#### url
https://l400325-iflmap.hcisbp.br1.hana.ondemand.com/http/PP/ApontamentoProducao
#### auth
- username: S0021938399
- password: Agrotis@2020
#### o que precisa ser enviado:
- Sistema (`Sistema`):
- enviar valor 'AGROT'.
- corresponde ao código legado em alguns documentos.
- Ordem de produção (`OrderNumber`):
- corresponde a `integracaoTerceiros` de **CampoProducaoConsultaApi**
- Tipo de movimento (`MovType`):
- enviar valor padrão '101', à confirmar.**
- Centro (`Plant`):
- obter valor do de-para de Empresa/Filial correspondente a `idEmpresa`.
- Depósito (`Lgort`):
- enviar valor padrão '20' (depósito de grãos e sementes).
- Data (`PstngDate`):
- enviar data do romaneio no formato 'aaaammdd' (ex: '20200422').
- Materiais (`Materiais`):
- lista com os materias
- Material (`Material`):
- enviado dentro do objeto `Materiais`
- possui os seguintes campos:
- Número Material (`Matnr`):
- obter valor do de-para de Materiais correspondente a `idProdutoArmazenagem`.
- Quantidade (`Quantity`):
- corresponde a `quantidade` de **Romaneio**
- Unidade de Medida (`QuantityUom`):
- enviar valor padrão 'KG'
- Lote (`Charg`):
- enviar valor 'PADRAO', quando o material for Commodities Agrícolas > Soja > Grãos (codigo='000770000600000001')
- enviar valor nulo, quando demais materiais
#### exemplo
```
{
"Sistema": "AGROT",
"OrderNumber": "310000348",
"MovType": "261",
"Plant": "C002",
"Lgort": "02",
"PstngDate": "20200422",
"Materiais": {
"Material": [
{
"Matnr": "6000306",
"Quantity": "50",
"QuantityUom": "",
"Charg": "0000028891"
}
]
}
}
```