Este documento é material de especificação dos requisitos de inovação, trata-se de conteúdo extremamente técnico. |
---|
(Obrigatório)
Informações Gerais
Especificação | |||
Produto | Protheus | Módulo | SIGAPCP |
Segmento Executor |
| ||
Projeto1 | M_MAN_PCP001 | IRM1 | PCREQ-367 |
Requisito1 | PCREQ-6132 | Subtarefa1 |
|
Chamado2 |
| ||
Release de Entrega Planejada | 12.1.10 | Réplica | 11.80.14 |
País | (x ) Brasil ( ) Argentina ( ) Mexico ( ) Chile ( ) Paraguai ( ) Equador ( ) USA ( ) Colombia ( ) Outro _____________. | ||
Outros | <Caso necessário informe outras referências que sejam pertinentes a esta especificação. Exemplo: links de outros documentos ou subtarefas relacionadas>. |
Legenda: 1 – Inovação 2 – Manutenção (Os demais campos devem ser preenchidos para ambos os processos).
Objetivo
Desenvolver funções ( adapters ) que serão executadas nas rotinas de cadastro de itens, cadastro de local de estoque, cadastro de recurso, cadastro de centro de trabalho, rotinas de inclusão ordens de produção ( cadastro manual e MRP), para que os dados sejam enviados via mensagem XML ao PCFactory. O envio das mensagens se dará via WEBSERVICE.
<Nesta etapa informar o objetivo da especificação do requisito, ou seja, o que a funcionalidade deve fazer. Exemplo: Permitir que o usuário defina o percentual mínimo em espécie (dinheiro), a referência mínima para calculo dos débitos do aluno e o período de validade do parâmetro de negociação>.
(Obrigatório)
Definição da Regra de Negócio
Desenvolver rotinas para realizar o envio dos dados do Protheus para o PCFactory usando Adapters que irão gerar os XML´s que serão enviados ao Webservice da PPi MultTask.
O projetos está divido em 3 fases. Nesta primeira fase de desenvolvimento serão integrados os seguintes dados :
- Cadastro de Itens
- Cadastro de Local de Estoque ( depósitos)
- Cadastro de Recurso (Cadastro de Centro de Trabalho)
- Ordens de produção ( Operações, Roteiros, Componentes )
A integração entre os dois sistemas ocorrerá utilizando o conceito de troca de mensagens XML trafegadas sobre o protocolo HTTP ou HTTPS – com o uso do padrão SOAP (WebServices). Em seguida, deverá enviar para o Webservice disponibilizado pelo PCFactory (software MES da PPI Multitask), caracterizando o envio como síncrono.
Conforme o padrão da TOTVS, todas as mensagens trafegadas usarão o conceito de Mensagem Única – sob o layout da TOTVSMessage (que pode ser conferido em $/STABLE/xmlschema/general/totvsmsg.xsd).
Segue regra de envio (TOTVS-> PPI) usada para todos os arquivos(utilizando o exemplo do cadastro de produto):
- No momento do <Enter> na criação, alteração ou exclusão de um Item, o WebService será avisado de forma síncrona antes da efetivação no próprio TOTVS.
- O PC Factory, ao receber a mensagem já irá executar a rotina de efetivação no mesmo momento, permitindo retornar ao TOTVS se o ITEM foi incluído, alterado ou excluído com sucesso ou se há alguma inconsistência de negócio.
- Caso não ocorra erro, o procedimento é concluído e a sessão do usuário já é liberada.
Em caso de exceção (erros de transporte ou inconsistências de negócio), o usuário será avisado no mesmo momento que o ITEM não foi efetivado no PC Factory, detalhando qual foi a causa do problema, e permitirá ao usuário tomar 2 ações:
- Ignorar o erro (Tratar mais tarde) – o Item é efetivado no ERP, porém será gerada uma pendência de integração em banco de dados(Protheus) , para que um usuário responsável consiga visualizar as informações que não foram enviadas e possa tomar alguma ação sobre ela(controle de pendências).
- Cancelar processo – O Item não é efetivado no ERP, permitindo ajustes do próprio usuário e após isso ele poderá refazer sua alteração.
- Exportar o XML e gerar dados da tabela de integração tanto da transação com erro como da transação OK, respeitando o padrão estabelecido no item 1.2.4.
Obs.: Dados da ordem de produção seguirão outro procedimento, não tendo ações após o envio dos dados ao PC-Factory.
Abaixo vamos detalhar o envio de cada mensagem. A criação/alteração dos adpaters bem como a alteração dos pontos de geração e alteração dos dados que deverão startar o envio das mensagens.
Mensagens TOTVS enviadas:
1 - Item
O cadastro de itens é o MATA010. Gera a tabela SB1.
A Mensagem utilizada será: Item_3_002
1.1 Mensagem:
A mensagem possui vários tags, porém serão usadas algumas para o PCFactory:
Bloco | Tag | Descrição | Observação |
BusinessContentType | CompanyId | Empresa | |
BusinessContentType | BranchId | Filial | |
BusinessContentType | CompanyInternalId | Empresa+Filial | |
BusinessContentType | Code | Código do item | SB1.B1_COD |
BusinessContentType | Name | Descrição do item | SB1.B1_DESC |
BusinessContentType | ShortName | Nome curto | SB1.B1_DESC |
BusinessContentType | Active | Item ativo? | SB1.B1_ATIVO |
BusinessContentType | UnitOfMeasureCode | Unidade de Medida | SB1.B1_UM |
BusinessContentType | EconomicLot | Lote econômico | SB1.B1_LE |
BusinessContentType | MinimumLot | Lote mínimo | SB1.B1_LM |
BusinessContentType | FamilyCode | Família | SB1.B1_FPCOD |
BusinessContentType | FamilyDescription | Descrição da família | SYC.YC_NOME |
BusinessContentType | SecondUnitOfMeasureCode | Segunda Unidade de medida | SB1.B1_SEGUM |
BusinessContentType | MultiplicationFactorValue | Fator de conversão | SB1.B1_CONV |
BusinessContentType | ProductType | Tipo do Item | SB1.B1_TIPO |
BusinessContentType | PackingQuantity | Quantidade Embalagem | SB1.B1_QE |
BusinessContentType | CostCenterCode | Centro de Custo | SB1.B1_CC |
Algumas tags deverão ser geradas somente quando usa integração com o PC-Factory(atualmente não são geradas):
- Detail: Especificação do item. Gerar em branco. <Detail/>
- MultipleLot: Lote múltiplo do item. Não tem no Protheus. Gerar 0.
<MultipleLot>0</MultipleLot>
-CostCenterCode: Centro de custo.
- PackingQuantity: Quantidade da embalagem.
As demais tags continuam sendo geradas normalmente.
1.2 Alterações necessárias:
1.2.1 MATA010
O cadastro de itens já executa função que gera XML padrão TOTVS e integra com o EAI. Atualmente executa o Adapter MATi010.
Será alterado o cadastro de itens para que também execute o adapter quando a integração com o PPI MultTask estiver ativa.
Para ativar o MATI010 é verificado se existe cadastrado nas rotinas do EAI usando a variável abaixo:
Local lIntegDef := FWHasEAI("MATA010",.T.,,.T.)
Para integração Protheus x PC-Factory não será usado o EAI e desta forma a variável lIntegDef não será utilizada. Para não interferir com o processo do EAI,será criada uma função no PCPXfun(com o nome de PCPIntgPPI ) para a verificação de integração com o PC-Factory registrada na tabela SOD, campo OD_ATIVO. O cadastro da SOD é feito pelo PCPA109, parâmetros da integração entre Protheus x PPI.
Obs.: A função PCPXfun(PCPIntgPPI) de verificação será padrão que possa ser utilizada em outras rotinas.
A função IntegDef(que é executada pela FwIntegDef) é chamada de diversos pontos da rotina(Exclusão, Inclusão,Alteração). A IntegDef executa o adapter MATi010. Esta rotina é usada quando o EAI está ativo.
No caso da integração com o PCFactory será necessário executar o MATi010 de outra forma, executando-o antes de comitar os dados no banco, pois só poderá comitar se a integração for concluída com sucesso ou por geração de pendência.
Inclusão e Alteração - A010TudoOk:
Quando incluir deverá executar a integração diretamente na função A010TudoOk. Somente efetivar a inclusão se ocorrer a integração(ver item 1.2.4)
..........
If lRet .AND. <PCPIntgPPI >
aRet := MATI010(cXml, nTypeTrans, cTypeMessage)
<função para enviar o XML para o WebService da PPI e recuperar o retorno>
Se o retorno for positivo poderá prosseguir com a inclusão/alteração e geração do XML nos diretórios correspondentes.
<função para gerar o XML nos diretórios>
<função para gerar tabela de integração SOF>
EndIf
RestArea(aArea)
Return(lRet)
...............
Exclusão - Static Function A010Deleta:
Após realizar as validações, que possibilitam a exclusão, antes de iniciar a transação Begin Transaction deverá executar a integração com o PPI. Somente efetivar a exclusão se ocorrer a integração(ver item 1.2.4).
.........
If !lPodeApagar
Exit
Endif
If <PCPIntgPPI > Then
aRet := MATI010(cXml, nTypeTrans, cTypeMessage)
<função para enviar o XML para o WebService da PPI e recuperar o retorno>
Se o retorno for positivo poderá prosseguir com a exclusão e geração do XML nos diretórios correspondentes.
<função para gerar o XML nos diretórios>
<função para gerar tabela de integração SOF>
End if
Begin Transaction
..........
Deverá ser enviado os seguintes parâmetros para o MATI010 quando integração com pc-factory:
cXml =
nTypeTrans = TRANS_SEND
cTypeMessage = EAI_MESSAGE_BUSINESS
1.2.2 Function MATi010
A função MATI010 é a rotina responsável por gerar o XML.
Será usada a mesma função, sendo necessário algumas adequações. Alterar a Function MATI010(cXml, nTypeTrans, cTypeMessage)
........
ElseIf nTypeTrans == TRANS_SEND
IF <integraçao-pc_factory>
//Fixo 2. Na fase 2 deverá cadastrar a versão na rotina de parâmetros
cVersao := "2"
ELSE
dbSelectArea('XX4')
aAreaXX4 := XX4->(GetArea())
XX4->(dbSetOrder(1))
IF XX4->(dbSeek(Xfilial('XX4') + PADR('MATA010', Len(XX4_ROTINA)) + PADR('ITEM', Len(XX4_MODEL))))
If Empty(XX4->XX4_SNDVER)
lRet := .F.
cXmlRet := STR0008 //"Versão não informada no cadastro do adapter."
Return {lRet, cXmlRet}
Else
cVersao := StrTokArr(XX4->XX4_SNDVER, ".")[1]
EndIf
Else
lRet := .F.
cXmlRet := STR0009 //"Adapter não encontrado!"
Return {lRet, cXmlRet}
Endif
..................
1.2.3 Function v2000
Na função Static Function v2000, deverá fazer algumas validações pois a função é executada via EAI e também passará a ser executada via integração com o PCFactory.
Geração do LOG (verificar em todos os pontos - somente no envio da mensagem):
IIf(lLog, AdpLogEAI(1, "MATI010", nTypeTrans, cTypeMessage, cXML), ConOut(STR0011)) //"Atualize o UPDINT01.prw para utilizar o log"
Quando a execução for via integração com o pc-factory <integraçao-pc_factory> não irá gerar o LOG.
Na montagem do XML a rotina gera a partir do BusinessEvent (que fica dentro da tag BusinessMessage). Para integração com PCFactory deverá montar o cabeçalho da mensagem que consta com as tags TOTVSMessage e MessageInformation.
Abaixo modelo(seguindo padrão de integração entre PCFactory a Datasul):
<?xml version="1.0" encoding="UTF-8" ?>
<TOTVSMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xmlschema/general/events/Item_3_001.xsd">
<MessageInformation version="3.001">
<UUID>d97aeb6f-1440-8c81-fc13-ec8cf87b82ad</UUID>
<Type>BusinessMessage</Type>
<Transaction>Item</Transaction>
<StandardVersion>1.0</StandardVersion>
<SourceApplication>dts11cordas8480</SourceApplication>
<CompanyId>10</CompanyId>
<BranchId>10</BranchId>
<UserId>xxx</UserId>
<Product name="Datasul" version="11.5.X"/>
<GeneratedOn>2015-07-10T16:25:21.971-03:00</GeneratedOn>
<ContextName>PROTHEUS</ContextName>
<DeliveryType>Sync</DeliveryType>
</MessageInformation>
<BusinessMessage>
<BusinessEvent>
......................
</BusinessEvent>
....................
....................
<\BusinessMessage>
Onde:
- TOTVSMessage xmlns:xsi Indica o xsd para gerarção do XML. Usar o conteúdo do modelo.
- MessageInformation version Indica a versão da mensagem. Usar “3.001”
- UUID : Sequencial usado pelo EAI. Gerar fixo “1’.
- Type: Tipo da mensagem. Gerar fixo “BusinessMessage”
- Transaction: Indica o que está sendo enviado. Gerar fixo “Item”
- StandardVersion: Versão. Gerar fixo “1.0”
- SourceApplication: Aplicação que está executando. Gerar fixo “SIGAPCP”
- CompanyId: Código da empresa. Empresa que estiver logada
- BranchId: Código da filial. Filial logada.
- UserId: Usuário. Usuário logado.
- Product: Nome do produto. Name = “MATA010” version = versão do programa.
- GenerateOn = Data e hora da geração da mensagem
- ContextName = Protheus
- DeliveryType:Tipo de envio da mensagem. Gerar fixo “Sync”.
Dentro do BusinessMessage existe o bloco BusinessEvent com as seguintes tags:
<BusinessEvent>
<Entity>Item</Entity>
<Event>upsert</Event>
<Identification>
<key name="Code">651140049</key>
</Identification>
</BusinessEvent>
Onde:
- Entity: Entidade . Gerar fixo “Item”
- Event: Inclusão/Alteração ou exclusão. Pode ser ‘delete’ ou ‘upsert’
- Identification: Identificação do item.
Usar key name="InternalID" : Esta gerando com a empresa, filial e código do item.
Dentro do BusinessMessage existe o bloco BusinessContent, que contém os dados do item. Está gerando o XML com muitas informações que não serão usadas pela integração. Pode continuar gerando.
Somente deve gerar os campos necessários conforme descrito no item 1.1
1.2.4 Filtros, geração do XML, execução do WeService PPI e tabela para registrar a mensagem (XML)
O que desenvolver:
a)Alterar a função PCPXfun, criando a PCPXmLPPI - função para gerar fisicamente os XML com nome e diretório correspondente.
b)Alterar função PCPXfun, criando a função PCPWebsPPI - função para enviar o XML para o Webservice da PPI e recuperar o retorno.
c)Criar a PCPCriaSOF, que será uma função genérica para gerar a SOF de qualquer rotina.
Exemplo do item 1.2.1
If lRet .AND. <PCPIntgPPI >
aRet := MATI010(cXml, nTypeTrans, cTypeMessage)
<função para enviar o XML para o WebService da PPI e recuperar o retorno>
Se o retorno for positivo poderá prosseguir com a operação e geração do XML nos diretórios correspondentes.
<função para gerar o XML nos diretórios>
<função para gerar tabela de integração SOF>
EndIf
Regras:
No cadastro de parâmetros PCPA109, é definido se gera o arquivo XML nos diretórios. Quando este indicador, OD_GERAXML, estiver como 2 ('N') não será gravado o arquivo XML nos diretórios correspondentes. Será gravado apenas o conteúdo em tabela (SOF).
Caso o indicador , OD_GERAXML, estiver como 1('S') deverá seguir a seguinte regra de geração:
- Processados com sucesso : XML processado pelo PPI com retorno do PCFactory OK.
XML será gravado no diretório cadastrado no campo Enviados(OD_DIRENV) do PCA109.
- Processados sem sucesso : XML processado pelo PPI com retorno de ERRO pelo PCFactory ou WebService desligado ( não conseguiu enviar o XML).
XML será gravado no diretório definido no campo Pendência (OD_DIRPEND) do PCA109. Neste caso, como o retorno do PCFactory será impeditivo para o commit do registro, deverá ser questionado se deseja salvar no Protheus mesmo com o erro/pendência no PCFactory(neste caso sempre deve exibir a mensagem de erro, retornada pelo PCFactory, que impossibilitou a integração).
Em caso do usuário confirmar a operação no Protheus, a rotina deverá salvar o item para que depois seja realizada a integração via programa de controle de pendências. Nesta situação será gravado um arquivo de ERRO ou PEND conforme a situação que impossibilitou o envio ao PCFactory. Em caso do usuário não confirmar a operação, poderá fazer os ajustes para o reenvio de dados ou o cancelamento da operação ( sem commit e sem integração).
Em ambos os casos(sucesso ou erro/pendencia), ocorrendo o commit, será gerada a tabela SOF.
Importante: Os arquivos XML´s gerados e dados da tabela SOF somente serão gerados se a inclusão/alteração/exclusão do item for comitada no banco, conforme descrito no item 1.2.1.
Os nomes do arquivos seguirão o seguinte padrão:
OK_<MSG>_<DATAHORA>_<REGISTRO>
PEND_<MSG>_<DATAHORA>_<REGISTRO>
ERR_<MSG>_<DATAHORA>_<REGISTRO>
Onde: OK - Se mensagem entregue sem problemas
PEND- Se mensagem não foi enviada
ERR - Se mensagem enviada, porém retornou erro.
MSG - ITEM
DATAHORA: Data e Hora do envio
REGISTRO: Código do item que está sendo enviado.
A tabela SOF conterá os seguintes campos:
- Transação : Nome da tabela ( SB1)
- Registro : código do item
- Status: 1 - OK; 2 - Pend; 3 - Erro
- Gerou XML : Sim ou não
- Nome arquivo XML
- Data Envio
- Hora de envio
- Usuário
- Mensagem de retorno do PCFactory
- Xml : Conteúdo do XML
- Programa: Rotina que gerou o registro
- Data Reprocessamento : Quando reprocessado pela rotina de pendências
- Hora Reprocessamento : Quando reprocessado pela rotina de pendências
IMPORTANTE:
Só poderá ter uma pendência para o registro.
Para gerar o XML e gravar a tabela SOF terá que respeitar as pendencias geradas. Se existir uma pendência de envio de algum registro e for gerada uma nova mensagem para o mesmo registro a pendencia deverá ser excluída e trabalhar somente com a última mensagem, que poderá ser enviada sem problemas ou gerar nova pendência.
Obs.: Mais informações verificar a especificação ER_PCREQ-6129_PPI_MultTask_Parametros
Filtros:
No PCPA109 são definidos os filtros que indicam quais registros serão enviados ao PCFactory.
No caso do item, deverá ler os dados da tabelas SOE onde o campo OE_TABELA seja = 'SB1'. O campo OE_FILTRO conterá o filtro que deverá ser aplicado ao registro que está sendo enviado. Somente poderá enviar(gerar xml) se satisfazer a condição do PCPA109.
Deverá alterar a função no PCPXfun, criando a PCPFiltPPI ( fará o filtro de todas as tabelas que são integradas com o PCFactory).
Essa função irá receber como parâmetro o nome da tabela. No caso do cadastro de item será enviado SB1 como parâmetro. Deverá ser executada no MATi010,.no mesmo ponto onde verifica a versão. Somente executa se for integração via PCFactory.
A função irá retornar TRUE se satisfazer a condição, ou seja, o item pode ser enviado e false caso o item não satisfaça.
Obs.: Se não existir filtro na SOE , OE_FILTRO, enviará todos os registros, ou seja, a função sempre retornará TRUE.
........
ElseIf nTypeTrans == TRANS_SEND
IF <integraçao-pc_factory>
//Fixo 2. Na fase 2 deverá cadastrar a versão na rotina de parâmetros
cVersao := "2"
lRetorna := PCPFiltPPI('SB1')
IF Not lRetorna THEN Return
ELSE
......................
2 - Local de Estoque
O cadastro de Local de Estoque é o AGRA045. Gera a tabela NNR.
A Mensagem utilizada será: Wharehouse_1_001.
Obs.: Detalhamento já considerando as alterações da função PCPXfun (PCPintgPPI, PCPFiltPPI,PCPXmlPPI,PCPCriaSOF,PCPWebsPPI) detalhadas no item 1 - Integração do item.
2.1 Mensagem:
A mensagem possui vários tags, porém serão usadas algumas para o PCFactory:
Bloco | Tag | Descrição | Observação |
BusinessContentType | CompanyId | Código da Empresa | |
BusinessContentType | BranchId | Código da Filial | |
BusinessContentType | CompanyInternalId | InternalId da chave completa de empresa | |
BusinessContentType | Code | Código do Local de Estoque(armazém/almoxarifado/depósito) | NNR.NNR_CODIGO |
BusinessContentType | InternalId | InternalId do Code | |
BusinessContentType | Description | Descrição do Local de Estoque(armazém/almoxarifado/depósito) | NNR.NNR_DESCRI |
BusinessContentType | Active | Local de Estoque Ativo? | true |
BusinessContentType | Type | Tipo do Local de Estoque | NNR.NNR_TIPO |
As tags abaixo não serão usadas pela integração, porém serão geradas em branco:
Bloco | Tag | Descrição | Observação |
BusinessContentType | IsFinalItem | Local de Estoque é de produto acabado? | |
BusinessContentType | IsQualityControl | Local de Estoque é de controle de qualidade? | |
BusinessContentType | IsProcess | Local de Estoque é de processo? | |
BusinessContentType | IsWaste | Local de Estoque é de rejeito? | |
BusinessContentType | IsRecycled | Local de Estoque é de reciclado? | |
BusinessContentType | IsBalanceAvailable | Considera o saldo do Local de Estoque como disponível para utilização. |
2.2 Alterações Necessárias
2.2.1 AGRA045
A rotina deverá ser alterada para executar o ADAPTER - AGRI045. O AGRA045 no momento de incluir, modificar ou excluir deverá verificar se existe integração com o PCFactory e em existindo deverá enviar a solicitação via AGRI045.
Alterar a função AGRA045B, função que faz o tratamento em inclusões, exclusões e modificações. Ao final deverá verificar se possui integração com PCFactory. Se existir executar a geração do XML e envio para o PPI.
If lRet .And. PCPIntgPPI()
lRet := AGRA045PPI(nOpc)
EndIf
Criar a função AGRA045PPI.
Nesta função deverá executar a geração.
aRet := AGRI045(cXml, nTypeTrans, cTypeMessage)
<função para enviar o XML para o WebService da PPI e recuperar o retorno> : PCPWebsPPI
Se o retorno for positivo poderá prosseguir com a inclusão/alteração e geração do XML nos diretórios correspondentes.
<função para gerar o XML nos diretórios> : PCPXmlPPI
<função para gerar tabela de integração SOF> : PCPCriaSOF
..............
Deverá ser enviado os seguintes parâmetros para o AGRI045 quando integração com pc-factory:
cXml =
nTypeTrans = TRANS_SEND
cTypeMessage = EAI_MESSAGE_BUSINES
2.2.2 Function AGRI045
A função AGRI045 é a rotina responsável por gerar o XML. Será usada a mesma função, sendo necessário algumas adequações.
Cabeçalho:
Quando for executado via integração com PCFactory deverá montar o cabeçalho da mensagem que consta com as tags TOTVSMessage e MessageInformation.
Abaixo modelo(o BusinessEvent o adapter está gerando):
<?xml version="1.0" encoding="UTF-8" ?>
<TOTVSMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="xmlschema/general/events/Warehouse_1_001.xsd">
<MessageInformation version="1.001">
<UUID>d97aeb6f-1440-8c81-fc13-ec8cf87b82ad</UUID>
<Type>BusinessMessage</Type>
<Transaction>Warehouse</Transaction>
<StandardVersion>1.0</StandardVersion>
<SourceApplication>dts11cordas8480</SourceApplication>
<CompanyId>10</CompanyId>
<BranchId>10</BranchId>
<UserId>xxx</UserId>
<Product name="Datasul" version="11.5.X"/>
<GeneratedOn>2015-07-10T16:25:21.971-03:00</GeneratedOn>
<ContextName>PROTHEUS</ContextName>
<DeliveryType>Sync</DeliveryType>
</MessageInformation>
<BusinessMessage>
<BusinessEvent>
......................
</BusinessEvent>
....................
....................
<\BusinessMessage>
Onde:
TOTVSMessage xmlns:xsi Indica o xsd para gerarção do XML. Usar o conteúdo do modelo.
MessageInformation version Indica a versão da mensagem. Usar “1.001”
UUID : Sequencial usado pelo EAI. Gerar fixo “1’.
Type: Tipo da mensagem. Gerar fixo “BusinessMessage”
Transaction: Indica o que está sendo enviado. Gerar fixo “Item”
StandardVersion: Versão. Gerar fixo “1.0”
SourceApplication: Aplicação que está executando. Gerar fixo “SIGAPCP”
CompanyId: Código da empresa. Empresa que estiver logada
BranchId: Código da filial. Filial logada.
UserId: Usuário. Usuário logado.
Product: Nome do produto. Name = “AGRA045” version = versão do programa.
GenerateOn = Data e hora da geração da mensagem
ContextName = Protheus
DeliveryType:Tipo de envio da mensagem. Gerar fixo “Sync”.
Dentro do BusinessMessage existe o bloco BusinessContent, que contém os dados do local de estoque. Está gerando o XML com muitas informações que não serão usadas pela integração. Pode continuar gerando.
LOG:
Onde executa a geração do Log, não devera´executar se for executada via integração com PCFactory
.....
IF Not PCPIntgPPI() AdpLogEAI(1, "AGRI045", nTypeTrans, cTypeMessage, cXML)
......
A integração somente ocorrerá no envio:
........
ElseIf nTypeTrans == TRANS_SEND
//Verica operação realizada
Do Case
Case oModel:nOperation == MODEL_OPERATION_INSERT
IF Not PCPIntgPPI() AdpLogEAI(4, 3)
cEvent := 'upsert' //Inclusão
Case oModel:nOperation == MODEL_OPERATION_UPDATE
IF Not PCPIntgPPI() AdpLogEAI(4, 4)
cEvent := 'upsert' //Alteração
Case oModel:nOperation == MODEL_OPERATION_DELETE
IF Not PCPIntgPPI() AdpLogEAI(4, 5)
cEvent := 'delete' //Exclusão
EndCase
IF Not PCPIntgPPI() AdpLogEAI(5, "AGRI045", cXMLRet, lRet)
......
Filtros e geração do XML (Seguir o mesmo padrão do item 1.2.4):
No cadastro de parâmetros PCPA109, é definido se gera o arquivo XML nos diretórios. Quando este indicador, OD_GERAXML, estiver como 2('N') não será gravado o arquivo XML nos diretórios correspondentes. Será gravado apenas o conteúdo em tabela (SOF).
Caso o indicador , OD_GERAXML, estiver como 1('S') deverá seguir a seguinte regra de geração:
- Processados com sucesso : XML processado pelo PPI com retorno do PCFactory OK. XML será gravado no diretório cadastrado no campo Enviados(OD_DIRENV) do PCA109.
- Processados sem sucesso : XML processado pelo PPI com retorno de ERRO pelo PCFactory ou WebService desligado ( não conseguiu enviar o XML).
XML será gravado no diretório definido no campo Pendência (OD_DIRPEND) do PCA109. Neste caso, como o retorno do PCFactory será impeditivo para o commit do registro, deverá ser questionado se deseja salvar no Protheus mesmo com o erro/pendência no PCFactory(neste caso sempre deve exibir a mensagem de erro, retornada pelo PCFactory, que impossibilitou a integração).
Em caso do usuário confirmar a operação no Protheus, a rotina deverá salvar o local de estoque para que depois seja realizada a integração via programa de controle de pendências. Nesta situação será gravado um arquivo de ERRO ou PEND conforme a situação que impossibilitou o envio ao PCFactory. Em caso do usuário não confirmar a operação, poderá fazer os ajustes para o reenvio de dados ou o cancelamento da operação ( sem commit e sem integração).
Em ambos os casos(sucesso ou erro/pendencia), ocorrendo o commit, será gerada a tabela SOF.
Importante: Os arquivos XML´s gerados e dados da tabela SOF somente serão gerados se a inclusão/alteração/exclusão do local de estoque for comitada no banco.
Os nomes do arquivos seguirão o seguinte padrão:
OK_<MSG>_<DATAHORA>_<REGISTRO>
PEND_<MSG>_<DATAHORA>_<REGISTRO>
ERR_<MSG>_<DATAHORA>_<REGISTRO>
Onde: OK - Se mensagem entregue sem problemas
PEND- Se mensagem não foi enviada
ERR - Se mensagem enviada, porém retornou erro.
MSG - WAREHOUSE
DATAHORA: Data e Hora do envio
REGISTRO: Código do local de estoque que está sendo enviado.
A tabela SOF conterá os seguintes campos:
Transação : Nome da tabela ( NNR )
Registro : código do local de estoque
Status: 1 - OK; 2 - Pend; 3 - Erro
Gerou XML : Sim ou não
Nome arquivo XML
Data Envio
Hora de envio
Usuário
Mensagem de retorno do PCFactory
Xml : Conteúdo do XML
Programa: Rotina que gerou o registro
Data Reprocessamento : Quando reprocessado pela rotina de pendências
Hora Reprocessamento : Quando reprocessado pela rotina de pendências
IMPORTANTE:
Só poderá ter uma pendência para o registro.
Para gerar o XML e gravar a tabela SOF terá que respeitar as pendencias geradas. Se existir uma pendência de envio de algum registro e for gerada uma nova mensagem para o mesmo registro a pendencia deverá ser excluída e trabalhar somente com a última mensagem, que poderá ser enviada sem problemas ou gerar nova pendência.
Obs.: Mais informações verificar a especificação ER_PCREQ-6129_PPI_MultTask_Parametros
Filtros:
No PCPA109 são definidos os filtros que indicam quais registros serão enviados ao PCFactory.
No caso do local de estoque, deverá ler os dados da tabelas SOE onde o campo OE_TABELA seja = 'NNR'. O campo OE_FILTRO conterá o filtro que deverá ser aplicado ao registro que está sendo enviado. Somente poderá enviar(gerar xml) se satisfazer a condição do PCPA109.
Usar a PCPFiltPPI ( fará o filtro de todas as tabelas que são integradas com o PCFactory).
Essa função irá receber como parâmetro o nome da tabela. No caso do cadastro de local de estoque será enviado NNR como parâmetro.
A função irá retornar TRUE se satisfazer a condição, ou seja, o local de estoque pode ser enviado ou false caso o local de estoque não satisfaça.
Obs.: Se não existir filtro na SOE , OE_FILTRO, enviará todos os registros, ou seja, a função sempre retornará TRUE.
........
Pode ser executada na AGRA045PPI
lRetorna := PCPFiltPPI('SB1')
IF Not lRetorna THEN Return
ELSE
......................
3 - Recurso
O cadastro do Recurso é o MATA610. Gera a tabela SH1
A Mensagem utilizada será: Machine_1_000
Obs.: Detalhamento já considerando as alterações da função PCPXfun (PCPintgPPI, PCPFiltPPI,PCPXmlPPI,PCPCriaSOF,PCPWebsPPI) detalhadas no item 1 - Integração do item.
Obs.: Com o envio do código e descrição do centro de trabalho na mensagem MACHINE não será mais necessário enviar a mensagem WORKCENTER.
3.1 Mensagem:
A mensagem possui vários tags, porém serão usadas algumas para o PCFactory:
Bloco | Tag | Descrição | Observação |
BusinessContentType | Code | Código Máquina | SH1.H1_CODIGO |
BusinessContentType | Description | Descrição Máquina | SH1.H1DESCRI |
BusinessContentType | WorkCenterCode | Código Centro Trabalho | SH1.H1_CTRAB |
BusinessContentType | WorkCenterDescription | Descrição Centro Trabalho | SHB.HB_NOME |
BusinessContentType | CostCenterCode | Código Centro Custo | SH1.H1_CCUST |
3.2 Alterações Necessárias
3.2.1 MATA610
Alterar o MATA610 para executar o ADAPTER - MATI610 no momento de incluir, modificar ou excluir um recurso. Somente executar o MATI610 se existir a integração com o PCFactory.
Criar a função MATA610PPI que deverá ser executada pela função A610PEOK. A função A610PEOK é chamada na inclusão (A610Inclui), alteração (A610Altera) e exclusão(A610Deleta).
........
Na função A610PEOK:
If lRet .And. PCPIntgPPI()
lRet := MATA610PPI()
EndIf
.........
Na função MATA610PPI.
aRet := MATI610(cXml, nTypeTrans, cTypeMessage)
<função para enviar o XML para o WebService da PPI e recuperar o retorno> : PCPWebsPPI
Se o retorno for positivo poderá prosseguir com a inclusão/alteração e geração do XML nos diretórios correspondentes.
<função para gerar o XML nos diretórios> : PCPXmlPPI
<função para gerar tabela de integração SOF> : PCPCriaSOF
..............
Deverá ser enviado os seguintes parâmetros para o MATI610 quando integração com pc-factory:
cXml =
nTypeTrans = TRANS_SEND
cTypeMessage = EAI_MESSAGE_BUSINES
3.2.2 MATI610
Será criado o adapter MATI610, somente para o envio das informações. Deverá usar como base o MATI010, usando a quebra por versão de mensagem. Será desenvolvido somente a parte do envio (SEND)
A função MATI610 será responsável pro gerar o XML.
Cabeçalho:
Quando for executado via integração com PCFactory deverá montar o cabeçalho da mensagem que consta com as tags TOTVSMessage e MessageInformation.
Abaixo modelo:
<?xml version="1.0" encoding="UTF-8" ?>
<TOTVSMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="xmlschema/general/events/Machine_1_000.xsd">
<MessageInformation version="1.000">
<UUID>d97aeb6f-1440-8c81-fc13-ec8cf87b82ad</UUID>
<Type>BusinessMessage</Type>
<Transaction>Machine</Transaction>
<StandardVersion>1.0</StandardVersion>
<SourceApplication>dts11cordas8480</SourceApplication>
<CompanyId>10</CompanyId>
<BranchId>10</BranchId>
<UserId>xxx</UserId>
<Product name="Datasul" version="11.5.X"/>
<GeneratedOn>2015-07-10T16:25:21.971-03:00</GeneratedOn>
<ContextName>PROTHEUS</ContextName>
<DeliveryType>Sync</DeliveryType>
</MessageInformation>
<BusinessMessage>
<BusinessEvent>
......................
</BusinessEvent>
....................
....................
<\BusinessMessage>
Onde:
TOTVSMessage xmlns:xsi Indica o xsd para gerarção do XML. Usar o conteúdo do modelo.
MessageInformation version Indica a versão da mensagem. Usar “1.000”
UUID : Sequencial usado pelo EAI. Gerar fixo “1’.
Type: Tipo da mensagem. Gerar fixo “BusinessMessage”
Transaction: Indica o que está sendo enviado. Gerar fixo “Machine”
StandardVersion: Versão. Gerar fixo “1.0”
SourceApplication: Aplicação que está executando. Gerar fixo “SIGAPCP”
CompanyId: Código da empresa. Empresa que estiver logada
BranchId: Código da filial. Filial logada.
UserId: Usuário. Usuário logado.
Product: Nome do produto. Name = “MATA610” version = versão do programa.
GenerateOn = Data e hora da geração da mensagem
ContextName = Protheus
DeliveryType:Tipo de envio da mensagem. Gerar fixo “Sync”.
Dentro do BusinessMessage existe o bloco BusinessEvent com as seguintes tags:
<BusinessEvent>
<Entity>Machine</Entity>
<Event>upsert</Event>
<Identification>
<key name="InternalId">651140049</key>
</Identification>
</BusinessEvent>
Onde:
Entity: Entidade . Gerar fixo “Machine”
Event: Inclusão/Alteração ou exclusão. Pode ser ‘delete’ ou ‘upsert’
Identification: Identificação do recurso.
Usar key name="InternalID" : gerar com o código do item H1_CODIGO
Dentro do BusinessMessage existe o bloco BusinessContent, que contém os dados do recurso.
A integração somente ocorrerá no envio:
Exemplo:
...................
Static Function v1000(cXml, nTypeTrans, cTypeMessage, oXml)
Local lRet := .T.
Local lLog := .T. //FindFunction("AdpLogEAI")
Local cXMLRet := ""
Local cEvent := ""
Local cEntity := "Machine"
Local aAreaAnt := GetArea()
If !lIntegPPI
IIf(lLog, AdpLogEAI(1, "MATI610", nTypeTrans, cTypeMessage, cXML), ConOut(STR0004)) //"Atualize o UPDINT01.prw para utilizar o log"
EndIf
If nTypeTrans == TRANS_RECEIVE
/*
Mensagem desenvolvida para integração com o PCFactory, e nao possui recebimento.
*/
ElseIf nTypeTrans == TRANS_SEND
.......................
Filtros e geração do XML (Seguir o mesmo padrão do item 1.2.4):
No cadastro de parâmetros PCPA109, é definido se gera o arquivo XML nos diretórios. Quando este indicador, OD_GERAXML, estiver como 2('N') não será gravado o arquivo XML nos diretórios correspondentes. Será gravado apenas o conteúdo em tabela (SOF).
Caso o indicador , OD_GERAXML, estiver como 1('S') deverá seguir a seguinte regra de geração:
- Processados com sucesso : XML processado pelo PPI com retorno do PCFactory OK. XML será gravado no diretório cadastrado no campo Enviados(OD_DIRENV) do PCA109.
- Processados sem sucesso : XML processado pelo PPI com retorno de ERRO pelo PCFactory ou WebService desligado ( não conseguiu enviar o XML).
XML será gravado no diretório definido no campo Pendência (OD_DIRPEND) do PCA109. Neste caso, como o retorno do PCFactory será impeditivo para o commit do registro, deverá ser questionado se deseja salvar no Protheus mesmo com o erro/pendência no PCFactory(neste caso sempre deve exibir a mensagem de erro, retornada pelo PCFactory, que impossibilitou a integração).
Em caso do usuário confirmar a operação no Protheus, a rotina deverá salvar o recurso para que depois seja realizada a integração via programa de controle de pendências. Nesta situação será gravado um arquivo de ERRO ou PEND conforme a situação que impossibilitou o envio ao PCFactory. Em caso do usuário não confirmar a operação, poderá fazer os ajustes para o reenvio de dados ou o cancelamento da operação ( sem commit e sem integração).
Em ambos os casos(sucesso ou erro/pendencia), ocorrendo o commit, será gerada a tabela SOF.
Importante: Os arquivos XML´s gerados e dados da tabela SOF somente serão gerados se a inclusão/alteração/exclusão do recurso for comitada no banco.
Os nomes do arquivos seguirão o seguinte padrão:
OK_<MSG>_<DATAHORA>_<REGISTRO>
PEND_<MSG>_<DATAHORA>_<REGISTRO>
ERR_<MSG>_<DATAHORA>_<REGISTRO>
Onde: OK - Se mensagem entregue sem problemas
PEND- Se mensagem não foi enviada
ERR - Se mensagem enviada, porém retornou erro.
MSG - MACHINE
DATAHORA: Data e Hora do envio
REGISTRO: Código do local de estoque que está sendo enviado.
A tabela SOF conterá os seguintes campos:
Transação : Nome da tabela ( SH1)
Registro : código do recurso
Status: 1 - OK; 2 - Pend; 3 - Erro
Gerou XML : Sim ou não
Nome arquivo XML
Data Envio
Hora de envio
Usuário
Mensagem de retorno do PCFactory
Xml : Conteúdo do XML
Programa: Rotina que gerou o registro
Data Reprocessamento : Quando reprocessado pela rotina de pendências
Hora Reprocessamento : Quando reprocessado pela rotina de pendências
IMPORTANTE:
Só poderá ter uma pendência para o registro.
Para gerar o XML e gravar a tabela SOF terá que respeitar as pendências geradas. Se existir uma pendência de envio de algum registro e for gerada uma nova mensagem para o mesmo registro a pendencia deverá ser excluída e trabalhar somente com a última mensagem, que poderá ser enviada sem problemas ou gerar nova pendência.
Obs.: Mais informações verificar a especificação ER_PCREQ-6129_PPI_MultTask_Parametros
Filtros:
No PCPA109 são definidos os filtros que indicam quais registros serão enviados ao PCFactory.
No caso do recurso, deverá ler os dados da tabelas SOE onde o campo OE_TABELA seja = 'SH1'. O campo OE_FILTRO conterá o filtro que deverá ser aplicado ao registro que está sendo enviado. Somente poderá enviar(gerar xml) se satisfazer a condição do PCPA109.
Usar a PCPFiltPPI ( fará o filtro de todas as tabelas que são integradas com o PCFactory).
Essa função irá receber como parâmetro o nome da tabela.
A função irá retornar TRUE se satisfazer a condição, ou seja, o local de estoque pode ser enviado ou false caso o local de estoque não satisfaça.
Obs.: Se não existir filtro na SOE , OE_FILTRO, enviará todos os registros, ou seja, a função sempre retornará TRUE.
........
4 - Ordens de Produção
O cadastro das ordens de produção é o MATA650. Gera a tabela SC2
A Mensagem utilizada será: ProductionOrder_2_000
4.1 Mensagem
A mensagem possui vários tags, porém serão usadas algumas para o PCFactory:
Bloco | Tag | Descrição | Observação |
BusinessContentType | Number | Número Ordem Produção | SC2.C2_NUM + SC2.C2_ITEM + SC2.C2_SEQUEN |
BusinessContentType | ProductionOrderUniqueID | Identificador único da ordem | Empresa|Filial|OP |
BusinessContentType | ItemCode | Código Item | SC2.C2_PRODUTO |
BusinessContentType | ItemDescription | Descrição Item | SB1.B1_DESC |
BusinessContentType | Type | Tipo da Ordem | Fixo 1 (ordem interna) |
BusinessContentType | Quantity | Quantidade | SC2.C2_QUANT |
BusinessContentType | ReportQuantity | Quantidade Reportada | SC2.C2QUJE |
BusinessContentType | IsStatusOrder | Reporte Fecha Ordem Produção | |
BusinessContentType | UnitOfMeasureCode | Unidade Medida | SC2.C2_UM |
BusinessContentType | RequestOrderCode | Código Pedido Ordem Produção | SC2.C2_PEDIDO |
BusinessContentType | StatusType | Estado |
|
BusinessContentType | StatusOrderType | Estado da ordem | Prevista/Aberta = 1 Iniciada = 6 Ociosa = 9 Encerrada Parcial/Total = 7 |
BusinessContentType | WarehouseCode | Código Depósito | SC2.C2_LOCAL |
BusinessContentType | EndOrderDateTime | Data Fim Ordem Produção CP | SC2.C2_DATPRF |
BusinessContentType | StartOrderDateTime | Data Início Ordem Produção CP | SC2.C2_DATPRI |
BusinessContentType | AbbreviationProviderName | Nome Cliente | SC5.C5_CLIENTE ( SA1.A1_NOME) |
BusinessContentType | CustomerRequestCode | Código Pedido Cliente | |
BusinessContentType | ScriptCode | Código Roteiro | SC2.C2_ROTEIRO |
ListOfActivityOrders | ProductionOrderNumber | Ordem de Produção | OP (NUM+ITEM+SEQUEN) |
ListOfActivityOrders | ActivityID | ID do Registro | RECNO (SG2 ou SHY) |
ListOfActivityOrders | ActivityCode | Código Operação | SG2 (Operacaoes) SGF (Oper x Comp) SHY (Oper x Ordem) |
ListOfActivityOrders | ActivityDescription | Descrição Operação | SG2.G2_DESCRI |
ListOfActivityOrders | ItemCode | Código do item | SC2.C2_PRODUTO |
ListOfActivityOrders | ItemDescription | Descrição do item | SB1.B1_DESC |
ListOfActivityOrders | ActivityType | Tipo Operação | 1 = Executa operação; 2 = Não executa. Protheus passar fixo "1" |
ListOfActivityOrders | WorkCenterCode | Código Centro de Trabalho | SG2 (Operacaoes) SHY (Oper x Ordem) |
ListOfActivityOrders | WorkCenterDescription | Descrição Centro de Trabalho | |
ListOfActivityOrders | UnitTimeType | Tipo Unidade Tempo | Fixo 1 |
ListOfActivityOrders | TimeResource | Tempo Recurso | Tempo para fazer um lote. SG2.G2_TEMPAD |
ListOfActivityOrders | TimeMachine | Tempo Máquina | SG2 (Operacaoes) SHY (Oper x Ordem) Mult. pela qtd da ordem ( tempo para fazer toda a ordem) |
ListOfActivityOrders | TimeSetup | Tempo Preparação | SG2 (Operacaoes) SHY (Oper x Ordem) |
ListOfActivityOrders | ScriptCode | Código Roteiro | SG2 (Operacaoes) SHY (Oper x Ordem) |
ListOfActivityOrders | LaborCode | Código Mão de Obra Direta | MOD+CC |
ListOfActivityOrders | UnitItemNumber | Lote Padrão | Lote Padrão da operação. SG2.G2_LOTEPAD |
ListOfActivityOrders | IsActivityEnd | Última Operação | Na última operação passar TRUE |
ListOfActivityOrders | MachineCode | Código Máquina | SG2_RECURSO ou SHY_RECURSO |
ListOfActivityOrders | StartPlanDateTime | Data/Hora Início Programação | SHY.HY_HORAINI ou SC2.C2_DATPRI |
ListOfActivityOrders | EndPlanDateTime | Data/Hora Fim Programação | SHY.HY_HORAFIM ou SC2.C2_DATPRF |
ListOfActivityOrders | ProductionQuantity | Quantidade a produzir na operação | SHY.HY_QUANT ou SH8.H8_QUANT ou SC2.C2_QUANT |
ListOfActivityOrders | UnitActivityCode | Unidade de medida | SB1.B1_UM |
ListOfActivityOrders | SecondUnitActivityCode | Segunda unidade de medida na operação | |
ListOfActivityOrders | SecondUnitActivityFactor | Fator de conversão para segunda un. na operação | |
ListOfMaterialOrders | ProductionOrderNumber | Ordem de produção | OP (NUM+ITEM+SEQUEN) |
ListOfMaterialOrders | MaterialID | Registro da reserva | RECNO SD4 |
ListOfMaterialOrders | MaterialCode | Código Item Reserva | SD4.D4_COD |
ListOfMaterialOrders | ScriptCode | Código Roteiro | SD4 (a partir do pacote 6) |
ListOfMaterialOrders | ActivityCode | Código Operação | SD4 (a partir do pacote 6) |
ListOfMaterialOrders | WarehouseCode | Código Depósito | SD4.D4_LOCAL |
ListOfMaterialOrders | MaterialDate | Data Reserva | SD4.D4_DATA |
ListOfMaterialOrders | MaterialQuantity | Quantidade Reserva | SD4.D4_QUANT |
4.2 Alterações Necessárias
4.2.1 Ordens - MATA650
As ordens de produção precisam ter o roteiro informado, quando integrado com o PCFactory. Alterar MATA650, para obrigar a gravar o roteiro na ordem de produção, quando usar integração com PCFactory.
Obs.: Rotinas automáticas, como por exemplo o MRP, usarão o roteiro padrão (SB1.B1_OPERPAD).
Criar a função MATA650PPI que deverá ser executada quando ocorrer inclusão , alteração , exclusão e geração de OP´s intermediárias.
A geração dos dados das ordens de produção é um pouco diferente dos demais cadastros que compõe essa especificação. Os dados da ordem , componentes da ordem e operações são gerados em momentos diferentes.
Exemplo: A rotina MATA650 permite incluir diversas ordens de produção, registrando os dados na SC2. Ao sair do programa exibe mensagem questionando se deseja exlplodir estrutura para gerar emprenhos e OPs intermediárias.
Devido a esta forma de geração, ao incluir uma ordem de produção e a mesma não for enviado ao PC-Factory( por qualquer motivo - ERRO ou PEND), deverá fazer a pergunta se deseja salvar (gerando pendência ou erro) conforme demais cadastros. Porém ao sair da rotina e for gerar a lista de componentes,operações, ordens intermediárias não fará o questionamento. Irá processar o envio, e se ocorrer erro erro ou pendência será apenas salvo o XML ou a tabela SOF. Como este processo pode ocorrer para uma ou várias ordens, no final do processo deverá exibir uma lista de ordens que foram processadas com erro ou pendência. Se enviou tudo sem problema não será necessário exibir mensagem.
Para ordens pode ocorrer as seguintes situações:
- Enviar somente com as informações da ordem (SC2)
- Enviar somente com as informações da ordem e componentes (SC2 e SD4)
- Enviar somente com as informações da ordem e operações (SC2 e SG2/SHY)
- Enviar com as informações da ordem, componentes e operações. (SC2,SD4, SG2/SHY)
f lRet .And. PCPIntgPPI()
lRet := MATA650PPI()
EndIf
Na exclusão somente enviar os dados da ordem. Não é necessário ler os componentes e operações.
Chamar a função MATA650PPI na A650DelOp quando exluir registros da ordem de produção (SC2).
Além desses pontos, existem outras situações que devem executar o envio de dados para o PC-Factory:
- Na geração de OP´s intermediárias :
Ao executar a função A650GeraC2 deverá a nova função MATA650PPI
- Na criação dos empenhos:
Após executar a função GravaEmp ( que executa a A650ReplD4) deverá executar a nova função MATA650PPI.
- Na criação das operações:
Para operações o registro pode ser considerada da SG2 ou SHY.
A função TAPSOperac irá gerar a SHY. Deve executar a integração sempre que for gerar a operação. ( Verificar se na alteração e inclusão a integração pode ser executada somente depois da inclusão da operação).
Mesmo não incluindo na SHY a integração poderá ser executada após essa função, pois a MATA650PPI deverá ler as duas tabelas (SG2/SHY).
.........
Na função MATA650PPI.
//Função irá retornar o XmL
aRet := MATI650(cXml, nTypeTrans, cTypeMessage)
<função para enviar o XML para o WebService da PPI e recuperar o retorno> : PCPWebsPPI
Se o retorno for positivo poderá prosseguir com a inclusão/alteração e geração do XML nos diretórios correspondentes.
<função para gerar o XML nos diretórios> : PCPXmlPPI
<função para gerar tabela de integração SOF> : PCPCriaSOF
..............
.............
Deverá ser enviado os seguintes parâmetros para o MATI650 quando integração com pc-factory:
cXml =
nTypeTrans = TRANS_SEND
cTypeMessage = EAI_MESSAGE_BUSINES
4.2.2 Adapters Ordens - MATI650
Será criado o adapter MATI650, somente para o envio das informações. Deverá usar como base o MATI010, usando a quebra por versão de mensagem. Será desenvolvido somente a parte do envio (SEND)
A função MATI650 será responsável pela geração do XML.
Cabeçalho:
Quando for executado via integração com PCFactory deverá montar o cabeçalho da mensagem que consta com as tags TOTVSMessage e MessageInformation.
Abaixo modelo:
<?xml version="1.0" encoding="UTF-8" ?>
<TOTVSMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="xmlschema/general/events/ProductionOrder_2_000.xsd">
<MessageInformation version="2.000">
<UUID>d97aeb6f-1440-8c81-fc13-ec8cf87b82ad</UUID>
<Type>BusinessMessage</Type>
<Transaction>ProductionOrder</Transaction>
<StandardVersion>1.0</StandardVersion>
<SourceApplication>dts11cordas8480</SourceApplication>
<CompanyId>10</CompanyId>
<BranchId>10</BranchId>
<UserId>xxx</UserId>
<Product name="Datasul" version="11.5.X"/>
<GeneratedOn>2015-07-10T16:25:21.971-03:00</GeneratedOn>
<ContextName>PROTHEUS</ContextName>
<DeliveryType>Sync</DeliveryType>
</MessageInformation>
<BusinessMessage>
<BusinessEvent>
......................
</BusinessEvent>
....................
....................
<\BusinessMessage>
Onde:
TOTVSMessage xmlns:xsi Indica o xsd para gerarção do XML. Usar o conteúdo do modelo.
MessageInformation version Indica a versão da mensagem. Usar “2.000”
UUID : Sequencial usado pelo EAI. Gerar fixo “1’.
Type: Tipo da mensagem. Gerar fixo “BusinessMessage”
Transaction: Indica o que está sendo enviado. Gerar fixo “ProductionOrder”
StandardVersion: Versão. Gerar fixo “1.0”
SourceApplication: Aplicação que está executando. Gerar fixo “SIGAPCP”
CompanyId: Código da empresa. Empresa que estiver logada
BranchId: Código da filial. Filial logada.
UserId: Usuário. Usuário logado.
Product: Nome do produto. Name = “MATA650” version = versão do programa.
GenerateOn = Data e hora da geração da mensagem
ContextName = Protheus
DeliveryType:Tipo de envio da mensagem. Gerar fixo “Sync”.
Dentro do BusinessMessage existe o bloco BusinessEvent com as seguintes tags:
<BusinessEvent>
<Entity>ProductionOrder</Entity>
<Event>upsert</Event>
<Identification>
<key name="InternalId">651140049</key>
</Identification>
</BusinessEvent>
Onde:
Entity: Entidade . Gerar fixo “ProductionOrder”
Event: Inclusão/Alteração ou exclusão. Pode ser ‘delete’ ou ‘upsert’
Identification: Identificação do recurso.
Usar key name="InternalID" : gerar com o número da ordem: C2_NUM+C2_ITEM+C2_SEQUEN
Dentro do BusinessMessage existe o bloco BusinessContent, que contém os dados da ordem de produção Irá gerar o XML completo, com tags sem informações, que não serão usadas pela integração.
A integração somente ocorrerá no envio(TRANS_SEND).
Criar função com a versão da mensagem: Static Function v2000
Exemplo:
...................
Static Function v2000(cXml, nTypeTrans, cTypeMessage, oXml)
If nTypeTrans == TRANS_RECEIVE
/*
Mensagem desenvolvida para integração com o PCFactory, e nao possui recebimento.
*/
ElseIf nTypeTrans == TRANS_SEND
.......................
A mensagem de ordens possui 3 tipos de informações que serão usadas na integração. A ordem de produção(BusinessContentType), os componentes(ListOfMaterialOrders) e as operações da ordem(ListOfActivityOrders).
A função sempre irá "tentar" gerar a mensagem completa, mas pode ocorrer de não existir todas as informações.
- Pode existir somente informações da ordem
- Pode existir somente as informações da ordem e componentes
- Pode existir somente as informações da ordem e operações
- Pode existir as informações da ordem, componentes e operações.
Componentes:
São os dados da tabela SD4. Pesquisar pelo campo ordem de produção D4_OP = C2_NUM+C2_ITEM+C2_SEQUEN
Os dados dos componentes deverão ser ordenados pelo campo D4_TRT
Operações
As operações da ordem poderá ter origem diferente. Quando o parâmetro MV_PCPATOR estiver como 'S' irá gerar a SHY.
Existindo a SHY os dados da operação serão gerados com base na SHY, senão deverá usar os dados da SG2.
Obs.:As tabelas e campos da base Protheus para montar a mensagem estão identificados no item 4.1
Informação sobre o cálculo do tempo:
ListOfActivityOrders | TimeMachine | Tempo Máquina | SG2 (Operacaoes) SHY (Oper x Ordem) Mult. Pela qtd |
O tempo pode ter variação conforme Tipo Operação:
Quando não existir na SHY deve fazer o seguinte cálculo:
Tipo Operação 1 Normal : Aplica o tempo do lote a quantidade da ordem ( Qtd * tempo). Considera Eficiência da MO.
Tipo Operação 2 Fixo e 3 Ilimitada: Independente da quantidade o tempo será o mesmo
Tipo Operação 4 Tempo Minimo: Deve considerar sempre quantidade múltipla do lote. Exemplo: Lote = 10. Tempo = 5. Qtd Ordem = 7. Tem que considerar o tempo para fazer 10 peças. Considera Eficiência da MO.
Outro ponto a considerar é que o PC-Factory espera o tempo em Centesimal. Quando o parâmetro MV_TPHR for diferente de 'C' deve converter o tempo para centesimal(A690horaCt).
Os campo abaixo são utilizados pelo PC-Factory para o cálculo da velocidade padrão.
ListOfActivityOrders | TimeResource | Tempo Recurso | Tempo para fazer um lote. SG2.G2_TEMPAD |
ListOfActivityOrders | UnitItemNumber | Lote Padrão | Lote Padrão da operação. SG2.G2_LOTEPAD |
Estado da ordem:
Será usado somente o StatusOrderType. O StatusType não será preenchido.
Deverá ser alterada a mensagem ProductionOrder_2_000 ( criar a versão ProductionOrder_2_001) para incluir um novo status 9 = Ociosa.
BusinessContentType | StatusOrderType | Estado da ordem | Prevista/Aberta = 1 Iniciada = 6 Ociosa = 9 Encerrada Parcial/Total = 7 |
Obs.:
A mensagem está em : $/STABLE/xmlschema/general/events
Para o PC-Factory é necessário indicar em qual operação o componente é consumido. Quando não usa o conceito de estrutura por operação deverá linkar os componentes na última operação.
ListOfActivityOrders | IsActivityEnd | Última Operação | Na última operação passar TRUE |
Filtros e geração do XML (Seguir o mesmo padrão do item 1.2.4):
No cadastro de parâmetros PCPA109, é definido se gera o arquivo XML nos diretórios. Quando este indicador, OD_GERAXML, estiver como 2('N') não será gravado o arquivo XML nos diretórios correspondentes. Será gravado apenas o conteúdo em tabela (SOF).
Caso o indicador , OD_GERAXML, estiver como 1('S') deverá seguir a seguinte regra de geração:
- Processados com sucesso : XML processado pelo PPI com retorno do PCFactory OK. XML será gravado no diretório cadastrado no campo Enviados(OD_DIRENV) do PCA109.
- Processados sem sucesso : XML processado pelo PPI com retorno de ERRO pelo PCFactory ou WebService desligado ( não conseguiu enviar o XML).
XML será gravado no diretório definido no campo Pendência (OD_DIRPEND) do PCA109. Para ordens, o retorno do PCFactory será impeditivo para o commit do registro.
Importante: Os arquivos XML´s gerados e dados da tabela SOF somente serão gerados se a inclusão/alteração/exclusão da ordem for comitada no banco.
Os nomes do arquivos seguirão o seguinte padrão:
OK_<MSG>_<DATAHORA>_<REGISTRO>
PEND_<MSG>_<DATAHORA>_<REGISTRO>
ERR_<MSG>_<DATAHORA>_<REGISTRO>
Onde: OK - Se mensagem entregue sem problemas
PEND- Se mensagem não foi enviada
ERR - Se mensagem enviada, porém retornou erro.
MSG - PRODUCTIONORDER
DATAHORA: Data e Hora do envio
REGISTRO: Número da ordem que está sendo enviada.
A tabela SOF conterá os seguintes campos:
Transação : Nome da tabela ( SC2)
Registro : número da ordem
Status: 1 - OK; 2 - Pend; 3 - Erro
Gerou XML : Sim ou não
Nome arquivo XML
Data Envio
Hora de envio
Usuário
Mensagem de retorno do PCFactory
Xml : Conteúdo do XML
Programa: Rotina que gerou o registro
Data Reprocessamento : Quando reprocessado pela rotina de pendências
Hora Reprocessamento : Quando reprocessado pela rotina de pendências
IMPORTANTE:
Só poderá ter uma pendência para o registro.
Para gerar o XML e gravar a tabela SOF terá que respeitar as pendências geradas. Se existir uma pendência de envio de algum registro e for gerada uma nova mensagem para o mesmo registro a pendencia deverá ser excluída e trabalhar somente com a última mensagem, que poderá ser enviada sem problemas ou gerar nova pendência.
Obs.: Mais informações verificar a especificação ER_PCREQ-6129_PPI_MultTask_Parametros
Filtros:
No PCPA109 são definidos os filtros que indicam quais registros serão enviados ao PCFactory.
No caso da ordem de produção, deverá ler os dados da tabelas SOE onde o campo OE_TABELA seja = 'SC2'. O campo OE_FILTRO conterá o filtro que deverá ser aplicado ao registro que está sendo enviado. Somente poderá enviar(gerar xml) se satisfazer a condição do PCPA109.
Usar a PCPFiltPPI ( fará o filtro de todas as tabelas que são integradas com o PCFactory).
Essa função irá receber como parâmetro o nome da tabela.
A função irá retornar TRUE se satisfazer a condição, ou seja, o local de estoque pode ser enviado ou false caso o local de estoque não satisfaça.
Obs.: Se não existir filtro na SOE , OE_FILTRO, enviará todos os registros, ou seja, a função sempre retornará TRUE.
........
4.2.3 Firma ordens - MATA651
Será alterada a rotina que firma as ordens de produção para validar o processo de integração com PC-Factory.
Esta rotina permite a exclusão de ordens e a alteração da situação ( Prevista para Firme).
Como esta rotina pode processar uma ou várias ordens, para commitar os dados no Protheus , não deverá aguardar o retorno do PC-Factory. Sempre irá salvar no Protheus e caso a ordem não for enviada ao PC-Factory, seja por motivo de erro ou pendência ao final deverá exibir em mensagem com as ordens que tiveram problemas.
Seguir o mesmo procedimento do MATA650, referente a geração de XML, aplicação de filtros, envio do XML, tratamento do retorno.
Deverá executar a integração MATA650PPI na função ao final A651Proces ( após executar A651Do).
IMPORTANTE: Para indicar se a envia ordem FIRME ou PREVISTA o usuário terá que usar o filtro do PCPA109.
4.2.4 Manutenção das Operações - MATA632
Será alterada a rotina de manutenção das operações da ordem para validar o processo de integração com PC-Factory.
Esta rotina permite a alteração das operações, o que impacta diretamente na ordem de produção.
Uma alteração em determinado roteiro pode afetar uma ou várias ordens.
Como esta rotina pode processar uma ou várias ordens, para commitar os dados no Protheus , não deverá aguardar o retorno do PC-Factory. Sempre irá salvar no Protheus e caso a ordem não for enviada ao PC-Factory, seja por motivo de erro ou pendência ao final deverá exibir em mensagem as ordens que tiveram problemas.
Seguir o mesmo procedimento do MATA650, referente a geração de XML, aplicação de filtros, envio do XML, tratamento do retorno.
Deverá executar a integração MATA650PPI ao final na função GeraOperac.
Para gerar as operações devem seguir o modelo já existente , primeiro SH8, depois SHY e posteriormente SG2.
IMPORTANTE: Para indicar se a envia ordem FIRME ou PREVISTA o usuário terá que usar o filtro do PCPA109.
4.2.5 Manutenção de Empenhos - MATA380 e MATA381
Alterar rotinas de manutenção dos empenhos para validar o processo de integração com PC-Factory.
Estas rotinas permite a alteração dos empenhos, o que impacta diretamente na ordem de produção.
Seguir o mesmo procedimento do MATA650, referente a geração de XML, aplicação de filtros, envio do XML, tratamento do retorno.
MATA380 : Deverá executar a integração MATA650PPI.
Executar na A380Exclui após a execução da AxDeleta. Realizar a integração somente se o retorno da AxDeleta for igual a 2 (clique no confirmar)
Executar no final da função A380TudoOK, antes do comando "dbSelectArea(cAlias)"
MATA381 : Deverá executar a integração MATA650PPI ao final da função A381TudoOk
IMPORTANTE: Para indicar se a envia ordem FIRME ou PREVISTA o usuário terá que usar o filtro do PCPA109.
5. Ponto de Entrada
Desenvolver ponto de entrada para que seja impedida a execução da integração com o PC-Factory em rotinas que o cliente não deseje enviar os dados.
No Protheus existem inúmeras rotinas para criar e alterar ordens de produção. O processo padrão diz que todas as rotinas que geram e alterem ordens deverão gerar dados para o PC-Factory se a integração estiver ativa. Porém existem casos excepcionais que determinada rotina não pode enviar os dados para o PC-Factory. Exemplo um cliente que cria ordens pelo MATA650, sem o envio para o PC-Factory e posteriormente execute o carga máquina MATA690 enviado para o PC-Factory.
Para atender essa situação, será criado o ponto de entrada para indicar se gera ou os dados para o PPI ( mesmo integração ATIVA via PCPA109). O ponto de entrada vai esperar um retorno TRUE ou FALSE e poderá ser tratado rotina por rotina.
Exemplo ( só precisa indicar o nome do programa):
User Function PCPXFUNPPI()
Local lRet := .T.
If AllTrim(PARAMIXB) == "MATA650"
//Não executa a integração para o MATA650
lRet := .F.
EndIf
Return lRet
Onde:
PARAMIXB = Nome do programa que está sendo executado.
Rotinas Envolvidas:
Rotina | Tipo de Operação | Opção de Menu | Regras de Negócio |
MATA010 – Produtos | Alteração | Atualizações | - |
Alteração | Atualizações > Cadatros > Produtos > Locais de Estoque | ||
MATA610 - Recurso | Alteração | Atualizações > Cadastros > Ambiente Produtivo > Recurso > Recursos | |
MATA650 - Ordens de Produção | Alteração | Atualizações > Movimentações > Produção > Ordens de Produção | |
MATA651 - Firma Ops | Alteração | Atualizações > Movimentações > Produção > Ops Previstas | |
MATA632 - Operações | Alteração | Atualizações > Cadastros > Ambiente Produtivo > Operações | |
MATA380 - Empenho Simples | Alteração | Atualizações > Movimentações > Produção > Empenho Simples | |
MATA381 - Empenho Multiplo | Alteração | Atualizações > Movimentações > Produção > Empenho Multiplo | - |
Tabelas Utilizadas
- SOF – Tabela de integração PCP entre Prohtneus e PCfactory
Opcional
Protótipo de Tela
<Caso necessário inclua protótipos de telas com o objetivo de facilitar o entendimento do requisito, apresentar conceitos e funcionalidades do software>.
Protótipo 01
Opcional
Fluxo do Processo
<Nesta etapa incluir representações gráficas que descrevam o problema a ser resolvido e o sistema a ser desenvolvido. Exemplo: Diagrama - Caso de Uso, Diagrama de Atividades, Diagrama de Classes, Diagrama de Entidade e Relacionamento e Diagrama de Sequência>.
Opcional
Dicionário de Dados
Arquivo ou Código do Script: SOF – Integração PCP Protheus x PCFactory
Índice | Chave |
01 | OF_FILIAL+OF_TRANSAC+OF_REGIST+OF_STATUS+OF_DTENVIO+OF_HRENVIO |
02 | |
03 |
|
Campo | OF_TRANSAC |
Tipo | CHAR |
Tamanho | 10 |
Valor Inicial |
|
Mandatório | Sim (X) Não ( ) |
Descrição | Nome da Tabela |
Título | Tabela |
Picture |
|
Help de Campo | Nome da tabela que está sendo enviado ao PCFacotry |
Campo | OF_REGIST |
Tipo | CHAR |
Tamanho | 50 |
Valor Inicial |
|
Mandatório | Sim (X) Não ( ) |
Descrição | Código do registro |
Título | Registro |
Picture |
|
Help de Campo | Código do registro que está sendo enviado. |
Campo | OF_STATUS |
Tipo | CHAR |
Tamanho | 01 |
Valor Inicial |
|
Mandatório | Sim (X) Não ( ) |
Descrição | Status |
Título | Status |
Picture |
|
Help de Campo | Status de envio. 1 - OK, 2-Pend,3_Erro |
Campo | OF_GERAXML |
Tipo | CHAR |
Tamanho | 01 |
Valor Inicial |
|
Mandatório | Sim () Não (x) |
Descrição | Gerou XML |
Título | Gerou XML |
Picture |
|
Help de Campo | Indica se Gerou XML. Sim/Não |
Campo | OF_NOMEXML |
Tipo | CHAR |
Tamanho | 100 |
Valor Inicial |
|
Mandatório | Sim () Não (x ) |
Descrição | Nome do arquivo XML |
Título | Nome do arquivo XML |
Picture |
|
Help de Campo | Nome do arquivo XML gerado |
Campo | OF_DTENVIO |
Tipo | CHAR |
Tamanho | 08 |
Valor Inicial |
|
Mandatório | Sim (x) Não () |
Descrição | Data envio do XML |
Título | Data envio do XML |
Picture |
|
Help de Campo | Data envio do XML para o PCFactory |
Campo | OF_HRENVIO |
Tipo | CHAR |
Tamanho | 08 |
Valor Inicial |
|
Mandatório | Sim (x) Não () |
Descrição | Hora envio do XML |
Título | Hora envio do XML |
Picture |
|
Help de Campo | Hora envio do XML para o PCFactory. HH:MM:SS |
Campo | OF_USU |
Tipo | CHAR |
Tamanho | 25 |
Valor Inicial |
|
Mandatório | Sim (x) Não () |
Descrição | Usuário |
Título | Usuário |
Picture |
|
Help de Campo | Usuário que enviou o XML para o PCFactory. |
Campo | OF_MSGRET |
Tipo | MEMO
|
Tamanho |
|
Valor Inicial |
|
Mandatório | Sim () Não (x) |
Descrição | Mensagem Retorno |
Título | Mensagem Retorno |
Picture |
|
Help de Campo | Mensagem de retorno do PCFactory |
Campo | OF_XML |
Tipo | MEMO |
Tamanho |
|
Valor Inicial |
|
Mandatório | Sim (x) Não () |
Descrição | Conteúdo XML |
Título | Conteúdo XML |
Picture |
|
Help de Campo | Conteúdo do XML gerado. |
Campo | OF_DATPROC |
Tipo | Date |
Tamanho |
|
Valor Inicial |
|
Mandatório | Sim () Não (x) |
Descrição | Data Reprocessamento |
Título | Data Reprocessamento |
Picture |
|
Help de Campo | Data Reprocessamento gerado pelo PCPA110 |
Campo | OF_HORPROC |
Tipo | CHAR |
Tamanho | 08 |
Valor Inicial |
|
Mandatório | Sim () Não (x) |
Descrição | Hora Reprocessamento |
Título | Hora Reprocessamento |
Picture |
|
Help de Campo | Hora reprocessamento gerada pelo PCPA110. HH:MM:SS |
Campo | OF_PROGRAM |
Tipo | CHAR |
Tamanho | 10 |
Valor Inicial |
|
Mandatório | Sim () Não (x) |
Descrição | Programa gerador |
Título | Programa gerador |
Picture |
|
Help de Campo | Programa que gerou o registro |
(Opcional)
Grupo de Perguntas
<Informações utilizadas na linha Protheus>.
(Opcional)
Consulta Padrão
<Informações utilizadas na linha Protheus>
(Opcional)
Estrutura de Menu
<Informações utilizadas na linha Datasul>.
Procedimentos
Procedimento |
|
|
|
Descrição | (Max 40 posições) | (Max 40 posições) | (Max 40 posições) |
Módulo |
|
|
|
Programa base |
|
|
|
Nome Menu | (Max 32 posições) | (Max 32 posições) | (Max 32 posições) |
Interface | GUI/WEB/ChUI/Flex | GUI/WEB/ChUI/Flex | GUI/WEB/ChUI/Flex |
Registro padrão | Sim | Sim | Sim |
Visualiza Menu | Sim/Não | Sim/Não | Sim/Não |
Release de Liberação |
|
|
|
Programas
Programa |
|
|
|
Descrição | (Max 40 posições) | (Max 40 posições) | (Max 40 posições) |
Nome Externo |
|
|
|
Nome Menu/Programa | (Max 32 posições) | (Max 32 posições) | (Max 32 posições) |
Nome Verbalizado[1] | (Max 254 posições) | (Max 254 posições) | (Max 254 posições) |
Procedimento |
|
|
|
Template | (Verificar lista de opções no man01211) | (Verificar lista de opções no man01211) | (Verificar lista de opções no man01211) |
Tipo[2] | Consulta/Manutenção/ Relatório/Tarefas | Consulta/Manutenção/ Relatório/Tarefas | Consulta/Manutenção/ Relatório/Tarefas |
Interface | GUI/WEB/ChUI/Flex | GUI/WEB/ChUI/Flex | GUI/WEB/ChUI/Flex |
Categoria[3] |
|
|
|
Executa via RPC | Sim/Não | Sim/Não | Sim/Não |
Registro padrão | Sim | Sim | Sim |
Outro Produto | Não | Não | Não |
Visualiza Menu | Sim/Não | Sim/Não | Sim/Não |
Query on-line | Sim/Não | Sim/Não | Sim/Não |
Log Exec. | Sim/Não | Sim/Não | Sim/Não |
Rotina (EMS) |
|
|
|
Sub-Rotina (EMS) |
|
|
|
Localização dentro da Sub Rotina (EMS) |
|
|
|
Compact[4] | Sim/Não | Sim/Não | Sim/Não |
Home[5] | Sim/Não | Sim/Não | Sim/Não |
Posição do Portlet[6] | 0 – Top Left 1 – Top Right 2 – Bottom Left 3 – Bottom Right | 0 – Top Left 1 – Top Right 2 – Bottom Left 3 – Bottom Right | 0 – Top Left 1 – Top Right 2 – Bottom Left 3 – Bottom Right |
Informar os papeis com os quais o programa deve ser vinculado |
|
|
|
Cadastro de Papéis
<O cadastro de papéis é obrigatório para os projetos de desenvolvimento FLEX a partir do Datasul 10>.
<Lembrete: o nome dos papeis em inglês descrito neste ponto do documento, devem ser homologados pela equipe de tradução>.
Código Papel | (máx 3 posições) |
Descrição em Português* |
|
Descrição em Inglês* |
|
[1] Nome Verbalizado é obrigatório para desenvolvimentos no Datasul 10 em diante.
[2] Tipo é obrigatório para desenvolvimento no Datasul 10 em diante
[3] Categorias são obrigatórias para os programas FLEX.
[4] Obrigatório quando o projeto for FLEX
[5] Obrigatório quando o projeto for FLEX
[6] Obrigatório quando o projeto for FLEX
Este documento é material de especificação dos requisitos de inovação, trata-se de conteúdo extremamente técnico. |
---|