Inclusão de anexos em Documentos
Produto: | Datasul |
Ocorrência: | Documentação de API |
Nome físico: | cdp/apiSupplyDocuments.p |
Objetivo
Esta API tem como objetivo validar as regras de negócio dos arquivos de compras que serão anexados pela api de documentos hubapi/apidocuments.
Esta api recebe os parâmetros das requisições enviados pela cdp/api/v1/supplyDocuments, faz as validações necessárias nos métodos e depois encaminha os parâmetros para a api de documentos hubapi/apidocuments. Na apidocuments (api do HUB), serão efetivados os métodos de inclusão, exclusão, download, upload e consulta dos anexos dos documentos.
Para maiores informações sobre:
- hubapi/apiDocuments: https://tdn.totvs.com/pages/viewpage.action?pageId=675561040 .
Funcionamento
A API fornece uma série de métodos que podem ser executados individualmente para apresentação de anexos na tela do documento.
A sintaxe para a chamada da API, que deve ser de forma persistente:
run cdp/apiSupplyDocuments.p persistent set h-handle. |
A variável denominada h-handle irá receber o “handle” do programa, permitindo o acesso aos “métodos” internos da API.
Método Negócio
Quando a API estiver executada em modo persistente, os seguintes métodos estarão disponíveis para execução:
| pi-metadata-v1 | ||||
Requisito | Nenhum. | |||
Descrição | Repassa o parâmetro do tipo de evento recebido pela API de comunicação para a API de documentos (hubapi/apiDocuments) chamando o método pi-metadata-v1. Existem duas apis de comunicação:
Retorna o metadados com os campos e ações ativos referentes a tela de Listagem (list), Consulta (view) ou Edição (edit), dependendo de qual tipo foi enviado pela requisição, para a montagem dinâmica da tela com as informações vindas do backend. | |||
Parâmetros | Tipo | Input/Output | Descrição | |
oInput | JsonObject | INPUT | Parâmetros para a busca de metadados: pathParams: Informar: metadata. queryParams → type: Utilizando este atributo com uma das opções abaixo permite retornar as informações de:
Exemplo {
"queryParams": {
"type": "list"
},
"pathParams": [
"metadata"
],
}
| |
| cEvent | Character | INPUT | Identifica qual o tipo de evento vindo do queryParams para a busca do metadado correto. | |
| cVersion | Character | INPUT | Identifica a versão da API. | |
| oOutput | JsonObject | OUTPUT | Retorno contendo o metadados com campos e ações conforme parâmetros recebidos:
List {
"literals": {},
"validateFields": [],
"title": "Anexos de documentos",
"fields": [
{
"visible": false,
"property": "documentId",
"label": "Código",
"type": "number",
"key": true,
"order": 1
},
{
"visible": false,
"property": "processType",
"options": [
{
"label": "Ordem de Compra",
"value": 1
},
{
"label": "Cotação de Materiais",
"value": 2
}
],
"label": "Tipo Processo",
"type": "label",
"order": 2,
"labels": [
{
"label": "Ordem de Compra",
"value": 1
},
{
"label": "Cotação de Materiais",
"value": 2
}
]
},
{
"visible": false,
"property": "processKey",
"label": "Chave Processo",
"type": "string",
"order": 3
},
{
"property": "documentName",
"width": "20%",
"label": "Documento",
"type": "string",
"order": 4
},
{
"property": "documentSize",
"width": "10%",
"label": "Tamanho",
"type": "string",
"order": 5
},
{
"property": "documentDescription",
"width": "30%",
"label": "Descrição",
"type": "string",
"order": 6
},
{
"visible": false,
"allowColumnsManager": true,
"property": "creationUser",
"width": "5%",
"label": "Criador",
"type": "string",
"order": 7
},
{
"visible": false,
"allowColumnsManager": true,
"property": "creationUserName",
"width": "15%",
"label": "Nome Criador",
"type": "string",
"order": 8
},
{
"visible": false,
"allowColumnsManager": true,
"property": "creationDatetime",
"width": "20%",
"label": "Data",
"type": "dateTime",
"order": 9
}
],
"tableCustomActions": [],
"actions": {
"new": "/new",
"removeAll": true,
"remove": true
},
"pageCustomActions": []
}
Descrição dos campos:
Edit {
"defaultFields": [
{
"gridColumns": 4,
"divider": "Processo",
"label": "Tipo Processo",
"property": "processType",
"disabled": true,
"options": [
{
"value": 1,
"label": "Ordem de Compra"
}
]
},
{
"gridColumns": 4,
"label": "Chave",
"property": "processKey",
"disabled": true
},
{
"autoUpload": true,
"gridColumns": 4,
"divider": "Anexar Documento",
"label": "Selecione o documento",
"property": "documentUpload",
"required": true,
"type": "upload"
},
{
"maxLength": 200,
"gridColumns": 8,
"label": "Descrição",
"property": "documentDescription",
"rows": 4
}
],
"title": "Novo anexo",
"breadcrumb": {
"items": [
{
"link": "/",
"label": "Anexos de documentos"
},
{
"link": "/new",
"label": "Novo anexo"
}
]
}
}
View {
"keepfilters": false,
"literals": {},
"validateFields": [],
"title": "Consulta de Anexos de Documentos",
"fields": [
{
"visible": false,
"property": "documentId",
"label": "Código",
"type": "number",
"key": true,
"order": 1
},
{
"property": "processTypeDescription",
"width": "15%",
"label": "Tipo Processo",
"type": "string",
"order": 2
},
{
"property": "processKey",
"width": "15%",
"label": "Chave Processo",
"type": "string",
"order": 3
},
{
"property": "documentName",
"width": "20%",
"label": "Documento",
"type": "string",
"order": 4
},
{
"property": "documentSize",
"width": "10%",
"label": "Tamanho",
"type": "string",
"order": 5
},
{
"property": "documentDescription",
"width": "35%",
"label": "Descrição",
"type": "string",
"order": 6
},
{
"visible": false,
"allowColumnsManager": true,
"property": "creationUser",
"width": "5%",
"label": "Criador",
"type": "string",
"order": 7
},
{
"visible": false,
"property": "creationUserName",
"width": "20%",
"label": "Nome Criador",
"type": "string",
"order": 8
},
{
"visible": false,
"allowColumnsManager": true,
"property": "creationDatetime",
"width": "15%",
"label": "Data",
"type": "dateTime",
"order": 9
}
],
"tableCustomActions": [],
"pageCustomActions": []
}
Possui os mesmos campos de retorno do metadados "List", sendo que a diferença é que se trata de uma tela de Consulta apenas, então, neste caso, não estão disponíveis as ações ("actions" no json), ou seja, os botões "Novo" e "Excluir" não são carregados na tela. A requisição é igual ao do metadados List (passando no queryparams o type = list) da api supplyDocuments, apenas alterando a api de origem que é a supplyDocumentsView. No método pi-metadata da supplyDocumentsView é feito o tratamento onde, ao receber o tipo "list" ele envia o tipo "view" para a apiDocuments fazer o tratamento e omitir os campos referente as ações da tela e exibe seu respectivo título da página. | |
| RowErrors | Temp-table | OUTPUT | Informações sobre os erros ocorridos durante o processo de busca dos dados. | |
Retorno | Retorna informações do metadados ou erros ocorridos durante a busca | |||
| pi-query-v1 | ||||
Requisito | Nenhum. | |||
Descrição | Repassa o parâmetro do tipo de evento recebido pela API de comunicação para a API de documentos (hubapi/apiDocuments) chamando o método pi-query-v1. Existem duas apis de comunicação:
Retorna a lista de anexos relacionados a um documento. | |||
Parâmetros | Tipo | Input/Output | Descrição | |
oInput | JsonObject | INPUT | Parâmetros para a busca de anexos: queryParams:
Exemplo {
"queryParams": {
"processType": "1",
"processKey": "1234%7CABC"
}
}
Outros parâmetros que podem ser usados em conjunto com os queryParams de consulta dos anexos:
Exemplo {
"queryParams": {
"processType": "1",
"processKey": "1234%7CABC",
"search":"super"
}
}
| |
| aResult | JsonArray | OUTPUT | Retorno do processo, contendo os itens da listagem de anexos conforme parâmetros enviados. Exemplo {
"total": 3,
"totalHits": 3,
"hasNext": false,
"items": [
{
"creationUserName": "Super",
"documentDir": "c:\\tmp\\ERP\\1\\123\\5\\c3e349d230b2d176eefb7d58f2eb35e1.txt",
"creationUser": "super",
"documentDescription": "arquivo 123",
"processKey": "123|5",
"documentId": 392,
"processType": 1,
"documentName": "arquivo123.txt",
"documentSize": "74 Bytes",
"processTypeDescription": "Ordem de Compra",
"creationDatetime": "2022-02-07T09:12:43.000"
},
{
"creationUserName": "Super",
"documentDir": "c:\\tmp\\ERP\\1\\123\\5\\e13190f35f57fcb02bcf91c799ed3191.txt",
"creationUser": "SUPER",
"documentDescription": "teste download",
"processKey": "123|5",
"documentId": 393,
"processType": 1,
"documentName": "testando.txt",
"documentSize": "1GB",
"processTypeDescription": "Ordem de Compra",
"creationDatetime": "2022-02-07T18:01:17.000"
},
{
"creationUserName": "Super",
"documentDir": "c:\\tmp\\ERP\\2\\1234\\5\\2ca28ec306fb5e55c24448f2bdb1baa3",
"creationUser": "SUPER",
"documentDescription": "teste download",
"processKey": "123|5",
"documentId": 396,
"processType": 1,
"documentName": "testando.txt",
"documentSize": "1GB",
"processTypeDescription": "Ordem de Compra",
"creationDatetime": "2022-02-07T18:08:29.000"
}
]
}
Para verificar o que significa cada campo, conferir no final desta documentação a descrição dos campos da temp-table: ttDocumentFile. | |
| lHasNext | Logical | OUTPUT | Indica que existem mais registros a serem mostrados | |
| iTotalHits | Integer | OUTPUT | Contagem do total de registros encontrados. | |
| RowErrors | Temp-table | OUTPUT | Informações sobre os erros ocorridos durante o processo. | |
Retorno | Retorna a lista de arquivos relacionados a um documento ou erros ocorridos durante a busca. | |||
| pi-upload-v1 | ||||
Requisito | Nenhum. | |||
Descrição | Repassa os parâmetros recebidos pela API de comunicação (cdp/api/v1/supplyDocuments) para a API de documentos (hubapi/apiDocuments) chamando o método pi-upload-v1. Retorna informações do arquivo em que o upload está sendo efetuado. | |||
Parâmetros | Tipo | Input/Output | Descrição | |
oInput | JsonObject | INPUT | Parâmetros para o upload: pathParams: Informar: upload. queryParams → files=: Arquivo a ser efetuado o upload, sendo enviado também como parâmetro. Exemplo abaixo do formato de requisição com arquivo enviado como parâmetro: Exemplo {
"content-type": "multipart/form-data",
"multipart": [
{
"headers": {
"Content-Disposition": "form-data; name=\"file\"; filename=\"Adobe Sign Form Field.pdf\""
},
"body": {
"content-type": "application/pdf",
"content": "@{base64(body('Get_file_content_Signed_PDF'))}"
}
}
]
}
| |
| oOutput | JsonObject | OUTPUT | Informações do arquivo: Exemplo {
"fileName": "Evidencia_DMANSUPIMPA2-419.docx",
"content": "UEsDBBQABgAIAAAAIQCJi8MJ4gEAAF4KAAATAAgCW0NvbnRlbnRfVHlwZXN..."
}
Descrição dos campos:
| |
| RowErrors | Temp-table | OUTPUT | Informações sobre os erros ocorridos durante o processo de upload. | |
Retorno | Retorna informações do nome do arquivo e seu conteúdo em base64 ou erros ocorridos durante o processo. | |||
| pi-download-v1 | ||||
Requisito | Nenhum. | |||
Descrição | Repassa os parâmetros recebidos pela API de comunicação para a API de documentos (hubapi/apiDocuments) chamando o método pi-download-v1. Também realiza validações de restrição dos usuários em relação a menu e processos. Existem duas apis de comunicação:
Retorna informações do arquivo em que o download está sendo efetuado. | |||
Parâmetros | Tipo | Input/Output | Descrição | |
oInput | JsonObject | INPUT | Parâmetros para download do anexo: pathParams: Informar: download e o documentId do documento. Exemplo {
"pathParams": [
"download",
"402"
],
}
| |
| oOutput | JsonObject | OUTPUT | Retorno das informações do arquivo que está sendo realizado o download: Exemplo {
"headers": {
"Content-Type": "application/octet-stream"
},
"payload": {
"file": {
"FN_File": "Evidencia_COD_DMANSUPIMPA2-605.docx",
"DN_File": "UEsDBBQABgAIAAAAIQBkdsOlw57DhwEAAMOKCQAAEwAIAltD..."
}
}
}
Descrição dos campos:
| |
| RowErrors | Temp-table | OUTPUT | Informações sobre os erros ocorridos durante a busca dos códigos dos anexos. | |
Retorno | Retorna informações de nome e conteúdo do anexo que está sendo feito download ou erros ocorridos durante o processo. | |||
| pi-delete-v1 | ||||
Requisito | Nenhum. | |||
Descrição | Repassa os parâmetros recebidos pela API de comunicação (cdp/api/v1/supplyDocuments) para a API de documentos (hubapi/apiDocuments) chamando o método pi-delete-v1. Também realiza validações de restrição dos usuários em relação a menu e processos. Retorna informações relacionadas a exclusão dos anexos. | |||
Parâmetros | Tipo | Input/Output | Descrição | |
oInput | JsonObject | INPUT | Parâmetros para eliminação de anexo individual: pathParams: Informar: o documentId do anexo. Exemplo {
"pathParams": [
"1234"
],
}
Parâmetros para eliminação de anexo em lote: Payload: Informar a relação dos documentId's a serem eliminados: Exemplo [
{"documentId": 552,
{"documentId": 553},
{"documentId": 554}
]
| |
| oOutput | JsonObject | OUTPUT | Informações da exclusão: Não há retorno direto via Output nesse método. Em caso de sucesso na exclusão individual ou lote, será retornado vazio. A montagem do JsonObject e seu retorno ocorrerá na API de comunicações, cdp/api/v1/supplyDocuments com base no conteúdo vindo da temp-table RowErrors. Caso não haja nenhum erro na exclusão dos anexos, essa api retorna o código 204 (No Content) sem json de retorno. | |
| RowErrors | Temp-table | OUTPUT | Informações sobre os erros ocorridos durante o processo: A temp-table vem populada com registros criados na API de documentos (hubapi/apiDocuments), devido a erros ocorridos durante o processo de exclusão de anexos. Esses registros serão usados para a montagem da mensagem de erro que será retornada via OUTPUT de um JsonObject, na API de comunicação (cdp/api/v1/supplyDocuments), conforme cada caso específico:
Exemplo {
"detailedMessage": "Registro não encontrado na tabela anexo_docto - Id: 553.\n",
"code": "57401",
"message": "Registro não encontrado.",
"type": "error"
}
Exemplo {
"detailedMessage": "Registro não encontrado na tabela anexo_docto - Id: 552.\n",
"code": "57401",
"details": [
{
"detailedMessage": "Registro não encontrado na tabela anexo_docto - Id: 553.\n",
"code": "57401",
"message": "Registro não encontrado.",
"type": "error"
},
{
"detailedMessage": "Registro não encontrado na tabela anexo_docto - Id: 554.\n",
"code": "57401",
"message": "Registro não encontrado.",
"type": "error"
}
],
"message": "Registro não encontrado.",
"type": "error"
}
Exemplo {
"_messages": [
{
"detailedMessage": "Registro não encontrado na tabela anexo_docto - Id: 554.\n",
"code": 57401,
"type": "error",
"message": "Registro não encontrado."
}
],
"idList": "404,637"
}
Para verificar o que significa cada campo, conferir nas temp-tables no final desta documentação:
| |
| ListaIdsExcluidos | Character | OUTPUT | relação dos documentId's que foram eliminados com sucesso. Serão apresentados na mensagem de retorno caso aconteça de ter erros e sucessos em uma mesma eliminação em lote. | |
| Retorno | Erros ocorridos durante a exclusão individual ou em lote identificando qual o documentId com erro na mensagem e a lista dos documentId's dos documentos excluídos com sucesso. | |||
| pi-create-v1 | ||||
Requisito | Nenhum. | |||
Descrição | Repassa os parâmetros recebidos pela API de comunicação (cdp/api/v1/supplyDocuments) para a API de documentos (hubapi/apiDocuments) chamando o método pi-create-v1. Também realiza validações de restrição dos usuários em relação a menu e processos. Retorna informações sobre o anexo criado. | |||
Parâmetros | Tipo | Input/Output | Descrição | |
oInput | JsonObject | INPUT | Parâmetros para criação: Payload: Exemplo {
"processType":1,
"processKey":"12345|10",
"documentName":"testeArquivo.txt",
"documentDescription":"teste de arquivo",
"documentFile": "JC9CVVNJTkVTU0hVQi9Gb250ZXNfRG9jL1N1c3RlbnRhY2FvL1YxMS9WMTEv..."
}
Descrição dos campos do payload:
| |
| oOutput | JsonObject | OUTPUT | Informações do anexo criado: Exemplo {
"items": [
{
"creationUserName": "Super",
"documentDir": "\\\\moitas\\tmp\\ERP\\1\\12345\\10\\3c3bbcd88a4f01fb34fb63ae7f845f6c.txt",
"creationUser": "super",
"documentDescription": "teste de arquivo",
"processKey": "12345|10",
"documentId": 725,
"processType": 1,
"documentName": "testeArquivo.txt",
"documentSize": "74 Bytes",
"processTypeDescription": "Ordem de Compra",
"creationDatetime": "2022-03-29T10:59:46.376"
}
]
}
Para verificar o que significa cada campo conferir no final desta documentação o detalhamento dos campos da temp-table : ttDocumentFile . | |
| RowErrors | Temp-table | OUTPUT | Informações sobre os erros ocorridos durante a criação de arquivo. | |
Retorno | Informações do anexo criado ou erros ocorridos durante o processo. | |||
| pi-valida | ||||
Requisito | Nenhum. | |||
Descrição | Realiza a verificação dos parâmetros passados no queryParams e pathParams dos métodos: pi-query-v1, pi-create-v1, pi-delete-v1 e pi-download-v1, validando se o tipo de processo é um processo válido e existente, caso contrário, a execução do método será interrompida já no começo. | |||
Parâmetros | Tipo | Input/Output | Descrição | |
| cType | Character | INPUT | Identificação do endpoint:
| |
| iDocumentId | Integer | INPUT | Id (campo num-id-docto da tabela arquivo-docto do documento a ser verificado. | |
iProcessType | Integer | INPUT | Tipo do processo vindo da queryParams. Caso não tenha sido passado, e for o endpoint de "create" será retornado um erro. | |
| cProcessKey | Character | INPUT | Chave do processo vindo da queryParams. Caso não tenha sido passado, e for o endpoint de "create" será retornado um erro. | |
| RowErrors | Temp-table | OUTPUT | Informações sobre os erros ocorridos durante o processo. | |
Retorno | Informações sobre os erros ocorridos durante o processo. | |||
| pi-valida-ordem | ||||
Requisito | Nenhum. | |||
Descrição | Realiza a verificação das permissões do usuário logado em relação ao programa de ordens de compra. As validações ocorrem da seguinte forma:
| |||
Parâmetros | Tipo | Input/Output | Descrição | |
| RowErrors | Temp-table | OUTPUT | Informações sobre os erros ocorridos durante o processo. | |
Retorno | Informações sobre os erros ocorridos durante o processo. | |||
Definição de temp-tables:
RowErrors | Entrada/Saída | |||
Temp-table com dados dos erros ocorridos durante o processo | Saída | |||
Atributo | Tipo | Descrição | Obrigatório | Evolução |
ErrorSequence | INTEGER | Número da sequência do erro | Sim | Não se aplica |
ErrorNumber | INTEGER | Código do erro | Sim | Não se aplica |
| ErrorDescription | CHARACTER | Descrição do erro | Não | Não se aplica |
| ErrorParameters | CHARACTER | Parâmetros da mensagem de erro | Não | Não se aplica |
| ErrorType | CHARACTER | Tipo do erro | Não | Não se aplica |
| ErrorHelp | CHARACTER | Texto de ajuda da mensagem de erro | Não | Não se aplica |
| ErrorSubType | CHARACTER | Subtipo do erro | Não | Não se aplica |
ttDocumentFile | Entrada/Saída | ||||
Temp-table com os campos a serem retornados na busca dos documentos do processo. | Saída | ||||
Atributo | Nome no Objeto | Tipo | Descrição | Obrigatório | Evolução |
num_id_docto | documentId | INTEGER | Número do ID do documento | Sim | Não se aplica |
cdn_tipo_processo | processType | INTEGER | Número do tipo do processo | Sim | Não se aplica |
| desc_tipo_proces | processTypeDescription | CHARACTER | Descrição do tipo do processo | Sim | Não se aplica |
| cod_chave_proces | processKey | CHARACTER | Código da chave do processo | Sim | Não se aplica |
| cod_usuar_docto | creationUser | CHARACTER | Código do usuário criador | Sim | Não se aplica |
| nom_usuar_docto | creationUserName | CHARACTER | Nome do usuário criador | Sim | Não se aplica |
| dtm_criac_docto | creationDatetime | DATETIME | Data e hora da criação | Sim | Não se aplica |
| nom_arq_docto | documentName | CHARACTER | Nome do documento | Sim | Não se aplica |
| nom_dir_docto | documentDir | CHARACTER | Caminho do diretório do documento | Sim | Não se aplica |
| ind_tam_docto | documentSize | CHARACTER | Tamanho do documento | Não | Não se aplica |
| des_docto | documentDescription | CHARACTER | Descrição do documento | Não | Não se aplica |