RESTWeb Service REST
Produto: | TOTVS Automação Fiscal |
Versões: | 12.1.23+ |
Este documento tem o objetivo de fornecer informações para utilização do Web Service REST de integração com o TOTVS Automação Fiscal.
Para mais detalhes sobre o conceito de um serviços REST clique aqui.
Para mais detalhes sobre serviços REST na arquitetura Protheus clique aqui.
Índice
Nome: WSTSSSetup
Objetivo: Realizar a configuração do TSS (TOTVS Service SOA) e obter o ID da entidade.
Descrição: Essa interface de integração irá realizar a criação de entidade, configuração do certificado digital e também disponibilizará método para consultar o ID da entidade, de acordo com parâmetros.
Métodos: POST e GET.
A Configuração do serviço REST está documentada no link Configuração REST SERVER - Protheus.
Estas parametrizações estão localizadas fisicamente no arquivo appserver.ini da pasta de instalação "[...]\BIN\APP"
Na seção HTTPURI, a chave PrepareIn deve ser comentada. Segue exemplo de configuração do WS REST para utilização no modulo TAF: [HTTPV11] [HTTPREST] [HTTPURI] [HTTPJOB] [TAF_CFGJOB]
*A chave PrepareIn deve conter o código do Grupo de Empresas(sigamat.emp/syscompany) utilizado no modulo TAF, abaixo exemplos configurações possíveis para as mesmas:
** A chave Instances na seção TAF_CFGJOB é opcional, se a mesma não existir o sistema ira considerar a quantidade de threads declarada na chave instances da seção HTTPURI. Obs: O servidor cria Threads especificas para cada grupo de empresas de acordo com a configuração da chave Instances, por isso essa configuração deve ser realizada considerando a capacidade computacional do servidor. |
Descrição do Método: O método POST segue o conceito do próprio método em qualquer outro tipo de serviço REST, devendo seu conteúdo ser enviado no corpo da mensagem (body) no formato json.
O objetivo do método é configurar uma nova entidade no TSS (TOTVS Service SOA) ou atualizar certificado digital de uma entidade existente.
Atributo | Pai | Nivel | Ocorrência | Formato |
|---|---|---|---|---|
url | - | 1 | 1 | 150 |
registrationType | - | 1 | 1 | Integer(1) |
registrationNumber | - | 1 | 1 | String(14) |
ie | - | 1 | 1 | String(12) |
uf | - | 1 | 1 | String(02) |
countyCode | - | 1 | 1 | String(5) |
companyName | - | 1 | 1 | String(250) |
branchName | - | 1 | 1 | String(250) |
digitalCertificate | - | 1 | 1 | Memo - Base64 |
password | - | 1 | 1 | String(50) |
Os atributos não obrigatórios têm que fazer parte da estrutura, somente o seu preenchimento é opcional. |
Para a utilização de caracteres especiais nos conteúdos dos atributos, é necessário a definição do encode correto no Header das mensagens de todos os métodos. Authorization : Basic ****** Content-Type : application/json;charset=UTF-8 |
Atributo | Pai | Nivel | Ocorrência | Formato |
|---|---|---|---|---|
ticketCode | - | 1 | 0:1 | String(36) |
registryKey | - | 1 | 0:N | - |
| coderr | - | 1 | 0:1 | Int(3) |
| description | - | 1 | 0:1 | String(100) |
key | registryKey | 2 | 1 | String(100) |
success | registryKey | 2 | 1 | boolean(true : false) |
error | registryKey | 2 | 0:N | - |
coderr | error | 3 | 1 | Int(3) |
description | error | 3 | 1 | String(100) |
keyAmount | registryKey | 1 | 0:1 | Int(9999) |
{"ticketCode" : "WIO9753123654789789363655241452363",
"lote": [
{"sourceBranch" : "0100",
"messageType" : "2",
"messageSequential" : "001",
"registryType" : "S-1010",
"registryKey" : "KEYIO7878874854545454998598525",
"integrationMessage": "PGVTb2NpYWw+PGV2dFRhYlJ1YnJpY2EgaWQ9J1MtMTAxMDEzMDUyMDE2MTU0MDE2JyB2ZXJzYW89JzEuMSc+PGlkZUV2ZW50bz48dHBBbWI+MzwvdHBBbWI+PHByb2NFbWk+MTwvcHJvY0VtaT48dmVyUHJvYz48L3ZlclByb2M+PC9pZGVFdmVudG8+PGlkZUVtcHJlZ2Fkb3I+PHRwSW5zYz4xPC90cEluc2M+PG5ySW5zYz41MzExMzc5MTAwMDEyMjwvbnJJbnNjPjwvaWRlRW1wcmVnYWRvcj48aW5mb1J1YnJpY2E+PGFsdGVyYWNhbz48aWRlUnVicmljYT48Y29kUnVicj45OTg8L2NvZFJ1YnI+PGluaVZhbGlkPjIwMTYtMDM8L2luaVZhbGlkPjwvaWRlUnVicmljYT48ZGFkb3NSdWJyaWNhPjxkc2NSdWJyPkJBU0UgUEVOU0FPIFBHVE88L2RzY1J1YnI+PG5hdFJ1YnI+OTk4OTwvbmF0UnVicj48dHBSdWJyPjM8L3RwUnVicj48Y29kSW5jQ1A+MDA8L2NvZEluY0NQPjxjb2RJbmNJUlJGPjAwPC9jb2RJbmNJUlJGPjxjb2RJbmNGR1RTPjAwPC9jb2RJbmNGR1RTPjxjb2RJbmNTSU5EPjAwPC9jb2RJbmNTSU5EPjxyZXBEU1I+TjwvcmVwRFNSPjxyZXAxMz5OPC9yZXAxMz48cmVwRmVyaWFzPk48L3JlcEZlcmlhcz48cmVwUmVzYz5OPC9yZXBSZXNjPjwvZGFkb3NSdWJyaWNhPjwvYWx0ZXJhY2FvPjwvaW5mb1J1YnJpY2E+PC9ldnRUYWJSdWJyaWNhPjwvZVNvY2lhbD4=",
"integrationDate" : "20161210",
"integrationTime": "14:15:22",
"erpowner" : "DATASUL"
},
{"sourceBranch" : "0100",
"messageType" : "2",
"messageSequential" : "001",
"registryType" : "S-2200",
"registryKey" : "KEYYZE7878RE4854545454998598576",
"integrationMessage":
"PGVTb2NpYWw+PGV2dENhZEluaWNpYWwgSWQ9J0lEMTUzMTEzNzkxMDAwMDAwMjAxNjEyMDkxNDU5NTQwMDAwMSc+PGlkZUV2ZW50bz48aW5kUmV0aWY+MTwvaW5kUmV0aWY+PG5yUmVjaWJvPjwvbnJSZWNpYm8+PHRwQW1iPjM8L3RwQW1iPjxwcm9jRW1pPjE8L3Byb2NFbWk+PHZlclByb2M+MS4wPC92ZXJQcm9jPjwvaWRlRXZlbnRvPjxpZGVFbXByZWdhZG9yPjx0cEluc2M+MTwvdHBJbnNjPjxuckluc2M+NTMxMTM3OTE8L25ySW5zYz48L2lkZUVtcHJlZ2Fkb3I+PHRyYWJhbGhhZG9yPjxjcGZUcmFiPjMyMDA5MDM3ODQ2PC9jcGZUcmFiPjxuaXNUcmFiPjEyMjAzNjcxODQ0PC9uaXNUcmFiPjxubVRyYWI+IEdUIFhNQlBFUkhVSlpOQ1FGU0lWTEFPRDwvbm1UcmFiPjxzZXhvPk08L3NleG8+PHJhY2FDb3I+MTwvcmFjYUNvcj48ZXN0Q2l2PjI8L2VzdENpdj48Z3JhdUluc3RyPjwvZ3JhdUluc3RyPjxuYXNjaW1lbnRvPjxkdE5hc2N0bz4xOTc2LTA0LTEzPC9kdE5hc2N0bz48Y29kTXVuaWM+MTIwMDEwNTwvY29kTXVuaWM+PHVmPlNQPC91Zj48cGFpc05hc2N0bz4wMTM8L3BhaXNOYXNjdG8+PHBhaXNOYWM+MDEzPC9wYWlzTmFjPjxubU1hZT5ORVVTQSBDQVJWQUxITyBORVZFUzwvbm1NYWU+PG5tUGFpPkpPU0UgUkVZTkFMRE8gQ1JFU1BPIE5FVkVTPC9ubVBhaT48L25hc2NpbWVudG8+PGRvY3VtZW50b3M+PENUUFM+PG5yQ3Rwcz4wMDAzNTgwMDwvbnJDdHBzPjxzZXJpZUN0cHM+MDAwNzM8L3NlcmllQ3Rwcz48dWZDdHBzPlNQPC91ZkN0cHM+PC9DVFBTPjxSRz48bnJSZz4xNi43MjEuMDMwPC9uclJnPjxvcmdhb0VtaXNzb3I+U1NQPC9vcmdhb0VtaXNzb3I+PGR0RXhwZWQ+MTk4Mi0wMy0wMjwvZHRFeHBlZD48L1JHPjxDTkg+PG5yUmVnQ25oPjAwMDAwMDAwMDA8L25yUmVnQ25oPjx1ZkNuaD48L3VmQ25oPjxkdFZhbGlkPjwvZHRWYWxpZD48Y2F0ZWdvcmlhQ25oPjwvY2F0ZWdvcmlhQ25oPjwvQ05IPjwvZG9jdW1lbnRvcz48ZW5kZXJlY28+PGV4dGVyaW9yPjxwYWlzUmVzaWQ+MDEzPC9wYWlzUmVzaWQ+PGRzY0xvZ3JhZD5BTEJBPC9kc2NMb2dyYWQ+PG5yTG9ncmFkPjE0NDQ8L25yTG9ncmFkPjxiYWlycm8+UFEuIEpBQkFRVUFSQTwvYmFpcnJvPjxubUNpZD5TQU4gTFVJWjwvbm1DaWQ+PGNvZFBvc3RhbD4wNDM0NjAwMDwvY29kUG9zdGFsPjwvZXh0ZXJpb3I+PC9lbmRlcmVjbz48aW5mb0RlZmljaWVuY2lhPjxkZWZGaXNpY2E+TjwvZGVmRmlzaWNhPjxkZWZWaXN1YWw+TjwvZGVmVmlzdWFsPjxkZWZBdWRpdGl2YT5OPC9kZWZBdWRpdGl2YT48ZGVmTWVudGFsPk48L2RlZk1lbnRhbD48ZGVmSW50ZWxlY3R1YWw+TjwvZGVmSW50ZWxlY3R1YWw+PHJlYWJSZWFkYXA+TjwvcmVhYlJlYWRhcD48L2luZm9EZWZpY2llbmNpYT48YXBvc2VudGFkb3JpYT48dHJhYkFwb3NlbnQ+TjwvdHJhYkFwb3NlbnQ+PC9hcG9zZW50YWRvcmlhPjxjb250YXRvPjxmb25lUHJpbmM+MDAxMzQ3MzU1NTUgLzwvZm9uZVByaW5jPjxmb25lQWx0ZXJuYXQ+MDExNzg5Nzk4Nzk4PC9mb25lQWx0ZXJuYXQ+PGVtYWlsQWx0ZXJuYXQ+UkVZTkFMRE9ASE9UTUFJTC5DT008L2VtYWlsQWx0ZXJuYXQ+PC9jb250YXRvPjwvdHJhYmFsaGFkb3I+PHZpbmN1bG8+PG1hdHJpY3VsYT4wMDAwMDAwMDAwMDAwMDAwMDAwNzwvbWF0cmljdWxhPjx0cFJlZ1RyYWI+MTwvdHBSZWdUcmFiPjx0cFJlZ1ByZXY+MTwvdHBSZWdQcmV2PjxpbmZvUmVnaW1lVHJhYj48L2luZm9SZWdpbWVUcmFiPjxpbmZvQ29udHJhdG8+PGNvZENhdGVnPjMwMjwvY29kQ2F0ZWc+PHJlbXVuZXJhY2FvPjx2clNhbEZ4PjEwMDAuMDA8L3ZyU2FsRng+PHVuZFNhbEZpeG8+NTwvdW5kU2FsRml4bz48L3JlbXVuZXJhY2FvPjxkdXJhY2FvPjx0cENvbnRyPjE8L3RwQ29udHI+PC9kdXJhY2FvPjxsb2NhbFRyYWJhbGhvPjwvbG9jYWxUcmFiYWxobz48L2luZm9Db250cmF0bz48L3ZpbmN1bG8+PC9ldnRDYWRJbmljaWFsPjwvZVNvY2lhbD4=",
"integrationDate" : "",
"integrationTime" : "",
"registryPriority" : "0",
"integrationQueue" : "1",
"erpowner" : "DATASUL",
"registryPredecessor" : "KEYIO7878874854545454998598525",
"transferBranch" : "0200",
}
]
} |
{
"ticketCode": "WIO9753123654789789363655241452363",
"registryKey": [
{
"key": "KEYIO7878874854545454998598525",
"success": true
},
{
"key": "KEYYZE7878RE4854545454998598576",
"success": true
}
],
"keyAmount": 2
} |
Descrição do Método: O método GET retorna os status dos registros integrados de acordo com os parâmetros (atributos) enviados na URL.
A Consulta pode combinar parâmetros utilizando a sintaxe “Query String” conforme exemplo abaixo:
http://172.16.31.214:8085/rest/wstafst2?ticketCode=F95975312365478978936365524145236352&RegistryKey=KEYQWE7878RE4854545454998598571&startRecNo=0
| Parâmetro | Descrição | Obrigatório |
|---|---|---|
| ticketCode | TAFTICKET | OC |
| registryKey | TAFKEY | OC |
| startRecNo | RecNo inicial para consulta | O |
| searchMode | Filtro para busca | N |
| sourceBranch | Filial do ERP Emissor | O* |
| queryElements | Habilita Consulta no TSS | N |
lotQuantity | Limita a quantidade de registros retornados |
Atributo | Pai | Nivel | Ocorrência | Formato |
|---|---|---|---|---|
type | - | 1 | 1 | - |
code | - | 1 | 1:N | String(36-100) |
Items | - | 1 | 1 | - |
success | Items | 2 | 1 | boolean(true : false) |
proccessed | Items | 2 | 1 | boolean(true : false) |
description | Items | 2 | 1 | String(100) |
registryKey | Items | 2 | 0:1 | String(100) |
ticketCode | Items | 2 | 0:1 | String(36) |
errorCode | Items | 2 | 0:1 | String(6) |
errorDescription | Items | 2 | 0:1 | String(60) |
errorDetail | Items | 2 | 0:1 | String(220) |
statusCode | Items | 2 | 0:1 | String(1) |
statusDescription | Items | 2 | 0:1 | String(25) |
active | Items | 2 | 0:1 | boolean(true : false) |
| registryPriority | Items | 2 | 0:1 | String(1) |
| integrationQueue | Items | 2 | 0:1 | String(1) |
| streamingErrors | Items | 3 | 0:1 | - |
| streamingErrorCode | streamingErrors | 3 | 0:1 | String(6) |
| streamingErrorDetail | streamingErrors | 3 | 0:1 | String(220) |
| lastRecNo | - | 1 | 1 | Int(9999) |
| maxRecNo | - | 1 | 1 | Int(9999) |
Exemplos de requisição utilizando o método GET:
Request:
http://172.16.31.214:8085/rest/wstafst2?ticketCode=WIO9753123654789789363655241452363&startRecNo=0
{
"type": "ticketCode",
"code": "WIO9753123654789789363655241452363",
"items": [
{
"success": true,
"proccessed": false,
"description": "Aguardando Processamento.",
"registryKey": "KEYIO7878874854545454998598525",
"errorCode": "",
"errorDescription": "",
"errorDetail": ""
},
{
"success": true,
"proccessed": false,
"description": "Aguardando Processamento.",
"registryKey": "KEYYZE7878RE4854545454998598576",
"errorCode": "",
"errorDescription": "",
"errorDetail": ""
}
],
"lastRecNo": 82,
"maxRecNo": 82
} |
{
"type": "ticketCode",
"code": "WIO9753123654789789363655241452363",
"items": [
{
"success": true,
"proccessed": false,
"description": "Registro Inconsistente.",
"registryKey": "KEYIO7878874854545454998598525",
"errorCode": "000007",
"errorDescription": "A operacao solicitada no XML esta em desacordo com o cenario do registro na base do TAF",
"errorDetail": ""
},
{
"success": true,
"proccessed": true,
"description": "Registro Processado.",
"registryKey": "KEYYZE7878RE4854545454998598576",
"statusCode": " ",
"statusDescription": "Registro Integrado",
"active": true
}
],
"lastRecNo": 82,
"maxRecNo": 82
} |
Observação: O exemplo acima contem os 2 tipos de retorno possíveis para um TAFKEY, o atributo proccessed define se vão ser apresentados os atributos de Erro ou de Sucesso conforme descrito acima na tabela de estrutura da resposta do método GET.
Request:
http://172.16.31.214:8085/rest/wstafst2?ticketCode=WIO9753123654789789363655241452363&RegistryKey=KEYYZE7878RE4854545454998598576&startRecNo=0
{
"type": "ticketCode",
"code": "WIO9753123654789789363655241452363",
"items": [
{
"success": true,
"proccessed": false,
"description": "Aguardando Processamento do Job2.",
"registryKey": "KEYYZE7878RE4854545454998598576",
"errorCode": "",
"errorDescription": "",
"errorDetail": ""
}
],
"lastRecNo": 81,
"maxRecNo": 81
} |
Quando a consulta for por ticketCode + registryKey o retorno será agrupado por ticketCode. |
Request:
http://172.16.31.214:8085/rest/wstafst2?registryKey=KEYYZE7878RE4854545454998598576&startRecNo=0
{
"type": "registryKey",
"code": "KEYYZE7878RE4854545454998598576",
"items": [
{
"success": true,
"proccessed": false,
"description": "Aguardando Processamento do Job2.",
"ticketCode": "WIO9753123654789789363655241452363",
"errorCode": "",
"errorDescription": "",
"errorDetail": ""
}
],
"lastRecNo": 80,
"maxRecNo": 80
} |
Quando o retorno de uma requisição ultrapassa o valor de 850 Kb a mensagem de resposta é "quebrada" e retornada com o conteúdo até então incrementado, exemplo:
{
"type": "ticketCode",
"code": "WIO9753123654789789363655241452363",
"items": [
{
"success": true,
"proccessed": false,
"description": "Aguardando Processamento",
"registryKey": "KEYIO7878874854545454998598525",
"errorCode": "",
"errorDescription": "",
"errorDetail": ""
},
*
*
*
{several items}
*
*
*
{
"success": true,
"proccessed": false,
"description": "Aguardando Processamento",
"registryKey": "KEYQIU7878RE4854545454998598544",
"errorCode": "",
"errorDescription": "",
"errorDetail": ""
}
],
"lastRecNo": 150,
"maxRecNo": 322
} |
No exemplo acima a consulta retornou até o registro 150, sendo que o registro com maior RecNo pertencente a consulta é o 322, isso não quer dizer que foram retornados 150 registros e que faltam 172, o RecNo apenas informa a sequencia do registro na tabela TAFST2 porém o lastRecNo menor que o maxRecNo indica que ainda existem registro a serem retornados para a chave requisitada. Para o retorno dos demais registros deve-se realizar uma nova requisição com o startRecNo igual a lastRecNo + 1, este procedimento deve ser adotado até que o lastRecNo seja igual ao maxRecNo conforme exemplo abaixo:
Request:
http://172.16.31.214:8085/rest/wstafst2?ticketCode=WIO9753123654789789363655241452363&startRecNo=151
{
"type": "ticketCode",
"code": "WIO9753123654789789363655241452363",
"items": [
{
"success": true,
"proccessed": false,
"description": "Aguardando Processamento",
"registryKey": "KEYIO7878874854545454998598888",
"errorCode": "",
"errorDescription": "",
"errorDetail": ""
},
*
*
*
{several items}
*
*
*
{
"success": true,
"proccessed": false,
"description": "Aguardando Processamento",
"registryKey": "KEYQIU7878RE4854545454998598987",
"errorCode": "",
"errorDescription": "",
"errorDetail": ""
}
],
"lastRecNo": 322,
"maxRecNo": 322
} |
803 – TAFFIL não encontrado no complemento de empresas.
No método POST caso o primeiro item do lote não esteja com o TAFFIL cadastrado no complemento de empresas o sistema irá rejeitar o lote inteiro, caso contrario é realizado uma avaliação item a item verificando se a filial é válida e se pertence ao mesmo grupo de empresas no TAF, neste caso é rejeitado somente os registros inválidos dentro do lote. |
Legenda:
# - valor variável.
{
"coderr": 803,
"description": "O valor do campo sourceBranch (TAFFIL) não está no cadastro no complemento de empresas."
} |
{
"ticketCode": "WIO9753123654789789363655241452363",
"registryKey": [
{
"key": "KEYIO7878874854545454998598525",
"success": false,
"error": [
{
"coderr": 801,
"description": "Campo TAFFIL (sourceBranch) e Obrigatorio."
},
{
"coderr": 803,
"description": "O valor do campo TAFFIL (sourceBranch) nao esta cadastro no complemento de empresas."
}
{
"coderr": 805,
"description": "Codigo de Prioridade invalido! Codigo enviado: '8'. Codigos validos: 0 - Urgente, 1 - Prioridade Critica, 2 - Prioridade Alta, 3 - Prioridade Media, 4 - Prioridade Baixa, 5 - Nao Prioritario"
}
]
},
{
"key": "KEYYZE7878RE4854545454998598576",
"success": true
},
{
"key": "KEYQWE7878RE4854545454998598571",
"success": true
},
{
"key": "KEYQIU7878RE4854545454998598544",
"success": true
}
],
"keyAmount": 4
} |
RESTFAULT*
Apesar do código de erro iniciar com 7 o status HTTP de um request que submetido a RestFault é 500 - Erro Interno no Servidor. |

*Será liberado juntamente com o pacote de atualização e-Social 2.4.