Árvore de páginas

01. DADOS GERAIS


Produto:

TOTVS CRM Automação da Força de Vendas

Linha de Produto:

Linha TOTVS CRM SFA

Módulo:Venda
Função:Pedido
Ticket:
Requisito/Story/Issue:


02. GLOSSÁRIO

Referência textual

Descrição detalhada

lógicas de permitir exceder limite de crédito

As lógicas citadas estão melhor detalhadas na seguinte documentação: Percentual de tolerância ao exceder limite de crédito no pedido

sistema offline

As informações contidas em uma aplicação offline representam o estado delas no momento da última sincronização, podendo haver uma diferença entre a informação no dispositivo com relação à informação no servidor (banco de dados atualizado)

03. ESCOPO FUNCIONAL

No ambiente Mobile,

Atualmente,

Ao finalizar um pedido de venda, o sistema valida se o pedido de venda pode ser realizado em função das lógicas de permitir exceder limite de crédito.

Entretanto, por se tratar de um sistema offline, ao sincronizar o pedido de venda, ainda que a informação do limite de crédito atualizada não fosse mais suficiente para permitir o envio do pedido ao ERP, o pedido de venda é sincronizado sem restrições, visto que não há um bloqueio de sincronizações validando se o saldo de limite de crédito continua válido.

Agora,

Ao sincronizar as informações do dispositivo com o servidor, o sistema deverá realizar novamente a validação das lógicas de permitir exceder limite de crédito.

Caso haja alguma validação de bloqueio do pedido considerando o limite de crédito atualizado, o pedido deverá ser reaberto (não finalizado) para o usuário ajustar o pedido.

04. ESCOPO TÉCNICO

04.01 Aplicação

04.01.01 Alterações em banco de dados

04.01.01.01 Novo registro em pluginintegracao

Contexto / Gatilho: 

  • Tools, opção 5

Lógica:

  • Inserir os seguintes registros na tabela pluginintegracao:

    <changeSet author="systemScript" failOnError="false" id="" runOnChange="true">
        <preConditions onError="HALT" onFail="MARK_RAN" onSqlOutput="IGNORE">
            <customPrecondition className="com.wealthsystems.sim3g.dao.hibernate.api.liquibase.custom.precondition.RegisterExistsPrecondition">
                <param name="table" value="pluginintegracao"/>
                <param name="column" value="codigo"/>
                <param name="value" value="'WEBHOOK'"/>
            </customPrecondition>
        </preConditions>
        <insert tableName="pluginintegracao">
            <column name="IDPLUGININTEGRACAO" valueSequenceNext="SEQPKPLUGININTEGRACAO"/>
            <column name="CODIGO" valueComputed="'WEBHOOK'"/>
            <column name="IDNATIVO" valueComputed="0"/>
            <column name="IDNCUSTOMIZADO" valueComputed="0"/>
        </insert>
    </changeSet>
04.01.01.02 Nova coluna em pedido

Contexto / Gatilho: 

  • Tools, opção 3

Lógica:

  • Inserir os seguintes registros na tabela pedido:

    <changeSet author="System (generated)" failOnError="false" id="" objectQuotingStrategy="LEGACY">
        <addColumn tableName="Pedido">
            <column defaultValue="0" name="idnProcessadoWebHook" type="byte"/>
        </addColumn>
    </changeSet>
04.01.01.03 Nova tabela credencial

Contexto / Gatilho: 

  • Tools, opção 3

Lógica:

  • Criar a tabela credencial, com os seguintes campos:

    <changeSet author="systemScript" failOnError="false" id="" objectQuotingStrategy="LEGACY">
    	<createTable tableName="Credencial">
    		<column name="idCredencial" type="LONG">
    			<constraints nullable="false"/>
    		</column>
    		<column name="descricao" type="VARCHAR(80)">
    			<constraints nullable="false"/>
    		</column>
    		<column name="sgltipoautenticacao" type="VARCHAR(20)">
    			<constraints nullable="false"/>
    		</column>
    		<column name="usuario" type="VARCHAR(120)"/>
    		<column name="senha" type="VARCHAR(200)"/>
    		<column defaultValue="0" name="idnAtivo" type="byte"/>
    	    <column name="codigoerp" type="VARCHAR(80)"/>
    		<column name="wsVersao" type="LONG"/>
    	</createTable>
    </changeSet>
04.01.01.04 Nova colunas na tabela pluginintvinculos

Contexto / Gatilho: 

  • Tools, opção 3

Lógica:

  • Criar a coluna sglagrupador, nullable, para servir de agrupamento de registros para mostrar em uma ou outra grid do mesmo plugin

    • O campo deverá possuir índice, visto que será usado para pesquisas frequentes


      <changeSet author="System (generated)" failOnError="false" id="" objectQuotingStrategy="LEGACY">
          <addColumn tableName="PluginIntVinculos">
              <column name="sglagrupador" type="varchar(20)"/>
          </addColumn>
      </changeSet>
  • Criar a coluna idcredencial, nullable, FK para tabela credencial

    <changeSet author="System (generated)" failOnError="false" id="" objectQuotingStrategy="LEGACY">
        <addColumn tableName="PluginIntVinculos">
            <column name="idCredencial" type="long"/>
        </addColumn>
    </changeSet>
    <changeSet author="System (generated)" failOnError="false" id="" objectQuotingStrategy="LEGACY">
        <addForeignKeyConstraint baseColumnNames="idCredencial" baseTableName="PluginIntVinculos" constraintName="" deferrable="false" initiallyDeferred="false" referencedColumnNames="idCredencial" referencedTableName="Credencial"/>
    </changeSet>
  • Criar colunas genéricas para receber colunas da grid, juntamente com suas descrições:

    <changeSet author="" failOnError="false" id="" objectQuotingStrategy="LEGACY">
        <addColumn tableName="PluginIntConfig">
            <column name="texto1" type="varchar(400)"/>
            <column name="descricaotexto1" type="varchar(40)"/> 
            <column name="texto2" type="varchar(400)"/>
            <column name="descricaotexto2" type="varchar(40)"/> 
    		<column name="texto3" type="varchar(400)"/>
            <column name="descricaotexto3" type="varchar(40)"/> 
            <column name="int1" type="LONG"/>
            <column name="descricaoint1" type="varchar(40)"/> 
            <column name="int2" type="LONG"/>
            <column name="descricaoint2" type="varchar(40)"/> 
            <column name="decimal1" type="decimal(18,6)"/>
            <column name="descricaodecimal1" type="varchar(40)"/>
            <column name="decimal2" type="decimal(18,6)"/>
            <column name="descricaodecimal2" type="varchar(40)"/> 
            <column name="byte1" type="byte"/>
            <column name="descricaobyte1" type="varchar(40)"/>  
            <column name="byte2" type="byte"/>
            <column name="descricaobyte2" type="varchar(40)"/> 
        </addColumn>
    </changeSet>

04.01.02 Criação de listagem de credenciais

Contexto / Gatilho: 

  • Ambiente Web: Configuração → Integração

Lógica:

  • Vinculado à regra de perfil de acesso de código "regra.acesso.configuracao.plugin.integracao.geral"
    • O sistema deve disponibilizar nova opção no menu do contexto Configuração → Integração, de nome "Credenciais"(en: "Credentials", es: "Credenciales")
    • Clicando sobre a opção do menu "Credenciais", o sistema deve exibir tela com os seguintes elementos:
      • "Credenciais"(en: "Credentials", es: "Credenciales"): Título da página
      • SlickGrid contendo as seguintes colunas não editáveis:
          • "Descrição"(en: "Description", es: "Descripción"): Campo texto, representando o valor da coluna credencial.descricao
          • "Tipo de autenticação"(en: "Authentication type", es: "Tipo de autenticación"): Campo texto, representando o valor da coluna credencial.sgltipoautenticacao
          • "Situação"(en: "Status", es: "Situación"): Texto, exibindo Ativo/Inativo quando o campo credencial.idnativo estiver com respectivos valores 1/0.
          • : botão "Editar"(en: "Edit", es: "Editar") que, quando clicado, enviará o usuário para o formulário de credencial, vinculado os valores dos campos ao registro selecionado.
        • A grid deverá ter recurso de adicionar novo registro, disponibilizando botão "Adicionar" (en: "Add", es: "Agregar") que, quando clicado, enviará o usuário para o formulário de credencial
        • Não há necessidade dos botões "Cancelar alteração"(en: "Cancel changes", es: "Cancelar cambios") / "Gravar"(en: "Save", es: "Grabar"), visto que os registros não serão editáveis pela grid
        • A pesquisa rápida deve considerar o campo credencial.descricao
        • A pesquisa avançada deverá disponibilizar os seguintes campos:
          • "Tipo de autenticação"(en: "Authentication type", es: "Tipo de autenticación"): campo de opções selecionáveis, com única opção "Básica"(en: "Basic", es: "Básica")
          • "Situação"(en: "Status", es: "Situación"): campos check-box com opções:
            • "Ativo"(en: "Active", es: "Activo"): Marcado por padrão. Quando marcado, filtra registros de credencial onde o campo credencial.idnativo = 1
            • "Inativo"(en: "Inactive", es: "Inactivo"): Desmarcado por padrão. Quando marcado, filtra registros de credencial onde o campo credencial.idnativo = 0

04.01.03 Criação de formulário de credenciais

Contexto / Gatilho: 

  • Ambiente Web: Configuração → Integração → Credenciais

Lógica:

  • O sistema deve disponibilizar tela com os seguintes elementos:
    • "Formulário de credencial"(en: "Credential form", es: "Formulario de credencial"): título da página
    • "Situação"(en: "Status", es: "Situación"): Campo radio button, com opções Ativo/Inativo quando o campo credencial.idnativo estiver com respectivos valores 1/0.
      • Deve ser persistido no campo credencial.idnativo
    • "Descrição"(en: "Description", es: "Descripción"): Campo de input textual, obrigatório.
      • Deve ser persistido no campo credencial.descricao
    • "Tipo de autenticação"(en: "Authentication type", es: "Tipo de autenticación"): Campo de opções selecionáveis, obrigatório, com única opção fixa. 
        • "Básica"(en: "Basic", es: "Básica"): valor BASICA
      • Deve ser persistido sobre o campo credencial.sgltipoautenticacao
    • "Usuário"(en: "User", es: "Usuario"): campo de input textual
      • O campo somente deve ser exibido quando "Tipo de autenticação" = "Básica"
      • O campo deve ser obrigatório quando "Tipo de autenticação" = "Básica"
      • Deve ser persistido sobre o campo credencial.usuario
    • "Senha"(en: "Password", es: "Contraseña"): campo de input textual, com máscara de senha (não deve ser possível visualizar seu valor pela DOM - F12)
      • O campo somente deve ser exibido quando "Tipo de autenticação" = "Básica"
      • O campo deve ser obrigatório quando "Tipo de autenticação" = "Básica"
      • Deve ser persistido sobre o campo credencial.senha
    • "Gravar"(en: "Save", es: "Grabar"): Botão no canto superior direito da tela que, quando clicado, realizará as persistências do formulário em questão.
    • "Voltar"(en: "Back", es: "Volver"): Botão no canto superior direito da tela. Quando clicado, retornará à tela de listagem de credenciais

04.01.04 Criação de plugin de integração "Webhooks" em tela

Contexto / Gatilho: 

  • Ambiente Web: Configuração → Integração → Plugins de integração

Lógica:

  • O sistema deve exibir card de plugin de integração, com os elementos:
    • (https://pictogrammers.com/library/mdi/icon/webhook/): Ícone do plugin de integração
    • "Webhooks": Título do card
    • Campo switch para ativar/desativar plugin de integração
      • Valor do campo deverá ser persistido sobre o campo pluginintegracao.idnativo
    • "Notifique aplicações externas com informações do sistema a partir de gatilhos estratégicos do sistema"(en: "Notify external applications with system information from strategic system triggers", es: "Notifique a aplicaciones externas con información del sistema desde disparadores estratégicos del sistema"): Descrição do card
    • "Configurar"(en: "Configure", es: "Configurar"): botão de ação que, quando clicado, disparará a lógica de acionamento do botão configurar
    • Quando clicado sobre o botão, o sistema deverá abrir nova tela com os seguintes elementos:
      • "Webhook (Consulte o manual)"(en: "Webhook (Refer to the manual)", es: "Webhook (Consulte el manual)"): título da pagina, onde "Consulte o manual" é um link para a página Plugin de integração - Webhook
      • "Contratos de aplicações externas": Seção contendo grid referente à tabela pluginintvinculos, com informações agrupadas através do campo pluginintvinculos.sglagrupador = 'contratos' com as seguintes colunas:
        • "Gatilho"(en: "Trigger", es: "Gatillo"): Campo obrigatório, editável, tipo pesquisa, seleção única, abrindo modal de pesquisa com campo "Gatilho"
            • Valor persistidoGatilho
              SYNC_PEDIDO_PPSincronização de pedido finalizado
          • O valor do campo deve ser persistido em pluginintvinculos.texto1, com valor fixo no campo pluginintvinculos.descricaotexto1 = 'Gatilho'
        • "URL": Campo textual, editável, obrigatório.
          • O valor do campo deve ser persistido em pluginintvinculos.texto2, com valor fixo no campo pluginintvinculos.descricaotexto2 = 'URL'
        • "Credencial"(en: "Credential", es: "Credencial"): Campo de opções selecionáveis (combo-box), não obrigatório, nenhuma opção selecionada por padrão, cujas opções virão da seguinte consulta:
            • select idcredencial as valor, descricao as descricao from credencial where idnativo = 1
          • O valor da opção selecionada deve ser persistido no campo pluginintvinculos.idcredencial
        • "Timeout (s)"(en: "Timeout (s)", es: "Tiempo de espera (s)"): Campo editável, aceitando valores inteiros positivos. Valor padrão 10.
          • O valor da opção selecionada deve ser persistido no campo pluginintvinculos.int1, com valor fixo no campo pluginintvinculos.descricaoint1 = 'Timeout (s)'
        • "Protocolo de Retorno"(en: "Return Protocol", es: "Protocolo de retorno"): Campo de opções selecionáveis (combo-box), obrigatório, com as seguintes opções fixas:
            • ValorDescriçãoPadrão
              2XXHTTP Status 2XX - Sem conteúdoX
              CARTEXML Pentaho Carte - Sem conteúdo
          • O valor do campo deve ser persistido em pluginintvinculos.texto3, com valor fixo no campo pluginintvinculos.descricaotexto3 = 'Protocolo de retorno'
        • : Botão de lixeira para remover o registro em questão.
      • "Gravar"(en: "Save", es: "Guardar"): Botão no canto superior direito da tela que, quando clicado, realizará as persistências do formulário em questão.
      • "Voltar"(en: "Back", es: "Volver"): Botão no canto superior direito da tela. Quando clicado, retornará à tela de Configuração → Integração → Plugins de integração

04.01.05 Implementação de webhook em pedidos de venda - Sincronização manual / Sincronização automática

Contexto / Gatilho:

  • Sincronização manual de dados do aplicativo móvel para o servidor, após o commit no banco de dados, antes de realizar consulta de dados atualizados que vão para o aparelho.
  • Sincronização automática de dados do aplicativo móvel para o servidor, após o commit no banco de dados.

Lógica:

  • Caso o plugin de integração "WEBHOOK" esteja com campo pluginintegracao.idnativo = 1
    • Caso exista registro na tabela pluginintvinculos, com os seguintes valores de campos:
        • pluginintvinculos.idpluginintegracao = (select idpluginintegracao from pluginintegracao where codigo = 'WEBHOOK'
        • pluginintvinculos.sglagrupador = 'contratos'
        • pluginintvinculos.texto1 = 'SYNC_PEDIDO_PP'
      • Caso existam pedidos alterados pela aplicação Mobile commitados no banco,
        • Para cada um dos registros cadastrados nesse gatilho (loop),
        • Realizar requisição HTTP POST para ${URL cadastrada no campo pluginintvinculos.texto2}
          • Body

            [
            	{
            		"idpedido": 1, //pedido.idpedido
            		"idusuario": 1, //pedido.idusuarioprofissional
            		"idparceiro": 1, //pedido.idparceiro
            		"idlocal": 2, //pedido.idlocal
            		"idlocalcobranca": 3, //pedido.idlocalcobranca
            		"idfilialvenda": 3, //pedido.idlocalfilialvenda
            		"idfilialretira": 4, //pedido.idlocalfilialretirada
            		"idfilialfaturamento": 5, //pedido.idlocalfilialfaturamento
            		"idtipopedido": 4, //pedido.idtipopedido
            		"idtipocobranca": 5, //pedido.idtipocobranca
            		"idtabelapreco": 6, //pedido.idtabelapreco
            		"idcondicaopagamento": 5, //pedido.idcondicaopagamento
            		"idsegmento": 8, //pedido.idsegmento
            		"idtipologia": 8, //pedido.idtipologia
            		"idoperacao": 8, //pedido.idoperacao
            		"idmoeda": 8, //pedido.idindexador
            		"idtipoestoque": 8, //pedido.idtipoestoque
            		"valortotalbruto": 8.00, //Campo "Valor total bruto do resumo"
            		"valortotalliquido": 9.00, //Campo "Valor total liquido do resumo",
                    "observacaopedido": "texto", //pedido.observacaopedido
                    "observacaonotafiscal": "texto", //pedido.observacaonotafiscal
                    "observacaosituacao": "texto", //pedido.observacaosituacao
                    "observacaoexpedicao": "texto", //pedido.observacaoexpedicao
                    "datapedido": "2020-01-01", //pedido.datapedido
                    "horapedido": "08:21:00", //pedido.horapedido
                    "datafinalizado": "2020-01-01", //pedido.datafinalizado
                    "horafinalizado": "08:21:00", //pedido.horafinalizado
            		"descontopedido": [
            			{
            				"codigo": "8", //pedidotipodesconto.idtipodesconto > tipodesconto.codigo
            				"percentual": 9.00, //pedidotipodesconto.percentual
            				"valor": 10.00 //pedidotipodesconto.valor
            			},
            			{
            				"codigo": "8", //pedidotipodesconto.idtipodesconto > tipodesconto.codigo
            				"percentual": 9.00, //pedidotipodesconto.percentual
            				"valor": 10.00 //pedidotipodesconto.valor
            			}
            		],
            		"pedidoproduto": [
            			{
            				"idpedidoproduto": 1, //pedidoproduto.idpedidoproduto
            				"ordem": 1, //pedidoproduto.ordem
            				"idproduto": 8, //pedidoproduto.idproduto
            				"idembalagem": 10, //pedidoproduto.idembalagem,
            				"quantidade": 9.00, //pedidoproduto.quantidade
            				"precovenda": 10.00, //pedidoproduto.precovenda PS:Valor unitário
            				"precotabela": 11.00, //pedidoproduto.precotabela PS:Valor unitário
            				"precooriginal": 12.00, //pedidoproduto.precooriginal PS:Valor unitário
            				"percentualdesconto": 13.00, //pedidoproduto.percentualdesconto
            				"valordesconto": 13.00, //pedidoproduto.valordesconto PS:Valor unitário
            				"percentualacrescimo": 13.00, //pedidoproduto.percentualacrescimo
            				"valoracrescimo": 13.00, //pedidoproduto.valoracrescimo PS:Valor unitário
            				"idtipopedido": 13.00, //pedidoproduto.idtipopedido
            				"idtipoestoque": 14, //pedidoproduto.idtipoestoque
            				"idtabelapreco": 15, //pedidoproduto.idtabelapreco
            			},
            			{  				
            				"idpedidoproduto": 2, //pedidoproduto.idpedidoproduto 
            				"ordem": 1, //pedidoproduto.ordem
            				"idproduto": 8, //pedidoproduto.idproduto
            				"idembalagem": 10, //pedidoproduto.idembalagem,
            				"quantidade": 9.00, //pedidoproduto.quantidade
            				"precovenda": 10.00, //pedidoproduto.precovenda PS:Valor unitário
            				"precotabela": 11.00, //pedidoproduto.precotabela PS:Valor unitário
            				"precooriginal": 12.00, //pedidoproduto.precooriginal PS:Valor unitário
            				"percentualdesconto": 13.00, //pedidoproduto.percentualdesconto
            				"valordesconto": 13.00, //pedidoproduto.valordesconto PS:Valor unitário
            				"percentualacrescimo": 13.00, //pedidoproduto.percentualacrescimo
            				"valoracrescimo": 13.00, //pedidoproduto.valoracrescimo PS:Valor unitário
            				"idtipopedido": 13.00, //pedidoproduto.idtipopedido
            				"idtipoestoque": 14, //pedidoproduto.idtipoestoque
            				"idtabelapreco": 15, //pedidoproduto.idtabelapreco
            			}
            		],
            		"pedidoentrega": [
            			{
            				"idpedidoentrega": 1, //pedidoentrega.idpedidoentrega
            				"idtipofrete": 4, //pedidoentrega.idtipofrete
            				"idtransportadora": 7, //pedidoentrega.idparceirotransportador
            				"idparceiroentrega": 8, //pedidoentrega.idparceiroentrega
            				"valorfrete": 5.00, //pedidoentrega.valorfrete
            				"valordespesa": 6.00, //pedidoentrega.valordespesa
            				"valorseguro": 7.00 //pedidoentrega.valorseguro       
            			},
            			{
              				"idpedidoentrega": 2, //pedidoentrega.idpedidoentrega 
                            "idtipofrete": 4, //pedidoentrega.idtipofrete
            				"idtransportadora": 7, //pedidoentrega.idparceirotransportador
            				"idparceiroentrega": 8, //pedidoentrega.idparceiroentrega
            				"valorfrete": 5.00, //pedidoentrega.valorfrete
            				"valordespesa": 6.00, //pedidoentrega.valordespesa
            				"valorseguro": 7.00 //pedidoentrega.valorseguro       
            			}
            		],
                    "pedidoparcela": [
            			{
            				"idpedidoparcela": 1, //pedidoentrega.idpedidoparcela
            				"ordem": 1, //pedidoentrega.ordem
            				"valor": 4, //pedidoentrega.valor
            				"datavencimento": 7 //pedidoentrega.datavencimento
            			},
            			{
              				"idpedidoparcela": 2, //pedidoentrega.idpedidoparcela 
                            "ordem": 2, //pedidoentrega.ordem
                            "valor": 4, //pedidoentrega.valor
            				"datavencimento": 7 //pedidoentrega.datavencimento
            			}
            		]
            	},
            	{ /* outro objeto com template acima */ },
            	{ /* outro objeto com template acima */ }
            ]
          • Resposta esperada quando pluginintvinculos.texto3 = 'CARTE' 

            /* Considerando já o PARSE DA resposta do pentaho que é realizada de maneira assíncrona, retornando xml 
            Na tag result.result-rows, o retorno será feito através de 2 campos:
            
            	RETORNO: string
            	STATUS: int
            */
            
            Quando bem sucedido:
            {
            	"status": 200
            	"retorno": "" 
            }
            
            Quando mal sucedido:
            {
            	"status": ${<> 200, 201}
            	"retorno": "Mensagem para ser anexada ao log do servidor" 
            }
          • Resposta esperada quando pluginintvinculos.texto3 = '2XX' 

            Quando bem sucedido:
            http_status 2XX 
            Body: No content
            
            Quando mal sucedido:
            http_status <> 2XX
            {
            	"erro": "Mensagem para ser anexada ao log do servidor" 
            }
          • Caso a requisição demore um tempo acima da quantidade de segundos cadastrada no campo pluginintvinculos.int1, ou o retorno for mal sucedido, o sistema deverá mandar mensagem no log do serviço executado: 
            • "Falha em requisição WebHook:
              {
                  "gatilho": ${pluginintvinculos.texto1}
                  "url": ${pluginintvinculos.texto2}
                  "descricao": ${quando existe conteúdo no campo "erro", então ${erro}, caso contrário: "Erro inesperado sem mensagem retornada". Caso for erro de timeout: "Tempo esgotado para retorno da requisição"}
                  "entidades": ${Identificadores das entidades enviadas no gatilho. Por exemplo: Pedido -188265, Pedido -188266}
              }"

04.01 Integração

04.01.01 Serviço de validação de pedidos por limite de crédito atualizado

Visto que a regra de limite de crédito validada pela integração será feita de maneira customizada, a sua descrição não estará presente no presente documento, podendo ser acessada por este link.

05. FORA DO ESCOPO

  1. A sincronização somente terá o recurso de alterar o status do pedido para "Não finalizado", garantindo que o mesmo não seja processado pelo servidor como finalizado, entretanto, não realizará criação de aprovações para o pedido.
    1. Caso no momento da sincronização, ao realizar a validação das lógicas de permitir exceder limite de crédito com os dados atualizados, o sistema identificar que o pedido deveria conter uma aprovação que não existe, o sistema deverá retornar o pedido para não finalizado, para que o usuário ter a possibilidade de reajustar o pedido para não passar pela aprovação, ou finalizar novamente, para encaminhar o pedido para aprovação.
  2. A sincronização automática somente envia dados do aparelho ao servidor, atualmente. Portanto, ao finalizar um pedido e sincronizá-lo automaticamente, o sistema poderá informar o webhook da alteração da entidade, porém, deverá receber a notificação de alteração do pedido para não finalizado através do módulo de notificação. O usuário deverá sincronizar manualmente para receber os dados atualizados para o status não finalizado.
  • Sem rótulos