<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://wiki.biserp.com.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rodrigogml</id>
	<title>BIS Wiki - Contribuições do usuário [pt-br]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.biserp.com.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rodrigogml"/>
	<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=Especial:Contribui%C3%A7%C3%B5es/Rodrigogml"/>
	<updated>2026-04-08T18:44:26Z</updated>
	<subtitle>Contribuições do usuário</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1703</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1703"/>
		<updated>2026-01-03T19:21:55Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* ClassTrib x NCM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
As Exceções da Tabela do IPI podem ser obtidas no &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/legislacao/tipi-tabela-de-incidencia-do-imposto-sobre-produtos-industrializados site do gov.br]&#039;&#039;&#039;. Embora não tenha um formado padronizado como a do NCM, o formato XLSX com algum tratamento/adaptação permite a importação no sistema. Cuidado ao tentar automatizar com a importação do XLSX pois a planilha sofre alterações de layout entre publicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
A tabela de ClassTrib é fornecida diretamente pelo [https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= Portal da NFe], em excel.&lt;br /&gt;
&lt;br /&gt;
== Atualização do Sistema ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Cuidado com ON DELETE CASCADE|Os relacionamentos das tabelas, em geral incluem ON DELETE CASCADE, pois se um NCM, CEST ou ClassTrib deixar de existir qualquer relacionamento e informações adicionais são excluídas automaticamente.&lt;br /&gt;
&lt;br /&gt;
Por isso é preciso cuidado na atualização das tabelas, não executando exclusão para depois inserção ou pode terminar na perda de informações relacionadas. Exemplos:&lt;br /&gt;
* Excluir um NCM durante a atualização exclui junto as informações sobre crédito especial de regime (valores que são salvos juntos na mesma tabela do NCM mas que não fazem parte da definição do NCM);&lt;br /&gt;
* Excluir um NCM também exclui seus filhos, o que inclui registros filhos da exceção da TIPI, que também não fazem parte da definição do NCM, mas são criados a partir da importação da TIPI.&lt;br /&gt;
* Excluir um NCM, CEST ou ClassTrib exclui automaticamente o relacionamento entre esses tributos, que é definido e criado manualmente.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
Como o formato padrão da SISCOMEX é JSON, o BIS ganhou o método &amp;lt;code&amp;gt;NCMCrud.updateNCMTable()&amp;lt;/code&amp;gt; que baixa e já atualiza a tabela de NCM no sistema. Dando baixa nos NCMs que não podem mais ser utilizados, completando data de expiração de outros e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Por padrão esse método não exclui nenhum NCM, mas NCMs que não são encontrados no JSON são marcados como vencidos com a data do dia anterior ao de execução do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Atenção ao limite de 3 acessos ao site por hora|O site da SISCOMEX tem um limite de acesso de 3 vezes por hora. Para desenvolvimento ou em caso de problemas é recomendado fazer um cache local do arquivo primeiro.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
Como a tabela é baixada em Excel, as seguitnes fórmulas podem ajudar a realizar a importação manual, gerando Scripts para execução direta no banco de dados:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Mudanças no Layout da Planilha|As fórmulas foram geradas para um layout da planilha e pode precisar de adaptação.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;E9:&#039;&#039;&#039; Trata e limpa o NCM&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;SUBSTITUTE(A9;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);IF(AND(B9&amp;lt;&amp;gt;&amp;quot;&amp;quot;;LEN(A8)=10);SUBSTITUTE(A8;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);&amp;quot;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F9:&#039;&#039;&#039; Trata e limpa a ExTIPI&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(E9&amp;lt;&amp;gt;&amp;quot;&amp;quot;;IF(B9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;TEXT(VALUE(SUBSTITUTE(B9;&amp;quot;Ex &amp;quot;;&amp;quot;&amp;quot;));&amp;quot;000&amp;quot;));&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;G9:&#039;&#039;&#039; Trata e Limpa a Descrição&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=TRIM(SUBSTITUTE(CLEAN(IF(LEFT(C9;1)=&amp;quot;-&amp;quot;; TRIM(MID(C9; FIND(&amp;quot; &amp;quot;; C9); LEN(C9))); C9)); &amp;quot;&#039;&amp;quot;; &amp;quot;&#039;&#039;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;H9:&#039;&#039;&#039; Gera o SQL de INSERT/UPDATE para as entradas de exceçãod e TIPI (Apenas as que não são atualizadas geradas pela tabela do NCM)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(F9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;&lt;br /&gt;
&amp;quot;INSERT INTO fiscal_ncm (idfiscal_ncm, ncm, exTIPI, description, fullDescription, usable, esp32_credit, endValidity, lastUpdate) &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;SELECT id, &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; F9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;, CONCAT(fullDescription, &#039;|&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;), 1, NULL, endValidity, NOW() FROM fiscal_ncm WHERE ncm = &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039; AND extipi = &#039;&#039; LIMIT 1 &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;ON DUPLICATE KEY UPDATE idfiscal_ncm=VALUES(idfiscal_ncm), description=VALUES(description), fullDescription=VALUES(fullDescription), usable=VALUES(usable), endValidity=VALUES(endValidity),lastUpdate = VALUES(lastUpdate);&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
&lt;br /&gt;
O portal [https://dfe-portal.svrs.rs.gov.br/CFF/Servicos´ Portal da Conformidade Fácil] oferece algumas tabelas no formato do JSON para download, entre elas: [https://cff.svrs.rs.gov.br/api/v1/consultas/classTrib ClassTrib].&lt;br /&gt;
&lt;br /&gt;
O BIS baixa e atualiza automaticamente sua tabela através do método &amp;lt;code&amp;gt;ClassTribCrud.updateClassTribTable(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Relacionamento entre as Tabelas ===&lt;br /&gt;
&lt;br /&gt;
O relacionamento (ou mapeamento) entre tabelas de NCM/CEST/ClassTrib foram geradas pelo contador para importação no sistema e precisam de adaptação conforme a planilha manual criada por eles. Ainda assim, o modelo do script a seguir pode ser útil para importação manual dos valores das planilhas:&lt;br /&gt;
&lt;br /&gt;
==== ClassTrib x NCM====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=&amp;quot;INSERT IGNORE INTO fiscal_classtrib_ncm (`idfiscal_classtrib`, `idfiscal_ncm`) VALUES ((SELECT id FROM fiscal_classtrib WHERE classTrib = &#039;&amp;quot; &amp;amp; =IF(O7=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;O7) &amp;amp; &amp;quot;&#039;),(SELECT id FROM fiscal_ncm WHERE ncm=&#039;&amp;quot; &amp;amp; AX7 &amp;amp; &amp;quot;&#039; AND exTIPI=&#039;&amp;quot; &amp;amp; IF(VALUE(B7)=0;&amp;quot;&amp;quot;;TEXT(B7;&amp;quot;000&amp;quot;)) &amp;amp; &amp;quot;&#039;));&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Onde:&#039;&#039;&#039;&lt;br /&gt;
* AX7 -&amp;gt; NCM tratado para 8 dígitos sem pontuação;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A7)=10;SUBSTITUTE(A7;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* O7 -&amp;gt; ClassTrib com 6 dígitos sem pontuação;&lt;br /&gt;
* B7 -&amp;gt; ExTIPI&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1702</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1702"/>
		<updated>2025-12-26T00:56:13Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* ExTIPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
As Exceções da Tabela do IPI podem ser obtidas no &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/legislacao/tipi-tabela-de-incidencia-do-imposto-sobre-produtos-industrializados site do gov.br]&#039;&#039;&#039;. Embora não tenha um formado padronizado como a do NCM, o formato XLSX com algum tratamento/adaptação permite a importação no sistema. Cuidado ao tentar automatizar com a importação do XLSX pois a planilha sofre alterações de layout entre publicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
A tabela de ClassTrib é fornecida diretamente pelo [https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= Portal da NFe], em excel.&lt;br /&gt;
&lt;br /&gt;
== Atualização do Sistema ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Cuidado com ON DELETE CASCADE|Os relacionamentos das tabelas, em geral incluem ON DELETE CASCADE, pois se um NCM, CEST ou ClassTrib deixar de existir qualquer relacionamento e informações adicionais são excluídas automaticamente.&lt;br /&gt;
&lt;br /&gt;
Por isso é preciso cuidado na atualização das tabelas, não executando exclusão para depois inserção ou pode terminar na perda de informações relacionadas. Exemplos:&lt;br /&gt;
* Excluir um NCM durante a atualização exclui junto as informações sobre crédito especial de regime (valores que são salvos juntos na mesma tabela do NCM mas que não fazem parte da definição do NCM);&lt;br /&gt;
* Excluir um NCM também exclui seus filhos, o que inclui registros filhos da exceção da TIPI, que também não fazem parte da definição do NCM, mas são criados a partir da importação da TIPI.&lt;br /&gt;
* Excluir um NCM, CEST ou ClassTrib exclui automaticamente o relacionamento entre esses tributos, que é definido e criado manualmente.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
Como o formato padrão da SISCOMEX é JSON, o BIS ganhou o método &amp;lt;code&amp;gt;NCMCrud.updateNCMTable()&amp;lt;/code&amp;gt; que baixa e já atualiza a tabela de NCM no sistema. Dando baixa nos NCMs que não podem mais ser utilizados, completando data de expiração de outros e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Por padrão esse método não exclui nenhum NCM, mas NCMs que não são encontrados no JSON são marcados como vencidos com a data do dia anterior ao de execução do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Atenção ao limite de 3 acessos ao site por hora|O site da SISCOMEX tem um limite de acesso de 3 vezes por hora. Para desenvolvimento ou em caso de problemas é recomendado fazer um cache local do arquivo primeiro.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
Como a tabela é baixada em Excel, as seguitnes fórmulas podem ajudar a realizar a importação manual, gerando Scripts para execução direta no banco de dados:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Mudanças no Layout da Planilha|As fórmulas foram geradas para um layout da planilha e pode precisar de adaptação.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;E9:&#039;&#039;&#039; Trata e limpa o NCM&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;SUBSTITUTE(A9;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);IF(AND(B9&amp;lt;&amp;gt;&amp;quot;&amp;quot;;LEN(A8)=10);SUBSTITUTE(A8;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);&amp;quot;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F9:&#039;&#039;&#039; Trata e limpa a ExTIPI&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(E9&amp;lt;&amp;gt;&amp;quot;&amp;quot;;IF(B9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;TEXT(VALUE(SUBSTITUTE(B9;&amp;quot;Ex &amp;quot;;&amp;quot;&amp;quot;));&amp;quot;000&amp;quot;));&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;G9:&#039;&#039;&#039; Trata e Limpa a Descrição&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=TRIM(SUBSTITUTE(CLEAN(IF(LEFT(C9;1)=&amp;quot;-&amp;quot;; TRIM(MID(C9; FIND(&amp;quot; &amp;quot;; C9); LEN(C9))); C9)); &amp;quot;&#039;&amp;quot;; &amp;quot;&#039;&#039;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;H9:&#039;&#039;&#039; Gera o SQL de INSERT/UPDATE para as entradas de exceçãod e TIPI (Apenas as que não são atualizadas geradas pela tabela do NCM)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(F9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;&lt;br /&gt;
&amp;quot;INSERT INTO fiscal_ncm (idfiscal_ncm, ncm, exTIPI, description, fullDescription, usable, esp32_credit, endValidity, lastUpdate) &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;SELECT id, &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; F9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;, CONCAT(fullDescription, &#039;|&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;), 1, NULL, endValidity, NOW() FROM fiscal_ncm WHERE ncm = &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039; AND extipi = &#039;&#039; LIMIT 1 &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;ON DUPLICATE KEY UPDATE idfiscal_ncm=VALUES(idfiscal_ncm), description=VALUES(description), fullDescription=VALUES(fullDescription), usable=VALUES(usable), endValidity=VALUES(endValidity),lastUpdate = VALUES(lastUpdate);&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
&lt;br /&gt;
O portal [https://dfe-portal.svrs.rs.gov.br/CFF/Servicos´ Portal da Conformidade Fácil] oferece algumas tabelas no formato do JSON para download, entre elas: [https://cff.svrs.rs.gov.br/api/v1/consultas/classTrib ClassTrib].&lt;br /&gt;
&lt;br /&gt;
O BIS baixa e atualiza automaticamente sua tabela através do método &amp;lt;code&amp;gt;ClassTribCrud.updateClassTribTable(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Relacionamento entre as Tabelas ===&lt;br /&gt;
&lt;br /&gt;
O relacionamento (ou mapeamento) entre tabelas de NCM/CEST/ClassTrib foram geradas pelo contador para importação no sistema e precisam de adaptação conforme a planilha manual criada por eles. Ainda assim, o modelo do script a seguir pode ser útil para importação manual dos valores das planilhas:&lt;br /&gt;
&lt;br /&gt;
==== ClassTrib x NCM====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=&amp;quot;INSERT IGNORE INTO fiscal_classtrib_ncm (`idfiscal_classtrib`, `idfiscal_ncm`) VALUES ((SELECT id FROM fiscal_classtrib WHERE cclassTrib = &#039;&amp;quot; &amp;amp; AY7 &amp;amp; &amp;quot;&#039;),(SELECT id FROM fiscal_ncm WHERE ncm=&#039;&amp;quot; &amp;amp; AX7 &amp;amp; &amp;quot;&#039; AND exTIPI=&#039;&amp;quot; &amp;amp; IF(VALUE(B7)=0;&amp;quot;&amp;quot;;TEXT(B7;&amp;quot;000&amp;quot;)) &amp;amp; &amp;quot;&#039;));&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Onde:&#039;&#039;&#039;&lt;br /&gt;
* AX7 -&amp;gt; NCM tratado para 8 dígitos sem pontuação;&lt;br /&gt;
* AY7 -&amp;gt; ClassTrib tratado com 6 dígitos sem pontuação;&lt;br /&gt;
* B7 -&amp;gt; ExTIPI&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1701</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1701"/>
		<updated>2025-12-26T00:49:23Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* ExTIPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
As Exceções da Tabela do IPI podem ser obtidas no &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/legislacao/tipi-tabela-de-incidencia-do-imposto-sobre-produtos-industrializados site do gov.br]&#039;&#039;&#039;. Embora não tenha um formado padronizado como a do NCM, o formato XLSX com algum tratamento/adaptação permite a importação no sistema. Cuidado ao tentar automatizar com a importação do XLSX pois a planilha sofre alterações de layout entre publicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
A tabela de ClassTrib é fornecida diretamente pelo [https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= Portal da NFe], em excel.&lt;br /&gt;
&lt;br /&gt;
== Atualização do Sistema ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Cuidado com ON DELETE CASCADE|Os relacionamentos das tabelas, em geral incluem ON DELETE CASCADE, pois se um NCM, CEST ou ClassTrib deixar de existir qualquer relacionamento e informações adicionais são excluídas automaticamente.&lt;br /&gt;
&lt;br /&gt;
Por isso é preciso cuidado na atualização das tabelas, não executando exclusão para depois inserção ou pode terminar na perda de informações relacionadas. Exemplos:&lt;br /&gt;
* Excluir um NCM durante a atualização exclui junto as informações sobre crédito especial de regime (valores que são salvos juntos na mesma tabela do NCM mas que não fazem parte da definição do NCM);&lt;br /&gt;
* Excluir um NCM também exclui seus filhos, o que inclui registros filhos da exceção da TIPI, que também não fazem parte da definição do NCM, mas são criados a partir da importação da TIPI.&lt;br /&gt;
* Excluir um NCM, CEST ou ClassTrib exclui automaticamente o relacionamento entre esses tributos, que é definido e criado manualmente.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
Como o formato padrão da SISCOMEX é JSON, o BIS ganhou o método &amp;lt;code&amp;gt;NCMCrud.updateNCMTable()&amp;lt;/code&amp;gt; que baixa e já atualiza a tabela de NCM no sistema. Dando baixa nos NCMs que não podem mais ser utilizados, completando data de expiração de outros e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Por padrão esse método não exclui nenhum NCM, mas NCMs que não são encontrados no JSON são marcados como vencidos com a data do dia anterior ao de execução do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Atenção ao limite de 3 acessos ao site por hora|O site da SISCOMEX tem um limite de acesso de 3 vezes por hora. Para desenvolvimento ou em caso de problemas é recomendado fazer um cache local do arquivo primeiro.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
Como a tabela é baixada em Excel, as seguitnes fórmulas podem ajudar a realizar a importação manual, gerando Scripts para execução direta no banco de dados:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Mudanças no Layout da Planilha|As fórmulas foram geradas para um layout da planilha e pode precisar de adaptação.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;E9:&#039;&#039;&#039; Trata e limpa o NCM&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;SUBSTITUTE(A9;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);IF(AND(B9&amp;lt;&amp;gt;&amp;quot;&amp;quot;;LEN(A8)=10);SUBSTITUTE(A8;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);&amp;quot;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F9:&#039;&#039;&#039; Trata e limpa a ExTIPI&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(E9&amp;lt;&amp;gt;&amp;quot;&amp;quot;;IF(B9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;TEXT(VALUE(SUBSTITUTE(B9;&amp;quot;Ex &amp;quot;;&amp;quot;&amp;quot;));&amp;quot;000&amp;quot;));&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;G9:&#039;&#039;&#039; Trata e Limpa a Descrição&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=TRIM(SUBSTITUTE(CLEAN(IF(LEFT(C9;1)=&amp;quot;-&amp;quot;; TRIM(MID(C9; FIND(&amp;quot; &amp;quot;; C9); LEN(C9))); C9)); &amp;quot;&#039;&amp;quot;; &amp;quot;&#039;&#039;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;H9:&#039;&#039;&#039; Gera o SQL de INSERT/UPDATE para as entradas de exceçãod e TIPI (Apenas as que não são atualizadas geradas pela tabela do NCM)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(F9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;&lt;br /&gt;
&amp;quot;INSERT INTO fiscal_ncm (idfiscal_ncm, ncm, exTIPI, description, fullDescription, usable, esp32_credit, endValidity) &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;SELECT id, &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; F9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;, CONCAT(fullDescription, &#039;|&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;), 1, NULL, endValidity FROM fiscal_ncm WHERE ncm = &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039; AND extipi = &#039;&#039; LIMIT 1 &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;ON DUPLICATE KEY UPDATE idfiscal_ncm=VALUES(idfiscal_ncm), description=VALUES(description), fullDescription=VALUES(fullDescription), usable=VALUES(usable), endValidity=VALUES(endValidity);&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
&lt;br /&gt;
O portal [https://dfe-portal.svrs.rs.gov.br/CFF/Servicos´ Portal da Conformidade Fácil] oferece algumas tabelas no formato do JSON para download, entre elas: [https://cff.svrs.rs.gov.br/api/v1/consultas/classTrib ClassTrib].&lt;br /&gt;
&lt;br /&gt;
O BIS baixa e atualiza automaticamente sua tabela através do método &amp;lt;code&amp;gt;ClassTribCrud.updateClassTribTable(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Relacionamento entre as Tabelas ===&lt;br /&gt;
&lt;br /&gt;
O relacionamento (ou mapeamento) entre tabelas de NCM/CEST/ClassTrib foram geradas pelo contador para importação no sistema e precisam de adaptação conforme a planilha manual criada por eles. Ainda assim, o modelo do script a seguir pode ser útil para importação manual dos valores das planilhas:&lt;br /&gt;
&lt;br /&gt;
==== ClassTrib x NCM====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=&amp;quot;INSERT IGNORE INTO fiscal_classtrib_ncm (`idfiscal_classtrib`, `idfiscal_ncm`) VALUES ((SELECT id FROM fiscal_classtrib WHERE cclassTrib = &#039;&amp;quot; &amp;amp; AY7 &amp;amp; &amp;quot;&#039;),(SELECT id FROM fiscal_ncm WHERE ncm=&#039;&amp;quot; &amp;amp; AX7 &amp;amp; &amp;quot;&#039; AND exTIPI=&#039;&amp;quot; &amp;amp; IF(VALUE(B7)=0;&amp;quot;&amp;quot;;TEXT(B7;&amp;quot;000&amp;quot;)) &amp;amp; &amp;quot;&#039;));&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Onde:&#039;&#039;&#039;&lt;br /&gt;
* AX7 -&amp;gt; NCM tratado para 8 dígitos sem pontuação;&lt;br /&gt;
* AY7 -&amp;gt; ClassTrib tratado com 6 dígitos sem pontuação;&lt;br /&gt;
* B7 -&amp;gt; ExTIPI&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1700</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1700"/>
		<updated>2025-12-20T20:47:29Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* NCM x ClassTrib */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
As Exceções da Tabela do IPI podem ser obtidas no &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/legislacao/tipi-tabela-de-incidencia-do-imposto-sobre-produtos-industrializados site do gov.br]&#039;&#039;&#039;. Embora não tenha um formado padronizado como a do NCM, o formato XLSX com algum tratamento/adaptação permite a importação no sistema. Cuidado ao tentar automatizar com a importação do XLSX pois a planilha sofre alterações de layout entre publicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
A tabela de ClassTrib é fornecida diretamente pelo [https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= Portal da NFe], em excel.&lt;br /&gt;
&lt;br /&gt;
== Atualização do Sistema ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Cuidado com ON DELETE CASCADE|Os relacionamentos das tabelas, em geral incluem ON DELETE CASCADE, pois se um NCM, CEST ou ClassTrib deixar de existir qualquer relacionamento e informações adicionais são excluídas automaticamente.&lt;br /&gt;
&lt;br /&gt;
Por isso é preciso cuidado na atualização das tabelas, não executando exclusão para depois inserção ou pode terminar na perda de informações relacionadas. Exemplos:&lt;br /&gt;
* Excluir um NCM durante a atualização exclui junto as informações sobre crédito especial de regime (valores que são salvos juntos na mesma tabela do NCM mas que não fazem parte da definição do NCM);&lt;br /&gt;
* Excluir um NCM também exclui seus filhos, o que inclui registros filhos da exceção da TIPI, que também não fazem parte da definição do NCM, mas são criados a partir da importação da TIPI.&lt;br /&gt;
* Excluir um NCM, CEST ou ClassTrib exclui automaticamente o relacionamento entre esses tributos, que é definido e criado manualmente.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
Como o formato padrão da SISCOMEX é JSON, o BIS ganhou o método &amp;lt;code&amp;gt;NCMCrud.updateNCMTable()&amp;lt;/code&amp;gt; que baixa e já atualiza a tabela de NCM no sistema. Dando baixa nos NCMs que não podem mais ser utilizados, completando data de expiração de outros e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Por padrão esse método não exclui nenhum NCM, mas NCMs que não são encontrados no JSON são marcados como vencidos com a data do dia anterior ao de execução do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Atenção ao limite de 3 acessos ao site por hora|O site da SISCOMEX tem um limite de acesso de 3 vezes por hora. Para desenvolvimento ou em caso de problemas é recomendado fazer um cache local do arquivo primeiro.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
Como a tabela é baixada em Excel, as seguitnes fórmulas podem ajudar a realizar a importação manual, gerando Scripts para execução direta no banco de dados:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Mudanças no Layout da Planilha|As fórmulas foram geradas para um layout da planilha e pode precisar de adaptação.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;E9:&#039;&#039;&#039; Trata e limpa o NCM&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;SUBSTITUTE(A9;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F9:&#039;&#039;&#039; Trata e limpa a ExTIPI&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;IF(B9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;TEXT(VALUE(SUBSTITUTE(B9;&amp;quot;Ex &amp;quot;;&amp;quot;&amp;quot;));&amp;quot;000&amp;quot;));&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;G9:&#039;&#039;&#039; Trata e Limpa a Descrição&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=TRIM(SUBSTITUTE(CLEAN(IF(LEFT(C9;1)=&amp;quot;-&amp;quot;; TRIM(MID(C9; FIND(&amp;quot; &amp;quot;; C9); LEN(C9))); C9)); &amp;quot;&#039;&amp;quot;; &amp;quot;&#039;&#039;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;H9:&#039;&#039;&#039; Gera o SQL de INSERT/UPDATE para as entradas de exceçãod e TIPI (Apenas as que não são atualizadas geradas pela tabela do NCM)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(F9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;&lt;br /&gt;
&amp;quot;INSERT INTO fiscal_ncm (idfiscal_ncm, ncm, exTIPI, description, fullDescription, usable, esp32_credit, endValidity) &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;SELECT id, &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; F9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;, CONCAT(fullDescription, &#039;|&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;), 1, NULL, endValidity FROM fiscal_ncm WHERE ncm = &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039; AND extipi = &#039;&#039; LIMIT 1 &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;ON DUPLICATE KEY UPDATE idfiscal_ncm=VALUES(idfiscal_ncm), description=VALUES(description), fullDescription=VALUES(fullDescription), usable=VALUES(usable), endValidity=VALUES(endValidity);&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
&lt;br /&gt;
O portal [https://dfe-portal.svrs.rs.gov.br/CFF/Servicos´ Portal da Conformidade Fácil] oferece algumas tabelas no formato do JSON para download, entre elas: [https://cff.svrs.rs.gov.br/api/v1/consultas/classTrib ClassTrib].&lt;br /&gt;
&lt;br /&gt;
O BIS baixa e atualiza automaticamente sua tabela através do método &amp;lt;code&amp;gt;ClassTribCrud.updateClassTribTable(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Relacionamento entre as Tabelas ===&lt;br /&gt;
&lt;br /&gt;
O relacionamento (ou mapeamento) entre tabelas de NCM/CEST/ClassTrib foram geradas pelo contador para importação no sistema e precisam de adaptação conforme a planilha manual criada por eles. Ainda assim, o modelo do script a seguir pode ser útil para importação manual dos valores das planilhas:&lt;br /&gt;
&lt;br /&gt;
==== ClassTrib x NCM====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=&amp;quot;INSERT IGNORE INTO fiscal_classtrib_ncm (`idfiscal_classtrib`, `idfiscal_ncm`) VALUES ((SELECT id FROM fiscal_classtrib WHERE cclassTrib = &#039;&amp;quot; &amp;amp; AY7 &amp;amp; &amp;quot;&#039;),(SELECT id FROM fiscal_ncm WHERE ncm=&#039;&amp;quot; &amp;amp; AX7 &amp;amp; &amp;quot;&#039; AND exTIPI=&#039;&amp;quot; &amp;amp; IF(VALUE(B7)=0;&amp;quot;&amp;quot;;TEXT(B7;&amp;quot;000&amp;quot;)) &amp;amp; &amp;quot;&#039;));&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Onde:&#039;&#039;&#039;&lt;br /&gt;
* AX7 -&amp;gt; NCM tratado para 8 dígitos sem pontuação;&lt;br /&gt;
* AY7 -&amp;gt; ClassTrib tratado com 6 dígitos sem pontuação;&lt;br /&gt;
* B7 -&amp;gt; ExTIPI&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1699</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1699"/>
		<updated>2025-12-19T21:43:53Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* ClassTrib */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
As Exceções da Tabela do IPI podem ser obtidas no &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/legislacao/tipi-tabela-de-incidencia-do-imposto-sobre-produtos-industrializados site do gov.br]&#039;&#039;&#039;. Embora não tenha um formado padronizado como a do NCM, o formato XLSX com algum tratamento/adaptação permite a importação no sistema. Cuidado ao tentar automatizar com a importação do XLSX pois a planilha sofre alterações de layout entre publicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
A tabela de ClassTrib é fornecida diretamente pelo [https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= Portal da NFe], em excel.&lt;br /&gt;
&lt;br /&gt;
== Atualização do Sistema ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Cuidado com ON DELETE CASCADE|Os relacionamentos das tabelas, em geral incluem ON DELETE CASCADE, pois se um NCM, CEST ou ClassTrib deixar de existir qualquer relacionamento e informações adicionais são excluídas automaticamente.&lt;br /&gt;
&lt;br /&gt;
Por isso é preciso cuidado na atualização das tabelas, não executando exclusão para depois inserção ou pode terminar na perda de informações relacionadas. Exemplos:&lt;br /&gt;
* Excluir um NCM durante a atualização exclui junto as informações sobre crédito especial de regime (valores que são salvos juntos na mesma tabela do NCM mas que não fazem parte da definição do NCM);&lt;br /&gt;
* Excluir um NCM também exclui seus filhos, o que inclui registros filhos da exceção da TIPI, que também não fazem parte da definição do NCM, mas são criados a partir da importação da TIPI.&lt;br /&gt;
* Excluir um NCM, CEST ou ClassTrib exclui automaticamente o relacionamento entre esses tributos, que é definido e criado manualmente.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
Como o formato padrão da SISCOMEX é JSON, o BIS ganhou o método &amp;lt;code&amp;gt;NCMCrud.updateNCMTable()&amp;lt;/code&amp;gt; que baixa e já atualiza a tabela de NCM no sistema. Dando baixa nos NCMs que não podem mais ser utilizados, completando data de expiração de outros e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Por padrão esse método não exclui nenhum NCM, mas NCMs que não são encontrados no JSON são marcados como vencidos com a data do dia anterior ao de execução do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Atenção ao limite de 3 acessos ao site por hora|O site da SISCOMEX tem um limite de acesso de 3 vezes por hora. Para desenvolvimento ou em caso de problemas é recomendado fazer um cache local do arquivo primeiro.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
Como a tabela é baixada em Excel, as seguitnes fórmulas podem ajudar a realizar a importação manual, gerando Scripts para execução direta no banco de dados:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Mudanças no Layout da Planilha|As fórmulas foram geradas para um layout da planilha e pode precisar de adaptação.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;E9:&#039;&#039;&#039; Trata e limpa o NCM&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;SUBSTITUTE(A9;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F9:&#039;&#039;&#039; Trata e limpa a ExTIPI&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;IF(B9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;TEXT(VALUE(SUBSTITUTE(B9;&amp;quot;Ex &amp;quot;;&amp;quot;&amp;quot;));&amp;quot;000&amp;quot;));&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;G9:&#039;&#039;&#039; Trata e Limpa a Descrição&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=TRIM(SUBSTITUTE(CLEAN(IF(LEFT(C9;1)=&amp;quot;-&amp;quot;; TRIM(MID(C9; FIND(&amp;quot; &amp;quot;; C9); LEN(C9))); C9)); &amp;quot;&#039;&amp;quot;; &amp;quot;&#039;&#039;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;H9:&#039;&#039;&#039; Gera o SQL de INSERT/UPDATE para as entradas de exceçãod e TIPI (Apenas as que não são atualizadas geradas pela tabela do NCM)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(F9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;&lt;br /&gt;
&amp;quot;INSERT INTO fiscal_ncm (idfiscal_ncm, ncm, exTIPI, description, fullDescription, usable, esp32_credit, endValidity) &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;SELECT id, &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; F9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;, CONCAT(fullDescription, &#039;|&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;), 1, NULL, endValidity FROM fiscal_ncm WHERE ncm = &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039; AND extipi = &#039;&#039; LIMIT 1 &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;ON DUPLICATE KEY UPDATE idfiscal_ncm=VALUES(idfiscal_ncm), description=VALUES(description), fullDescription=VALUES(fullDescription), usable=VALUES(usable), endValidity=VALUES(endValidity);&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
&lt;br /&gt;
O portal [https://dfe-portal.svrs.rs.gov.br/CFF/Servicos´ Portal da Conformidade Fácil] oferece algumas tabelas no formato do JSON para download, entre elas: [https://cff.svrs.rs.gov.br/api/v1/consultas/classTrib ClassTrib].&lt;br /&gt;
&lt;br /&gt;
O BIS baixa e atualiza automaticamente sua tabela através do método &amp;lt;code&amp;gt;ClassTribCrud.updateClassTribTable(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Relacionamento entre as Tabelas ===&lt;br /&gt;
&lt;br /&gt;
O relacionamento (ou mapeamento) entre tabelas de NCM/CEST/ClassTrib foram geradas pelo contador para importação no sistema e precisam de adaptação conforme a planilha manual criada por eles. Ainda assim, o modelo do script a seguir pode ser útil para importação manual dos valores das planilhas:&lt;br /&gt;
&lt;br /&gt;
==== NCM x ClassTrib ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=&amp;quot;INSERT IGNORE INTO fiscal_classtrib_ncm (`idfiscal_classtrib`, `idfiscal_ncm`) VALUES ((SELECT id FROM fiscal_classtrib WHERE cclassTrib = &#039;&amp;quot; &amp;amp; AY7 &amp;amp; &amp;quot;&#039;),(SELECT id FROM fiscal_ncm WHERE ncm=&#039;&amp;quot; &amp;amp; AX7 &amp;amp; &amp;quot;&#039; AND exTIPI=&#039;&amp;quot; &amp;amp; IF(VALUE(B7)=0;&amp;quot;&amp;quot;;TEXT(B7;&amp;quot;000&amp;quot;)) &amp;amp; &amp;quot;&#039;));&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Onde:&#039;&#039;&#039;&lt;br /&gt;
* AX7 -&amp;gt; NCM tratado para 8 dígitos sem pontuação;&lt;br /&gt;
* AY7 -&amp;gt; ClassTrib tratado com 6 dígitos sem pontuação;&lt;br /&gt;
* B7 -&amp;gt; ExTIPI&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1698</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1698"/>
		<updated>2025-12-19T21:42:57Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* ClassTrib */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
As Exceções da Tabela do IPI podem ser obtidas no &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/legislacao/tipi-tabela-de-incidencia-do-imposto-sobre-produtos-industrializados site do gov.br]&#039;&#039;&#039;. Embora não tenha um formado padronizado como a do NCM, o formato XLSX com algum tratamento/adaptação permite a importação no sistema. Cuidado ao tentar automatizar com a importação do XLSX pois a planilha sofre alterações de layout entre publicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
A tabela de ClassTrib é fornecida diretamente pelo [https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= Portal da NFe], em excel.&lt;br /&gt;
&lt;br /&gt;
== Atualização do Sistema ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Cuidado com ON DELETE CASCADE|Os relacionamentos das tabelas, em geral incluem ON DELETE CASCADE, pois se um NCM, CEST ou ClassTrib deixar de existir qualquer relacionamento e informações adicionais são excluídas automaticamente.&lt;br /&gt;
&lt;br /&gt;
Por isso é preciso cuidado na atualização das tabelas, não executando exclusão para depois inserção ou pode terminar na perda de informações relacionadas. Exemplos:&lt;br /&gt;
* Excluir um NCM durante a atualização exclui junto as informações sobre crédito especial de regime (valores que são salvos juntos na mesma tabela do NCM mas que não fazem parte da definição do NCM);&lt;br /&gt;
* Excluir um NCM também exclui seus filhos, o que inclui registros filhos da exceção da TIPI, que também não fazem parte da definição do NCM, mas são criados a partir da importação da TIPI.&lt;br /&gt;
* Excluir um NCM, CEST ou ClassTrib exclui automaticamente o relacionamento entre esses tributos, que é definido e criado manualmente.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
Como o formato padrão da SISCOMEX é JSON, o BIS ganhou o método &amp;lt;code&amp;gt;NCMCrud.updateNCMTable()&amp;lt;/code&amp;gt; que baixa e já atualiza a tabela de NCM no sistema. Dando baixa nos NCMs que não podem mais ser utilizados, completando data de expiração de outros e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Por padrão esse método não exclui nenhum NCM, mas NCMs que não são encontrados no JSON são marcados como vencidos com a data do dia anterior ao de execução do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Atenção ao limite de 3 acessos ao site por hora|O site da SISCOMEX tem um limite de acesso de 3 vezes por hora. Para desenvolvimento ou em caso de problemas é recomendado fazer um cache local do arquivo primeiro.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
Como a tabela é baixada em Excel, as seguitnes fórmulas podem ajudar a realizar a importação manual, gerando Scripts para execução direta no banco de dados:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Mudanças no Layout da Planilha|As fórmulas foram geradas para um layout da planilha e pode precisar de adaptação.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;E9:&#039;&#039;&#039; Trata e limpa o NCM&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;SUBSTITUTE(A9;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F9:&#039;&#039;&#039; Trata e limpa a ExTIPI&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;IF(B9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;TEXT(VALUE(SUBSTITUTE(B9;&amp;quot;Ex &amp;quot;;&amp;quot;&amp;quot;));&amp;quot;000&amp;quot;));&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;G9:&#039;&#039;&#039; Trata e Limpa a Descrição&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=TRIM(SUBSTITUTE(CLEAN(IF(LEFT(C9;1)=&amp;quot;-&amp;quot;; TRIM(MID(C9; FIND(&amp;quot; &amp;quot;; C9); LEN(C9))); C9)); &amp;quot;&#039;&amp;quot;; &amp;quot;&#039;&#039;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;H9:&#039;&#039;&#039; Gera o SQL de INSERT/UPDATE para as entradas de exceçãod e TIPI (Apenas as que não são atualizadas geradas pela tabela do NCM)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(F9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;&lt;br /&gt;
&amp;quot;INSERT INTO fiscal_ncm (idfiscal_ncm, ncm, exTIPI, description, fullDescription, usable, esp32_credit, endValidity) &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;SELECT id, &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; F9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;, CONCAT(fullDescription, &#039;|&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;), 1, NULL, endValidity FROM fiscal_ncm WHERE ncm = &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039; AND extipi = &#039;&#039; LIMIT 1 &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;ON DUPLICATE KEY UPDATE idfiscal_ncm=VALUES(idfiscal_ncm), description=VALUES(description), fullDescription=VALUES(fullDescription), usable=VALUES(usable), endValidity=VALUES(endValidity);&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
&lt;br /&gt;
O portal [https://dfe-portal.svrs.rs.gov.br/CFF/Servicos´] oferece algumas tabelas no formato do JSON para download, entre elas: [https://cff.svrs.rs.gov.br/api/v1/consultas/classTrib ClassTrib].&lt;br /&gt;
&lt;br /&gt;
O BIS baixa e atualiza automaticamente sua tabela através do método &amp;lt;code&amp;gt;ClassTribCrud.updateClassTribTable(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Relacionamento entre as Tabelas ===&lt;br /&gt;
&lt;br /&gt;
O relacionamento (ou mapeamento) entre tabelas de NCM/CEST/ClassTrib foram geradas pelo contador para importação no sistema e precisam de adaptação conforme a planilha manual criada por eles. Ainda assim, o modelo do script a seguir pode ser útil para importação manual dos valores das planilhas:&lt;br /&gt;
&lt;br /&gt;
==== NCM x ClassTrib ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=&amp;quot;INSERT IGNORE INTO fiscal_classtrib_ncm (`idfiscal_classtrib`, `idfiscal_ncm`) VALUES ((SELECT id FROM fiscal_classtrib WHERE cclassTrib = &#039;&amp;quot; &amp;amp; AY7 &amp;amp; &amp;quot;&#039;),(SELECT id FROM fiscal_ncm WHERE ncm=&#039;&amp;quot; &amp;amp; AX7 &amp;amp; &amp;quot;&#039; AND exTIPI=&#039;&amp;quot; &amp;amp; IF(VALUE(B7)=0;&amp;quot;&amp;quot;;TEXT(B7;&amp;quot;000&amp;quot;)) &amp;amp; &amp;quot;&#039;));&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Onde:&#039;&#039;&#039;&lt;br /&gt;
* AX7 -&amp;gt; NCM tratado para 8 dígitos sem pontuação;&lt;br /&gt;
* AY7 -&amp;gt; ClassTrib tratado com 6 dígitos sem pontuação;&lt;br /&gt;
* B7 -&amp;gt; ExTIPI&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1697</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1697"/>
		<updated>2025-12-19T14:20:10Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Atualização do Sistema */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
As Exceções da Tabela do IPI podem ser obtidas no &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/legislacao/tipi-tabela-de-incidencia-do-imposto-sobre-produtos-industrializados site do gov.br]&#039;&#039;&#039;. Embora não tenha um formado padronizado como a do NCM, o formato XLSX com algum tratamento/adaptação permite a importação no sistema. Cuidado ao tentar automatizar com a importação do XLSX pois a planilha sofre alterações de layout entre publicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
A tabela de ClassTrib é fornecida diretamente pelo [https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= Portal da NFe], em excel.&lt;br /&gt;
&lt;br /&gt;
== Atualização do Sistema ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Cuidado com ON DELETE CASCADE|Os relacionamentos das tabelas, em geral incluem ON DELETE CASCADE, pois se um NCM, CEST ou ClassTrib deixar de existir qualquer relacionamento e informações adicionais são excluídas automaticamente.&lt;br /&gt;
&lt;br /&gt;
Por isso é preciso cuidado na atualização das tabelas, não executando exclusão para depois inserção ou pode terminar na perda de informações relacionadas. Exemplos:&lt;br /&gt;
* Excluir um NCM durante a atualização exclui junto as informações sobre crédito especial de regime (valores que são salvos juntos na mesma tabela do NCM mas que não fazem parte da definição do NCM);&lt;br /&gt;
* Excluir um NCM também exclui seus filhos, o que inclui registros filhos da exceção da TIPI, que também não fazem parte da definição do NCM, mas são criados a partir da importação da TIPI.&lt;br /&gt;
* Excluir um NCM, CEST ou ClassTrib exclui automaticamente o relacionamento entre esses tributos, que é definido e criado manualmente.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
Como o formato padrão da SISCOMEX é JSON, o BIS ganhou o método &amp;lt;code&amp;gt;NCMCrud.updateNCMTable()&amp;lt;/code&amp;gt; que baixa e já atualiza a tabela de NCM no sistema. Dando baixa nos NCMs que não podem mais ser utilizados, completando data de expiração de outros e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Por padrão esse método não exclui nenhum NCM, mas NCMs que não são encontrados no JSON são marcados como vencidos com a data do dia anterior ao de execução do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Atenção ao limite de 3 acessos ao site por hora|O site da SISCOMEX tem um limite de acesso de 3 vezes por hora. Para desenvolvimento ou em caso de problemas é recomendado fazer um cache local do arquivo primeiro.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
Como a tabela é baixada em Excel, as seguitnes fórmulas podem ajudar a realizar a importação manual, gerando Scripts para execução direta no banco de dados:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Mudanças no Layout da Planilha|As fórmulas foram geradas para um layout da planilha e pode precisar de adaptação.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;E9:&#039;&#039;&#039; Trata e limpa o NCM&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;SUBSTITUTE(A9;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F9:&#039;&#039;&#039; Trata e limpa a ExTIPI&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;IF(B9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;TEXT(VALUE(SUBSTITUTE(B9;&amp;quot;Ex &amp;quot;;&amp;quot;&amp;quot;));&amp;quot;000&amp;quot;));&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;G9:&#039;&#039;&#039; Trata e Limpa a Descrição&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=TRIM(SUBSTITUTE(CLEAN(IF(LEFT(C9;1)=&amp;quot;-&amp;quot;; TRIM(MID(C9; FIND(&amp;quot; &amp;quot;; C9); LEN(C9))); C9)); &amp;quot;&#039;&amp;quot;; &amp;quot;&#039;&#039;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;H9:&#039;&#039;&#039; Gera o SQL de INSERT/UPDATE para as entradas de exceçãod e TIPI (Apenas as que não são atualizadas geradas pela tabela do NCM)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(F9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;&lt;br /&gt;
&amp;quot;INSERT INTO fiscal_ncm (idfiscal_ncm, ncm, exTIPI, description, fullDescription, usable, esp32_credit, endValidity) &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;SELECT id, &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; F9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;, CONCAT(fullDescription, &#039;|&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;), 1, NULL, endValidity FROM fiscal_ncm WHERE ncm = &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039; AND extipi = &#039;&#039; LIMIT 1 &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;ON DUPLICATE KEY UPDATE idfiscal_ncm=VALUES(idfiscal_ncm), description=VALUES(description), fullDescription=VALUES(fullDescription), usable=VALUES(usable), endValidity=VALUES(endValidity);&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
&lt;br /&gt;
Pela ausência de uma tabela &#039;importável&#039; pelo sistema, a importação ocorre pela geração de script SQL a partir da tabela excel fornecida pelo portal da NFe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AP2:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=&amp;quot;INSERT INTO fiscal_classtrib (cstIBSCBS, cclassTrib, nomeClassTrib, descricaoClassTrib, lcRedacao, lcArtigo, taxRatioType, pRedIBS, pRedCBS, indGTribRegular, indGCredPresOper, indGMonoPadrao, indGMonoReten, indGMonoRet, indGMonoDif, indGEstornoCred, dtIniVig, dtFimVig, dtAtualizacao, indNFeABI, indNFe, indNFCe, indCTe, indCTeOS, indBPe, indBPeTA, indBPeTM, indNF3e, indNFSe, indNFSeVia, indNFCom, indNFAg, indNFGas, indDERE, anexo, link) VALUES (&amp;quot; &amp;amp;&lt;br /&gt;
IF(A2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;&amp;quot;&#039;&amp;quot;&amp;amp;SUBSTITUTE(A2;&amp;quot;&amp;quot;&amp;quot;&amp;quot;;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;)&amp;amp;&amp;quot;&#039;&amp;quot;) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(C2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;&amp;quot;&#039;&amp;quot;&amp;amp;SUBSTITUTE(C2;&amp;quot;&amp;quot;&amp;quot;&amp;quot;;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;)&amp;amp;&amp;quot;&#039;&amp;quot;) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(D2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;&amp;quot;&#039;&amp;quot;&amp;amp;SUBSTITUTE(D2;&amp;quot;&amp;quot;&amp;quot;&amp;quot;;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;)&amp;amp;&amp;quot;&#039;&amp;quot;) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(E2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;&amp;quot;&#039;&amp;quot;&amp;amp;SUBSTITUTE(E2;&amp;quot;&amp;quot;&amp;quot;&amp;quot;;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;)&amp;amp;&amp;quot;&#039;&amp;quot;) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(F2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;&amp;quot;&#039;&amp;quot;&amp;amp;SUBSTITUTE(F2;&amp;quot;&amp;quot;&amp;quot;&amp;quot;;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;)&amp;amp;&amp;quot;&#039;&amp;quot;) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(G2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;&amp;quot;&#039;&amp;quot;&amp;amp;SUBSTITUTE(G2;&amp;quot;&amp;quot;&amp;quot;&amp;quot;;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;)&amp;amp;&amp;quot;&#039;&amp;quot;) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(H2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;&amp;quot;&#039;&amp;quot;&amp;amp;SUBSTITUTE(H2;&amp;quot;&amp;quot;&amp;quot;&amp;quot;;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;)&amp;amp;&amp;quot;&#039;&amp;quot;) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(I2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;I2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(J2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;J2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(K2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;K2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(L2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;L2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(M2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;M2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(N2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;N2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(O2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;O2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(P2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;P2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(Q2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;Q2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(R2=&amp;quot;&amp;quot;;&amp;quot;&#039;2300-03-25&#039;&amp;quot;;&amp;quot;&#039;&amp;quot;&amp;amp;TEXT(R2;&amp;quot;aaaa-mm-dd&amp;quot;)&amp;amp;&amp;quot;&#039;&amp;quot;) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(S2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;&amp;quot;&#039;&amp;quot;&amp;amp;TEXT(S2;&amp;quot;aaaa-mm-dd&amp;quot;)&amp;amp;&amp;quot;&#039;&amp;quot;) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(T2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;&amp;quot;&#039;&amp;quot;&amp;amp;TEXT(T2;&amp;quot;aaaa-mm-dd&amp;quot;)&amp;amp;&amp;quot;&#039;&amp;quot;) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(U2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;U2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(V2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;V2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(W2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;W2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(X2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;X2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(Y2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;Y2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(Z2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;Z2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(AA2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;AA2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(AB2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;AB2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(AC2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;AC2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(AD2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;AD2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(AE2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;AE2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(AF2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;AF2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(AG2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;AG2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(AH2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;AH2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(AI2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;AI2) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(AJ2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;&amp;quot;&#039;&amp;quot;&amp;amp;SUBSTITUTE(AJ2;&amp;quot;&amp;quot;&amp;quot;&amp;quot;;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;)&amp;amp;&amp;quot;&#039;&amp;quot;) &amp;amp; &amp;quot;,&amp;quot; &amp;amp;&lt;br /&gt;
IF(AK2=&amp;quot;&amp;quot;;&amp;quot;NULL&amp;quot;;&amp;quot;&#039;&amp;quot;&amp;amp;SUBSTITUTE(AK2;&amp;quot;&amp;quot;&amp;quot;&amp;quot;;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;)&amp;amp;&amp;quot;&#039;&amp;quot;) &amp;amp;&lt;br /&gt;
&amp;quot;);&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A planilha para qual a fórmula foi criada continha as seguintes colunas, começando em A1 e temrinando em AK1:&lt;br /&gt;
* CST-IBS/CBS&lt;br /&gt;
* Descrição CST-IBS/CBS&lt;br /&gt;
* cClassTrib&lt;br /&gt;
* Nome cClassTrib&lt;br /&gt;
* Descrição cClassTrib&lt;br /&gt;
* LC Redação&lt;br /&gt;
* LC 214/25&lt;br /&gt;
* Tipo de Alíquota&lt;br /&gt;
* pRedIBS&lt;br /&gt;
* pRedCBS&lt;br /&gt;
* ind_gTribRegular&lt;br /&gt;
* ind_gCredPresOper&lt;br /&gt;
* ind_gMonoPadrao&lt;br /&gt;
* ind_gMonoReten&lt;br /&gt;
* ind_gMonoRet&lt;br /&gt;
* ind_gMonoDif&lt;br /&gt;
* ind_gEstornoCred&lt;br /&gt;
* dIniVig&lt;br /&gt;
* dFimVig&lt;br /&gt;
* DataAtualização&lt;br /&gt;
* indNFeABI&lt;br /&gt;
* indNFe&lt;br /&gt;
* indNFCe&lt;br /&gt;
* indCTe&lt;br /&gt;
* indCTeOS&lt;br /&gt;
* indBPe&lt;br /&gt;
* indBPeTA&lt;br /&gt;
* indBPeTM&lt;br /&gt;
* indNF3e&lt;br /&gt;
* indNFSe&lt;br /&gt;
* indNFSe Via&lt;br /&gt;
* indNFCom&lt;br /&gt;
* indNFAg&lt;br /&gt;
* indNFGas&lt;br /&gt;
* indDERE&lt;br /&gt;
* ANEXO&lt;br /&gt;
* Link&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Relacionamento entre as Tabelas ===&lt;br /&gt;
&lt;br /&gt;
O relacionamento (ou mapeamento) entre tabelas de NCM/CEST/ClassTrib foram geradas pelo contador para importação no sistema e precisam de adaptação conforme a planilha manual criada por eles. Ainda assim, o modelo do script a seguir pode ser útil para importação manual dos valores das planilhas:&lt;br /&gt;
&lt;br /&gt;
==== NCM x ClassTrib ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=&amp;quot;INSERT IGNORE INTO fiscal_classtrib_ncm (`idfiscal_classtrib`, `idfiscal_ncm`) VALUES ((SELECT id FROM fiscal_classtrib WHERE cclassTrib = &#039;&amp;quot; &amp;amp; AY7 &amp;amp; &amp;quot;&#039;),(SELECT id FROM fiscal_ncm WHERE ncm=&#039;&amp;quot; &amp;amp; AX7 &amp;amp; &amp;quot;&#039; AND exTIPI=&#039;&amp;quot; &amp;amp; IF(VALUE(B7)=0;&amp;quot;&amp;quot;;TEXT(B7;&amp;quot;000&amp;quot;)) &amp;amp; &amp;quot;&#039;));&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Onde:&#039;&#039;&#039;&lt;br /&gt;
* AX7 -&amp;gt; NCM tratado para 8 dígitos sem pontuação;&lt;br /&gt;
* AY7 -&amp;gt; ClassTrib tratado com 6 dígitos sem pontuação;&lt;br /&gt;
* B7 -&amp;gt; ExTIPI&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1696</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1696"/>
		<updated>2025-12-19T14:16:38Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Tabelas Oficiciais */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
As Exceções da Tabela do IPI podem ser obtidas no &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/legislacao/tipi-tabela-de-incidencia-do-imposto-sobre-produtos-industrializados site do gov.br]&#039;&#039;&#039;. Embora não tenha um formado padronizado como a do NCM, o formato XLSX com algum tratamento/adaptação permite a importação no sistema. Cuidado ao tentar automatizar com a importação do XLSX pois a planilha sofre alterações de layout entre publicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ClassTrib ===&lt;br /&gt;
A tabela de ClassTrib é fornecida diretamente pelo [https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= Portal da NFe], em excel.&lt;br /&gt;
&lt;br /&gt;
== Atualização do Sistema ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Cuidado com ON DELETE CASCADE|Os relacionamentos das tabelas, em geral incluem ON DELETE CASCADE, pois se um NCM, CEST ou ClassTrib deixar de existir qualquer relacionamento e informações adicionais são excluídas automaticamente.&lt;br /&gt;
&lt;br /&gt;
Por isso é preciso cuidado na atualização das tabelas, não executando exclusão para depois inserção ou pode terminar na perda de informações relacionadas. Exemplos:&lt;br /&gt;
* Excluir um NCM durante a atualização exclui junto as informações sobre crédito especial de regime (valores que são salvos juntos na mesma tabela do NCM mas que não fazem parte da definição do NCM);&lt;br /&gt;
* Excluir um NCM também exclui seus filhos, o que inclui registros filhos da exceção da TIPI, que também não fazem parte da definição do NCM, mas são criados a partir da importação da TIPI.&lt;br /&gt;
* Excluir um NCM, CEST ou ClassTrib exclui automaticamente o relacionamento entre esses tributos, que é definido e criado manualmente.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
Como o formato padrão da SISCOMEX é JSON, o BIS ganhou o método &amp;lt;code&amp;gt;NCMCrud.updateNCMTable()&amp;lt;/code&amp;gt; que baixa e já atualiza a tabela de NCM no sistema. Dando baixa nos NCMs que não podem mais ser utilizados, completando data de expiração de outros e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Por padrão esse método não exclui nenhum NCM, mas NCMs que não são encontrados no JSON são marcados como vencidos com a data do dia anterior ao de execução do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Atenção ao limite de 3 acessos ao site por hora|O site da SISCOMEX tem um limite de acesso de 3 vezes por hora. Para desenvolvimento ou em caso de problemas é recomendado fazer um cache local do arquivo primeiro.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
Como a tabela é baixada em Excel, as seguitnes fórmulas podem ajudar a realizar a importação manual, gerando Scripts para execução direta no banco de dados:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Mudanças no Layout da Planilha|As fórmulas foram geradas para um layout da planilha e pode precisar de adaptação.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;E9:&#039;&#039;&#039; Trata e limpa o NCM&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;SUBSTITUTE(A9;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F9:&#039;&#039;&#039; Trata e limpa a ExTIPI&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;IF(B9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;TEXT(VALUE(SUBSTITUTE(B9;&amp;quot;Ex &amp;quot;;&amp;quot;&amp;quot;));&amp;quot;000&amp;quot;));&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;G9:&#039;&#039;&#039; Trata e Limpa a Descrição&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=TRIM(SUBSTITUTE(CLEAN(IF(LEFT(C9;1)=&amp;quot;-&amp;quot;; TRIM(MID(C9; FIND(&amp;quot; &amp;quot;; C9); LEN(C9))); C9)); &amp;quot;&#039;&amp;quot;; &amp;quot;&#039;&#039;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;H9:&#039;&#039;&#039; Gera o SQL de INSERT/UPDATE para as entradas de exceçãod e TIPI (Apenas as que não são atualizadas geradas pela tabela do NCM)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(F9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;&lt;br /&gt;
&amp;quot;INSERT INTO fiscal_ncm (idfiscal_ncm, ncm, exTIPI, description, fullDescription, usable, esp32_credit, endValidity) &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;SELECT id, &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; F9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;, CONCAT(fullDescription, &#039;|&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;), 1, NULL, endValidity FROM fiscal_ncm WHERE ncm = &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039; AND extipi = &#039;&#039; LIMIT 1 &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;ON DUPLICATE KEY UPDATE idfiscal_ncm=VALUES(idfiscal_ncm), description=VALUES(description), fullDescription=VALUES(fullDescription), usable=VALUES(usable), endValidity=VALUES(endValidity);&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Relacionamento entre as Tabelas ===&lt;br /&gt;
&lt;br /&gt;
O relacionamento (ou mapeamento) entre tabelas de NCM/CEST/ClassTrib foram geradas pelo contador para importação no sistema e precisam de adaptação conforme a planilha manual criada por eles. Ainda assim, o modelo do script a seguir pode ser útil para importação manual dos valores das planilhas:&lt;br /&gt;
&lt;br /&gt;
==== NCM x ClassTrib ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=&amp;quot;INSERT IGNORE INTO fiscal_classtrib_ncm (`idfiscal_classtrib`, `idfiscal_ncm`) VALUES ((SELECT id FROM fiscal_classtrib WHERE cclassTrib = &#039;&amp;quot; &amp;amp; AY7 &amp;amp; &amp;quot;&#039;),(SELECT id FROM fiscal_ncm WHERE ncm=&#039;&amp;quot; &amp;amp; AX7 &amp;amp; &amp;quot;&#039; AND exTIPI=&#039;&amp;quot; &amp;amp; IF(VALUE(B7)=0;&amp;quot;&amp;quot;;TEXT(B7;&amp;quot;000&amp;quot;)) &amp;amp; &amp;quot;&#039;));&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Onde:&#039;&#039;&#039;&lt;br /&gt;
* AX7 -&amp;gt; NCM tratado para 8 dígitos sem pontuação;&lt;br /&gt;
* AY7 -&amp;gt; ClassTrib tratado com 6 dígitos sem pontuação;&lt;br /&gt;
* B7 -&amp;gt; ExTIPI&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1695</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1695"/>
		<updated>2025-12-19T14:11:59Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Bibliografia e Referências */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
As Exceções da Tabela do IPI podem ser obtidas no &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/legislacao/tipi-tabela-de-incidencia-do-imposto-sobre-produtos-industrializados site do gov.br]&#039;&#039;&#039;. Embora não tenha um formado padronizado como a do NCM, o formato XLSX com algum tratamento/adaptação permite a importação no sistema. Cuidado ao tentar automatizar com a importação do XLSX pois a planilha sofre alterações de layout entre publicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Atualização do Sistema ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Cuidado com ON DELETE CASCADE|Os relacionamentos das tabelas, em geral incluem ON DELETE CASCADE, pois se um NCM, CEST ou ClassTrib deixar de existir qualquer relacionamento e informações adicionais são excluídas automaticamente.&lt;br /&gt;
&lt;br /&gt;
Por isso é preciso cuidado na atualização das tabelas, não executando exclusão para depois inserção ou pode terminar na perda de informações relacionadas. Exemplos:&lt;br /&gt;
* Excluir um NCM durante a atualização exclui junto as informações sobre crédito especial de regime (valores que são salvos juntos na mesma tabela do NCM mas que não fazem parte da definição do NCM);&lt;br /&gt;
* Excluir um NCM também exclui seus filhos, o que inclui registros filhos da exceção da TIPI, que também não fazem parte da definição do NCM, mas são criados a partir da importação da TIPI.&lt;br /&gt;
* Excluir um NCM, CEST ou ClassTrib exclui automaticamente o relacionamento entre esses tributos, que é definido e criado manualmente.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
Como o formato padrão da SISCOMEX é JSON, o BIS ganhou o método &amp;lt;code&amp;gt;NCMCrud.updateNCMTable()&amp;lt;/code&amp;gt; que baixa e já atualiza a tabela de NCM no sistema. Dando baixa nos NCMs que não podem mais ser utilizados, completando data de expiração de outros e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Por padrão esse método não exclui nenhum NCM, mas NCMs que não são encontrados no JSON são marcados como vencidos com a data do dia anterior ao de execução do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Atenção ao limite de 3 acessos ao site por hora|O site da SISCOMEX tem um limite de acesso de 3 vezes por hora. Para desenvolvimento ou em caso de problemas é recomendado fazer um cache local do arquivo primeiro.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
Como a tabela é baixada em Excel, as seguitnes fórmulas podem ajudar a realizar a importação manual, gerando Scripts para execução direta no banco de dados:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Mudanças no Layout da Planilha|As fórmulas foram geradas para um layout da planilha e pode precisar de adaptação.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;E9:&#039;&#039;&#039; Trata e limpa o NCM&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;SUBSTITUTE(A9;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F9:&#039;&#039;&#039; Trata e limpa a ExTIPI&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;IF(B9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;TEXT(VALUE(SUBSTITUTE(B9;&amp;quot;Ex &amp;quot;;&amp;quot;&amp;quot;));&amp;quot;000&amp;quot;));&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;G9:&#039;&#039;&#039; Trata e Limpa a Descrição&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=TRIM(SUBSTITUTE(CLEAN(IF(LEFT(C9;1)=&amp;quot;-&amp;quot;; TRIM(MID(C9; FIND(&amp;quot; &amp;quot;; C9); LEN(C9))); C9)); &amp;quot;&#039;&amp;quot;; &amp;quot;&#039;&#039;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;H9:&#039;&#039;&#039; Gera o SQL de INSERT/UPDATE para as entradas de exceçãod e TIPI (Apenas as que não são atualizadas geradas pela tabela do NCM)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(F9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;&lt;br /&gt;
&amp;quot;INSERT INTO fiscal_ncm (idfiscal_ncm, ncm, exTIPI, description, fullDescription, usable, esp32_credit, endValidity) &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;SELECT id, &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; F9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;, CONCAT(fullDescription, &#039;|&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;), 1, NULL, endValidity FROM fiscal_ncm WHERE ncm = &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039; AND extipi = &#039;&#039; LIMIT 1 &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;ON DUPLICATE KEY UPDATE idfiscal_ncm=VALUES(idfiscal_ncm), description=VALUES(description), fullDescription=VALUES(fullDescription), usable=VALUES(usable), endValidity=VALUES(endValidity);&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Relacionamento entre as Tabelas ===&lt;br /&gt;
&lt;br /&gt;
O relacionamento (ou mapeamento) entre tabelas de NCM/CEST/ClassTrib foram geradas pelo contador para importação no sistema e precisam de adaptação conforme a planilha manual criada por eles. Ainda assim, o modelo do script a seguir pode ser útil para importação manual dos valores das planilhas:&lt;br /&gt;
&lt;br /&gt;
==== NCM x ClassTrib ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=&amp;quot;INSERT IGNORE INTO fiscal_classtrib_ncm (`idfiscal_classtrib`, `idfiscal_ncm`) VALUES ((SELECT id FROM fiscal_classtrib WHERE cclassTrib = &#039;&amp;quot; &amp;amp; AY7 &amp;amp; &amp;quot;&#039;),(SELECT id FROM fiscal_ncm WHERE ncm=&#039;&amp;quot; &amp;amp; AX7 &amp;amp; &amp;quot;&#039; AND exTIPI=&#039;&amp;quot; &amp;amp; IF(VALUE(B7)=0;&amp;quot;&amp;quot;;TEXT(B7;&amp;quot;000&amp;quot;)) &amp;amp; &amp;quot;&#039;));&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Onde:&#039;&#039;&#039;&lt;br /&gt;
* AX7 -&amp;gt; NCM tratado para 8 dígitos sem pontuação;&lt;br /&gt;
* AY7 -&amp;gt; ClassTrib tratado com 6 dígitos sem pontuação;&lt;br /&gt;
* B7 -&amp;gt; ExTIPI&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1694</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1694"/>
		<updated>2025-12-19T14:05:57Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Tabelas Oficiciais */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Atualizando no Sistema ====&lt;br /&gt;
&lt;br /&gt;
Como o formato padrão da SISCOMEX é JSON, o BIS ganhou o método &amp;lt;code&amp;gt;NCMCrud.updateNCMTable()&amp;lt;/code&amp;gt; que baixa e já atualiza a tabela de NCM no sistema. Dando baixa nos NCMs que não podem mais ser utilizados, completando data de expiração de outros e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Por padrão esse método não exclui nenhum NCM, mas NCMs que não são encontrados no JSON são marcados como vencidos com a data do dia anterior ao de execução do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Atenção ao limite de 3 acessos ao site por hora|O site da SISCOMEX tem um limite de acesso de 3 vezes por hora. Para desenvolvimento ou em caso de problemas é recomendado fazer um cache local do arquivo primeiro.}}&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
As Exceções da Tabela do IPI podem ser obtidas no &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/legislacao/tipi-tabela-de-incidencia-do-imposto-sobre-produtos-industrializados site do gov.br]&#039;&#039;&#039;. Embora não tenha um formado padronizado como a do NCM, o formato XLSX com algum tratamento/adaptação permite a importação no sistema. Cuidado ao tentar automatizar com a importação do XLSX pois a planilha sofre alterações de layout entre publicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Atualizando no Sistema ====&lt;br /&gt;
&lt;br /&gt;
Como a tabela é baixada em Excel, as seguitnes fórmulas podem ajudar a realizar a importação manual, gerando Scripts para execução direta no banco de dados:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Mudanças no Layoute da Planilha|As fórmulas foram geradas para um layout da planilha e pode precisar de adaptação.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;E9:&#039;&#039;&#039; Trata e limpa o NCM&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;SUBSTITUTE(A9;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F9:&#039;&#039;&#039; Trata e limpa a ExTIPI&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;IF(B9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;TEXT(VALUE(SUBSTITUTE(B9;&amp;quot;Ex &amp;quot;;&amp;quot;&amp;quot;));&amp;quot;000&amp;quot;));&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;G9:&#039;&#039;&#039; Trata e Limpa a Descrição&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=TRIM(SUBSTITUTE(CLEAN(IF(LEFT(C9;1)=&amp;quot;-&amp;quot;; TRIM(MID(C9; FIND(&amp;quot; &amp;quot;; C9); LEN(C9))); C9)); &amp;quot;&#039;&amp;quot;; &amp;quot;&#039;&#039;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;H9:&#039;&#039;&#039; Gera o SQL de INSERT/UPDATE para as entradas de exceçãod e TIPI (Apenas as que não são atualizadas geradas pela tabela do NCM)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(F9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;&lt;br /&gt;
&amp;quot;INSERT INTO fiscal_ncm (idfiscal_ncm, ncm, exTIPI, description, fullDescription, usable, esp32_credit, endValidity) &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;SELECT id, &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; F9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;, CONCAT(fullDescription, &#039;|&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;), 1, NULL, endValidity FROM fiscal_ncm WHERE ncm = &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039; AND extipi = &#039;&#039; LIMIT 1 &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;ON DUPLICATE KEY UPDATE idfiscal_ncm=VALUES(idfiscal_ncm), description=VALUES(description), fullDescription=VALUES(fullDescription), usable=VALUES(usable), endValidity=VALUES(endValidity);&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Relacionamento entre as Tabelas ==&lt;br /&gt;
&lt;br /&gt;
O relacionamento (ou mapeamento) entre tabelas de NCM/CEST/ClassTrib foram geradas pelo contador para importação no sistema e precisam de adaptação conforme a planilha manual criada por eles. Ainda assim, o modelo do script a seguir pode ser útil para importação manual dos valores das planilhas:&lt;br /&gt;
&lt;br /&gt;
=== NCM x ClassTrib ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=&amp;quot;INSERT IGNORE INTO fiscal_classtrib_ncm (`idfiscal_classtrib`, `idfiscal_ncm`) VALUES ((SELECT id FROM fiscal_classtrib WHERE cclassTrib = &#039;&amp;quot; &amp;amp; AY7 &amp;amp; &amp;quot;&#039;),(SELECT id FROM fiscal_ncm WHERE ncm=&#039;&amp;quot; &amp;amp; AX7 &amp;amp; &amp;quot;&#039; AND exTIPI=&#039;&amp;quot; &amp;amp; IF(VALUE(B7)=0;&amp;quot;&amp;quot;;TEXT(B7;&amp;quot;000&amp;quot;)) &amp;amp; &amp;quot;&#039;));&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Onde:&#039;&#039;&#039;&lt;br /&gt;
* AX7 -&amp;gt; NCM tratado para 8 dígitos sem pontuação;&lt;br /&gt;
* AY7 -&amp;gt; ClassTrib tratado com 6 dígitos sem pontuação;&lt;br /&gt;
* B7 -&amp;gt; ExTIPI&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1693</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1693"/>
		<updated>2025-12-19T13:51:24Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* ExTIPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Atualizando no Sistema ====&lt;br /&gt;
&lt;br /&gt;
Como o formato padrão da SISCOMEX é JSON, o BIS ganhou o método &amp;lt;code&amp;gt;NCMCrud.updateNCMTable()&amp;lt;/code&amp;gt; que baixa e já atualiza a tabela de NCM no sistema. Dando baixa nos NCMs que não podem mais ser utilizados, completando data de expiração de outros e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Por padrão esse método não exclui nenhum NCM, mas NCMs que não são encontrados no JSON são marcados como vencidos com a data do dia anterior ao de execução do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Atenção ao limite de 3 acessos ao site por hora|O site da SISCOMEX tem um limite de acesso de 3 vezes por hora. Para desenvolvimento ou em caso de problemas é recomendado fazer um cache local do arquivo primeiro.}}&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
As Exceções da Tabela do IPI podem ser obtidas no &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/legislacao/tipi-tabela-de-incidencia-do-imposto-sobre-produtos-industrializados site do gov.br]&#039;&#039;&#039;. Embora não tenha um formado padronizado como a do NCM, o formato XLSX com algum tratamento/adaptação permite a importação no sistema. Cuidado ao tentar automatizar com a importação do XLSX pois a planilha sofre alterações de layout entre publicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Atualizando no Sistema ====&lt;br /&gt;
&lt;br /&gt;
Como a tabela é baixada em Excel, as seguitnes fórmulas podem ajudar a realizar a importação manual, gerando Scripts para execução direta no banco de dados:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Mudanças no Layoute da Planilha|As fórmulas foram geradas para um layout da planilha e pode precisar de adaptação.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;E9:&#039;&#039;&#039; Trata e limpa o NCM&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;SUBSTITUTE(A9;&amp;quot;.&amp;quot;;&amp;quot;&amp;quot;);&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F9:&#039;&#039;&#039; Trata e limpa a ExTIPI&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(LEN(A9)=10;IF(B9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;TEXT(VALUE(SUBSTITUTE(B9;&amp;quot;Ex &amp;quot;;&amp;quot;&amp;quot;));&amp;quot;000&amp;quot;));&amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;G9:&#039;&#039;&#039; Trata e Limpa a Descrição&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=TRIM(SUBSTITUTE(CLEAN(IF(LEFT(C9;1)=&amp;quot;-&amp;quot;; TRIM(MID(C9; FIND(&amp;quot; &amp;quot;; C9); LEN(C9))); C9)); &amp;quot;&#039;&amp;quot;; &amp;quot;&#039;&#039;&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;H9:&#039;&#039;&#039; Gera o SQL de INSERT/UPDATE para as entradas de exceçãod e TIPI (Apenas as que não são atualizadas geradas pela tabela do NCM)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
=IF(F9=&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;&lt;br /&gt;
&amp;quot;INSERT INTO fiscal_ncm (idfiscal_ncm, ncm, exTIPI, description, fullDescription, usable, esp32_credit, endValidity) &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;SELECT id, &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; F9 &amp;amp; &amp;quot;&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;, CONCAT(fullDescription, &#039;|&#039;, &#039;&amp;quot; &amp;amp; G9 &amp;amp; &amp;quot;&#039;), 1, NULL, endValidity FROM fiscal_ncm WHERE ncm = &#039;&amp;quot; &amp;amp; E9 &amp;amp; &amp;quot;&#039; AND extipi = &#039;&#039; LIMIT 1 &amp;quot; &amp;amp;&lt;br /&gt;
&amp;quot;ON DUPLICATE KEY UPDATE idfiscal_ncm=VALUES(idfiscal_ncm), description=VALUES(description), fullDescription=VALUES(fullDescription), usable=VALUES(usable), endValidity=VALUES(endValidity);&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1692</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1692"/>
		<updated>2025-12-19T13:46:22Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* NCM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Atualizando no Sistema ====&lt;br /&gt;
&lt;br /&gt;
Como o formato padrão da SISCOMEX é JSON, o BIS ganhou o método &amp;lt;code&amp;gt;NCMCrud.updateNCMTable()&amp;lt;/code&amp;gt; que baixa e já atualiza a tabela de NCM no sistema. Dando baixa nos NCMs que não podem mais ser utilizados, completando data de expiração de outros e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Por padrão esse método não exclui nenhum NCM, mas NCMs que não são encontrados no JSON são marcados como vencidos com a data do dia anterior ao de execução do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Atenção ao limite de 3 acessos ao site por hora|O site da SISCOMEX tem um limite de acesso de 3 vezes por hora. Para desenvolvimento ou em caso de problemas é recomendado fazer um cache local do arquivo primeiro.}}&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
As Exceções da Tabela do IPI podem ser obtidas no &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/legislacao/tipi-tabela-de-incidencia-do-imposto-sobre-produtos-industrializados site do gov.br]&#039;&#039;&#039;. Embora não tenha um formado padronizado como a do NCM, o formato XLSX com algum tratamento/adaptação permite a importação no sistema. Cuidado ao tentar automatizar com a importação do XLSX pois a planilha sofre alterações de layout entre publicações.&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1691</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1691"/>
		<updated>2025-12-19T12:28:58Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Tabelas Oficiciais */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExTIPI ===&lt;br /&gt;
&lt;br /&gt;
As Exceções da Tabela do IPI podem ser obtidas no &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/legislacao/tipi-tabela-de-incidencia-do-imposto-sobre-produtos-industrializados site do gov.br]&#039;&#039;&#039;. Embora não tenha um formado padronizado como a do NCM, o formato XLSX com algum tratamento/adaptação permite a importação no sistema. Cuidado ao tentar automatizar com a importação do XLSX pois a planilha sofre alterações de layout entre publicações.&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1690</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1690"/>
		<updated>2025-12-19T12:19:48Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Bibliografia e Referências */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
== Tabelas Oficiciais ==&lt;br /&gt;
&lt;br /&gt;
=== NCM ===&lt;br /&gt;
&lt;br /&gt;
A tabela de NCM atualizada, e em formato JSON pode ser obtida diretamente do site da &#039;&#039;&#039;[https://www.gov.br/receitafederal/pt-br/assuntos/aduana-e-comercio-exterior/classificacao-fiscal-de-mercadorias/download-ncm-nomenclatura-comum-do-mercosul SISCOMEX/gov.br]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Exceções da Tabela do IPI (ExTIPI)|A tabela da SISCOMEX é focada no NCM normalizado do MERCOSUL. Desconhece as tabelas exceções da tributação do IPI. Essas informações devem ser recuperadas a partes e &#039;sincronizadas&#039; no sistema.}}&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1689</id>
		<title>BISModulesSocket</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1689"/>
		<updated>2025-12-16T22:29:03Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* getSEFAZStatus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
O BISModulesSocket é como uma pequena biblioteca que facilita a comunicação entre terminais (aplicações externas ao servidor de aplicações) e o BISCore e BISModules. Desenvolvido apenas com Java e Sockets (implementado em cima do [[BISSocket]]), pode ser usado para realizar chamadas e comunicar com o sistema sem a necessidade de utilizar bibliotecas RMI/JNDI ou outras mais complexas de integração.&lt;br /&gt;
&lt;br /&gt;
== Funcionamento ==&lt;br /&gt;
O lado servidor será &amp;quot;levantado&amp;quot; junto com o plugin. A partir deste momento o servidor já estará escutando a porta e aguardado conexão dos terminais.&lt;br /&gt;
&lt;br /&gt;
A utilização é simples:&lt;br /&gt;
# Cria uma instância do BISModulesSocketClient, passe no construtor o host e a porta do servidor BISERP para que o cliente conecte-se;&lt;br /&gt;
# Chama os métodos passando os atributos desejados e aguarde pela resposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo entre BISModulesSocketClient e BISModulesSocketServer ==&lt;br /&gt;
&lt;br /&gt;
Abaixo estão listados os comandos utilizados atualmente pelas duas classes para abstrair a comunicação. Para utilizar as classes não é necessário se familiarizar com o protocolo, apenas para manutenção e implementação das mesmas.&lt;br /&gt;
&lt;br /&gt;
{{stop|Chamada Pela Fachada|Quando o BISModulesSocketServer faz o repasse da chamada dos métodos na parte do Core (do BIS ou dos Plugins), deve sempre chamar a fachada de acesso. Para que o servidor de aplicações instancie as transações e o Interceptor da fachada possa fazer seu trabalho.&lt;br /&gt;
Uma chamada direta ao CRUD pode funcionar em alguns casos, mas com certeza desabilitará o [[BISLogger]], as transações dos EJBs e outros serviços oferecidos pelo servidor de aplicação.}}&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Serviço do BISModulesSocket ===&lt;br /&gt;
&lt;br /&gt;
==== serverTime ====&lt;br /&gt;
Recupera o horário do Servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Número qualquer para identificar a requisição. O mesmo valor é retornado na resposta.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_TIME&lt;br /&gt;
|&amp;lt;Long&amp;gt; System.currentTimeMillis() do servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Exatamente mesmo valor recebido na requisição, mesmo que null.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISCore ===&lt;br /&gt;
&lt;br /&gt;
==== getProperty ====&lt;br /&gt;
Busca no servidor uma propriedade do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETPROPERTY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_PROPERTY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Propriedade a ser recuperada no servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_VALUE&lt;br /&gt;
|String - Valor da propriedade do sistema, null caso a propriedade tenha o valor nulo ou não tenha sido encontrado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETPROPERTY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== hasPermissionKey ====&lt;br /&gt;
Envia para o servidor a autenticação de um usuário e uma chave de segurança para saber se o usuário tem acesso para a chave passada. Note que, seguindo a funcionalidade do Kernel, o método lança exception caso a autenticação falhe, caso o usuário não tenha autorização o retorno será false.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|HASPERMISSIONKEY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_ACCESSKEY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Chave de acesso para questionar.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_RESPONSE&lt;br /&gt;
|Boolean - True caso o usuário tenha acesso a chave, false caso contrário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_HASPERMISSIONKEY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== postBISLog ====&lt;br /&gt;
Envia para o servidor um registro de LOG para ser salvo. Como não há como ter um controle de sincronia de objeto (um ID local como nos objetos do PDV), casa post gerará um objeto novo no servidor. Por isso é preciso controlar os posts pelo lado do cliente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|POSTBISLOG&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_POSTBISLOG_BISLOGOBJ&lt;br /&gt;
|&amp;lt;BISLogVO&amp;gt; - Objeto completo com o registro de erro pronto para ser cadastrado no sistema.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_POSTBISLOG&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== notifyActiveSupport ====&lt;br /&gt;
Este método força o envio de uma mensage para o sistema de suporte ativo do BISERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|NOTIFYACTIVESUPPORT&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_NOTIFYACTIVESUPPORT_MSG&lt;br /&gt;
|&amp;lt;String&amp;gt; - Mensagem a ser enviada para o suporte.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_NOTIFYACTIVESUPPORT&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findBISCertificateList ====&lt;br /&gt;
Busca uma lista de certificados do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_MO&lt;br /&gt;
|&amp;lt;BISCertificateMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELISTLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;BISCertificateVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findCompanyList ====&lt;br /&gt;
Busca uma lista de empresas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_MO&lt;br /&gt;
|&amp;lt;CompanyMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;CompanyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getCompanyCertificateForSEFAZ ====&lt;br /&gt;
Recupera no servidor o certificado A1 válido para que seja utilizado pelo PDV. O PDV utilizar o certificado para assinar a NFCe em contingência OffLine no PDV.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETCOMPANYCERTIFICATEFORSEFAZ&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETCOMPANYCERTIFICATEFORSEFAZ_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da Empresa solicitando o certificado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETCOMPANYCERTIFICATEFORSEFAZ&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETCOMPANYCERTIFICATEFORSEFAZ_CERTIFICATE&lt;br /&gt;
|&amp;lt;BISCertificateVO&amp;gt; - Certificado válido e definido para comunicação com a SEFAZ.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findUserList ====&lt;br /&gt;
Busca uma lista de usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_MO&lt;br /&gt;
|&amp;lt;UserMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;UserVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== createNewTokenToUser ====&lt;br /&gt;
Solicita ao servidor que gere um novo token para o usuário passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requsição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_TOKEN&lt;br /&gt;
|&amp;lt;String&amp;gt; - Token recém criado para o usuário.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISModules ===&lt;br /&gt;
&lt;br /&gt;
==== registerTerminal ====&lt;br /&gt;
Faz o registro do terminal no servidor do BIS. Necessário para que o BIS reconheça esse terminal e possa gerencia-lo adequadamente, como sincronizar dados, conhecer status, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_UNIQUEID&lt;br /&gt;
|&amp;lt;String&amp;gt; - ID do terminal. String gerada que deve ser única par o terminal. Normalmente usado o macaddress da máquina por já ser uma númeração única.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID Gerado pelo servidor que passará a identificar o terminal no servidor&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVItemListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os itens mais novos que esta data. Se for nulo, retornamos todos os itens.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVItemVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPropertiesListToSync ====&lt;br /&gt;
&lt;br /&gt;
Solicita do módulo PDV uma lista das propriedades de configuração para o aplicativo BISPDV definidas para uma determinada empresa. Esta lista terá trará todas as propriedades com o prefixo &amp;quot;br.com.biserp.bismodules.pdv.pdvapp.centralconfig&amp;quot; e no sufixo o ID da empresa separado por um &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPROPERTIESLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PropertyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findFiscalIBPTRatiosListToSync ====&lt;br /&gt;
Solicita do módulo Fiscal uma lista dos ratios fornecida pelo IBPT usada para calcular o total de imposto aproximado pago no cupom. Esta lista terá apenas os objetos alterados a partir da data passada. Método usado para sincronizar novos objetos nos terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no temrinal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os objetos mais novos que esta data. Se for nulo, retornamos todos os objetos.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;FiscalIBPTRatioVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPaymentListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPAYMENTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVPaymentVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVContractListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de contratos (convênios) para venda no caixa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVCONTRACTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVContractVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVTokenList ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_MO&lt;br /&gt;
|&amp;lt;PDVTokenMO&amp;gt; MO para filtrar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; para organizar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ATTRIBUTE&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Atributos que devem ser populados nos objetos da lista.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lockPDVToken ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser bloqueado&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; - Token bloqueado para edição&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== saveAndUnlockToken ====&lt;br /&gt;
Solicita do módulo PDV que salva uma comanda e a deixe desbloqueada para edição por outros terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SAVEANDUNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SAVEANDUNLOCKTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; Objeto representando o token a ser salvo e desbloqueado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SAVEANDUNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== unlockToken ====&lt;br /&gt;
Solicita do módulo PDV que desbloqueie uma comanda da edição.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|UNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_UNLOCKTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser desbloqueado da edição.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_UNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clearTokens ====&lt;br /&gt;
Solicita do módulo PDV que limpe e desbloqueie as comandas informadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CLEARTOKENS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CLEARTOKENS_TOKENS&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; Coleção de comandas a serem limpas e desbloqueadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CLEARTOKENS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCheckoutVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCheckoutVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCheckoutVO&amp;gt;&amp;gt; Coleção de checkouts para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCupomVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCupomVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCUPOMVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCupomVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCUPOMVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== syncDocFiscalVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos DocFiscalVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCDOCFISCALVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;DocFiscalVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCDOCFISCALVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVNFCeLastDocumentNumber ====&lt;br /&gt;
Solicita ao servidor que retorne o número do documento do último cupom emitido para uma determinada empresa e série da documento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCSERIAL&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da série do documento desejado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCNUMBER&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do último documento emitido para a empresa e na série solicitada.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findLocationCountryListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Países alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCountryVO&amp;gt; Retorna uma lista com todos os LocationCountryVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationStateListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Estados alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_IDCOUNTRY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do País que se deseja os estados.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de países para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationStateVO&amp;gt; Retorna uma lista com todos os LocationStateVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationCityListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_IDSTATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de estados para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCityVO&amp;gt; Retorna uma lista com todos os LocationCityVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationAddressListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_IDCITY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de cidade para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationAddressVO&amp;gt; Retorna uma lista com todos os LocationAddressVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== importSATXML ====&lt;br /&gt;
&lt;br /&gt;
Solicita ao servidor que importe um arquivo de XML do SAT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|IMPORTSATXML&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_IMPORTSATXML_XML&lt;br /&gt;
|&amp;lt;String&amp;gt; Conteúdo do arquivo XML a ser importado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_IMPORTSATXML&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getNFCeLastNumberForSerie====&lt;br /&gt;
&lt;br /&gt;
Recupera o o número da última NFCe emitida para uma série específicca.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETNFCELASTNUMBERFORSERIE&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETNFCELASTNUMBERFORSERIE_SERIE&lt;br /&gt;
|&amp;lt;String&amp;gt; Número de Série desejado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETNFCELASTNUMBERFORSERIE_TPAMB&lt;br /&gt;
|&amp;lt;SEFAZ_tpAmb&amp;gt; Ambiente de emissão.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETNFCELASTNUMBERFORSERIE&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETNFCELASTNUMBERFORSERIE_LASTNUMBER&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da última notada encontrada no banco, dada a série e ambiente de emissão.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getSEFAZStatus ====&lt;br /&gt;
&lt;br /&gt;
Recupera o status atual de comunicação com a SEFAZ (para emissão de NFe/NFCe).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa que fará a consulta, o certificado dela será utilizado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_TPAMB&lt;br /&gt;
|&amp;lt;SEFAZ_tpAmb&amp;gt; Enumeration com a identificação do ambiente a ser verificado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_SEFAZSTATUSVO&lt;br /&gt;
|&amp;lt;SEFAZStatusVO&amp;gt; Objeto SEFAZStatusVO com as informações solicitadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== emitDocFiscal ====&lt;br /&gt;
&lt;br /&gt;
EnviaSolicita a emissão de um DocFiscal para o BIS Server. &#039;&#039;&#039;Este método do lado do servidor já fará a sincronia do objeto antes de emití-lo!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|EMITDOCFISCAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_EMITDOCFISCAL_DOCFISCALVO&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO para ser sincronizado e emitido pelo servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_EMITDOCFISCAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_EMITDOCFISCAL_DOCFISCALVO&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO retornado com o cupom e dados completo.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1688</id>
		<title>BISModulesSocket</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1688"/>
		<updated>2025-12-12T17:34:30Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* getCompanyCertificateForSEFAZ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
O BISModulesSocket é como uma pequena biblioteca que facilita a comunicação entre terminais (aplicações externas ao servidor de aplicações) e o BISCore e BISModules. Desenvolvido apenas com Java e Sockets (implementado em cima do [[BISSocket]]), pode ser usado para realizar chamadas e comunicar com o sistema sem a necessidade de utilizar bibliotecas RMI/JNDI ou outras mais complexas de integração.&lt;br /&gt;
&lt;br /&gt;
== Funcionamento ==&lt;br /&gt;
O lado servidor será &amp;quot;levantado&amp;quot; junto com o plugin. A partir deste momento o servidor já estará escutando a porta e aguardado conexão dos terminais.&lt;br /&gt;
&lt;br /&gt;
A utilização é simples:&lt;br /&gt;
# Cria uma instância do BISModulesSocketClient, passe no construtor o host e a porta do servidor BISERP para que o cliente conecte-se;&lt;br /&gt;
# Chama os métodos passando os atributos desejados e aguarde pela resposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo entre BISModulesSocketClient e BISModulesSocketServer ==&lt;br /&gt;
&lt;br /&gt;
Abaixo estão listados os comandos utilizados atualmente pelas duas classes para abstrair a comunicação. Para utilizar as classes não é necessário se familiarizar com o protocolo, apenas para manutenção e implementação das mesmas.&lt;br /&gt;
&lt;br /&gt;
{{stop|Chamada Pela Fachada|Quando o BISModulesSocketServer faz o repasse da chamada dos métodos na parte do Core (do BIS ou dos Plugins), deve sempre chamar a fachada de acesso. Para que o servidor de aplicações instancie as transações e o Interceptor da fachada possa fazer seu trabalho.&lt;br /&gt;
Uma chamada direta ao CRUD pode funcionar em alguns casos, mas com certeza desabilitará o [[BISLogger]], as transações dos EJBs e outros serviços oferecidos pelo servidor de aplicação.}}&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Serviço do BISModulesSocket ===&lt;br /&gt;
&lt;br /&gt;
==== serverTime ====&lt;br /&gt;
Recupera o horário do Servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Número qualquer para identificar a requisição. O mesmo valor é retornado na resposta.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_TIME&lt;br /&gt;
|&amp;lt;Long&amp;gt; System.currentTimeMillis() do servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Exatamente mesmo valor recebido na requisição, mesmo que null.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISCore ===&lt;br /&gt;
&lt;br /&gt;
==== getProperty ====&lt;br /&gt;
Busca no servidor uma propriedade do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETPROPERTY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_PROPERTY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Propriedade a ser recuperada no servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_VALUE&lt;br /&gt;
|String - Valor da propriedade do sistema, null caso a propriedade tenha o valor nulo ou não tenha sido encontrado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETPROPERTY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== hasPermissionKey ====&lt;br /&gt;
Envia para o servidor a autenticação de um usuário e uma chave de segurança para saber se o usuário tem acesso para a chave passada. Note que, seguindo a funcionalidade do Kernel, o método lança exception caso a autenticação falhe, caso o usuário não tenha autorização o retorno será false.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|HASPERMISSIONKEY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_ACCESSKEY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Chave de acesso para questionar.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_RESPONSE&lt;br /&gt;
|Boolean - True caso o usuário tenha acesso a chave, false caso contrário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_HASPERMISSIONKEY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== postBISLog ====&lt;br /&gt;
Envia para o servidor um registro de LOG para ser salvo. Como não há como ter um controle de sincronia de objeto (um ID local como nos objetos do PDV), casa post gerará um objeto novo no servidor. Por isso é preciso controlar os posts pelo lado do cliente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|POSTBISLOG&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_POSTBISLOG_BISLOGOBJ&lt;br /&gt;
|&amp;lt;BISLogVO&amp;gt; - Objeto completo com o registro de erro pronto para ser cadastrado no sistema.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_POSTBISLOG&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== notifyActiveSupport ====&lt;br /&gt;
Este método força o envio de uma mensage para o sistema de suporte ativo do BISERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|NOTIFYACTIVESUPPORT&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_NOTIFYACTIVESUPPORT_MSG&lt;br /&gt;
|&amp;lt;String&amp;gt; - Mensagem a ser enviada para o suporte.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_NOTIFYACTIVESUPPORT&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findBISCertificateList ====&lt;br /&gt;
Busca uma lista de certificados do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_MO&lt;br /&gt;
|&amp;lt;BISCertificateMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELISTLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;BISCertificateVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findCompanyList ====&lt;br /&gt;
Busca uma lista de empresas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_MO&lt;br /&gt;
|&amp;lt;CompanyMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;CompanyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getCompanyCertificateForSEFAZ ====&lt;br /&gt;
Recupera no servidor o certificado A1 válido para que seja utilizado pelo PDV. O PDV utilizar o certificado para assinar a NFCe em contingência OffLine no PDV.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETCOMPANYCERTIFICATEFORSEFAZ&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETCOMPANYCERTIFICATEFORSEFAZ_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da Empresa solicitando o certificado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETCOMPANYCERTIFICATEFORSEFAZ&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETCOMPANYCERTIFICATEFORSEFAZ_CERTIFICATE&lt;br /&gt;
|&amp;lt;BISCertificateVO&amp;gt; - Certificado válido e definido para comunicação com a SEFAZ.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findUserList ====&lt;br /&gt;
Busca uma lista de usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_MO&lt;br /&gt;
|&amp;lt;UserMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;UserVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== createNewTokenToUser ====&lt;br /&gt;
Solicita ao servidor que gere um novo token para o usuário passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requsição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_TOKEN&lt;br /&gt;
|&amp;lt;String&amp;gt; - Token recém criado para o usuário.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISModules ===&lt;br /&gt;
&lt;br /&gt;
==== registerTerminal ====&lt;br /&gt;
Faz o registro do terminal no servidor do BIS. Necessário para que o BIS reconheça esse terminal e possa gerencia-lo adequadamente, como sincronizar dados, conhecer status, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_UNIQUEID&lt;br /&gt;
|&amp;lt;String&amp;gt; - ID do terminal. String gerada que deve ser única par o terminal. Normalmente usado o macaddress da máquina por já ser uma númeração única.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID Gerado pelo servidor que passará a identificar o terminal no servidor&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVItemListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os itens mais novos que esta data. Se for nulo, retornamos todos os itens.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVItemVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPropertiesListToSync ====&lt;br /&gt;
&lt;br /&gt;
Solicita do módulo PDV uma lista das propriedades de configuração para o aplicativo BISPDV definidas para uma determinada empresa. Esta lista terá trará todas as propriedades com o prefixo &amp;quot;br.com.biserp.bismodules.pdv.pdvapp.centralconfig&amp;quot; e no sufixo o ID da empresa separado por um &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPROPERTIESLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PropertyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findFiscalIBPTRatiosListToSync ====&lt;br /&gt;
Solicita do módulo Fiscal uma lista dos ratios fornecida pelo IBPT usada para calcular o total de imposto aproximado pago no cupom. Esta lista terá apenas os objetos alterados a partir da data passada. Método usado para sincronizar novos objetos nos terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no temrinal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os objetos mais novos que esta data. Se for nulo, retornamos todos os objetos.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;FiscalIBPTRatioVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPaymentListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPAYMENTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVPaymentVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVContractListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de contratos (convênios) para venda no caixa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVCONTRACTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVContractVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVTokenList ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_MO&lt;br /&gt;
|&amp;lt;PDVTokenMO&amp;gt; MO para filtrar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; para organizar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ATTRIBUTE&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Atributos que devem ser populados nos objetos da lista.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lockPDVToken ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser bloqueado&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; - Token bloqueado para edição&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== saveAndUnlockToken ====&lt;br /&gt;
Solicita do módulo PDV que salva uma comanda e a deixe desbloqueada para edição por outros terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SAVEANDUNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SAVEANDUNLOCKTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; Objeto representando o token a ser salvo e desbloqueado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SAVEANDUNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== unlockToken ====&lt;br /&gt;
Solicita do módulo PDV que desbloqueie uma comanda da edição.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|UNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_UNLOCKTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser desbloqueado da edição.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_UNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clearTokens ====&lt;br /&gt;
Solicita do módulo PDV que limpe e desbloqueie as comandas informadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CLEARTOKENS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CLEARTOKENS_TOKENS&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; Coleção de comandas a serem limpas e desbloqueadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CLEARTOKENS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCheckoutVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCheckoutVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCheckoutVO&amp;gt;&amp;gt; Coleção de checkouts para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCupomVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCupomVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCUPOMVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCupomVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCUPOMVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== syncDocFiscalVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos DocFiscalVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCDOCFISCALVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;DocFiscalVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCDOCFISCALVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVNFCeLastDocumentNumber ====&lt;br /&gt;
Solicita ao servidor que retorne o número do documento do último cupom emitido para uma determinada empresa e série da documento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCSERIAL&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da série do documento desejado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCNUMBER&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do último documento emitido para a empresa e na série solicitada.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findLocationCountryListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Países alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCountryVO&amp;gt; Retorna uma lista com todos os LocationCountryVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationStateListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Estados alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_IDCOUNTRY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do País que se deseja os estados.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de países para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationStateVO&amp;gt; Retorna uma lista com todos os LocationStateVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationCityListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_IDSTATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de estados para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCityVO&amp;gt; Retorna uma lista com todos os LocationCityVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationAddressListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_IDCITY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de cidade para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationAddressVO&amp;gt; Retorna uma lista com todos os LocationAddressVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== importSATXML ====&lt;br /&gt;
&lt;br /&gt;
Solicita ao servidor que importe um arquivo de XML do SAT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|IMPORTSATXML&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_IMPORTSATXML_XML&lt;br /&gt;
|&amp;lt;String&amp;gt; Conteúdo do arquivo XML a ser importado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_IMPORTSATXML&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getSEFAZStatus ====&lt;br /&gt;
&lt;br /&gt;
Recupera o status atual de comunicação com a SEFAZ (para emissão de NFe/NFCe).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa que fará a consulta, o certificado dela será utilizado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_TPAMB&lt;br /&gt;
|&amp;lt;SEFAZ_tpAmb&amp;gt; Enumeration com a identificação do ambiente a ser verificado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_SEFAZSTATUSVO&lt;br /&gt;
|&amp;lt;SEFAZStatusVO&amp;gt; Objeto SEFAZStatusVO com as informações solicitadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== emitDocFiscal ====&lt;br /&gt;
&lt;br /&gt;
EnviaSolicita a emissão de um DocFiscal para o BIS Server. &#039;&#039;&#039;Este método do lado do servidor já fará a sincronia do objeto antes de emití-lo!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|EMITDOCFISCAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_EMITDOCFISCAL_DOCFISCALVO&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO para ser sincronizado e emitido pelo servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_EMITDOCFISCAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_EMITDOCFISCAL_DOCFISCALVO&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO retornado com o cupom e dados completo.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1687</id>
		<title>BISModulesSocket</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1687"/>
		<updated>2025-12-12T17:33:57Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* findCompanyList */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
O BISModulesSocket é como uma pequena biblioteca que facilita a comunicação entre terminais (aplicações externas ao servidor de aplicações) e o BISCore e BISModules. Desenvolvido apenas com Java e Sockets (implementado em cima do [[BISSocket]]), pode ser usado para realizar chamadas e comunicar com o sistema sem a necessidade de utilizar bibliotecas RMI/JNDI ou outras mais complexas de integração.&lt;br /&gt;
&lt;br /&gt;
== Funcionamento ==&lt;br /&gt;
O lado servidor será &amp;quot;levantado&amp;quot; junto com o plugin. A partir deste momento o servidor já estará escutando a porta e aguardado conexão dos terminais.&lt;br /&gt;
&lt;br /&gt;
A utilização é simples:&lt;br /&gt;
# Cria uma instância do BISModulesSocketClient, passe no construtor o host e a porta do servidor BISERP para que o cliente conecte-se;&lt;br /&gt;
# Chama os métodos passando os atributos desejados e aguarde pela resposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo entre BISModulesSocketClient e BISModulesSocketServer ==&lt;br /&gt;
&lt;br /&gt;
Abaixo estão listados os comandos utilizados atualmente pelas duas classes para abstrair a comunicação. Para utilizar as classes não é necessário se familiarizar com o protocolo, apenas para manutenção e implementação das mesmas.&lt;br /&gt;
&lt;br /&gt;
{{stop|Chamada Pela Fachada|Quando o BISModulesSocketServer faz o repasse da chamada dos métodos na parte do Core (do BIS ou dos Plugins), deve sempre chamar a fachada de acesso. Para que o servidor de aplicações instancie as transações e o Interceptor da fachada possa fazer seu trabalho.&lt;br /&gt;
Uma chamada direta ao CRUD pode funcionar em alguns casos, mas com certeza desabilitará o [[BISLogger]], as transações dos EJBs e outros serviços oferecidos pelo servidor de aplicação.}}&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Serviço do BISModulesSocket ===&lt;br /&gt;
&lt;br /&gt;
==== serverTime ====&lt;br /&gt;
Recupera o horário do Servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Número qualquer para identificar a requisição. O mesmo valor é retornado na resposta.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_TIME&lt;br /&gt;
|&amp;lt;Long&amp;gt; System.currentTimeMillis() do servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Exatamente mesmo valor recebido na requisição, mesmo que null.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISCore ===&lt;br /&gt;
&lt;br /&gt;
==== getProperty ====&lt;br /&gt;
Busca no servidor uma propriedade do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETPROPERTY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_PROPERTY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Propriedade a ser recuperada no servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_VALUE&lt;br /&gt;
|String - Valor da propriedade do sistema, null caso a propriedade tenha o valor nulo ou não tenha sido encontrado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETPROPERTY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== hasPermissionKey ====&lt;br /&gt;
Envia para o servidor a autenticação de um usuário e uma chave de segurança para saber se o usuário tem acesso para a chave passada. Note que, seguindo a funcionalidade do Kernel, o método lança exception caso a autenticação falhe, caso o usuário não tenha autorização o retorno será false.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|HASPERMISSIONKEY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_ACCESSKEY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Chave de acesso para questionar.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_RESPONSE&lt;br /&gt;
|Boolean - True caso o usuário tenha acesso a chave, false caso contrário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_HASPERMISSIONKEY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== postBISLog ====&lt;br /&gt;
Envia para o servidor um registro de LOG para ser salvo. Como não há como ter um controle de sincronia de objeto (um ID local como nos objetos do PDV), casa post gerará um objeto novo no servidor. Por isso é preciso controlar os posts pelo lado do cliente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|POSTBISLOG&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_POSTBISLOG_BISLOGOBJ&lt;br /&gt;
|&amp;lt;BISLogVO&amp;gt; - Objeto completo com o registro de erro pronto para ser cadastrado no sistema.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_POSTBISLOG&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== notifyActiveSupport ====&lt;br /&gt;
Este método força o envio de uma mensage para o sistema de suporte ativo do BISERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|NOTIFYACTIVESUPPORT&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_NOTIFYACTIVESUPPORT_MSG&lt;br /&gt;
|&amp;lt;String&amp;gt; - Mensagem a ser enviada para o suporte.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_NOTIFYACTIVESUPPORT&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findBISCertificateList ====&lt;br /&gt;
Busca uma lista de certificados do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_MO&lt;br /&gt;
|&amp;lt;BISCertificateMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELISTLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;BISCertificateVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findCompanyList ====&lt;br /&gt;
Busca uma lista de empresas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_MO&lt;br /&gt;
|&amp;lt;CompanyMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;CompanyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getCompanyCertificateForSEFAZ ====&lt;br /&gt;
Recupera no servidor o certificado A1 válido para que seja utilizado pelo PDV. O PDV utilizar o certificado para assinar a NFCe em contingência OffLine no PDV.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETCOMPANYCERTIFICATEFORSEFAZ&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETCOMPANYCERTIFICATEFORSEFAZ_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da Empresa solicitando o certificado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETCOMPANYCERTIFICATEFORSEFAZ&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;BISCertificateVO&amp;gt; - Certificado válido e definido para comunicação com a SEFAZ.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findUserList ====&lt;br /&gt;
Busca uma lista de usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_MO&lt;br /&gt;
|&amp;lt;UserMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;UserVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== createNewTokenToUser ====&lt;br /&gt;
Solicita ao servidor que gere um novo token para o usuário passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requsição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_TOKEN&lt;br /&gt;
|&amp;lt;String&amp;gt; - Token recém criado para o usuário.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISModules ===&lt;br /&gt;
&lt;br /&gt;
==== registerTerminal ====&lt;br /&gt;
Faz o registro do terminal no servidor do BIS. Necessário para que o BIS reconheça esse terminal e possa gerencia-lo adequadamente, como sincronizar dados, conhecer status, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_UNIQUEID&lt;br /&gt;
|&amp;lt;String&amp;gt; - ID do terminal. String gerada que deve ser única par o terminal. Normalmente usado o macaddress da máquina por já ser uma númeração única.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID Gerado pelo servidor que passará a identificar o terminal no servidor&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVItemListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os itens mais novos que esta data. Se for nulo, retornamos todos os itens.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVItemVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPropertiesListToSync ====&lt;br /&gt;
&lt;br /&gt;
Solicita do módulo PDV uma lista das propriedades de configuração para o aplicativo BISPDV definidas para uma determinada empresa. Esta lista terá trará todas as propriedades com o prefixo &amp;quot;br.com.biserp.bismodules.pdv.pdvapp.centralconfig&amp;quot; e no sufixo o ID da empresa separado por um &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPROPERTIESLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PropertyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findFiscalIBPTRatiosListToSync ====&lt;br /&gt;
Solicita do módulo Fiscal uma lista dos ratios fornecida pelo IBPT usada para calcular o total de imposto aproximado pago no cupom. Esta lista terá apenas os objetos alterados a partir da data passada. Método usado para sincronizar novos objetos nos terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no temrinal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os objetos mais novos que esta data. Se for nulo, retornamos todos os objetos.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;FiscalIBPTRatioVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPaymentListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPAYMENTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVPaymentVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVContractListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de contratos (convênios) para venda no caixa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVCONTRACTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVContractVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVTokenList ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_MO&lt;br /&gt;
|&amp;lt;PDVTokenMO&amp;gt; MO para filtrar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; para organizar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ATTRIBUTE&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Atributos que devem ser populados nos objetos da lista.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lockPDVToken ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser bloqueado&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; - Token bloqueado para edição&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== saveAndUnlockToken ====&lt;br /&gt;
Solicita do módulo PDV que salva uma comanda e a deixe desbloqueada para edição por outros terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SAVEANDUNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SAVEANDUNLOCKTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; Objeto representando o token a ser salvo e desbloqueado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SAVEANDUNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== unlockToken ====&lt;br /&gt;
Solicita do módulo PDV que desbloqueie uma comanda da edição.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|UNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_UNLOCKTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser desbloqueado da edição.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_UNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clearTokens ====&lt;br /&gt;
Solicita do módulo PDV que limpe e desbloqueie as comandas informadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CLEARTOKENS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CLEARTOKENS_TOKENS&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; Coleção de comandas a serem limpas e desbloqueadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CLEARTOKENS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCheckoutVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCheckoutVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCheckoutVO&amp;gt;&amp;gt; Coleção de checkouts para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCupomVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCupomVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCUPOMVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCupomVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCUPOMVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== syncDocFiscalVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos DocFiscalVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCDOCFISCALVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;DocFiscalVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCDOCFISCALVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVNFCeLastDocumentNumber ====&lt;br /&gt;
Solicita ao servidor que retorne o número do documento do último cupom emitido para uma determinada empresa e série da documento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCSERIAL&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da série do documento desejado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCNUMBER&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do último documento emitido para a empresa e na série solicitada.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findLocationCountryListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Países alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCountryVO&amp;gt; Retorna uma lista com todos os LocationCountryVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationStateListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Estados alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_IDCOUNTRY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do País que se deseja os estados.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de países para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationStateVO&amp;gt; Retorna uma lista com todos os LocationStateVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationCityListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_IDSTATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de estados para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCityVO&amp;gt; Retorna uma lista com todos os LocationCityVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationAddressListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_IDCITY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de cidade para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationAddressVO&amp;gt; Retorna uma lista com todos os LocationAddressVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== importSATXML ====&lt;br /&gt;
&lt;br /&gt;
Solicita ao servidor que importe um arquivo de XML do SAT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|IMPORTSATXML&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_IMPORTSATXML_XML&lt;br /&gt;
|&amp;lt;String&amp;gt; Conteúdo do arquivo XML a ser importado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_IMPORTSATXML&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getSEFAZStatus ====&lt;br /&gt;
&lt;br /&gt;
Recupera o status atual de comunicação com a SEFAZ (para emissão de NFe/NFCe).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa que fará a consulta, o certificado dela será utilizado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_TPAMB&lt;br /&gt;
|&amp;lt;SEFAZ_tpAmb&amp;gt; Enumeration com a identificação do ambiente a ser verificado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_SEFAZSTATUSVO&lt;br /&gt;
|&amp;lt;SEFAZStatusVO&amp;gt; Objeto SEFAZStatusVO com as informações solicitadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== emitDocFiscal ====&lt;br /&gt;
&lt;br /&gt;
EnviaSolicita a emissão de um DocFiscal para o BIS Server. &#039;&#039;&#039;Este método do lado do servidor já fará a sincronia do objeto antes de emití-lo!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|EMITDOCFISCAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_EMITDOCFISCAL_DOCFISCALVO&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO para ser sincronizado e emitido pelo servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_EMITDOCFISCAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_EMITDOCFISCAL_DOCFISCALVO&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO retornado com o cupom e dados completo.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1686</id>
		<title>BISModulesSocket</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1686"/>
		<updated>2025-11-26T13:22:51Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* emitDocFiscal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
O BISModulesSocket é como uma pequena biblioteca que facilita a comunicação entre terminais (aplicações externas ao servidor de aplicações) e o BISCore e BISModules. Desenvolvido apenas com Java e Sockets (implementado em cima do [[BISSocket]]), pode ser usado para realizar chamadas e comunicar com o sistema sem a necessidade de utilizar bibliotecas RMI/JNDI ou outras mais complexas de integração.&lt;br /&gt;
&lt;br /&gt;
== Funcionamento ==&lt;br /&gt;
O lado servidor será &amp;quot;levantado&amp;quot; junto com o plugin. A partir deste momento o servidor já estará escutando a porta e aguardado conexão dos terminais.&lt;br /&gt;
&lt;br /&gt;
A utilização é simples:&lt;br /&gt;
# Cria uma instância do BISModulesSocketClient, passe no construtor o host e a porta do servidor BISERP para que o cliente conecte-se;&lt;br /&gt;
# Chama os métodos passando os atributos desejados e aguarde pela resposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo entre BISModulesSocketClient e BISModulesSocketServer ==&lt;br /&gt;
&lt;br /&gt;
Abaixo estão listados os comandos utilizados atualmente pelas duas classes para abstrair a comunicação. Para utilizar as classes não é necessário se familiarizar com o protocolo, apenas para manutenção e implementação das mesmas.&lt;br /&gt;
&lt;br /&gt;
{{stop|Chamada Pela Fachada|Quando o BISModulesSocketServer faz o repasse da chamada dos métodos na parte do Core (do BIS ou dos Plugins), deve sempre chamar a fachada de acesso. Para que o servidor de aplicações instancie as transações e o Interceptor da fachada possa fazer seu trabalho.&lt;br /&gt;
Uma chamada direta ao CRUD pode funcionar em alguns casos, mas com certeza desabilitará o [[BISLogger]], as transações dos EJBs e outros serviços oferecidos pelo servidor de aplicação.}}&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Serviço do BISModulesSocket ===&lt;br /&gt;
&lt;br /&gt;
==== serverTime ====&lt;br /&gt;
Recupera o horário do Servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Número qualquer para identificar a requisição. O mesmo valor é retornado na resposta.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_TIME&lt;br /&gt;
|&amp;lt;Long&amp;gt; System.currentTimeMillis() do servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Exatamente mesmo valor recebido na requisição, mesmo que null.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISCore ===&lt;br /&gt;
&lt;br /&gt;
==== getProperty ====&lt;br /&gt;
Busca no servidor uma propriedade do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETPROPERTY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_PROPERTY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Propriedade a ser recuperada no servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_VALUE&lt;br /&gt;
|String - Valor da propriedade do sistema, null caso a propriedade tenha o valor nulo ou não tenha sido encontrado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETPROPERTY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== hasPermissionKey ====&lt;br /&gt;
Envia para o servidor a autenticação de um usuário e uma chave de segurança para saber se o usuário tem acesso para a chave passada. Note que, seguindo a funcionalidade do Kernel, o método lança exception caso a autenticação falhe, caso o usuário não tenha autorização o retorno será false.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|HASPERMISSIONKEY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_ACCESSKEY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Chave de acesso para questionar.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_RESPONSE&lt;br /&gt;
|Boolean - True caso o usuário tenha acesso a chave, false caso contrário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_HASPERMISSIONKEY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== postBISLog ====&lt;br /&gt;
Envia para o servidor um registro de LOG para ser salvo. Como não há como ter um controle de sincronia de objeto (um ID local como nos objetos do PDV), casa post gerará um objeto novo no servidor. Por isso é preciso controlar os posts pelo lado do cliente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|POSTBISLOG&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_POSTBISLOG_BISLOGOBJ&lt;br /&gt;
|&amp;lt;BISLogVO&amp;gt; - Objeto completo com o registro de erro pronto para ser cadastrado no sistema.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_POSTBISLOG&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== notifyActiveSupport ====&lt;br /&gt;
Este método força o envio de uma mensage para o sistema de suporte ativo do BISERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|NOTIFYACTIVESUPPORT&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_NOTIFYACTIVESUPPORT_MSG&lt;br /&gt;
|&amp;lt;String&amp;gt; - Mensagem a ser enviada para o suporte.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_NOTIFYACTIVESUPPORT&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findBISCertificateList ====&lt;br /&gt;
Busca uma lista de certificados do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_MO&lt;br /&gt;
|&amp;lt;BISCertificateMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELISTLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;BISCertificateVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findCompanyList ====&lt;br /&gt;
Busca uma lista de empresas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_MO&lt;br /&gt;
|&amp;lt;CompanyMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;CompanyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findUserList ====&lt;br /&gt;
Busca uma lista de usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_MO&lt;br /&gt;
|&amp;lt;UserMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;UserVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== createNewTokenToUser ====&lt;br /&gt;
Solicita ao servidor que gere um novo token para o usuário passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requsição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_TOKEN&lt;br /&gt;
|&amp;lt;String&amp;gt; - Token recém criado para o usuário.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISModules ===&lt;br /&gt;
&lt;br /&gt;
==== registerTerminal ====&lt;br /&gt;
Faz o registro do terminal no servidor do BIS. Necessário para que o BIS reconheça esse terminal e possa gerencia-lo adequadamente, como sincronizar dados, conhecer status, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_UNIQUEID&lt;br /&gt;
|&amp;lt;String&amp;gt; - ID do terminal. String gerada que deve ser única par o terminal. Normalmente usado o macaddress da máquina por já ser uma númeração única.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID Gerado pelo servidor que passará a identificar o terminal no servidor&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVItemListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os itens mais novos que esta data. Se for nulo, retornamos todos os itens.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVItemVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPropertiesListToSync ====&lt;br /&gt;
&lt;br /&gt;
Solicita do módulo PDV uma lista das propriedades de configuração para o aplicativo BISPDV definidas para uma determinada empresa. Esta lista terá trará todas as propriedades com o prefixo &amp;quot;br.com.biserp.bismodules.pdv.pdvapp.centralconfig&amp;quot; e no sufixo o ID da empresa separado por um &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPROPERTIESLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PropertyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findFiscalIBPTRatiosListToSync ====&lt;br /&gt;
Solicita do módulo Fiscal uma lista dos ratios fornecida pelo IBPT usada para calcular o total de imposto aproximado pago no cupom. Esta lista terá apenas os objetos alterados a partir da data passada. Método usado para sincronizar novos objetos nos terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no temrinal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os objetos mais novos que esta data. Se for nulo, retornamos todos os objetos.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;FiscalIBPTRatioVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPaymentListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPAYMENTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVPaymentVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVContractListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de contratos (convênios) para venda no caixa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVCONTRACTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVContractVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVTokenList ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_MO&lt;br /&gt;
|&amp;lt;PDVTokenMO&amp;gt; MO para filtrar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; para organizar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ATTRIBUTE&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Atributos que devem ser populados nos objetos da lista.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lockPDVToken ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser bloqueado&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; - Token bloqueado para edição&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== saveAndUnlockToken ====&lt;br /&gt;
Solicita do módulo PDV que salva uma comanda e a deixe desbloqueada para edição por outros terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SAVEANDUNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SAVEANDUNLOCKTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; Objeto representando o token a ser salvo e desbloqueado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SAVEANDUNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== unlockToken ====&lt;br /&gt;
Solicita do módulo PDV que desbloqueie uma comanda da edição.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|UNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_UNLOCKTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser desbloqueado da edição.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_UNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clearTokens ====&lt;br /&gt;
Solicita do módulo PDV que limpe e desbloqueie as comandas informadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CLEARTOKENS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CLEARTOKENS_TOKENS&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; Coleção de comandas a serem limpas e desbloqueadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CLEARTOKENS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCheckoutVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCheckoutVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCheckoutVO&amp;gt;&amp;gt; Coleção de checkouts para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCupomVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCupomVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCUPOMVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCupomVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCUPOMVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== syncDocFiscalVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos DocFiscalVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCDOCFISCALVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;DocFiscalVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCDOCFISCALVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVNFCeLastDocumentNumber ====&lt;br /&gt;
Solicita ao servidor que retorne o número do documento do último cupom emitido para uma determinada empresa e série da documento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCSERIAL&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da série do documento desejado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCNUMBER&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do último documento emitido para a empresa e na série solicitada.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findLocationCountryListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Países alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCountryVO&amp;gt; Retorna uma lista com todos os LocationCountryVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationStateListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Estados alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_IDCOUNTRY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do País que se deseja os estados.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de países para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationStateVO&amp;gt; Retorna uma lista com todos os LocationStateVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationCityListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_IDSTATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de estados para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCityVO&amp;gt; Retorna uma lista com todos os LocationCityVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationAddressListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_IDCITY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de cidade para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationAddressVO&amp;gt; Retorna uma lista com todos os LocationAddressVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== importSATXML ====&lt;br /&gt;
&lt;br /&gt;
Solicita ao servidor que importe um arquivo de XML do SAT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|IMPORTSATXML&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_IMPORTSATXML_XML&lt;br /&gt;
|&amp;lt;String&amp;gt; Conteúdo do arquivo XML a ser importado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_IMPORTSATXML&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getSEFAZStatus ====&lt;br /&gt;
&lt;br /&gt;
Recupera o status atual de comunicação com a SEFAZ (para emissão de NFe/NFCe).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa que fará a consulta, o certificado dela será utilizado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_TPAMB&lt;br /&gt;
|&amp;lt;SEFAZ_tpAmb&amp;gt; Enumeration com a identificação do ambiente a ser verificado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_SEFAZSTATUSVO&lt;br /&gt;
|&amp;lt;SEFAZStatusVO&amp;gt; Objeto SEFAZStatusVO com as informações solicitadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== emitDocFiscal ====&lt;br /&gt;
&lt;br /&gt;
EnviaSolicita a emissão de um DocFiscal para o BIS Server. &#039;&#039;&#039;Este método do lado do servidor já fará a sincronia do objeto antes de emití-lo!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|EMITDOCFISCAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_EMITDOCFISCAL_DOCFISCALVO&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO para ser sincronizado e emitido pelo servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_EMITDOCFISCAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_EMITDOCFISCAL_DOCFISCALVO&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO retornado com o cupom e dados completo.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1685</id>
		<title>BISModulesSocket</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1685"/>
		<updated>2025-11-25T21:05:34Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* emitDocFiscal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
O BISModulesSocket é como uma pequena biblioteca que facilita a comunicação entre terminais (aplicações externas ao servidor de aplicações) e o BISCore e BISModules. Desenvolvido apenas com Java e Sockets (implementado em cima do [[BISSocket]]), pode ser usado para realizar chamadas e comunicar com o sistema sem a necessidade de utilizar bibliotecas RMI/JNDI ou outras mais complexas de integração.&lt;br /&gt;
&lt;br /&gt;
== Funcionamento ==&lt;br /&gt;
O lado servidor será &amp;quot;levantado&amp;quot; junto com o plugin. A partir deste momento o servidor já estará escutando a porta e aguardado conexão dos terminais.&lt;br /&gt;
&lt;br /&gt;
A utilização é simples:&lt;br /&gt;
# Cria uma instância do BISModulesSocketClient, passe no construtor o host e a porta do servidor BISERP para que o cliente conecte-se;&lt;br /&gt;
# Chama os métodos passando os atributos desejados e aguarde pela resposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo entre BISModulesSocketClient e BISModulesSocketServer ==&lt;br /&gt;
&lt;br /&gt;
Abaixo estão listados os comandos utilizados atualmente pelas duas classes para abstrair a comunicação. Para utilizar as classes não é necessário se familiarizar com o protocolo, apenas para manutenção e implementação das mesmas.&lt;br /&gt;
&lt;br /&gt;
{{stop|Chamada Pela Fachada|Quando o BISModulesSocketServer faz o repasse da chamada dos métodos na parte do Core (do BIS ou dos Plugins), deve sempre chamar a fachada de acesso. Para que o servidor de aplicações instancie as transações e o Interceptor da fachada possa fazer seu trabalho.&lt;br /&gt;
Uma chamada direta ao CRUD pode funcionar em alguns casos, mas com certeza desabilitará o [[BISLogger]], as transações dos EJBs e outros serviços oferecidos pelo servidor de aplicação.}}&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Serviço do BISModulesSocket ===&lt;br /&gt;
&lt;br /&gt;
==== serverTime ====&lt;br /&gt;
Recupera o horário do Servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Número qualquer para identificar a requisição. O mesmo valor é retornado na resposta.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_TIME&lt;br /&gt;
|&amp;lt;Long&amp;gt; System.currentTimeMillis() do servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Exatamente mesmo valor recebido na requisição, mesmo que null.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISCore ===&lt;br /&gt;
&lt;br /&gt;
==== getProperty ====&lt;br /&gt;
Busca no servidor uma propriedade do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETPROPERTY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_PROPERTY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Propriedade a ser recuperada no servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_VALUE&lt;br /&gt;
|String - Valor da propriedade do sistema, null caso a propriedade tenha o valor nulo ou não tenha sido encontrado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETPROPERTY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== hasPermissionKey ====&lt;br /&gt;
Envia para o servidor a autenticação de um usuário e uma chave de segurança para saber se o usuário tem acesso para a chave passada. Note que, seguindo a funcionalidade do Kernel, o método lança exception caso a autenticação falhe, caso o usuário não tenha autorização o retorno será false.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|HASPERMISSIONKEY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_ACCESSKEY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Chave de acesso para questionar.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_RESPONSE&lt;br /&gt;
|Boolean - True caso o usuário tenha acesso a chave, false caso contrário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_HASPERMISSIONKEY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== postBISLog ====&lt;br /&gt;
Envia para o servidor um registro de LOG para ser salvo. Como não há como ter um controle de sincronia de objeto (um ID local como nos objetos do PDV), casa post gerará um objeto novo no servidor. Por isso é preciso controlar os posts pelo lado do cliente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|POSTBISLOG&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_POSTBISLOG_BISLOGOBJ&lt;br /&gt;
|&amp;lt;BISLogVO&amp;gt; - Objeto completo com o registro de erro pronto para ser cadastrado no sistema.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_POSTBISLOG&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== notifyActiveSupport ====&lt;br /&gt;
Este método força o envio de uma mensage para o sistema de suporte ativo do BISERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|NOTIFYACTIVESUPPORT&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_NOTIFYACTIVESUPPORT_MSG&lt;br /&gt;
|&amp;lt;String&amp;gt; - Mensagem a ser enviada para o suporte.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_NOTIFYACTIVESUPPORT&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findBISCertificateList ====&lt;br /&gt;
Busca uma lista de certificados do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_MO&lt;br /&gt;
|&amp;lt;BISCertificateMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELISTLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;BISCertificateVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findCompanyList ====&lt;br /&gt;
Busca uma lista de empresas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_MO&lt;br /&gt;
|&amp;lt;CompanyMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;CompanyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findUserList ====&lt;br /&gt;
Busca uma lista de usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_MO&lt;br /&gt;
|&amp;lt;UserMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;UserVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== createNewTokenToUser ====&lt;br /&gt;
Solicita ao servidor que gere um novo token para o usuário passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requsição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_TOKEN&lt;br /&gt;
|&amp;lt;String&amp;gt; - Token recém criado para o usuário.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISModules ===&lt;br /&gt;
&lt;br /&gt;
==== registerTerminal ====&lt;br /&gt;
Faz o registro do terminal no servidor do BIS. Necessário para que o BIS reconheça esse terminal e possa gerencia-lo adequadamente, como sincronizar dados, conhecer status, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_UNIQUEID&lt;br /&gt;
|&amp;lt;String&amp;gt; - ID do terminal. String gerada que deve ser única par o terminal. Normalmente usado o macaddress da máquina por já ser uma númeração única.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID Gerado pelo servidor que passará a identificar o terminal no servidor&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVItemListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os itens mais novos que esta data. Se for nulo, retornamos todos os itens.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVItemVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPropertiesListToSync ====&lt;br /&gt;
&lt;br /&gt;
Solicita do módulo PDV uma lista das propriedades de configuração para o aplicativo BISPDV definidas para uma determinada empresa. Esta lista terá trará todas as propriedades com o prefixo &amp;quot;br.com.biserp.bismodules.pdv.pdvapp.centralconfig&amp;quot; e no sufixo o ID da empresa separado por um &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPROPERTIESLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PropertyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findFiscalIBPTRatiosListToSync ====&lt;br /&gt;
Solicita do módulo Fiscal uma lista dos ratios fornecida pelo IBPT usada para calcular o total de imposto aproximado pago no cupom. Esta lista terá apenas os objetos alterados a partir da data passada. Método usado para sincronizar novos objetos nos terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no temrinal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os objetos mais novos que esta data. Se for nulo, retornamos todos os objetos.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;FiscalIBPTRatioVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPaymentListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPAYMENTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVPaymentVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVContractListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de contratos (convênios) para venda no caixa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVCONTRACTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVContractVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVTokenList ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_MO&lt;br /&gt;
|&amp;lt;PDVTokenMO&amp;gt; MO para filtrar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; para organizar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ATTRIBUTE&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Atributos que devem ser populados nos objetos da lista.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lockPDVToken ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser bloqueado&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; - Token bloqueado para edição&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== saveAndUnlockToken ====&lt;br /&gt;
Solicita do módulo PDV que salva uma comanda e a deixe desbloqueada para edição por outros terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SAVEANDUNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SAVEANDUNLOCKTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; Objeto representando o token a ser salvo e desbloqueado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SAVEANDUNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== unlockToken ====&lt;br /&gt;
Solicita do módulo PDV que desbloqueie uma comanda da edição.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|UNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_UNLOCKTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser desbloqueado da edição.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_UNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clearTokens ====&lt;br /&gt;
Solicita do módulo PDV que limpe e desbloqueie as comandas informadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CLEARTOKENS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CLEARTOKENS_TOKENS&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; Coleção de comandas a serem limpas e desbloqueadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CLEARTOKENS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCheckoutVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCheckoutVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCheckoutVO&amp;gt;&amp;gt; Coleção de checkouts para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCupomVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCupomVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCUPOMVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCupomVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCUPOMVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== syncDocFiscalVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos DocFiscalVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCDOCFISCALVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;DocFiscalVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCDOCFISCALVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVNFCeLastDocumentNumber ====&lt;br /&gt;
Solicita ao servidor que retorne o número do documento do último cupom emitido para uma determinada empresa e série da documento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCSERIAL&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da série do documento desejado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCNUMBER&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do último documento emitido para a empresa e na série solicitada.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findLocationCountryListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Países alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCountryVO&amp;gt; Retorna uma lista com todos os LocationCountryVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationStateListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Estados alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_IDCOUNTRY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do País que se deseja os estados.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de países para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationStateVO&amp;gt; Retorna uma lista com todos os LocationStateVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationCityListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_IDSTATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de estados para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCityVO&amp;gt; Retorna uma lista com todos os LocationCityVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationAddressListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_IDCITY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de cidade para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationAddressVO&amp;gt; Retorna uma lista com todos os LocationAddressVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== importSATXML ====&lt;br /&gt;
&lt;br /&gt;
Solicita ao servidor que importe um arquivo de XML do SAT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|IMPORTSATXML&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_IMPORTSATXML_XML&lt;br /&gt;
|&amp;lt;String&amp;gt; Conteúdo do arquivo XML a ser importado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_IMPORTSATXML&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getSEFAZStatus ====&lt;br /&gt;
&lt;br /&gt;
Recupera o status atual de comunicação com a SEFAZ (para emissão de NFe/NFCe).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa que fará a consulta, o certificado dela será utilizado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_TPAMB&lt;br /&gt;
|&amp;lt;SEFAZ_tpAmb&amp;gt; Enumeration com a identificação do ambiente a ser verificado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_SEFAZSTATUSVO&lt;br /&gt;
|&amp;lt;SEFAZStatusVO&amp;gt; Objeto SEFAZStatusVO com as informações solicitadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== emitDocFiscal ====&lt;br /&gt;
&lt;br /&gt;
EnviaSolicita a emissão de um DocFiscal para o BIS Server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|EMITDOCFISCAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_EMITDOCFISCAL_DOCFISCALVO&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO para ser sincronizado e emitido pelo servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_EMITDOCFISCAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_EMITDOCFISCAL_DOCFISCALVO&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO retornado com o cupom e dados completo.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISPDV&amp;diff=1684</id>
		<title>BISPDV</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISPDV&amp;diff=1684"/>
		<updated>2025-11-25T18:52:09Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Ciclo de Vida do Documento Fiscal no PDV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O BISPDV é a aplicação utilizada na frente de caixa para realização da venda ao consumidor e de outra funções pertinentes à venda e atendimento do cliente da loja.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Pendências, Informações e Guia sobre a implementação =&lt;br /&gt;
&lt;br /&gt;
* O projeto anterior (bis2.pdv) está sendo descontinuado por ainda ter código com suporte a ECF e SAT, que estão em caindo em desuso. Para rever e simplificar o código um novo projeto (bis.pdv) foi criado e o código está sendo revisado e repassado para o novo projeto. Uma vez concluído o projeto bis2.pdv será descontinuado.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alterações em andamento:&#039;&#039;&#039;&lt;br /&gt;
# Para agilidade, foi definido que não utilizaremos o RFWDAO, mas manter a arquitetura de DAO original.&lt;br /&gt;
# Removido código relacionados ao ECF e ao SAT, este novo projeto emitirá cupons apenas utilizando o NFCe, utilizando o código do módulo RFW.SEFAZ.&lt;br /&gt;
# O Bundle foi rebatizado para bispdvbundle.properties, e passou a utilizar as chaves BISPDV_NNNNNN. Todas as chaves antigas foram copiadas para o arquivo e ao fechamento da versão devem ser revisadas, e as sobreviventes renomeadas.&lt;br /&gt;
&lt;br /&gt;
= Inicialização do Sistema =&lt;br /&gt;
&lt;br /&gt;
[[Imagem:inicialização_pdvapp.png|center|Inicialização do Sistema]]&lt;br /&gt;
&lt;br /&gt;
A inicialização do aplicativo segue as seguintes regras:&lt;br /&gt;
&lt;br /&gt;
== PDVStarter ==&lt;br /&gt;
A aplicação deve ser inicializada sempre por esta classe que contém o método &#039;&#039;main()&#039;&#039;;&lt;br /&gt;
: Esta classe não faz absolutamente nada além de passar a chamada, incluindo os argumentos de linha de comando para a &#039;&#039;&#039;PDVUpdater&#039;&#039;&#039;. Sua existência tem a finalidade de permitir a incorporação de plugins, siffers, debugger e outras ferramentas na aplicação. Para isso, basta que a ferramenta implemente uma &#039;sósia&#039; desta classe (mesmo nome e package), e que sua bibliotexa (.jar) seja carregada no classpath antes dos .jars da própria aplicação. Após realizar o que for necessário a ferramenta deve repassar a chamada para &#039;&#039;&#039;PDVUpdater&#039;&#039;&#039; da mesma forma, para que a aplicação se inicie em seu fluxo normal.&lt;br /&gt;
&lt;br /&gt;
== PDVUpdater ==&lt;br /&gt;
&lt;br /&gt;
Esta classe que concentra as tarefas de inicialização da aplicação recebe os seguintes parâmetros:&lt;br /&gt;
* &#039;&#039;&#039;-help&#039;&#039;&#039; - Exibe este menu de opções.&lt;br /&gt;
* &#039;&#039;&#039;-testDarumaFW&#039;&#039;&#039; - Não inicializa a aplicacao. Tenta apenas inicializar as bibliotecas da DarumaDramework, verificando se as DLLs estão OK. Não faz comunicação com a impressora.&lt;br /&gt;
* &#039;&#039;&#039;-watcher&#039;&#039;&#039; - Habilita uma thread que imprime o valor de algumas variáveis do sistema a cada segundo no console do sistema.&lt;br /&gt;
* &#039;&#039;&#039;-autoSaleTest&#039;&#039;&#039; - Carrega um arquivo de vendas automáticas. Esse arquivo deve conter o que deve ser vendido, e as vendas serão feitas automaticamente no horário programado.&lt;br /&gt;
* &#039;&#039;&#039;-noUI&#039;&#039;&#039; - Não inicializa a UI do PDVApp. Útil quando estamos utilizando o -saleFile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Valida se é a única instância tentando bloquear o arquivo &#039;&#039;&#039;.\\instance.lock&#039;&#039;&#039; no diretório da aplicação.&lt;br /&gt;
&lt;br /&gt;
== PDVApp ==&lt;br /&gt;
&lt;br /&gt;
O &#039;&#039;&#039;PDVApp&#039;&#039;&#039; é o coração da aplicação. Funciona com uma série de máquinas de estado (workflows) que definem a lógica da operação da aplicação.&lt;br /&gt;
&lt;br /&gt;
= Workflows do Sistema =&lt;br /&gt;
== Principal: &#039;&#039;&#039;PDVState&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:workflow_pdvstate.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esse é o WORKFLOW geral da aplicação, é definida nos valores da enum &#039;&#039;&#039;PDVState&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;START&#039;&#039;&#039; - Valor inicial, utilizado somente na inicialização da aplicação.&lt;br /&gt;
*: Neste passo é iniciado o workflow &#039;&#039;&#039;StartCheckStatus&#039;&#039;&#039;, enquanto esse workflow secundário é executado, o PDVState é passado para o estado &#039;&#039;&#039;STARTCHECK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STARTCHECK&#039;&#039;&#039; - Estado enquanto a checagem inicial do sistema ocorre;&lt;br /&gt;
*: Se a checagem inicial finalizar com sucesso vai para o estado &#039;&#039;&#039;WAITINGLOGIN&#039;&#039;&#039;, em caso de erro vai para o &#039;&#039;&#039;STARTCHECK_FAIL&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STARTCHECK_FAIL&#039;&#039;&#039; - indicador de que o processo de checagem inicial terminou com erro.&lt;br /&gt;
*: Não há saída desse estado, a não ser reiniciar ou refazer a instalação do PDVApp.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WAITINGLOGIN&#039;&#039;&#039; - Sinaliza que o sistema está aguradando o login.&lt;br /&gt;
*: Fica nesse estado até que o PDVUI interaja com o usuário para executar o login.&lt;br /&gt;
*: Uma vez feita o login pelo método doLogin(), se realizado com sucesso para para o estado &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039; - Estado em que o sistema permite ser configurado, e permite acesso a outras funções administravias do checkout (como abrir e fechar o checkout).&lt;br /&gt;
*: Este já um estado de uso do sistema, deste estado o usuário pode entrar no modo de venda &#039;&#039;&#039;SALES&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALES&#039;&#039;&#039; - Estado em que o sistema entra no modo de vendas, permite a abertura de venda, venda de produtos, recebimento, etc.&lt;br /&gt;
*: Sempre que não estiver com uma venda aberta, o usuário pode voltar para o estado &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Uma vez nos estrados &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039; ou &#039;&#039;&#039;SALES&#039;&#039;&#039; o usuário não pode mais voltar para os outros estados até que a aplicação seja finalizada.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inicialização: &#039;&#039;&#039;StartCheckStatus&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:workflow_StartCheckStatus.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esse é o WORKFLOW que cuida da checagem e inicialização inicial do sistema. Seus funcionamento é assim:&lt;br /&gt;
* &#039;&#039;&#039;INITING&#039;&#039;&#039; - Estado inicial de começo das checkagens;&lt;br /&gt;
*: Neste estágio o sistema começa a ser inicializado, como carregamento dos bundles.&lt;br /&gt;
*: Tudo inicializado com sucesso, passa para o estado &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039; - Estado para verificação do banco de dados.&lt;br /&gt;
*: Verifica se o banco de dados existe, se não existir o cria;&lt;br /&gt;
*: Passa para o estado &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039; - Verifica se o banco de dados está na versão correta e faz as alterações/atualizações necessárias;&lt;br /&gt;
*: Quando atualizado passa para o &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;- Valida se a instalação do PDV está ok (empresa configurada, dados sincronizados, etc.).&lt;br /&gt;
*: Se a instalação estiver OK vai para o estado &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039;, caso contrário para &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;&lt;br /&gt;
*: Nesse estado o PDVApp não faz nada, mas serve de sinalização para o &#039;&#039;&#039;PDVUI&#039;&#039;&#039; que a instalação precisa ser realizada, e a tela é exibida. Quando a tela de instalação é finalizada, o PDVUI sinaliza para o &#039;&#039;&#039;PDVAapp&#039;&#039;&#039; que volta para o estado de &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039; - Estado sem operação, apenas sinalizando que a Instalação está completa.&lt;br /&gt;
*: Passa automaticamente para o estado &#039;&#039;&#039;START_TERMINALAPP&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;START_TERMINALAPP&#039;&#039;&#039; - Inicializa o Terminal Client (Reponsável por realizar a comunicação com o servidor).&lt;br /&gt;
*: Após inicializá-lo passa automaticamente para o estado &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039; - Valida se o ID atual configurado na estação PDV está válido e cadastrado corretamente no servidor.&lt;br /&gt;
*: Se o cadastro estiver OK passa para &#039;&#039;&#039;LOAD_CHECKOUT_DATA&#039;&#039;&#039;, caso contrário trava a aplicação em erro para garantir que seja reinstalada.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LOAD_CHECKOUT_DATA&#039;&#039;&#039; - Carrega as informações do CheckoutData, se existir, para continuar com a aplicação a partir do ponto em que estava. Se não encontrar, procura manualmente se há algum caixa em aberto no banco de dados e &amp;quot;cria&amp;quot; o CheckoutData para continuar o checkout aberto (e não perder sessões de checkouts a cada vez que se perde o CheckoutData). &#039;&#039;&#039;Em adicional&#039;&#039;&#039;, (re)carrega o CFSystem para que o sistema esteja pronto para emitir cupons fiscais.&lt;br /&gt;
*: Passa para o &#039;&#039;&#039;START_SYNCDATA&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;START_SYNCDATA&#039;&#039;&#039; - Inicializa a Thread responsável por sincronizar os dados com/do servidor.&lt;br /&gt;
*: Passa para o &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OK&#039;&#039;&#039; - Estado em que o WORKFLOW finalizou com sucesso. Utilizado para sinalizar outras partes do sistema que a inicialização terminou com sucesso e o sistema está pronto para ser utilizado.&lt;br /&gt;
*: Sinaliza o PDVApp de que este workflou finalizou através do método &#039;&#039;&#039;app.freeStartCheck()&#039;&#039;&#039;, que dá sequência no workflow &#039;&#039;&#039;PDVState&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== PDVUI ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== NFC-e ==&lt;br /&gt;
&lt;br /&gt;
A emissão de NFCe é realizada pelo mesmo layout de WebService da NFe. O BISPDV utilizará o módulo [https://wiki.rodrigogml.eng.br/index.php/P%C3%A1gina_principal#RFW_-_Sefaz RFW.SEFAZ]. Toda a documentação técnica estará no site do módulo. &#039;&#039;&#039;Concentrar aqui apenas as informações relacionadas ao BISPDV e à configuração/utilização do módulo&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ciclo de Vida do Documento Fiscal no PDV ===&lt;br /&gt;
&lt;br /&gt;
O BISPDV utiliza o &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; do [[Módulo Fiscal]] para controlar o ciclo de venda que está ocorrendo, e faz isso através do status definido no objeto.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; pode ser conferido na sessão: [[Módulo_Fiscal#Ciclo_de_Vida_Documento_Fiscal|Ciclo de Vida Documento Fiscal]].&lt;br /&gt;
&lt;br /&gt;
= Cadastros do Sistema =&lt;br /&gt;
&lt;br /&gt;
== Items ==&lt;br /&gt;
&lt;br /&gt;
A aplicação BISPDV não suporta cadastro de itens diretamente no aplicativo. A base de itens para venda é sincronizada diretamente do servidor para a aplicação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para a aplicação é enviada apenas apenas os campos do cadastro de itens necessários para realizar a venda do produto, um objeto &amp;lt;code&amp;gt;PDVItemVO&amp;lt;/code&amp;gt; é montado com as informações da estrutura de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A conversão é feita a partir do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; e não de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;. Isso porque cada código de item pode ser vendido por preços diferentes, quantidades diferentes, unidades de medidas diferentes entre outros. Para o BISPDV cada código funciona como um produto cadastro diferente que pode ser vendido. Já no servidor, a venda de cada código é tratada como uma venda do mesmo item (respeitando a quantidade, preços, etc.). A conversão/envio dos códigos para venda no PDV é realizada da seguinte forma:&lt;br /&gt;
* Apenas produtos que tenham a finalidade marcada como &#039;&#039;&#039;Revenda&#039;&#039;&#039; ou &#039;&#039;&#039;Produto Acabado&#039;&#039;&#039; tem seus códigos sincronizados no PDV.&lt;br /&gt;
* O &amp;lt;code&amp;gt;ID&amp;lt;/code&amp;gt; aplicado no &amp;lt;code&amp;gt;PDVItemVO&amp;lt;/code&amp;gt; é o mesmo do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;, utilizado como referência para sincronizar os novos códigos ou alterações do servidor.&lt;br /&gt;
* O &amp;lt;code&amp;gt;IDItem&amp;lt;/code&amp;gt; é atribuído em outro atibuto, e é utilizado pelo servidor para associar o item do cupom (vendas) ao ItemVO correto. Essa medida visa não perder o relacionamento entre os objetos de Item de Documentos fiscais com o cadastro de item. Isso porque o objeto ItemCodeVO pode ser excluído do sistema, já o ItemVO é só marcado como excluído no sistema e mantido para efeitos de histório, ou seja, ItemCodeVO é um objeto volátil e não pode ser utilizado para referência ou vinculação com objetos de registro ou histórico.&lt;br /&gt;
* O servidor passar no atributo &amp;lt;code&amp;gt;startDate&amp;lt;/code&amp;gt; a última data de alteração do &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; (ou seus subojetos como &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;ItemPrice&amp;lt;/code&amp;gt;), para que o PDV saiba qual foi a última alteração dos objetos na sua base e, consultando a maior dessas datas entre todos os objetos, consegue utilizar essa data para requisitar os objetos alterados a partir dessadata (ao invés da data da última alteração, evitando problemas de sincronia de datas e deixar algum item dessincronizados).&lt;br /&gt;
* Como a venda ocorre com base nas definições do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;, mas o sistema precisa vincular a venda com o &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;, os campos que definem a &amp;quot;transformação&amp;quot; entre &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; e &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; são atribuídas no objeto nos seguintes atributos:&lt;br /&gt;
:* &#039;&#039;&#039;originalItemID&#039;&#039;&#039; - ID do &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; para associação com o item original.&lt;br /&gt;
:* &#039;&#039;&#039;originalDivider&#039;&#039;&#039; - Divisor de conversão&lt;br /&gt;
&lt;br /&gt;
= DOCUMENTAÇÃO A SER REVISADA! =&lt;br /&gt;
O Conteúdo a seguir precisa ser revisado desde a &amp;quot;reimplementação&amp;quot; do PDVApp (BIS2.PDV - Projeto com código do ECF e SAT) para o novo (BIS.PDV - Projeto dedicado apenas ao código do NFCe)&lt;br /&gt;
&lt;br /&gt;
== PayGo ==&lt;br /&gt;
&lt;br /&gt;
O PayGo é o sistema integrado de TEF do sistma.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observações Importantes&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;Site de suporte e manual do desenvolvedor:&#039;&#039;&#039; https://paygodev.readme.io/docs/vis%C3%A3o-geral&lt;br /&gt;
* &#039;&#039;&#039;Download do Kit de Integração:&#039;&#039;&#039; https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2&lt;br /&gt;
* O BISPDV utiliza a versão de troca de arquivos txt, que é a continuação da versão do da NTK na qual o sistema foi homologado inicialmente.&lt;br /&gt;
&lt;br /&gt;
=== Instalação Ambiente de Testes/Homologação ===&lt;br /&gt;
&lt;br /&gt;
Para instalação do ambiente de testes/homologação seguir as instruções do site: https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2.&lt;br /&gt;
Em 28/01/2025 solicitei cadastro para uma nova homologação e ativação do sistema e recebi um e-mail com o seguinte conteúdo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Giovanna de Mello Doroteio comentou\: Prezado(a), Rodrigo.&lt;br /&gt;
Agradecemos por escolher nossos serviços. Para garantir uma experiência tranquila e bem-sucedida durante a integração, estamos fornecendo os dados de instalação e informações sobre os adquirentes disponíveis em nosso servidor de testes.&lt;br /&gt;
&lt;br /&gt;
Dados de Instalação:&lt;br /&gt;
&lt;br /&gt;
Id de Instalação: 344384&lt;br /&gt;
Senha: A70C47D1&lt;br /&gt;
Adquirentes disponíveis em nosso servidor de testes:&lt;br /&gt;
&lt;br /&gt;
Adquirente DEMO:&lt;br /&gt;
Função: Simula uma sub-adquirente.&lt;br /&gt;
&lt;br /&gt;
Adquirente REDE:&lt;br /&gt;
Função: Simula uma adquirente.&lt;br /&gt;
Restrição no Ambiente de Sandbox: Aceita apenas valores inteiros.&lt;br /&gt;
Importante: Qualquer valor com centavos resultará em uma transação negada.&lt;br /&gt;
&lt;br /&gt;
Adquirente PIX C6 BANK:&lt;br /&gt;
Função: Simula operações com Pix e carteira digital.&lt;br /&gt;
Processo: Após uma transação, o QRCode para pagamento será gerado.&lt;br /&gt;
Aprovação Automática: A transação será aprovada automaticamente alguns segundos após a geração do QRCode.&lt;br /&gt;
&lt;br /&gt;
Para acessar a documentação completa de integração, por favor, visite: Sobre esse documento&lt;br /&gt;
Segue o kit de integração e o passo a passo para a habilitação dos logs, respectivamente: [&lt;br /&gt;
Kit de integração|https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2][&lt;br /&gt;
Kit de integração- Habilitação dos Logs.|https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2#aten%C3%A7%C3%A3o]&lt;br /&gt;
ATENÇÃO: É obrigatório habilitar os logs para realizar a homologação.&lt;br /&gt;
&lt;br /&gt;
Se você tiver alguma dúvida, precisar de assistência adicional ou encontrar qualquer problema durante o processo de integração, nossa equipe de suporte estará pronta para ajudar. Não hesite em entrar em contato conosco por meio deste chamado.&lt;br /&gt;
Agradecemos pela sua colaboração e estamos ansiosos para fornecer a melhor experiência possível durante sua fase de testes.&lt;br /&gt;
&lt;br /&gt;
Atenciosamente, SETIS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAT ==&lt;br /&gt;
&lt;br /&gt;
=== Informações ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Site Oficial:&#039;&#039;&#039; https://portal.fazenda.sp.gov.br/servicos/sat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Navegação dos Arquivos do Site&#039;&#039;&#039; (Procure pelas versões mais atualizadas na sessão de download do site oficial)&lt;br /&gt;
* &#039;&#039;&#039;Manual Orientacao SAT&#039;&#039;&#039; - arquivo geral com as orientações sobre como gerar a impressão do cupom, códigos de barras, tamanho, informações necessárias, qrcode, etc.&lt;br /&gt;
* &#039;&#039;&#039;Guia para Geração do QRCode&#039;&#039;&#039; - arquivo com as orientações para gerar o qrcode do cupom fiscal.&lt;br /&gt;
* &#039;&#039;&#039;Especificação de Requisitos do SAT&#039;&#039;&#039; - arquivo com as especificações para o desenvolvedor, como layout XML e outras informações técnicas.&lt;br /&gt;
&lt;br /&gt;
== Arquitetura ==&lt;br /&gt;
&lt;br /&gt;
O aplicativo apresenta a arquitetura dividia conforme o diagrama abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVArquitetura.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== PDVStarter == &lt;br /&gt;
&lt;br /&gt;
O PDVStarter é a classe inicial da aplicação, a classe que contém o método main(). Ela faz apenas algumas verificações mínimas e necessárias para o funcionamento, como definições do ambiente java, e logo seguida inicializa o &#039;&#039;&#039;PDVUI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== PDVUI ===&lt;br /&gt;
&lt;br /&gt;
PDVUI é a responsável pela Interface Gráfica da aplicação. A interface é montada toda com o JavaFX, por isso o método chamado no PDVUI para inicia-lo é o &#039;&#039;launch()&#039;&#039;. Ao iniciar, o JavaFX chamará o método &#039;&#039;start(Stage stage)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
O PDVUI é o responsável por montar as telas e a interface gráfica para o usuário, porém como todo o controle da aplicação é feita através do PDVApp o PDVUI lê os estados do PDVApp para saber que tela montar, que controles exibir, etc. O PDVUI é atualizado através de eventos emitidos pelo PDVApp.&lt;br /&gt;
&lt;br /&gt;
No PDVUI apenas as lógicas de UI são colocadas, como alguma validação de entradas do usuário, formatação e layout de tela, algumas questões de segurança para exibir ou esconder os componentes de tela, etc.&lt;br /&gt;
&lt;br /&gt;
==== PDVScreenInterface ====&lt;br /&gt;
&lt;br /&gt;
A classe PDVUI é a classe de controle geral da interface. Mas a cada estado do PDVState, a tela montada é &amp;quot;sub-controlada&amp;quot; pelas implementações de PDVScreenInterface. Em outras palavras, os únicos componentes que a PDVUI tem como filhas são as implementações dessa interface.&lt;br /&gt;
&lt;br /&gt;
Essas implementações montam uma tela para cada fase do sistema. Por exemplo, ao iniciar a aplicação é utilizada a &amp;quot;StartScreen&amp;quot;, que monta a tela para exibir as informações de inicialização e instalação, além da tela de Log-In. Após o login, o usuário é direcionado para a tela administrativa, montado pela &amp;quot;AdminScreen&amp;quot;. Caso o usuário entre no modo de vendas, toda a tela de venda ao consumidor (responsável por exibir as fotos de produtos ao fundo) é gerenciada pela &amp;quot;SaleScreen&amp;quot; e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Em geral, a PVDUI troca essa &amp;quot;Screen&amp;quot; para estado do PDVState. Dentro de cada estado do PDVState, seus substados são verificados e controlados por cada Screen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== BISPDVFrame ====&lt;br /&gt;
&lt;br /&gt;
Além das Screens que montam a &amp;quot;tela&amp;quot; da aplicação em cada estado, há as janelas chamadas de &amp;quot;Frames&amp;quot;. Esses frames são janelas modais que são colocadas por cima da Screen para indagar o usuário para realizar alguma função.&lt;br /&gt;
&lt;br /&gt;
Exemplos de Frames são as telas de configurações de Servidor ou do Sistema de Emissão do Cupom Fiscal, que aparecem por cima da AdminScreen. Ou a tela de identificação do cliente (CPF/Nota Paulista), que aparece por cima da SaleScreen ao começar uma nova venda.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PDVApp ==&lt;br /&gt;
&lt;br /&gt;
Esta classe Singleton é responsável pela inteligência da aplicação. Através desta classe são realizadas todas as as ações de vendas, configurações, validações, segurança etc. Assim como uma camada &amp;quot;CRUD&amp;quot;, esta classe faz a ligação entre as partes do sistema (CFSystem, Impressoras, TEF, Banco de Dados, etc.) e a interface do usuário (PDVUI).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Qualquer comando que o PDVUI receba do usuário, deve ser passado e tratado dentro do PDVApp, sincronizado se for o caso. O PDVApp processa e valida o comando.&lt;br /&gt;
&lt;br /&gt;
Abaixo o mapa completo dos estados e &amp;quot;sub-estados&amp;quot; que o PDVApp pode assumir:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVFullStateMap.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== PDVState ===&lt;br /&gt;
&lt;br /&gt;
O PDVApp pode ser considerado uma máquina de estados se analisar os passos que ele segue, e que ele guia o usuário. O controle do passo em que o PDVApp está é feito através do atributo PDVState dentro do próprio PDVApp.&lt;br /&gt;
&lt;br /&gt;
Assim que aplicação é iniciada, este estado é inicializado com o valor &amp;quot;START&amp;quot;, que implica que aplicação está iniciando. Em seguida ela seguirá o fluxo conforme a imagem abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVPDVState.png|center]]&lt;br /&gt;
&lt;br /&gt;
==== PDVStateSales ====&lt;br /&gt;
&lt;br /&gt;
Estes estatus servem como sub-status quando o PDVState está em SALES. Estes estados tem a função de definir em que passo da venda o PDVApp está no momento.&lt;br /&gt;
&lt;br /&gt;
Quando o PDVState entrar no estado &amp;quot;SALES&amp;quot;, o PDVStateSales deve iniciar no valor &amp;quot;NONE&amp;quot;. Assim como para que o PDVState possa sair do estado &amp;quot;SALES&amp;quot;, é obrigatório que o PDVStateSales tenha o valor &amp;quot;NONE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{nota|Recuperação de Desligamento|Em caso de recuperação de desligamento incorreto, o sistema pode entrar no modo PDVState &amp;quot;SALES&amp;quot; e o PDVStateSales já ter um valor carregado diferente. Que tenha sido persistido e recuperado junto com o CheckoutDat}}&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVPDVStateSales.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;NONE&#039;&#039;&#039; - Este estado indica que embora o PDVApp esteja no estado de venda, no momento não há nenhuma venda ocorrendo. Toda vez que o PDVState entrar em &#039;&#039;&#039;Selling&#039;&#039;&#039;, o PDVStateSales inicia neste estado. Assim como, para que o PDVState saia do estado &#039;&#039;&#039;Selling&#039;&#039;&#039;, é necessário que o PDVStateSales já tenha retornado para o NONE.&lt;br /&gt;
*: Apenas no caso de recuperação de desligamento incorreto o sistema o PDVState pode entrar em Selling, e já encontrar o PDVStateSale em um estado diferente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_SELLING&#039;&#039;&#039; - Este estado indica que há uma venda ocorrendo neste momento, e que a venda está efetivamente no estado de &amp;quot;venda&amp;quot;. Isto é, indica que a venda está no processo de registrar os itens que estão sendo vendidos ao consumidor.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_PAYMENT&#039;&#039;&#039; - Após o término do estado anterior, quando todos os itens já estão registrados para venda, passamos para o estado de planejamento dos pagamentos. Neste passo indicamos para o sistema como os pagamentos serão realizados. Só conseguimos passar para o passo seguinte depois de informar pagamentos suficientes para quitar o total dos produtos vendidos no passo anterior.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_FINALIZATION&#039;&#039;&#039; - Após informar os produtos e as formas de pagamento, o sistema entra neste passo para finalizar toda a venda. Neste passo o sistema processa toda a informação fornecida nos passos anteriores (itens e pagamentos), e executa tudo o que for necessário. Por exemplo, pagamentos com TEF, Tiquetes e outras operações que envolvam sistemas externos serão notificados e ativados no processamento deste passo.&lt;br /&gt;
*: Ao entrar neste passo o usuário não terá mais autonomia para retornar aos passos anteriores. A única condição que permitirá que o usuário volte ao passo anterior será a ocorrência de algum erro durante o processamento E QUE permita esse retrocesso ao passo anterior.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_SHOW&#039;&#039;&#039; - Ao terminar o processamento de finalização da venda, o sistema para neste passo. Neste passo o cupom e as informações continuam carregadas no PDVApp mas já estão todas processadas, salvas e finalizadas. Este passo tem apenas a finalidade de permitir que informações sejam exibidas ao usuário pelo UI. Assim que o usuário as confirmar, o sistema descarrega das variáveis esta venda e volta para o passo &#039;&#039;&#039;NONE&#039;&#039;&#039;, preparando-se para outra venda ou outra operação.&lt;br /&gt;
&lt;br /&gt;
=== PDVApp Listeners ===&lt;br /&gt;
&lt;br /&gt;
==== PDVSaleEventListener ====&lt;br /&gt;
&lt;br /&gt;
Este listener oferece notificações dos eventos relacionados a operação de venda ao consumidor. Como por exemplo, &amp;quot;Nova venda iniciada&amp;quot; (OPENCUPOM), &amp;quot;Última Venda Cancelada&amp;quot; (CALCELLASTCFX), &amp;quot;Venda atual cancelada&amp;quot; (CANCELHALFCFX), &amp;quot;Item Vendido/Registrado&amp;quot; (ITEMSOLD), e assim por diante....&lt;br /&gt;
&lt;br /&gt;
==== PDVStateChangeListener ====&lt;br /&gt;
&lt;br /&gt;
Este listener é acionado a cada alteração no valor do PDVState.&lt;br /&gt;
&lt;br /&gt;
== StartCheck ==&lt;br /&gt;
&lt;br /&gt;
StartCheck é a rotina de inicialização que o PDVApp executa logo após a aplicação ser iniciada, antes que o usuário possa realizar qualquer interação com a aplicação. A rotina do StartCheck segue os passos conforme o Fluxograma abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVStartCheck.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INITING&#039;&#039;&#039; - é apenas o primeiro estado, o estado inicial de quando a aplicação é carregada. Não há nenhuma execução neste estado, apenas é passado para o próximo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039; - Este passo é responsável por verificar o banco de dados local. Verifica sua existência e tentativa de conexão. Caso ele não exista, é criado. Caso não seja possível conectar, lança erro avisando o usuário que provavelmente há outra instância da aplicação rodando.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039; - Complementar a tarefa anterior, neste passo o sistema verifica a versão do banco de dados atual. Caso a aplicação tenha sido atualizada este passo executará os comandos necessários para atualizar o banco antes que o resto da aplicação tente acessa-lo. Caso a atualização tenha algum problema a aplicação é encerrada para evitar que o uso dos dados de forma incorreta danifiquem os dados.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039; - Este passo é essencial para a configuração da aplicação. Antes que o usuário possa utilizar a aplicação é necessário que alguma configurações sejam definidas, como por exemplo endereço do servidor, e periféricos pertinentes ao caixa. Caso a verificação perceba que alguma configuração inicial é necessária o StartCheck será interrompido e o sistema entrará no estado &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;. &lt;br /&gt;
*: Ao entrar neste estado o PDVUI detecta e exibirá o Wizard de configuração para o usuário. Uma vez que o Wizard seja finalizado ele envia ao PDVApp o comando para tentar o &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039; novamente. E em caso de sucesso, seguirá para o próximo passo.&lt;br /&gt;
*: Note que a maior parte das configurações, principalmente as que são iguais para todos os caixas, é definida pelo servidor e sincronizada para todos os caixas. Não há como altera-las diretamente na aplicação.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039; - Neste passo não há processamento, é apenas um passo indicativo de que a instalação está OK e que pode continuar. Um estado &amp;quot;contrário&amp;quot; ao &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;, fazendo que o StartCheck continue sua rotina.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039; - Durante a primeira inicialização/instalação da aplicação ela se registrará no servidor recebendo um ID único para identificação deste terminal deste ponto em diante. Servindo para rastrear tudo o que acontece em cada caixa/terminal de atendimento.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OK&#039;&#039;&#039; - Este é o passo final, que indica para as outras rotinas de que o StartCheck finalizou com sucesso é que o PDVApp está pronto para seguir para o próximo passo.&lt;br /&gt;
&lt;br /&gt;
== CFSystem ==&lt;br /&gt;
&lt;br /&gt;
O CFSystem (Sistema de Cupom Fiscal) é o nome dado para o encapsulamento dos diferentes sistemas de emissão de cupom fiscal - SAT, ECF, NFCe, etc. - suportados atualmente ou que venham a existir no futuro. Separando o controle da emissão do cupom fiscal das rotinas do sistema permite que o mesmo app seja reaproveitado para todas as tecnologias existes com pouca ou nenhuma adaptação.&lt;br /&gt;
&lt;br /&gt;
Esse encapsulamento funciona porque embora independente de como a tecnologia da emissão funcione a rotina de venda é sempre a mesma de forma geral: &amp;quot;Inicia a Venda - Registra Produtos - Executa Descontos e Totalizações - Recebe Pagamentos - Finaliza Venda&amp;quot;. A cada passo da venda o PDVApp chamará os métodos da interface do CFSystem para notificar os acontecimentos da venda. Devendo o CFSystem traduzir e organizar o funcionamento para cada tecnologia.&lt;br /&gt;
&lt;br /&gt;
O CFSystem é uma interface que permite as implementações das distintas tecnologias. Assim, cada implementação do CFSystem representa um equipamento e modelo de emissão diferentes. Por exemplo, a implementação para suporte do ECF Daruma é uma classe &amp;quot;CFSystemECFDaruma&amp;quot; que implementa a CFSystem.&lt;br /&gt;
&lt;br /&gt;
O CFSystem também apresenta os métodos para impressão de relatórios gerenciais e outros documentos não fiscais.&lt;br /&gt;
&lt;br /&gt;
=== CFSystemFactory ===&lt;br /&gt;
&lt;br /&gt;
Esta classe permite que a implementação correta do CFSystem seja retornada de acordo com os parâmetros de configuração passados. Seguindo o pattern &amp;quot;Factory&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Cupom Fiscal / PDVCupomVO ==&lt;br /&gt;
&lt;br /&gt;
Independente do sistema de emissão do cupom fiscal, o cupom fiscal é representado no sistema pelo PDVCupomVO. Para cada tipo de cupom fiscal (emitido por sistemas diferentes) o objeto apresentará um conjunto de atributos obrigatórios.&lt;br /&gt;
&lt;br /&gt;
=== Ciclo de Vida do Cupom Fiscal ===&lt;br /&gt;
&lt;br /&gt;
O cupom fiscal segue um ciclo de vida básico representado pela enumeration PDVCUPOMSTATUS, conforme o diagrama abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVCupomStatus.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados Adicionais|Alguns sistemas de emissão, como o NFCe, apresentam mais estados por conta do controle de transmissão e emissão. Esses estados adicionais serão tratados no capítulo próprio do sistema. Vale a pena verifica se esses estados devem continuar utilizando a mesma variável ou se deve ter um conjunto de estados a parte dentro do VO, para não interferir no funcionamento do PDVApp, uma vez que o sistema de emissão é abstraído pela interface CFSystem.}}&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1683</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1683"/>
		<updated>2025-11-25T18:50:07Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* DocFiscalVO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
== Ciclo de Vida Documento Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1682</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1682"/>
		<updated>2025-11-25T18:49:41Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Requisitos e Implementação */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DocFiscalVO =&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscalVO&amp;lt;/code&amp;gt; - e sua estrutura &amp;lt;code&amp;gt;DocFiscal*VO&amp;lt;/code&amp;gt; - é utilizada para representa um documento fiscal qualquer dentro do sistema. Seja uma NFe, NFCe, CTe, etc..&amp;lt;br&amp;gt;&amp;lt;Br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;code&amp;gt;DocFiscaoVO&amp;lt;/code&amp;gt; apresenta uma enumeration (&amp;lt;code&amp;gt;DocFiscalStatus&amp;lt;/code&amp;gt;)para definir seu estado, são eles:&lt;br /&gt;
* &#039;&#039;&#039;SELLING&#039;&#039;&#039; - Indica que o documento está em processo de venda, registro dos itens, rascunho. Esse status é utilizado, por exemplo, nos terminais quando a venda ainda está sendo montada.&lt;br /&gt;
* &#039;&#039;&#039;STORED&#039;&#039;&#039; - Indica que o conteúdo do documento fiscal iniciado (SELLING) foi desfeita porque a venda foi guardada em um token. Uma venda que foi guardada depois será contabilizada como cancelada ou finalizada em algum PDV. No entanto neste momento contabilizamos apenas que a venda foi &#039;guardada&#039; para efeitos de controle da emrpesa.&lt;br /&gt;
* &#039;&#039;&#039;SOLD&#039;&#039;&#039; - Indica que a venda foi realizada e que o documento fiscal foi emitido com êxito. &lt;br /&gt;
* &#039;&#039;&#039; CANCELLING&#039;&#039;&#039; - Estado que indica que o documento está em processo de cancelamento, porém ainda não foi completamente cancelado. O processo de cancelamento pode exigir uma coleção de estados próprios para o processo de cancelamento do documento, por exemplo: como o estorno/devolução de pagamentos em cartão, solicitação de cancelamento na SEFAZ, entre outros.&lt;br /&gt;
* &#039;&#039;&#039;CANCELED&#039;&#039;&#039; - Indica que a que a venda foi cancelada! Tendo ou não cupom já emitido. A difereça entre ter o documento já emitido ou não pode ser avaliada, por exemplo, pela presença dos XMLs ou de número/serie atribuídos ao objeto.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZVALIDATING&#039;&#039;&#039; - Informa que a venda e pagamentos foram finalizados, e que o cupom foi enviado para a SEFAZ e estamos agora aguardando sua autorização ou negação.&lt;br /&gt;
* &#039;&#039;&#039;SEFAZPROBLEM&#039;&#039;&#039; - Informa que a venda foi enviada para a SEFAZ mas foi rejeitada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; - Significa que o cupom terminou em erro e por algum motivo o sistema não conseguiu recuperar ou obter informações sobre essa venda. Em geral esse erro indica que nem a comunicação com a SEFAZ foi realizada.&lt;br /&gt;
* &#039;&#039;&#039;ERROR_SYNC&#039;&#039;&#039; - Finalizado com erro e falta de sincronia. Erro em que o sistema não tem certeza no que ocorreu com o DF se foi registrado ou não. Precisará de avaliação e correção Manual.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O ciclo de vida do documento fiscal pode ser visualidado pela imagem a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:DocFiscal_Cicle.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados de Erros|Os estados de erros não foram representados abaixo pois eles podem ocorrer a partir de qualquer um dos estados.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=Arquivo:DocFiscal_Cicle.png&amp;diff=1681</id>
		<title>Arquivo:DocFiscal Cicle.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=Arquivo:DocFiscal_Cicle.png&amp;diff=1681"/>
		<updated>2025-11-25T18:49:17Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: Rodrigogml carregada uma nova versão de Arquivo:DocFiscal Cicle.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=Arquivo:DocFiscal_Cicle.png&amp;diff=1680</id>
		<title>Arquivo:DocFiscal Cicle.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=Arquivo:DocFiscal_Cicle.png&amp;diff=1680"/>
		<updated>2025-11-25T18:47:43Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISPDV&amp;diff=1679</id>
		<title>BISPDV</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISPDV&amp;diff=1679"/>
		<updated>2025-11-25T18:46:24Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* NFC-e */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O BISPDV é a aplicação utilizada na frente de caixa para realização da venda ao consumidor e de outra funções pertinentes à venda e atendimento do cliente da loja.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Pendências, Informações e Guia sobre a implementação =&lt;br /&gt;
&lt;br /&gt;
* O projeto anterior (bis2.pdv) está sendo descontinuado por ainda ter código com suporte a ECF e SAT, que estão em caindo em desuso. Para rever e simplificar o código um novo projeto (bis.pdv) foi criado e o código está sendo revisado e repassado para o novo projeto. Uma vez concluído o projeto bis2.pdv será descontinuado.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alterações em andamento:&#039;&#039;&#039;&lt;br /&gt;
# Para agilidade, foi definido que não utilizaremos o RFWDAO, mas manter a arquitetura de DAO original.&lt;br /&gt;
# Removido código relacionados ao ECF e ao SAT, este novo projeto emitirá cupons apenas utilizando o NFCe, utilizando o código do módulo RFW.SEFAZ.&lt;br /&gt;
# O Bundle foi rebatizado para bispdvbundle.properties, e passou a utilizar as chaves BISPDV_NNNNNN. Todas as chaves antigas foram copiadas para o arquivo e ao fechamento da versão devem ser revisadas, e as sobreviventes renomeadas.&lt;br /&gt;
&lt;br /&gt;
= Inicialização do Sistema =&lt;br /&gt;
&lt;br /&gt;
[[Imagem:inicialização_pdvapp.png|center|Inicialização do Sistema]]&lt;br /&gt;
&lt;br /&gt;
A inicialização do aplicativo segue as seguintes regras:&lt;br /&gt;
&lt;br /&gt;
== PDVStarter ==&lt;br /&gt;
A aplicação deve ser inicializada sempre por esta classe que contém o método &#039;&#039;main()&#039;&#039;;&lt;br /&gt;
: Esta classe não faz absolutamente nada além de passar a chamada, incluindo os argumentos de linha de comando para a &#039;&#039;&#039;PDVUpdater&#039;&#039;&#039;. Sua existência tem a finalidade de permitir a incorporação de plugins, siffers, debugger e outras ferramentas na aplicação. Para isso, basta que a ferramenta implemente uma &#039;sósia&#039; desta classe (mesmo nome e package), e que sua bibliotexa (.jar) seja carregada no classpath antes dos .jars da própria aplicação. Após realizar o que for necessário a ferramenta deve repassar a chamada para &#039;&#039;&#039;PDVUpdater&#039;&#039;&#039; da mesma forma, para que a aplicação se inicie em seu fluxo normal.&lt;br /&gt;
&lt;br /&gt;
== PDVUpdater ==&lt;br /&gt;
&lt;br /&gt;
Esta classe que concentra as tarefas de inicialização da aplicação recebe os seguintes parâmetros:&lt;br /&gt;
* &#039;&#039;&#039;-help&#039;&#039;&#039; - Exibe este menu de opções.&lt;br /&gt;
* &#039;&#039;&#039;-testDarumaFW&#039;&#039;&#039; - Não inicializa a aplicacao. Tenta apenas inicializar as bibliotecas da DarumaDramework, verificando se as DLLs estão OK. Não faz comunicação com a impressora.&lt;br /&gt;
* &#039;&#039;&#039;-watcher&#039;&#039;&#039; - Habilita uma thread que imprime o valor de algumas variáveis do sistema a cada segundo no console do sistema.&lt;br /&gt;
* &#039;&#039;&#039;-autoSaleTest&#039;&#039;&#039; - Carrega um arquivo de vendas automáticas. Esse arquivo deve conter o que deve ser vendido, e as vendas serão feitas automaticamente no horário programado.&lt;br /&gt;
* &#039;&#039;&#039;-noUI&#039;&#039;&#039; - Não inicializa a UI do PDVApp. Útil quando estamos utilizando o -saleFile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Valida se é a única instância tentando bloquear o arquivo &#039;&#039;&#039;.\\instance.lock&#039;&#039;&#039; no diretório da aplicação.&lt;br /&gt;
&lt;br /&gt;
== PDVApp ==&lt;br /&gt;
&lt;br /&gt;
O &#039;&#039;&#039;PDVApp&#039;&#039;&#039; é o coração da aplicação. Funciona com uma série de máquinas de estado (workflows) que definem a lógica da operação da aplicação.&lt;br /&gt;
&lt;br /&gt;
= Workflows do Sistema =&lt;br /&gt;
== Principal: &#039;&#039;&#039;PDVState&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:workflow_pdvstate.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esse é o WORKFLOW geral da aplicação, é definida nos valores da enum &#039;&#039;&#039;PDVState&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;START&#039;&#039;&#039; - Valor inicial, utilizado somente na inicialização da aplicação.&lt;br /&gt;
*: Neste passo é iniciado o workflow &#039;&#039;&#039;StartCheckStatus&#039;&#039;&#039;, enquanto esse workflow secundário é executado, o PDVState é passado para o estado &#039;&#039;&#039;STARTCHECK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STARTCHECK&#039;&#039;&#039; - Estado enquanto a checagem inicial do sistema ocorre;&lt;br /&gt;
*: Se a checagem inicial finalizar com sucesso vai para o estado &#039;&#039;&#039;WAITINGLOGIN&#039;&#039;&#039;, em caso de erro vai para o &#039;&#039;&#039;STARTCHECK_FAIL&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STARTCHECK_FAIL&#039;&#039;&#039; - indicador de que o processo de checagem inicial terminou com erro.&lt;br /&gt;
*: Não há saída desse estado, a não ser reiniciar ou refazer a instalação do PDVApp.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WAITINGLOGIN&#039;&#039;&#039; - Sinaliza que o sistema está aguradando o login.&lt;br /&gt;
*: Fica nesse estado até que o PDVUI interaja com o usuário para executar o login.&lt;br /&gt;
*: Uma vez feita o login pelo método doLogin(), se realizado com sucesso para para o estado &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039; - Estado em que o sistema permite ser configurado, e permite acesso a outras funções administravias do checkout (como abrir e fechar o checkout).&lt;br /&gt;
*: Este já um estado de uso do sistema, deste estado o usuário pode entrar no modo de venda &#039;&#039;&#039;SALES&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALES&#039;&#039;&#039; - Estado em que o sistema entra no modo de vendas, permite a abertura de venda, venda de produtos, recebimento, etc.&lt;br /&gt;
*: Sempre que não estiver com uma venda aberta, o usuário pode voltar para o estado &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Uma vez nos estrados &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039; ou &#039;&#039;&#039;SALES&#039;&#039;&#039; o usuário não pode mais voltar para os outros estados até que a aplicação seja finalizada.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inicialização: &#039;&#039;&#039;StartCheckStatus&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:workflow_StartCheckStatus.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esse é o WORKFLOW que cuida da checagem e inicialização inicial do sistema. Seus funcionamento é assim:&lt;br /&gt;
* &#039;&#039;&#039;INITING&#039;&#039;&#039; - Estado inicial de começo das checkagens;&lt;br /&gt;
*: Neste estágio o sistema começa a ser inicializado, como carregamento dos bundles.&lt;br /&gt;
*: Tudo inicializado com sucesso, passa para o estado &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039; - Estado para verificação do banco de dados.&lt;br /&gt;
*: Verifica se o banco de dados existe, se não existir o cria;&lt;br /&gt;
*: Passa para o estado &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039; - Verifica se o banco de dados está na versão correta e faz as alterações/atualizações necessárias;&lt;br /&gt;
*: Quando atualizado passa para o &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;- Valida se a instalação do PDV está ok (empresa configurada, dados sincronizados, etc.).&lt;br /&gt;
*: Se a instalação estiver OK vai para o estado &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039;, caso contrário para &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;&lt;br /&gt;
*: Nesse estado o PDVApp não faz nada, mas serve de sinalização para o &#039;&#039;&#039;PDVUI&#039;&#039;&#039; que a instalação precisa ser realizada, e a tela é exibida. Quando a tela de instalação é finalizada, o PDVUI sinaliza para o &#039;&#039;&#039;PDVAapp&#039;&#039;&#039; que volta para o estado de &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039; - Estado sem operação, apenas sinalizando que a Instalação está completa.&lt;br /&gt;
*: Passa automaticamente para o estado &#039;&#039;&#039;START_TERMINALAPP&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;START_TERMINALAPP&#039;&#039;&#039; - Inicializa o Terminal Client (Reponsável por realizar a comunicação com o servidor).&lt;br /&gt;
*: Após inicializá-lo passa automaticamente para o estado &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039; - Valida se o ID atual configurado na estação PDV está válido e cadastrado corretamente no servidor.&lt;br /&gt;
*: Se o cadastro estiver OK passa para &#039;&#039;&#039;LOAD_CHECKOUT_DATA&#039;&#039;&#039;, caso contrário trava a aplicação em erro para garantir que seja reinstalada.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LOAD_CHECKOUT_DATA&#039;&#039;&#039; - Carrega as informações do CheckoutData, se existir, para continuar com a aplicação a partir do ponto em que estava. Se não encontrar, procura manualmente se há algum caixa em aberto no banco de dados e &amp;quot;cria&amp;quot; o CheckoutData para continuar o checkout aberto (e não perder sessões de checkouts a cada vez que se perde o CheckoutData). &#039;&#039;&#039;Em adicional&#039;&#039;&#039;, (re)carrega o CFSystem para que o sistema esteja pronto para emitir cupons fiscais.&lt;br /&gt;
*: Passa para o &#039;&#039;&#039;START_SYNCDATA&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;START_SYNCDATA&#039;&#039;&#039; - Inicializa a Thread responsável por sincronizar os dados com/do servidor.&lt;br /&gt;
*: Passa para o &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OK&#039;&#039;&#039; - Estado em que o WORKFLOW finalizou com sucesso. Utilizado para sinalizar outras partes do sistema que a inicialização terminou com sucesso e o sistema está pronto para ser utilizado.&lt;br /&gt;
*: Sinaliza o PDVApp de que este workflou finalizou através do método &#039;&#039;&#039;app.freeStartCheck()&#039;&#039;&#039;, que dá sequência no workflow &#039;&#039;&#039;PDVState&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== PDVUI ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== NFC-e ==&lt;br /&gt;
&lt;br /&gt;
A emissão de NFCe é realizada pelo mesmo layout de WebService da NFe. O BISPDV utilizará o módulo [https://wiki.rodrigogml.eng.br/index.php/P%C3%A1gina_principal#RFW_-_Sefaz RFW.SEFAZ]. Toda a documentação técnica estará no site do módulo. &#039;&#039;&#039;Concentrar aqui apenas as informações relacionadas ao BISPDV e à configuração/utilização do módulo&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ciclo de Vida do Documento Fiscal no PDV ===&lt;br /&gt;
&lt;br /&gt;
O BISPDV utiliza o DocFiscalVO para controlar o ciclo de venda que está ocorrendo, e faz isso através do status definido no objeto.&lt;br /&gt;
&lt;br /&gt;
= Cadastros do Sistema =&lt;br /&gt;
&lt;br /&gt;
== Items ==&lt;br /&gt;
&lt;br /&gt;
A aplicação BISPDV não suporta cadastro de itens diretamente no aplicativo. A base de itens para venda é sincronizada diretamente do servidor para a aplicação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para a aplicação é enviada apenas apenas os campos do cadastro de itens necessários para realizar a venda do produto, um objeto &amp;lt;code&amp;gt;PDVItemVO&amp;lt;/code&amp;gt; é montado com as informações da estrutura de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A conversão é feita a partir do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; e não de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;. Isso porque cada código de item pode ser vendido por preços diferentes, quantidades diferentes, unidades de medidas diferentes entre outros. Para o BISPDV cada código funciona como um produto cadastro diferente que pode ser vendido. Já no servidor, a venda de cada código é tratada como uma venda do mesmo item (respeitando a quantidade, preços, etc.). A conversão/envio dos códigos para venda no PDV é realizada da seguinte forma:&lt;br /&gt;
* Apenas produtos que tenham a finalidade marcada como &#039;&#039;&#039;Revenda&#039;&#039;&#039; ou &#039;&#039;&#039;Produto Acabado&#039;&#039;&#039; tem seus códigos sincronizados no PDV.&lt;br /&gt;
* O &amp;lt;code&amp;gt;ID&amp;lt;/code&amp;gt; aplicado no &amp;lt;code&amp;gt;PDVItemVO&amp;lt;/code&amp;gt; é o mesmo do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;, utilizado como referência para sincronizar os novos códigos ou alterações do servidor.&lt;br /&gt;
* O &amp;lt;code&amp;gt;IDItem&amp;lt;/code&amp;gt; é atribuído em outro atibuto, e é utilizado pelo servidor para associar o item do cupom (vendas) ao ItemVO correto. Essa medida visa não perder o relacionamento entre os objetos de Item de Documentos fiscais com o cadastro de item. Isso porque o objeto ItemCodeVO pode ser excluído do sistema, já o ItemVO é só marcado como excluído no sistema e mantido para efeitos de histório, ou seja, ItemCodeVO é um objeto volátil e não pode ser utilizado para referência ou vinculação com objetos de registro ou histórico.&lt;br /&gt;
* O servidor passar no atributo &amp;lt;code&amp;gt;startDate&amp;lt;/code&amp;gt; a última data de alteração do &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; (ou seus subojetos como &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;ItemPrice&amp;lt;/code&amp;gt;), para que o PDV saiba qual foi a última alteração dos objetos na sua base e, consultando a maior dessas datas entre todos os objetos, consegue utilizar essa data para requisitar os objetos alterados a partir dessadata (ao invés da data da última alteração, evitando problemas de sincronia de datas e deixar algum item dessincronizados).&lt;br /&gt;
* Como a venda ocorre com base nas definições do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;, mas o sistema precisa vincular a venda com o &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;, os campos que definem a &amp;quot;transformação&amp;quot; entre &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; e &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; são atribuídas no objeto nos seguintes atributos:&lt;br /&gt;
:* &#039;&#039;&#039;originalItemID&#039;&#039;&#039; - ID do &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; para associação com o item original.&lt;br /&gt;
:* &#039;&#039;&#039;originalDivider&#039;&#039;&#039; - Divisor de conversão&lt;br /&gt;
&lt;br /&gt;
= DOCUMENTAÇÃO A SER REVISADA! =&lt;br /&gt;
O Conteúdo a seguir precisa ser revisado desde a &amp;quot;reimplementação&amp;quot; do PDVApp (BIS2.PDV - Projeto com código do ECF e SAT) para o novo (BIS.PDV - Projeto dedicado apenas ao código do NFCe)&lt;br /&gt;
&lt;br /&gt;
== PayGo ==&lt;br /&gt;
&lt;br /&gt;
O PayGo é o sistema integrado de TEF do sistma.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observações Importantes&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;Site de suporte e manual do desenvolvedor:&#039;&#039;&#039; https://paygodev.readme.io/docs/vis%C3%A3o-geral&lt;br /&gt;
* &#039;&#039;&#039;Download do Kit de Integração:&#039;&#039;&#039; https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2&lt;br /&gt;
* O BISPDV utiliza a versão de troca de arquivos txt, que é a continuação da versão do da NTK na qual o sistema foi homologado inicialmente.&lt;br /&gt;
&lt;br /&gt;
=== Instalação Ambiente de Testes/Homologação ===&lt;br /&gt;
&lt;br /&gt;
Para instalação do ambiente de testes/homologação seguir as instruções do site: https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2.&lt;br /&gt;
Em 28/01/2025 solicitei cadastro para uma nova homologação e ativação do sistema e recebi um e-mail com o seguinte conteúdo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Giovanna de Mello Doroteio comentou\: Prezado(a), Rodrigo.&lt;br /&gt;
Agradecemos por escolher nossos serviços. Para garantir uma experiência tranquila e bem-sucedida durante a integração, estamos fornecendo os dados de instalação e informações sobre os adquirentes disponíveis em nosso servidor de testes.&lt;br /&gt;
&lt;br /&gt;
Dados de Instalação:&lt;br /&gt;
&lt;br /&gt;
Id de Instalação: 344384&lt;br /&gt;
Senha: A70C47D1&lt;br /&gt;
Adquirentes disponíveis em nosso servidor de testes:&lt;br /&gt;
&lt;br /&gt;
Adquirente DEMO:&lt;br /&gt;
Função: Simula uma sub-adquirente.&lt;br /&gt;
&lt;br /&gt;
Adquirente REDE:&lt;br /&gt;
Função: Simula uma adquirente.&lt;br /&gt;
Restrição no Ambiente de Sandbox: Aceita apenas valores inteiros.&lt;br /&gt;
Importante: Qualquer valor com centavos resultará em uma transação negada.&lt;br /&gt;
&lt;br /&gt;
Adquirente PIX C6 BANK:&lt;br /&gt;
Função: Simula operações com Pix e carteira digital.&lt;br /&gt;
Processo: Após uma transação, o QRCode para pagamento será gerado.&lt;br /&gt;
Aprovação Automática: A transação será aprovada automaticamente alguns segundos após a geração do QRCode.&lt;br /&gt;
&lt;br /&gt;
Para acessar a documentação completa de integração, por favor, visite: Sobre esse documento&lt;br /&gt;
Segue o kit de integração e o passo a passo para a habilitação dos logs, respectivamente: [&lt;br /&gt;
Kit de integração|https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2][&lt;br /&gt;
Kit de integração- Habilitação dos Logs.|https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2#aten%C3%A7%C3%A3o]&lt;br /&gt;
ATENÇÃO: É obrigatório habilitar os logs para realizar a homologação.&lt;br /&gt;
&lt;br /&gt;
Se você tiver alguma dúvida, precisar de assistência adicional ou encontrar qualquer problema durante o processo de integração, nossa equipe de suporte estará pronta para ajudar. Não hesite em entrar em contato conosco por meio deste chamado.&lt;br /&gt;
Agradecemos pela sua colaboração e estamos ansiosos para fornecer a melhor experiência possível durante sua fase de testes.&lt;br /&gt;
&lt;br /&gt;
Atenciosamente, SETIS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAT ==&lt;br /&gt;
&lt;br /&gt;
=== Informações ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Site Oficial:&#039;&#039;&#039; https://portal.fazenda.sp.gov.br/servicos/sat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Navegação dos Arquivos do Site&#039;&#039;&#039; (Procure pelas versões mais atualizadas na sessão de download do site oficial)&lt;br /&gt;
* &#039;&#039;&#039;Manual Orientacao SAT&#039;&#039;&#039; - arquivo geral com as orientações sobre como gerar a impressão do cupom, códigos de barras, tamanho, informações necessárias, qrcode, etc.&lt;br /&gt;
* &#039;&#039;&#039;Guia para Geração do QRCode&#039;&#039;&#039; - arquivo com as orientações para gerar o qrcode do cupom fiscal.&lt;br /&gt;
* &#039;&#039;&#039;Especificação de Requisitos do SAT&#039;&#039;&#039; - arquivo com as especificações para o desenvolvedor, como layout XML e outras informações técnicas.&lt;br /&gt;
&lt;br /&gt;
== Arquitetura ==&lt;br /&gt;
&lt;br /&gt;
O aplicativo apresenta a arquitetura dividia conforme o diagrama abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVArquitetura.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== PDVStarter == &lt;br /&gt;
&lt;br /&gt;
O PDVStarter é a classe inicial da aplicação, a classe que contém o método main(). Ela faz apenas algumas verificações mínimas e necessárias para o funcionamento, como definições do ambiente java, e logo seguida inicializa o &#039;&#039;&#039;PDVUI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== PDVUI ===&lt;br /&gt;
&lt;br /&gt;
PDVUI é a responsável pela Interface Gráfica da aplicação. A interface é montada toda com o JavaFX, por isso o método chamado no PDVUI para inicia-lo é o &#039;&#039;launch()&#039;&#039;. Ao iniciar, o JavaFX chamará o método &#039;&#039;start(Stage stage)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
O PDVUI é o responsável por montar as telas e a interface gráfica para o usuário, porém como todo o controle da aplicação é feita através do PDVApp o PDVUI lê os estados do PDVApp para saber que tela montar, que controles exibir, etc. O PDVUI é atualizado através de eventos emitidos pelo PDVApp.&lt;br /&gt;
&lt;br /&gt;
No PDVUI apenas as lógicas de UI são colocadas, como alguma validação de entradas do usuário, formatação e layout de tela, algumas questões de segurança para exibir ou esconder os componentes de tela, etc.&lt;br /&gt;
&lt;br /&gt;
==== PDVScreenInterface ====&lt;br /&gt;
&lt;br /&gt;
A classe PDVUI é a classe de controle geral da interface. Mas a cada estado do PDVState, a tela montada é &amp;quot;sub-controlada&amp;quot; pelas implementações de PDVScreenInterface. Em outras palavras, os únicos componentes que a PDVUI tem como filhas são as implementações dessa interface.&lt;br /&gt;
&lt;br /&gt;
Essas implementações montam uma tela para cada fase do sistema. Por exemplo, ao iniciar a aplicação é utilizada a &amp;quot;StartScreen&amp;quot;, que monta a tela para exibir as informações de inicialização e instalação, além da tela de Log-In. Após o login, o usuário é direcionado para a tela administrativa, montado pela &amp;quot;AdminScreen&amp;quot;. Caso o usuário entre no modo de vendas, toda a tela de venda ao consumidor (responsável por exibir as fotos de produtos ao fundo) é gerenciada pela &amp;quot;SaleScreen&amp;quot; e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Em geral, a PVDUI troca essa &amp;quot;Screen&amp;quot; para estado do PDVState. Dentro de cada estado do PDVState, seus substados são verificados e controlados por cada Screen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== BISPDVFrame ====&lt;br /&gt;
&lt;br /&gt;
Além das Screens que montam a &amp;quot;tela&amp;quot; da aplicação em cada estado, há as janelas chamadas de &amp;quot;Frames&amp;quot;. Esses frames são janelas modais que são colocadas por cima da Screen para indagar o usuário para realizar alguma função.&lt;br /&gt;
&lt;br /&gt;
Exemplos de Frames são as telas de configurações de Servidor ou do Sistema de Emissão do Cupom Fiscal, que aparecem por cima da AdminScreen. Ou a tela de identificação do cliente (CPF/Nota Paulista), que aparece por cima da SaleScreen ao começar uma nova venda.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PDVApp ==&lt;br /&gt;
&lt;br /&gt;
Esta classe Singleton é responsável pela inteligência da aplicação. Através desta classe são realizadas todas as as ações de vendas, configurações, validações, segurança etc. Assim como uma camada &amp;quot;CRUD&amp;quot;, esta classe faz a ligação entre as partes do sistema (CFSystem, Impressoras, TEF, Banco de Dados, etc.) e a interface do usuário (PDVUI).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Qualquer comando que o PDVUI receba do usuário, deve ser passado e tratado dentro do PDVApp, sincronizado se for o caso. O PDVApp processa e valida o comando.&lt;br /&gt;
&lt;br /&gt;
Abaixo o mapa completo dos estados e &amp;quot;sub-estados&amp;quot; que o PDVApp pode assumir:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVFullStateMap.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== PDVState ===&lt;br /&gt;
&lt;br /&gt;
O PDVApp pode ser considerado uma máquina de estados se analisar os passos que ele segue, e que ele guia o usuário. O controle do passo em que o PDVApp está é feito através do atributo PDVState dentro do próprio PDVApp.&lt;br /&gt;
&lt;br /&gt;
Assim que aplicação é iniciada, este estado é inicializado com o valor &amp;quot;START&amp;quot;, que implica que aplicação está iniciando. Em seguida ela seguirá o fluxo conforme a imagem abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVPDVState.png|center]]&lt;br /&gt;
&lt;br /&gt;
==== PDVStateSales ====&lt;br /&gt;
&lt;br /&gt;
Estes estatus servem como sub-status quando o PDVState está em SALES. Estes estados tem a função de definir em que passo da venda o PDVApp está no momento.&lt;br /&gt;
&lt;br /&gt;
Quando o PDVState entrar no estado &amp;quot;SALES&amp;quot;, o PDVStateSales deve iniciar no valor &amp;quot;NONE&amp;quot;. Assim como para que o PDVState possa sair do estado &amp;quot;SALES&amp;quot;, é obrigatório que o PDVStateSales tenha o valor &amp;quot;NONE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{nota|Recuperação de Desligamento|Em caso de recuperação de desligamento incorreto, o sistema pode entrar no modo PDVState &amp;quot;SALES&amp;quot; e o PDVStateSales já ter um valor carregado diferente. Que tenha sido persistido e recuperado junto com o CheckoutDat}}&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVPDVStateSales.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;NONE&#039;&#039;&#039; - Este estado indica que embora o PDVApp esteja no estado de venda, no momento não há nenhuma venda ocorrendo. Toda vez que o PDVState entrar em &#039;&#039;&#039;Selling&#039;&#039;&#039;, o PDVStateSales inicia neste estado. Assim como, para que o PDVState saia do estado &#039;&#039;&#039;Selling&#039;&#039;&#039;, é necessário que o PDVStateSales já tenha retornado para o NONE.&lt;br /&gt;
*: Apenas no caso de recuperação de desligamento incorreto o sistema o PDVState pode entrar em Selling, e já encontrar o PDVStateSale em um estado diferente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_SELLING&#039;&#039;&#039; - Este estado indica que há uma venda ocorrendo neste momento, e que a venda está efetivamente no estado de &amp;quot;venda&amp;quot;. Isto é, indica que a venda está no processo de registrar os itens que estão sendo vendidos ao consumidor.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_PAYMENT&#039;&#039;&#039; - Após o término do estado anterior, quando todos os itens já estão registrados para venda, passamos para o estado de planejamento dos pagamentos. Neste passo indicamos para o sistema como os pagamentos serão realizados. Só conseguimos passar para o passo seguinte depois de informar pagamentos suficientes para quitar o total dos produtos vendidos no passo anterior.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_FINALIZATION&#039;&#039;&#039; - Após informar os produtos e as formas de pagamento, o sistema entra neste passo para finalizar toda a venda. Neste passo o sistema processa toda a informação fornecida nos passos anteriores (itens e pagamentos), e executa tudo o que for necessário. Por exemplo, pagamentos com TEF, Tiquetes e outras operações que envolvam sistemas externos serão notificados e ativados no processamento deste passo.&lt;br /&gt;
*: Ao entrar neste passo o usuário não terá mais autonomia para retornar aos passos anteriores. A única condição que permitirá que o usuário volte ao passo anterior será a ocorrência de algum erro durante o processamento E QUE permita esse retrocesso ao passo anterior.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_SHOW&#039;&#039;&#039; - Ao terminar o processamento de finalização da venda, o sistema para neste passo. Neste passo o cupom e as informações continuam carregadas no PDVApp mas já estão todas processadas, salvas e finalizadas. Este passo tem apenas a finalidade de permitir que informações sejam exibidas ao usuário pelo UI. Assim que o usuário as confirmar, o sistema descarrega das variáveis esta venda e volta para o passo &#039;&#039;&#039;NONE&#039;&#039;&#039;, preparando-se para outra venda ou outra operação.&lt;br /&gt;
&lt;br /&gt;
=== PDVApp Listeners ===&lt;br /&gt;
&lt;br /&gt;
==== PDVSaleEventListener ====&lt;br /&gt;
&lt;br /&gt;
Este listener oferece notificações dos eventos relacionados a operação de venda ao consumidor. Como por exemplo, &amp;quot;Nova venda iniciada&amp;quot; (OPENCUPOM), &amp;quot;Última Venda Cancelada&amp;quot; (CALCELLASTCFX), &amp;quot;Venda atual cancelada&amp;quot; (CANCELHALFCFX), &amp;quot;Item Vendido/Registrado&amp;quot; (ITEMSOLD), e assim por diante....&lt;br /&gt;
&lt;br /&gt;
==== PDVStateChangeListener ====&lt;br /&gt;
&lt;br /&gt;
Este listener é acionado a cada alteração no valor do PDVState.&lt;br /&gt;
&lt;br /&gt;
== StartCheck ==&lt;br /&gt;
&lt;br /&gt;
StartCheck é a rotina de inicialização que o PDVApp executa logo após a aplicação ser iniciada, antes que o usuário possa realizar qualquer interação com a aplicação. A rotina do StartCheck segue os passos conforme o Fluxograma abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVStartCheck.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INITING&#039;&#039;&#039; - é apenas o primeiro estado, o estado inicial de quando a aplicação é carregada. Não há nenhuma execução neste estado, apenas é passado para o próximo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039; - Este passo é responsável por verificar o banco de dados local. Verifica sua existência e tentativa de conexão. Caso ele não exista, é criado. Caso não seja possível conectar, lança erro avisando o usuário que provavelmente há outra instância da aplicação rodando.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039; - Complementar a tarefa anterior, neste passo o sistema verifica a versão do banco de dados atual. Caso a aplicação tenha sido atualizada este passo executará os comandos necessários para atualizar o banco antes que o resto da aplicação tente acessa-lo. Caso a atualização tenha algum problema a aplicação é encerrada para evitar que o uso dos dados de forma incorreta danifiquem os dados.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039; - Este passo é essencial para a configuração da aplicação. Antes que o usuário possa utilizar a aplicação é necessário que alguma configurações sejam definidas, como por exemplo endereço do servidor, e periféricos pertinentes ao caixa. Caso a verificação perceba que alguma configuração inicial é necessária o StartCheck será interrompido e o sistema entrará no estado &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;. &lt;br /&gt;
*: Ao entrar neste estado o PDVUI detecta e exibirá o Wizard de configuração para o usuário. Uma vez que o Wizard seja finalizado ele envia ao PDVApp o comando para tentar o &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039; novamente. E em caso de sucesso, seguirá para o próximo passo.&lt;br /&gt;
*: Note que a maior parte das configurações, principalmente as que são iguais para todos os caixas, é definida pelo servidor e sincronizada para todos os caixas. Não há como altera-las diretamente na aplicação.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039; - Neste passo não há processamento, é apenas um passo indicativo de que a instalação está OK e que pode continuar. Um estado &amp;quot;contrário&amp;quot; ao &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;, fazendo que o StartCheck continue sua rotina.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039; - Durante a primeira inicialização/instalação da aplicação ela se registrará no servidor recebendo um ID único para identificação deste terminal deste ponto em diante. Servindo para rastrear tudo o que acontece em cada caixa/terminal de atendimento.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OK&#039;&#039;&#039; - Este é o passo final, que indica para as outras rotinas de que o StartCheck finalizou com sucesso é que o PDVApp está pronto para seguir para o próximo passo.&lt;br /&gt;
&lt;br /&gt;
== CFSystem ==&lt;br /&gt;
&lt;br /&gt;
O CFSystem (Sistema de Cupom Fiscal) é o nome dado para o encapsulamento dos diferentes sistemas de emissão de cupom fiscal - SAT, ECF, NFCe, etc. - suportados atualmente ou que venham a existir no futuro. Separando o controle da emissão do cupom fiscal das rotinas do sistema permite que o mesmo app seja reaproveitado para todas as tecnologias existes com pouca ou nenhuma adaptação.&lt;br /&gt;
&lt;br /&gt;
Esse encapsulamento funciona porque embora independente de como a tecnologia da emissão funcione a rotina de venda é sempre a mesma de forma geral: &amp;quot;Inicia a Venda - Registra Produtos - Executa Descontos e Totalizações - Recebe Pagamentos - Finaliza Venda&amp;quot;. A cada passo da venda o PDVApp chamará os métodos da interface do CFSystem para notificar os acontecimentos da venda. Devendo o CFSystem traduzir e organizar o funcionamento para cada tecnologia.&lt;br /&gt;
&lt;br /&gt;
O CFSystem é uma interface que permite as implementações das distintas tecnologias. Assim, cada implementação do CFSystem representa um equipamento e modelo de emissão diferentes. Por exemplo, a implementação para suporte do ECF Daruma é uma classe &amp;quot;CFSystemECFDaruma&amp;quot; que implementa a CFSystem.&lt;br /&gt;
&lt;br /&gt;
O CFSystem também apresenta os métodos para impressão de relatórios gerenciais e outros documentos não fiscais.&lt;br /&gt;
&lt;br /&gt;
=== CFSystemFactory ===&lt;br /&gt;
&lt;br /&gt;
Esta classe permite que a implementação correta do CFSystem seja retornada de acordo com os parâmetros de configuração passados. Seguindo o pattern &amp;quot;Factory&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Cupom Fiscal / PDVCupomVO ==&lt;br /&gt;
&lt;br /&gt;
Independente do sistema de emissão do cupom fiscal, o cupom fiscal é representado no sistema pelo PDVCupomVO. Para cada tipo de cupom fiscal (emitido por sistemas diferentes) o objeto apresentará um conjunto de atributos obrigatórios.&lt;br /&gt;
&lt;br /&gt;
=== Ciclo de Vida do Cupom Fiscal ===&lt;br /&gt;
&lt;br /&gt;
O cupom fiscal segue um ciclo de vida básico representado pela enumeration PDVCUPOMSTATUS, conforme o diagrama abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVCupomStatus.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados Adicionais|Alguns sistemas de emissão, como o NFCe, apresentam mais estados por conta do controle de transmissão e emissão. Esses estados adicionais serão tratados no capítulo próprio do sistema. Vale a pena verifica se esses estados devem continuar utilizando a mesma variável ou se deve ter um conjunto de estados a parte dentro do VO, para não interferir no funcionamento do PDVApp, uma vez que o sistema de emissão é abstraído pela interface CFSystem.}}&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1678</id>
		<title>BISModulesSocket</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1678"/>
		<updated>2025-11-24T21:50:45Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* sendDocFiscalToEmission */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
O BISModulesSocket é como uma pequena biblioteca que facilita a comunicação entre terminais (aplicações externas ao servidor de aplicações) e o BISCore e BISModules. Desenvolvido apenas com Java e Sockets (implementado em cima do [[BISSocket]]), pode ser usado para realizar chamadas e comunicar com o sistema sem a necessidade de utilizar bibliotecas RMI/JNDI ou outras mais complexas de integração.&lt;br /&gt;
&lt;br /&gt;
== Funcionamento ==&lt;br /&gt;
O lado servidor será &amp;quot;levantado&amp;quot; junto com o plugin. A partir deste momento o servidor já estará escutando a porta e aguardado conexão dos terminais.&lt;br /&gt;
&lt;br /&gt;
A utilização é simples:&lt;br /&gt;
# Cria uma instância do BISModulesSocketClient, passe no construtor o host e a porta do servidor BISERP para que o cliente conecte-se;&lt;br /&gt;
# Chama os métodos passando os atributos desejados e aguarde pela resposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo entre BISModulesSocketClient e BISModulesSocketServer ==&lt;br /&gt;
&lt;br /&gt;
Abaixo estão listados os comandos utilizados atualmente pelas duas classes para abstrair a comunicação. Para utilizar as classes não é necessário se familiarizar com o protocolo, apenas para manutenção e implementação das mesmas.&lt;br /&gt;
&lt;br /&gt;
{{stop|Chamada Pela Fachada|Quando o BISModulesSocketServer faz o repasse da chamada dos métodos na parte do Core (do BIS ou dos Plugins), deve sempre chamar a fachada de acesso. Para que o servidor de aplicações instancie as transações e o Interceptor da fachada possa fazer seu trabalho.&lt;br /&gt;
Uma chamada direta ao CRUD pode funcionar em alguns casos, mas com certeza desabilitará o [[BISLogger]], as transações dos EJBs e outros serviços oferecidos pelo servidor de aplicação.}}&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Serviço do BISModulesSocket ===&lt;br /&gt;
&lt;br /&gt;
==== serverTime ====&lt;br /&gt;
Recupera o horário do Servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Número qualquer para identificar a requisição. O mesmo valor é retornado na resposta.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_TIME&lt;br /&gt;
|&amp;lt;Long&amp;gt; System.currentTimeMillis() do servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Exatamente mesmo valor recebido na requisição, mesmo que null.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISCore ===&lt;br /&gt;
&lt;br /&gt;
==== getProperty ====&lt;br /&gt;
Busca no servidor uma propriedade do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETPROPERTY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_PROPERTY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Propriedade a ser recuperada no servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_VALUE&lt;br /&gt;
|String - Valor da propriedade do sistema, null caso a propriedade tenha o valor nulo ou não tenha sido encontrado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETPROPERTY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== hasPermissionKey ====&lt;br /&gt;
Envia para o servidor a autenticação de um usuário e uma chave de segurança para saber se o usuário tem acesso para a chave passada. Note que, seguindo a funcionalidade do Kernel, o método lança exception caso a autenticação falhe, caso o usuário não tenha autorização o retorno será false.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|HASPERMISSIONKEY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_ACCESSKEY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Chave de acesso para questionar.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_RESPONSE&lt;br /&gt;
|Boolean - True caso o usuário tenha acesso a chave, false caso contrário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_HASPERMISSIONKEY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== postBISLog ====&lt;br /&gt;
Envia para o servidor um registro de LOG para ser salvo. Como não há como ter um controle de sincronia de objeto (um ID local como nos objetos do PDV), casa post gerará um objeto novo no servidor. Por isso é preciso controlar os posts pelo lado do cliente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|POSTBISLOG&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_POSTBISLOG_BISLOGOBJ&lt;br /&gt;
|&amp;lt;BISLogVO&amp;gt; - Objeto completo com o registro de erro pronto para ser cadastrado no sistema.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_POSTBISLOG&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== notifyActiveSupport ====&lt;br /&gt;
Este método força o envio de uma mensage para o sistema de suporte ativo do BISERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|NOTIFYACTIVESUPPORT&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_NOTIFYACTIVESUPPORT_MSG&lt;br /&gt;
|&amp;lt;String&amp;gt; - Mensagem a ser enviada para o suporte.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_NOTIFYACTIVESUPPORT&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findBISCertificateList ====&lt;br /&gt;
Busca uma lista de certificados do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_MO&lt;br /&gt;
|&amp;lt;BISCertificateMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELISTLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;BISCertificateVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findCompanyList ====&lt;br /&gt;
Busca uma lista de empresas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_MO&lt;br /&gt;
|&amp;lt;CompanyMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;CompanyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findUserList ====&lt;br /&gt;
Busca uma lista de usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_MO&lt;br /&gt;
|&amp;lt;UserMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;UserVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== createNewTokenToUser ====&lt;br /&gt;
Solicita ao servidor que gere um novo token para o usuário passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requsição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_TOKEN&lt;br /&gt;
|&amp;lt;String&amp;gt; - Token recém criado para o usuário.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISModules ===&lt;br /&gt;
&lt;br /&gt;
==== registerTerminal ====&lt;br /&gt;
Faz o registro do terminal no servidor do BIS. Necessário para que o BIS reconheça esse terminal e possa gerencia-lo adequadamente, como sincronizar dados, conhecer status, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_UNIQUEID&lt;br /&gt;
|&amp;lt;String&amp;gt; - ID do terminal. String gerada que deve ser única par o terminal. Normalmente usado o macaddress da máquina por já ser uma númeração única.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID Gerado pelo servidor que passará a identificar o terminal no servidor&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVItemListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os itens mais novos que esta data. Se for nulo, retornamos todos os itens.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVItemVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPropertiesListToSync ====&lt;br /&gt;
&lt;br /&gt;
Solicita do módulo PDV uma lista das propriedades de configuração para o aplicativo BISPDV definidas para uma determinada empresa. Esta lista terá trará todas as propriedades com o prefixo &amp;quot;br.com.biserp.bismodules.pdv.pdvapp.centralconfig&amp;quot; e no sufixo o ID da empresa separado por um &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPROPERTIESLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PropertyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findFiscalIBPTRatiosListToSync ====&lt;br /&gt;
Solicita do módulo Fiscal uma lista dos ratios fornecida pelo IBPT usada para calcular o total de imposto aproximado pago no cupom. Esta lista terá apenas os objetos alterados a partir da data passada. Método usado para sincronizar novos objetos nos terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no temrinal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os objetos mais novos que esta data. Se for nulo, retornamos todos os objetos.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;FiscalIBPTRatioVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPaymentListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPAYMENTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVPaymentVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVContractListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de contratos (convênios) para venda no caixa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVCONTRACTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVContractVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVTokenList ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_MO&lt;br /&gt;
|&amp;lt;PDVTokenMO&amp;gt; MO para filtrar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; para organizar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ATTRIBUTE&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Atributos que devem ser populados nos objetos da lista.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lockPDVToken ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser bloqueado&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; - Token bloqueado para edição&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== saveAndUnlockToken ====&lt;br /&gt;
Solicita do módulo PDV que salva uma comanda e a deixe desbloqueada para edição por outros terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SAVEANDUNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SAVEANDUNLOCKTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; Objeto representando o token a ser salvo e desbloqueado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SAVEANDUNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== unlockToken ====&lt;br /&gt;
Solicita do módulo PDV que desbloqueie uma comanda da edição.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|UNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_UNLOCKTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser desbloqueado da edição.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_UNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clearTokens ====&lt;br /&gt;
Solicita do módulo PDV que limpe e desbloqueie as comandas informadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CLEARTOKENS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CLEARTOKENS_TOKENS&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; Coleção de comandas a serem limpas e desbloqueadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CLEARTOKENS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCheckoutVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCheckoutVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCheckoutVO&amp;gt;&amp;gt; Coleção de checkouts para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCupomVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCupomVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCUPOMVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCupomVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCUPOMVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== syncDocFiscalVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos DocFiscalVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCDOCFISCALVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;DocFiscalVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCDOCFISCALVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVNFCeLastDocumentNumber ====&lt;br /&gt;
Solicita ao servidor que retorne o número do documento do último cupom emitido para uma determinada empresa e série da documento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCSERIAL&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da série do documento desejado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCNUMBER&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do último documento emitido para a empresa e na série solicitada.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findLocationCountryListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Países alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCountryVO&amp;gt; Retorna uma lista com todos os LocationCountryVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationStateListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Estados alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_IDCOUNTRY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do País que se deseja os estados.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de países para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationStateVO&amp;gt; Retorna uma lista com todos os LocationStateVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationCityListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_IDSTATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de estados para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCityVO&amp;gt; Retorna uma lista com todos os LocationCityVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationAddressListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_IDCITY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de cidade para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationAddressVO&amp;gt; Retorna uma lista com todos os LocationAddressVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== importSATXML ====&lt;br /&gt;
&lt;br /&gt;
Solicita ao servidor que importe um arquivo de XML do SAT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|IMPORTSATXML&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_IMPORTSATXML_XML&lt;br /&gt;
|&amp;lt;String&amp;gt; Conteúdo do arquivo XML a ser importado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_IMPORTSATXML&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getSEFAZStatus ====&lt;br /&gt;
&lt;br /&gt;
Recupera o status atual de comunicação com a SEFAZ (para emissão de NFe/NFCe).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa que fará a consulta, o certificado dela será utilizado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_TPAMB&lt;br /&gt;
|&amp;lt;SEFAZ_tpAmb&amp;gt; Enumeration com a identificação do ambiente a ser verificado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_SEFAZSTATUSVO&lt;br /&gt;
|&amp;lt;SEFAZStatusVO&amp;gt; Objeto SEFAZStatusVO com as informações solicitadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== emitDocFiscal ====&lt;br /&gt;
&lt;br /&gt;
EnviaSolicita a emissão de um DocFiscal para o BIS Server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|EMITDOCFISCAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_EMITDOCFISCAL_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa para emissão do documento fiscal.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_EMITDOCFISCAL_IDDOCFISCAL&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do DocFiscalVO a ser emitido. Note que o objeto já deve estar sincronizado com todos os dados no ervidor para a emissão.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_EMITDOCFISCAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_EMITDOCFISCAL_DOCFISCALVO&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO retornado com o cupom e dados completo.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1677</id>
		<title>BISModulesSocket</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1677"/>
		<updated>2025-11-24T01:15:04Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* getSEFAZStatus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
O BISModulesSocket é como uma pequena biblioteca que facilita a comunicação entre terminais (aplicações externas ao servidor de aplicações) e o BISCore e BISModules. Desenvolvido apenas com Java e Sockets (implementado em cima do [[BISSocket]]), pode ser usado para realizar chamadas e comunicar com o sistema sem a necessidade de utilizar bibliotecas RMI/JNDI ou outras mais complexas de integração.&lt;br /&gt;
&lt;br /&gt;
== Funcionamento ==&lt;br /&gt;
O lado servidor será &amp;quot;levantado&amp;quot; junto com o plugin. A partir deste momento o servidor já estará escutando a porta e aguardado conexão dos terminais.&lt;br /&gt;
&lt;br /&gt;
A utilização é simples:&lt;br /&gt;
# Cria uma instância do BISModulesSocketClient, passe no construtor o host e a porta do servidor BISERP para que o cliente conecte-se;&lt;br /&gt;
# Chama os métodos passando os atributos desejados e aguarde pela resposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo entre BISModulesSocketClient e BISModulesSocketServer ==&lt;br /&gt;
&lt;br /&gt;
Abaixo estão listados os comandos utilizados atualmente pelas duas classes para abstrair a comunicação. Para utilizar as classes não é necessário se familiarizar com o protocolo, apenas para manutenção e implementação das mesmas.&lt;br /&gt;
&lt;br /&gt;
{{stop|Chamada Pela Fachada|Quando o BISModulesSocketServer faz o repasse da chamada dos métodos na parte do Core (do BIS ou dos Plugins), deve sempre chamar a fachada de acesso. Para que o servidor de aplicações instancie as transações e o Interceptor da fachada possa fazer seu trabalho.&lt;br /&gt;
Uma chamada direta ao CRUD pode funcionar em alguns casos, mas com certeza desabilitará o [[BISLogger]], as transações dos EJBs e outros serviços oferecidos pelo servidor de aplicação.}}&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Serviço do BISModulesSocket ===&lt;br /&gt;
&lt;br /&gt;
==== serverTime ====&lt;br /&gt;
Recupera o horário do Servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Número qualquer para identificar a requisição. O mesmo valor é retornado na resposta.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_TIME&lt;br /&gt;
|&amp;lt;Long&amp;gt; System.currentTimeMillis() do servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Exatamente mesmo valor recebido na requisição, mesmo que null.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISCore ===&lt;br /&gt;
&lt;br /&gt;
==== getProperty ====&lt;br /&gt;
Busca no servidor uma propriedade do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETPROPERTY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_PROPERTY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Propriedade a ser recuperada no servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_VALUE&lt;br /&gt;
|String - Valor da propriedade do sistema, null caso a propriedade tenha o valor nulo ou não tenha sido encontrado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETPROPERTY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== hasPermissionKey ====&lt;br /&gt;
Envia para o servidor a autenticação de um usuário e uma chave de segurança para saber se o usuário tem acesso para a chave passada. Note que, seguindo a funcionalidade do Kernel, o método lança exception caso a autenticação falhe, caso o usuário não tenha autorização o retorno será false.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|HASPERMISSIONKEY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_ACCESSKEY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Chave de acesso para questionar.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_RESPONSE&lt;br /&gt;
|Boolean - True caso o usuário tenha acesso a chave, false caso contrário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_HASPERMISSIONKEY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== postBISLog ====&lt;br /&gt;
Envia para o servidor um registro de LOG para ser salvo. Como não há como ter um controle de sincronia de objeto (um ID local como nos objetos do PDV), casa post gerará um objeto novo no servidor. Por isso é preciso controlar os posts pelo lado do cliente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|POSTBISLOG&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_POSTBISLOG_BISLOGOBJ&lt;br /&gt;
|&amp;lt;BISLogVO&amp;gt; - Objeto completo com o registro de erro pronto para ser cadastrado no sistema.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_POSTBISLOG&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== notifyActiveSupport ====&lt;br /&gt;
Este método força o envio de uma mensage para o sistema de suporte ativo do BISERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|NOTIFYACTIVESUPPORT&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_NOTIFYACTIVESUPPORT_MSG&lt;br /&gt;
|&amp;lt;String&amp;gt; - Mensagem a ser enviada para o suporte.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_NOTIFYACTIVESUPPORT&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findBISCertificateList ====&lt;br /&gt;
Busca uma lista de certificados do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_MO&lt;br /&gt;
|&amp;lt;BISCertificateMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELISTLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;BISCertificateVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findCompanyList ====&lt;br /&gt;
Busca uma lista de empresas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_MO&lt;br /&gt;
|&amp;lt;CompanyMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;CompanyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findUserList ====&lt;br /&gt;
Busca uma lista de usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_MO&lt;br /&gt;
|&amp;lt;UserMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;UserVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== createNewTokenToUser ====&lt;br /&gt;
Solicita ao servidor que gere um novo token para o usuário passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requsição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_TOKEN&lt;br /&gt;
|&amp;lt;String&amp;gt; - Token recém criado para o usuário.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISModules ===&lt;br /&gt;
&lt;br /&gt;
==== registerTerminal ====&lt;br /&gt;
Faz o registro do terminal no servidor do BIS. Necessário para que o BIS reconheça esse terminal e possa gerencia-lo adequadamente, como sincronizar dados, conhecer status, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_UNIQUEID&lt;br /&gt;
|&amp;lt;String&amp;gt; - ID do terminal. String gerada que deve ser única par o terminal. Normalmente usado o macaddress da máquina por já ser uma númeração única.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID Gerado pelo servidor que passará a identificar o terminal no servidor&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVItemListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os itens mais novos que esta data. Se for nulo, retornamos todos os itens.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVItemVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPropertiesListToSync ====&lt;br /&gt;
&lt;br /&gt;
Solicita do módulo PDV uma lista das propriedades de configuração para o aplicativo BISPDV definidas para uma determinada empresa. Esta lista terá trará todas as propriedades com o prefixo &amp;quot;br.com.biserp.bismodules.pdv.pdvapp.centralconfig&amp;quot; e no sufixo o ID da empresa separado por um &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPROPERTIESLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PropertyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findFiscalIBPTRatiosListToSync ====&lt;br /&gt;
Solicita do módulo Fiscal uma lista dos ratios fornecida pelo IBPT usada para calcular o total de imposto aproximado pago no cupom. Esta lista terá apenas os objetos alterados a partir da data passada. Método usado para sincronizar novos objetos nos terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no temrinal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os objetos mais novos que esta data. Se for nulo, retornamos todos os objetos.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;FiscalIBPTRatioVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPaymentListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPAYMENTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVPaymentVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVContractListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de contratos (convênios) para venda no caixa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVCONTRACTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVContractVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVTokenList ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_MO&lt;br /&gt;
|&amp;lt;PDVTokenMO&amp;gt; MO para filtrar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; para organizar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ATTRIBUTE&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Atributos que devem ser populados nos objetos da lista.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lockPDVToken ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser bloqueado&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; - Token bloqueado para edição&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== saveAndUnlockToken ====&lt;br /&gt;
Solicita do módulo PDV que salva uma comanda e a deixe desbloqueada para edição por outros terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SAVEANDUNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SAVEANDUNLOCKTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; Objeto representando o token a ser salvo e desbloqueado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SAVEANDUNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== unlockToken ====&lt;br /&gt;
Solicita do módulo PDV que desbloqueie uma comanda da edição.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|UNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_UNLOCKTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser desbloqueado da edição.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_UNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clearTokens ====&lt;br /&gt;
Solicita do módulo PDV que limpe e desbloqueie as comandas informadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CLEARTOKENS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CLEARTOKENS_TOKENS&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; Coleção de comandas a serem limpas e desbloqueadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CLEARTOKENS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCheckoutVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCheckoutVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCheckoutVO&amp;gt;&amp;gt; Coleção de checkouts para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCupomVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCupomVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCUPOMVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCupomVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCUPOMVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== syncDocFiscalVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos DocFiscalVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCDOCFISCALVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;DocFiscalVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCDOCFISCALVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVNFCeLastDocumentNumber ====&lt;br /&gt;
Solicita ao servidor que retorne o número do documento do último cupom emitido para uma determinada empresa e série da documento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCSERIAL&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da série do documento desejado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCNUMBER&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do último documento emitido para a empresa e na série solicitada.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findLocationCountryListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Países alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCountryVO&amp;gt; Retorna uma lista com todos os LocationCountryVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationStateListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Estados alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_IDCOUNTRY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do País que se deseja os estados.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de países para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationStateVO&amp;gt; Retorna uma lista com todos os LocationStateVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationCityListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_IDSTATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de estados para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCityVO&amp;gt; Retorna uma lista com todos os LocationCityVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationAddressListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_IDCITY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de cidade para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationAddressVO&amp;gt; Retorna uma lista com todos os LocationAddressVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== importSATXML ====&lt;br /&gt;
&lt;br /&gt;
Solicita ao servidor que importe um arquivo de XML do SAT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|IMPORTSATXML&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_IMPORTSATXML_XML&lt;br /&gt;
|&amp;lt;String&amp;gt; Conteúdo do arquivo XML a ser importado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_IMPORTSATXML&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getSEFAZStatus ====&lt;br /&gt;
&lt;br /&gt;
Recupera o status atual de comunicação com a SEFAZ (para emissão de NFe/NFCe).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa que fará a consulta, o certificado dela será utilizado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_TPAMB&lt;br /&gt;
|&amp;lt;SEFAZ_tpAmb&amp;gt; Enumeration com a identificação do ambiente a ser verificado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_SEFAZSTATUSVO&lt;br /&gt;
|&amp;lt;SEFAZStatusVO&amp;gt; Objeto SEFAZStatusVO com as informações solicitadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== sendDocFiscalToEmission ====&lt;br /&gt;
&lt;br /&gt;
Envia um DocFiscal para o BIS Server emitir o documento fiscal com suas informações.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SENDDOCFISCALTOEMISSION&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt;ID da empresa para emissão do documento fiscal.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_DOCFISCAL&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO com as informações necessárias da venda para finalização e emissão de do cupom fiscal pelo BISServer.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_DOCFISCAL&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO retornado com o cupom e dados completo.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1676</id>
		<title>BISModulesSocket</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1676"/>
		<updated>2025-11-24T01:08:49Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* getSEFAZStatus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
O BISModulesSocket é como uma pequena biblioteca que facilita a comunicação entre terminais (aplicações externas ao servidor de aplicações) e o BISCore e BISModules. Desenvolvido apenas com Java e Sockets (implementado em cima do [[BISSocket]]), pode ser usado para realizar chamadas e comunicar com o sistema sem a necessidade de utilizar bibliotecas RMI/JNDI ou outras mais complexas de integração.&lt;br /&gt;
&lt;br /&gt;
== Funcionamento ==&lt;br /&gt;
O lado servidor será &amp;quot;levantado&amp;quot; junto com o plugin. A partir deste momento o servidor já estará escutando a porta e aguardado conexão dos terminais.&lt;br /&gt;
&lt;br /&gt;
A utilização é simples:&lt;br /&gt;
# Cria uma instância do BISModulesSocketClient, passe no construtor o host e a porta do servidor BISERP para que o cliente conecte-se;&lt;br /&gt;
# Chama os métodos passando os atributos desejados e aguarde pela resposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo entre BISModulesSocketClient e BISModulesSocketServer ==&lt;br /&gt;
&lt;br /&gt;
Abaixo estão listados os comandos utilizados atualmente pelas duas classes para abstrair a comunicação. Para utilizar as classes não é necessário se familiarizar com o protocolo, apenas para manutenção e implementação das mesmas.&lt;br /&gt;
&lt;br /&gt;
{{stop|Chamada Pela Fachada|Quando o BISModulesSocketServer faz o repasse da chamada dos métodos na parte do Core (do BIS ou dos Plugins), deve sempre chamar a fachada de acesso. Para que o servidor de aplicações instancie as transações e o Interceptor da fachada possa fazer seu trabalho.&lt;br /&gt;
Uma chamada direta ao CRUD pode funcionar em alguns casos, mas com certeza desabilitará o [[BISLogger]], as transações dos EJBs e outros serviços oferecidos pelo servidor de aplicação.}}&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Serviço do BISModulesSocket ===&lt;br /&gt;
&lt;br /&gt;
==== serverTime ====&lt;br /&gt;
Recupera o horário do Servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Número qualquer para identificar a requisição. O mesmo valor é retornado na resposta.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_TIME&lt;br /&gt;
|&amp;lt;Long&amp;gt; System.currentTimeMillis() do servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Exatamente mesmo valor recebido na requisição, mesmo que null.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISCore ===&lt;br /&gt;
&lt;br /&gt;
==== getProperty ====&lt;br /&gt;
Busca no servidor uma propriedade do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETPROPERTY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_PROPERTY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Propriedade a ser recuperada no servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_VALUE&lt;br /&gt;
|String - Valor da propriedade do sistema, null caso a propriedade tenha o valor nulo ou não tenha sido encontrado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETPROPERTY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== hasPermissionKey ====&lt;br /&gt;
Envia para o servidor a autenticação de um usuário e uma chave de segurança para saber se o usuário tem acesso para a chave passada. Note que, seguindo a funcionalidade do Kernel, o método lança exception caso a autenticação falhe, caso o usuário não tenha autorização o retorno será false.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|HASPERMISSIONKEY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_ACCESSKEY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Chave de acesso para questionar.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_RESPONSE&lt;br /&gt;
|Boolean - True caso o usuário tenha acesso a chave, false caso contrário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_HASPERMISSIONKEY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== postBISLog ====&lt;br /&gt;
Envia para o servidor um registro de LOG para ser salvo. Como não há como ter um controle de sincronia de objeto (um ID local como nos objetos do PDV), casa post gerará um objeto novo no servidor. Por isso é preciso controlar os posts pelo lado do cliente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|POSTBISLOG&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_POSTBISLOG_BISLOGOBJ&lt;br /&gt;
|&amp;lt;BISLogVO&amp;gt; - Objeto completo com o registro de erro pronto para ser cadastrado no sistema.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_POSTBISLOG&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== notifyActiveSupport ====&lt;br /&gt;
Este método força o envio de uma mensage para o sistema de suporte ativo do BISERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|NOTIFYACTIVESUPPORT&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_NOTIFYACTIVESUPPORT_MSG&lt;br /&gt;
|&amp;lt;String&amp;gt; - Mensagem a ser enviada para o suporte.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_NOTIFYACTIVESUPPORT&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findBISCertificateList ====&lt;br /&gt;
Busca uma lista de certificados do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_MO&lt;br /&gt;
|&amp;lt;BISCertificateMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELISTLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;BISCertificateVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findCompanyList ====&lt;br /&gt;
Busca uma lista de empresas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_MO&lt;br /&gt;
|&amp;lt;CompanyMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;CompanyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findUserList ====&lt;br /&gt;
Busca uma lista de usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_MO&lt;br /&gt;
|&amp;lt;UserMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;UserVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== createNewTokenToUser ====&lt;br /&gt;
Solicita ao servidor que gere um novo token para o usuário passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requsição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_TOKEN&lt;br /&gt;
|&amp;lt;String&amp;gt; - Token recém criado para o usuário.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISModules ===&lt;br /&gt;
&lt;br /&gt;
==== registerTerminal ====&lt;br /&gt;
Faz o registro do terminal no servidor do BIS. Necessário para que o BIS reconheça esse terminal e possa gerencia-lo adequadamente, como sincronizar dados, conhecer status, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_UNIQUEID&lt;br /&gt;
|&amp;lt;String&amp;gt; - ID do terminal. String gerada que deve ser única par o terminal. Normalmente usado o macaddress da máquina por já ser uma númeração única.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID Gerado pelo servidor que passará a identificar o terminal no servidor&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVItemListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os itens mais novos que esta data. Se for nulo, retornamos todos os itens.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVItemVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPropertiesListToSync ====&lt;br /&gt;
&lt;br /&gt;
Solicita do módulo PDV uma lista das propriedades de configuração para o aplicativo BISPDV definidas para uma determinada empresa. Esta lista terá trará todas as propriedades com o prefixo &amp;quot;br.com.biserp.bismodules.pdv.pdvapp.centralconfig&amp;quot; e no sufixo o ID da empresa separado por um &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPROPERTIESLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PropertyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findFiscalIBPTRatiosListToSync ====&lt;br /&gt;
Solicita do módulo Fiscal uma lista dos ratios fornecida pelo IBPT usada para calcular o total de imposto aproximado pago no cupom. Esta lista terá apenas os objetos alterados a partir da data passada. Método usado para sincronizar novos objetos nos terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no temrinal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os objetos mais novos que esta data. Se for nulo, retornamos todos os objetos.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;FiscalIBPTRatioVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPaymentListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPAYMENTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVPaymentVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVContractListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de contratos (convênios) para venda no caixa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVCONTRACTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVContractVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVTokenList ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_MO&lt;br /&gt;
|&amp;lt;PDVTokenMO&amp;gt; MO para filtrar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; para organizar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ATTRIBUTE&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Atributos que devem ser populados nos objetos da lista.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lockPDVToken ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser bloqueado&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; - Token bloqueado para edição&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== saveAndUnlockToken ====&lt;br /&gt;
Solicita do módulo PDV que salva uma comanda e a deixe desbloqueada para edição por outros terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SAVEANDUNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SAVEANDUNLOCKTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; Objeto representando o token a ser salvo e desbloqueado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SAVEANDUNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== unlockToken ====&lt;br /&gt;
Solicita do módulo PDV que desbloqueie uma comanda da edição.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|UNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_UNLOCKTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser desbloqueado da edição.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_UNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clearTokens ====&lt;br /&gt;
Solicita do módulo PDV que limpe e desbloqueie as comandas informadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CLEARTOKENS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CLEARTOKENS_TOKENS&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; Coleção de comandas a serem limpas e desbloqueadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CLEARTOKENS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCheckoutVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCheckoutVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCheckoutVO&amp;gt;&amp;gt; Coleção de checkouts para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCupomVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCupomVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCUPOMVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCupomVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCUPOMVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== syncDocFiscalVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos DocFiscalVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCDOCFISCALVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;DocFiscalVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCDOCFISCALVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVNFCeLastDocumentNumber ====&lt;br /&gt;
Solicita ao servidor que retorne o número do documento do último cupom emitido para uma determinada empresa e série da documento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCSERIAL&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da série do documento desejado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCNUMBER&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do último documento emitido para a empresa e na série solicitada.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findLocationCountryListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Países alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCountryVO&amp;gt; Retorna uma lista com todos os LocationCountryVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationStateListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Estados alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_IDCOUNTRY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do País que se deseja os estados.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de países para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationStateVO&amp;gt; Retorna uma lista com todos os LocationStateVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationCityListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_IDSTATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de estados para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCityVO&amp;gt; Retorna uma lista com todos os LocationCityVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationAddressListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_IDCITY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de cidade para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationAddressVO&amp;gt; Retorna uma lista com todos os LocationAddressVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== importSATXML ====&lt;br /&gt;
&lt;br /&gt;
Solicita ao servidor que importe um arquivo de XML do SAT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|IMPORTSATXML&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_IMPORTSATXML_XML&lt;br /&gt;
|&amp;lt;String&amp;gt; Conteúdo do arquivo XML a ser importado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_IMPORTSATXML&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getSEFAZStatus ====&lt;br /&gt;
&lt;br /&gt;
Recupera o status atual de comunicação com a SEFAZ (para emissão de NFe/NFCe).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa que fará a consulta, o certificado dela será utilizado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_SEFAZSTATUSVO&lt;br /&gt;
|&amp;lt;SEFAZStatusVO&amp;gt; Objeto SEFAZStatusVO com as informações solicitadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== sendDocFiscalToEmission ====&lt;br /&gt;
&lt;br /&gt;
Envia um DocFiscal para o BIS Server emitir o documento fiscal com suas informações.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SENDDOCFISCALTOEMISSION&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt;ID da empresa para emissão do documento fiscal.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_DOCFISCAL&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO com as informações necessárias da venda para finalização e emissão de do cupom fiscal pelo BISServer.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_DOCFISCAL&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO retornado com o cupom e dados completo.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1675</id>
		<title>BISModulesSocket</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1675"/>
		<updated>2025-11-23T21:29:42Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* getSEFAZStatus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
O BISModulesSocket é como uma pequena biblioteca que facilita a comunicação entre terminais (aplicações externas ao servidor de aplicações) e o BISCore e BISModules. Desenvolvido apenas com Java e Sockets (implementado em cima do [[BISSocket]]), pode ser usado para realizar chamadas e comunicar com o sistema sem a necessidade de utilizar bibliotecas RMI/JNDI ou outras mais complexas de integração.&lt;br /&gt;
&lt;br /&gt;
== Funcionamento ==&lt;br /&gt;
O lado servidor será &amp;quot;levantado&amp;quot; junto com o plugin. A partir deste momento o servidor já estará escutando a porta e aguardado conexão dos terminais.&lt;br /&gt;
&lt;br /&gt;
A utilização é simples:&lt;br /&gt;
# Cria uma instância do BISModulesSocketClient, passe no construtor o host e a porta do servidor BISERP para que o cliente conecte-se;&lt;br /&gt;
# Chama os métodos passando os atributos desejados e aguarde pela resposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo entre BISModulesSocketClient e BISModulesSocketServer ==&lt;br /&gt;
&lt;br /&gt;
Abaixo estão listados os comandos utilizados atualmente pelas duas classes para abstrair a comunicação. Para utilizar as classes não é necessário se familiarizar com o protocolo, apenas para manutenção e implementação das mesmas.&lt;br /&gt;
&lt;br /&gt;
{{stop|Chamada Pela Fachada|Quando o BISModulesSocketServer faz o repasse da chamada dos métodos na parte do Core (do BIS ou dos Plugins), deve sempre chamar a fachada de acesso. Para que o servidor de aplicações instancie as transações e o Interceptor da fachada possa fazer seu trabalho.&lt;br /&gt;
Uma chamada direta ao CRUD pode funcionar em alguns casos, mas com certeza desabilitará o [[BISLogger]], as transações dos EJBs e outros serviços oferecidos pelo servidor de aplicação.}}&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Serviço do BISModulesSocket ===&lt;br /&gt;
&lt;br /&gt;
==== serverTime ====&lt;br /&gt;
Recupera o horário do Servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Número qualquer para identificar a requisição. O mesmo valor é retornado na resposta.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_TIME&lt;br /&gt;
|&amp;lt;Long&amp;gt; System.currentTimeMillis() do servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Exatamente mesmo valor recebido na requisição, mesmo que null.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISCore ===&lt;br /&gt;
&lt;br /&gt;
==== getProperty ====&lt;br /&gt;
Busca no servidor uma propriedade do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETPROPERTY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_PROPERTY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Propriedade a ser recuperada no servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_VALUE&lt;br /&gt;
|String - Valor da propriedade do sistema, null caso a propriedade tenha o valor nulo ou não tenha sido encontrado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETPROPERTY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== hasPermissionKey ====&lt;br /&gt;
Envia para o servidor a autenticação de um usuário e uma chave de segurança para saber se o usuário tem acesso para a chave passada. Note que, seguindo a funcionalidade do Kernel, o método lança exception caso a autenticação falhe, caso o usuário não tenha autorização o retorno será false.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|HASPERMISSIONKEY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_ACCESSKEY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Chave de acesso para questionar.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_RESPONSE&lt;br /&gt;
|Boolean - True caso o usuário tenha acesso a chave, false caso contrário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_HASPERMISSIONKEY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== postBISLog ====&lt;br /&gt;
Envia para o servidor um registro de LOG para ser salvo. Como não há como ter um controle de sincronia de objeto (um ID local como nos objetos do PDV), casa post gerará um objeto novo no servidor. Por isso é preciso controlar os posts pelo lado do cliente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|POSTBISLOG&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_POSTBISLOG_BISLOGOBJ&lt;br /&gt;
|&amp;lt;BISLogVO&amp;gt; - Objeto completo com o registro de erro pronto para ser cadastrado no sistema.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_POSTBISLOG&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== notifyActiveSupport ====&lt;br /&gt;
Este método força o envio de uma mensage para o sistema de suporte ativo do BISERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|NOTIFYACTIVESUPPORT&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_NOTIFYACTIVESUPPORT_MSG&lt;br /&gt;
|&amp;lt;String&amp;gt; - Mensagem a ser enviada para o suporte.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_NOTIFYACTIVESUPPORT&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findBISCertificateList ====&lt;br /&gt;
Busca uma lista de certificados do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_MO&lt;br /&gt;
|&amp;lt;BISCertificateMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELISTLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;BISCertificateVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findCompanyList ====&lt;br /&gt;
Busca uma lista de empresas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_MO&lt;br /&gt;
|&amp;lt;CompanyMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;CompanyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findUserList ====&lt;br /&gt;
Busca uma lista de usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_MO&lt;br /&gt;
|&amp;lt;UserMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;UserVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== createNewTokenToUser ====&lt;br /&gt;
Solicita ao servidor que gere um novo token para o usuário passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requsição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_TOKEN&lt;br /&gt;
|&amp;lt;String&amp;gt; - Token recém criado para o usuário.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISModules ===&lt;br /&gt;
&lt;br /&gt;
==== registerTerminal ====&lt;br /&gt;
Faz o registro do terminal no servidor do BIS. Necessário para que o BIS reconheça esse terminal e possa gerencia-lo adequadamente, como sincronizar dados, conhecer status, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_UNIQUEID&lt;br /&gt;
|&amp;lt;String&amp;gt; - ID do terminal. String gerada que deve ser única par o terminal. Normalmente usado o macaddress da máquina por já ser uma númeração única.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID Gerado pelo servidor que passará a identificar o terminal no servidor&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVItemListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os itens mais novos que esta data. Se for nulo, retornamos todos os itens.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVItemVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPropertiesListToSync ====&lt;br /&gt;
&lt;br /&gt;
Solicita do módulo PDV uma lista das propriedades de configuração para o aplicativo BISPDV definidas para uma determinada empresa. Esta lista terá trará todas as propriedades com o prefixo &amp;quot;br.com.biserp.bismodules.pdv.pdvapp.centralconfig&amp;quot; e no sufixo o ID da empresa separado por um &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPROPERTIESLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PropertyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findFiscalIBPTRatiosListToSync ====&lt;br /&gt;
Solicita do módulo Fiscal uma lista dos ratios fornecida pelo IBPT usada para calcular o total de imposto aproximado pago no cupom. Esta lista terá apenas os objetos alterados a partir da data passada. Método usado para sincronizar novos objetos nos terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no temrinal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os objetos mais novos que esta data. Se for nulo, retornamos todos os objetos.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;FiscalIBPTRatioVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPaymentListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPAYMENTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVPaymentVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVContractListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de contratos (convênios) para venda no caixa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVCONTRACTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVContractVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVTokenList ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_MO&lt;br /&gt;
|&amp;lt;PDVTokenMO&amp;gt; MO para filtrar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; para organizar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ATTRIBUTE&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Atributos que devem ser populados nos objetos da lista.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lockPDVToken ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser bloqueado&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; - Token bloqueado para edição&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== saveAndUnlockToken ====&lt;br /&gt;
Solicita do módulo PDV que salva uma comanda e a deixe desbloqueada para edição por outros terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SAVEANDUNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SAVEANDUNLOCKTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; Objeto representando o token a ser salvo e desbloqueado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SAVEANDUNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== unlockToken ====&lt;br /&gt;
Solicita do módulo PDV que desbloqueie uma comanda da edição.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|UNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_UNLOCKTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser desbloqueado da edição.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_UNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clearTokens ====&lt;br /&gt;
Solicita do módulo PDV que limpe e desbloqueie as comandas informadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CLEARTOKENS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CLEARTOKENS_TOKENS&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; Coleção de comandas a serem limpas e desbloqueadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CLEARTOKENS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCheckoutVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCheckoutVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCheckoutVO&amp;gt;&amp;gt; Coleção de checkouts para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCupomVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCupomVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCUPOMVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCupomVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCUPOMVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== syncDocFiscalVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos DocFiscalVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCDOCFISCALVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;DocFiscalVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCDOCFISCALVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVNFCeLastDocumentNumber ====&lt;br /&gt;
Solicita ao servidor que retorne o número do documento do último cupom emitido para uma determinada empresa e série da documento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCSERIAL&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da série do documento desejado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCNUMBER&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do último documento emitido para a empresa e na série solicitada.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findLocationCountryListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Países alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCountryVO&amp;gt; Retorna uma lista com todos os LocationCountryVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationStateListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Estados alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_IDCOUNTRY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do País que se deseja os estados.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de países para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationStateVO&amp;gt; Retorna uma lista com todos os LocationStateVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationCityListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_IDSTATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de estados para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCityVO&amp;gt; Retorna uma lista com todos os LocationCityVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationAddressListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_IDCITY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de cidade para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationAddressVO&amp;gt; Retorna uma lista com todos os LocationAddressVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== importSATXML ====&lt;br /&gt;
&lt;br /&gt;
Solicita ao servidor que importe um arquivo de XML do SAT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|IMPORTSATXML&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_IMPORTSATXML_XML&lt;br /&gt;
|&amp;lt;String&amp;gt; Conteúdo do arquivo XML a ser importado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_IMPORTSATXML&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getSEFAZStatus ====&lt;br /&gt;
&lt;br /&gt;
Recupera o status atual de comunicação com a SEFAZ (para emissão de NFe/NFCe).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt;ID da empresa para emissão do documento fiscal.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa que fará a consulta, o certificado dela será utilizado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETSEFAZSTATUS_SEFAZSTATUSVO&lt;br /&gt;
|&amp;lt;SEFAZStatusVO&amp;gt; Objeto SEFAZStatusVO com as informações solicitadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== sendDocFiscalToEmission ====&lt;br /&gt;
&lt;br /&gt;
Envia um DocFiscal para o BIS Server emitir o documento fiscal com suas informações.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SENDDOCFISCALTOEMISSION&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt;ID da empresa para emissão do documento fiscal.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_DOCFISCAL&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO com as informações necessárias da venda para finalização e emissão de do cupom fiscal pelo BISServer.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_DOCFISCAL&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO retornado com o cupom e dados completo.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1674</id>
		<title>BISModulesSocket</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1674"/>
		<updated>2025-11-23T21:28:05Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* sendDocFiscalToEmission */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
O BISModulesSocket é como uma pequena biblioteca que facilita a comunicação entre terminais (aplicações externas ao servidor de aplicações) e o BISCore e BISModules. Desenvolvido apenas com Java e Sockets (implementado em cima do [[BISSocket]]), pode ser usado para realizar chamadas e comunicar com o sistema sem a necessidade de utilizar bibliotecas RMI/JNDI ou outras mais complexas de integração.&lt;br /&gt;
&lt;br /&gt;
== Funcionamento ==&lt;br /&gt;
O lado servidor será &amp;quot;levantado&amp;quot; junto com o plugin. A partir deste momento o servidor já estará escutando a porta e aguardado conexão dos terminais.&lt;br /&gt;
&lt;br /&gt;
A utilização é simples:&lt;br /&gt;
# Cria uma instância do BISModulesSocketClient, passe no construtor o host e a porta do servidor BISERP para que o cliente conecte-se;&lt;br /&gt;
# Chama os métodos passando os atributos desejados e aguarde pela resposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo entre BISModulesSocketClient e BISModulesSocketServer ==&lt;br /&gt;
&lt;br /&gt;
Abaixo estão listados os comandos utilizados atualmente pelas duas classes para abstrair a comunicação. Para utilizar as classes não é necessário se familiarizar com o protocolo, apenas para manutenção e implementação das mesmas.&lt;br /&gt;
&lt;br /&gt;
{{stop|Chamada Pela Fachada|Quando o BISModulesSocketServer faz o repasse da chamada dos métodos na parte do Core (do BIS ou dos Plugins), deve sempre chamar a fachada de acesso. Para que o servidor de aplicações instancie as transações e o Interceptor da fachada possa fazer seu trabalho.&lt;br /&gt;
Uma chamada direta ao CRUD pode funcionar em alguns casos, mas com certeza desabilitará o [[BISLogger]], as transações dos EJBs e outros serviços oferecidos pelo servidor de aplicação.}}&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Serviço do BISModulesSocket ===&lt;br /&gt;
&lt;br /&gt;
==== serverTime ====&lt;br /&gt;
Recupera o horário do Servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Número qualquer para identificar a requisição. O mesmo valor é retornado na resposta.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_TIME&lt;br /&gt;
|&amp;lt;Long&amp;gt; System.currentTimeMillis() do servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Exatamente mesmo valor recebido na requisição, mesmo que null.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISCore ===&lt;br /&gt;
&lt;br /&gt;
==== getProperty ====&lt;br /&gt;
Busca no servidor uma propriedade do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETPROPERTY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_PROPERTY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Propriedade a ser recuperada no servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_VALUE&lt;br /&gt;
|String - Valor da propriedade do sistema, null caso a propriedade tenha o valor nulo ou não tenha sido encontrado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETPROPERTY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== hasPermissionKey ====&lt;br /&gt;
Envia para o servidor a autenticação de um usuário e uma chave de segurança para saber se o usuário tem acesso para a chave passada. Note que, seguindo a funcionalidade do Kernel, o método lança exception caso a autenticação falhe, caso o usuário não tenha autorização o retorno será false.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|HASPERMISSIONKEY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_ACCESSKEY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Chave de acesso para questionar.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_RESPONSE&lt;br /&gt;
|Boolean - True caso o usuário tenha acesso a chave, false caso contrário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_HASPERMISSIONKEY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== postBISLog ====&lt;br /&gt;
Envia para o servidor um registro de LOG para ser salvo. Como não há como ter um controle de sincronia de objeto (um ID local como nos objetos do PDV), casa post gerará um objeto novo no servidor. Por isso é preciso controlar os posts pelo lado do cliente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|POSTBISLOG&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_POSTBISLOG_BISLOGOBJ&lt;br /&gt;
|&amp;lt;BISLogVO&amp;gt; - Objeto completo com o registro de erro pronto para ser cadastrado no sistema.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_POSTBISLOG&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== notifyActiveSupport ====&lt;br /&gt;
Este método força o envio de uma mensage para o sistema de suporte ativo do BISERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|NOTIFYACTIVESUPPORT&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_NOTIFYACTIVESUPPORT_MSG&lt;br /&gt;
|&amp;lt;String&amp;gt; - Mensagem a ser enviada para o suporte.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_NOTIFYACTIVESUPPORT&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findBISCertificateList ====&lt;br /&gt;
Busca uma lista de certificados do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_MO&lt;br /&gt;
|&amp;lt;BISCertificateMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELISTLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;BISCertificateVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findCompanyList ====&lt;br /&gt;
Busca uma lista de empresas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_MO&lt;br /&gt;
|&amp;lt;CompanyMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;CompanyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findUserList ====&lt;br /&gt;
Busca uma lista de usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_MO&lt;br /&gt;
|&amp;lt;UserMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;UserVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== createNewTokenToUser ====&lt;br /&gt;
Solicita ao servidor que gere um novo token para o usuário passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requsição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_TOKEN&lt;br /&gt;
|&amp;lt;String&amp;gt; - Token recém criado para o usuário.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISModules ===&lt;br /&gt;
&lt;br /&gt;
==== registerTerminal ====&lt;br /&gt;
Faz o registro do terminal no servidor do BIS. Necessário para que o BIS reconheça esse terminal e possa gerencia-lo adequadamente, como sincronizar dados, conhecer status, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_UNIQUEID&lt;br /&gt;
|&amp;lt;String&amp;gt; - ID do terminal. String gerada que deve ser única par o terminal. Normalmente usado o macaddress da máquina por já ser uma númeração única.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID Gerado pelo servidor que passará a identificar o terminal no servidor&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVItemListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os itens mais novos que esta data. Se for nulo, retornamos todos os itens.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVItemVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPropertiesListToSync ====&lt;br /&gt;
&lt;br /&gt;
Solicita do módulo PDV uma lista das propriedades de configuração para o aplicativo BISPDV definidas para uma determinada empresa. Esta lista terá trará todas as propriedades com o prefixo &amp;quot;br.com.biserp.bismodules.pdv.pdvapp.centralconfig&amp;quot; e no sufixo o ID da empresa separado por um &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPROPERTIESLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PropertyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findFiscalIBPTRatiosListToSync ====&lt;br /&gt;
Solicita do módulo Fiscal uma lista dos ratios fornecida pelo IBPT usada para calcular o total de imposto aproximado pago no cupom. Esta lista terá apenas os objetos alterados a partir da data passada. Método usado para sincronizar novos objetos nos terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no temrinal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os objetos mais novos que esta data. Se for nulo, retornamos todos os objetos.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;FiscalIBPTRatioVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPaymentListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPAYMENTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVPaymentVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVContractListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de contratos (convênios) para venda no caixa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVCONTRACTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVContractVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVTokenList ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_MO&lt;br /&gt;
|&amp;lt;PDVTokenMO&amp;gt; MO para filtrar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; para organizar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ATTRIBUTE&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Atributos que devem ser populados nos objetos da lista.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lockPDVToken ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser bloqueado&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; - Token bloqueado para edição&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== saveAndUnlockToken ====&lt;br /&gt;
Solicita do módulo PDV que salva uma comanda e a deixe desbloqueada para edição por outros terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SAVEANDUNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SAVEANDUNLOCKTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; Objeto representando o token a ser salvo e desbloqueado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SAVEANDUNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== unlockToken ====&lt;br /&gt;
Solicita do módulo PDV que desbloqueie uma comanda da edição.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|UNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_UNLOCKTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser desbloqueado da edição.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_UNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clearTokens ====&lt;br /&gt;
Solicita do módulo PDV que limpe e desbloqueie as comandas informadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CLEARTOKENS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CLEARTOKENS_TOKENS&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; Coleção de comandas a serem limpas e desbloqueadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CLEARTOKENS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCheckoutVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCheckoutVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCheckoutVO&amp;gt;&amp;gt; Coleção de checkouts para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCupomVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCupomVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCUPOMVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCupomVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCUPOMVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== syncDocFiscalVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos DocFiscalVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCDOCFISCALVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;DocFiscalVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCDOCFISCALVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVNFCeLastDocumentNumber ====&lt;br /&gt;
Solicita ao servidor que retorne o número do documento do último cupom emitido para uma determinada empresa e série da documento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCSERIAL&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da série do documento desejado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCNUMBER&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do último documento emitido para a empresa e na série solicitada.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findLocationCountryListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Países alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCountryVO&amp;gt; Retorna uma lista com todos os LocationCountryVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationStateListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Estados alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_IDCOUNTRY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do País que se deseja os estados.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de países para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationStateVO&amp;gt; Retorna uma lista com todos os LocationStateVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationCityListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_IDSTATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de estados para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCityVO&amp;gt; Retorna uma lista com todos os LocationCityVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationAddressListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_IDCITY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de cidade para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationAddressVO&amp;gt; Retorna uma lista com todos os LocationAddressVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== importSATXML ====&lt;br /&gt;
&lt;br /&gt;
Solicita ao servidor que importe um arquivo de XML do SAT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|IMPORTSATXML&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_IMPORTSATXML_XML&lt;br /&gt;
|&amp;lt;String&amp;gt; Conteúdo do arquivo XML a ser importado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_IMPORTSATXML&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getSEFAZStatus ====&lt;br /&gt;
&lt;br /&gt;
Recupera o status atual de comunicação com a SEFAZ (para emissão de NFe/NFCe).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETSEFAZSTATUS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SEFAZSTATUS&lt;br /&gt;
|&amp;lt;SEFAZStatusVO&amp;gt; Objeto SEFAZStatusVO com as informações solicitadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sendDocFiscalToEmission ====&lt;br /&gt;
&lt;br /&gt;
Envia um DocFiscal para o BIS Server emitir o documento fiscal com suas informações.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SENDDOCFISCALTOEMISSION&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_IDCOMPANY&lt;br /&gt;
|&amp;lt;Long&amp;gt;ID da empresa para emissão do documento fiscal.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_DOCFISCAL&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO com as informações necessárias da venda para finalização e emissão de do cupom fiscal pelo BISServer.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_DOCFISCAL&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO retornado com o cupom e dados completo.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1673</id>
		<title>BISModulesSocket</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1673"/>
		<updated>2025-11-23T20:19:25Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* getSEFAZStatus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
O BISModulesSocket é como uma pequena biblioteca que facilita a comunicação entre terminais (aplicações externas ao servidor de aplicações) e o BISCore e BISModules. Desenvolvido apenas com Java e Sockets (implementado em cima do [[BISSocket]]), pode ser usado para realizar chamadas e comunicar com o sistema sem a necessidade de utilizar bibliotecas RMI/JNDI ou outras mais complexas de integração.&lt;br /&gt;
&lt;br /&gt;
== Funcionamento ==&lt;br /&gt;
O lado servidor será &amp;quot;levantado&amp;quot; junto com o plugin. A partir deste momento o servidor já estará escutando a porta e aguardado conexão dos terminais.&lt;br /&gt;
&lt;br /&gt;
A utilização é simples:&lt;br /&gt;
# Cria uma instância do BISModulesSocketClient, passe no construtor o host e a porta do servidor BISERP para que o cliente conecte-se;&lt;br /&gt;
# Chama os métodos passando os atributos desejados e aguarde pela resposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo entre BISModulesSocketClient e BISModulesSocketServer ==&lt;br /&gt;
&lt;br /&gt;
Abaixo estão listados os comandos utilizados atualmente pelas duas classes para abstrair a comunicação. Para utilizar as classes não é necessário se familiarizar com o protocolo, apenas para manutenção e implementação das mesmas.&lt;br /&gt;
&lt;br /&gt;
{{stop|Chamada Pela Fachada|Quando o BISModulesSocketServer faz o repasse da chamada dos métodos na parte do Core (do BIS ou dos Plugins), deve sempre chamar a fachada de acesso. Para que o servidor de aplicações instancie as transações e o Interceptor da fachada possa fazer seu trabalho.&lt;br /&gt;
Uma chamada direta ao CRUD pode funcionar em alguns casos, mas com certeza desabilitará o [[BISLogger]], as transações dos EJBs e outros serviços oferecidos pelo servidor de aplicação.}}&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Serviço do BISModulesSocket ===&lt;br /&gt;
&lt;br /&gt;
==== serverTime ====&lt;br /&gt;
Recupera o horário do Servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Número qualquer para identificar a requisição. O mesmo valor é retornado na resposta.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_TIME&lt;br /&gt;
|&amp;lt;Long&amp;gt; System.currentTimeMillis() do servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Exatamente mesmo valor recebido na requisição, mesmo que null.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISCore ===&lt;br /&gt;
&lt;br /&gt;
==== getProperty ====&lt;br /&gt;
Busca no servidor uma propriedade do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETPROPERTY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_PROPERTY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Propriedade a ser recuperada no servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_VALUE&lt;br /&gt;
|String - Valor da propriedade do sistema, null caso a propriedade tenha o valor nulo ou não tenha sido encontrado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETPROPERTY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== hasPermissionKey ====&lt;br /&gt;
Envia para o servidor a autenticação de um usuário e uma chave de segurança para saber se o usuário tem acesso para a chave passada. Note que, seguindo a funcionalidade do Kernel, o método lança exception caso a autenticação falhe, caso o usuário não tenha autorização o retorno será false.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|HASPERMISSIONKEY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_ACCESSKEY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Chave de acesso para questionar.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_RESPONSE&lt;br /&gt;
|Boolean - True caso o usuário tenha acesso a chave, false caso contrário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_HASPERMISSIONKEY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== postBISLog ====&lt;br /&gt;
Envia para o servidor um registro de LOG para ser salvo. Como não há como ter um controle de sincronia de objeto (um ID local como nos objetos do PDV), casa post gerará um objeto novo no servidor. Por isso é preciso controlar os posts pelo lado do cliente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|POSTBISLOG&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_POSTBISLOG_BISLOGOBJ&lt;br /&gt;
|&amp;lt;BISLogVO&amp;gt; - Objeto completo com o registro de erro pronto para ser cadastrado no sistema.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_POSTBISLOG&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== notifyActiveSupport ====&lt;br /&gt;
Este método força o envio de uma mensage para o sistema de suporte ativo do BISERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|NOTIFYACTIVESUPPORT&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_NOTIFYACTIVESUPPORT_MSG&lt;br /&gt;
|&amp;lt;String&amp;gt; - Mensagem a ser enviada para o suporte.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_NOTIFYACTIVESUPPORT&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findBISCertificateList ====&lt;br /&gt;
Busca uma lista de certificados do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_MO&lt;br /&gt;
|&amp;lt;BISCertificateMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELISTLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;BISCertificateVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findCompanyList ====&lt;br /&gt;
Busca uma lista de empresas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_MO&lt;br /&gt;
|&amp;lt;CompanyMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;CompanyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findUserList ====&lt;br /&gt;
Busca uma lista de usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_MO&lt;br /&gt;
|&amp;lt;UserMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;UserVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== createNewTokenToUser ====&lt;br /&gt;
Solicita ao servidor que gere um novo token para o usuário passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requsição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_TOKEN&lt;br /&gt;
|&amp;lt;String&amp;gt; - Token recém criado para o usuário.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISModules ===&lt;br /&gt;
&lt;br /&gt;
==== registerTerminal ====&lt;br /&gt;
Faz o registro do terminal no servidor do BIS. Necessário para que o BIS reconheça esse terminal e possa gerencia-lo adequadamente, como sincronizar dados, conhecer status, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_UNIQUEID&lt;br /&gt;
|&amp;lt;String&amp;gt; - ID do terminal. String gerada que deve ser única par o terminal. Normalmente usado o macaddress da máquina por já ser uma númeração única.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID Gerado pelo servidor que passará a identificar o terminal no servidor&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVItemListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os itens mais novos que esta data. Se for nulo, retornamos todos os itens.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVItemVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPropertiesListToSync ====&lt;br /&gt;
&lt;br /&gt;
Solicita do módulo PDV uma lista das propriedades de configuração para o aplicativo BISPDV definidas para uma determinada empresa. Esta lista terá trará todas as propriedades com o prefixo &amp;quot;br.com.biserp.bismodules.pdv.pdvapp.centralconfig&amp;quot; e no sufixo o ID da empresa separado por um &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPROPERTIESLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PropertyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findFiscalIBPTRatiosListToSync ====&lt;br /&gt;
Solicita do módulo Fiscal uma lista dos ratios fornecida pelo IBPT usada para calcular o total de imposto aproximado pago no cupom. Esta lista terá apenas os objetos alterados a partir da data passada. Método usado para sincronizar novos objetos nos terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no temrinal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os objetos mais novos que esta data. Se for nulo, retornamos todos os objetos.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;FiscalIBPTRatioVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPaymentListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPAYMENTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVPaymentVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVContractListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de contratos (convênios) para venda no caixa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVCONTRACTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVContractVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVTokenList ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_MO&lt;br /&gt;
|&amp;lt;PDVTokenMO&amp;gt; MO para filtrar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; para organizar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ATTRIBUTE&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Atributos que devem ser populados nos objetos da lista.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lockPDVToken ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser bloqueado&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; - Token bloqueado para edição&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== saveAndUnlockToken ====&lt;br /&gt;
Solicita do módulo PDV que salva uma comanda e a deixe desbloqueada para edição por outros terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SAVEANDUNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SAVEANDUNLOCKTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; Objeto representando o token a ser salvo e desbloqueado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SAVEANDUNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== unlockToken ====&lt;br /&gt;
Solicita do módulo PDV que desbloqueie uma comanda da edição.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|UNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_UNLOCKTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser desbloqueado da edição.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_UNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clearTokens ====&lt;br /&gt;
Solicita do módulo PDV que limpe e desbloqueie as comandas informadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CLEARTOKENS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CLEARTOKENS_TOKENS&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; Coleção de comandas a serem limpas e desbloqueadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CLEARTOKENS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCheckoutVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCheckoutVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCheckoutVO&amp;gt;&amp;gt; Coleção de checkouts para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCupomVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCupomVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCUPOMVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCupomVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCUPOMVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== syncDocFiscalVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos DocFiscalVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCDOCFISCALVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;DocFiscalVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCDOCFISCALVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVNFCeLastDocumentNumber ====&lt;br /&gt;
Solicita ao servidor que retorne o número do documento do último cupom emitido para uma determinada empresa e série da documento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCSERIAL&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da série do documento desejado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCNUMBER&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do último documento emitido para a empresa e na série solicitada.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findLocationCountryListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Países alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCountryVO&amp;gt; Retorna uma lista com todos os LocationCountryVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationStateListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Estados alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_IDCOUNTRY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do País que se deseja os estados.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de países para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationStateVO&amp;gt; Retorna uma lista com todos os LocationStateVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationCityListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_IDSTATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de estados para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCityVO&amp;gt; Retorna uma lista com todos os LocationCityVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationAddressListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_IDCITY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de cidade para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationAddressVO&amp;gt; Retorna uma lista com todos os LocationAddressVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== importSATXML ====&lt;br /&gt;
&lt;br /&gt;
Solicita ao servidor que importe um arquivo de XML do SAT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|IMPORTSATXML&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_IMPORTSATXML_XML&lt;br /&gt;
|&amp;lt;String&amp;gt; Conteúdo do arquivo XML a ser importado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_IMPORTSATXML&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getSEFAZStatus ====&lt;br /&gt;
&lt;br /&gt;
Recupera o status atual de comunicação com a SEFAZ (para emissão de NFe/NFCe).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETSEFAZSTATUS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SEFAZSTATUS&lt;br /&gt;
|&amp;lt;SEFAZStatusVO&amp;gt; Objeto SEFAZStatusVO com as informações solicitadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sendDocFiscalToEmission ====&lt;br /&gt;
&lt;br /&gt;
Envia um DocFiscal para o BIS Server emitir o documento fiscal com suas informações.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SENDDOCFISCALTOEMISSION&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_DOCFISCAL&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO com as informações necessárias da venda para finalização e emissão de do cupom fiscal pelo BISServer.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SENDDOCFISCALTOEMISSION_DOCFISCAL&lt;br /&gt;
|&amp;lt;DocFiscalVO&amp;gt; Objeto DocFiscalVO retornado com o cupom e dados completo.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1672</id>
		<title>BISModulesSocket</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1672"/>
		<updated>2025-11-23T13:36:37Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* importSATXML */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
O BISModulesSocket é como uma pequena biblioteca que facilita a comunicação entre terminais (aplicações externas ao servidor de aplicações) e o BISCore e BISModules. Desenvolvido apenas com Java e Sockets (implementado em cima do [[BISSocket]]), pode ser usado para realizar chamadas e comunicar com o sistema sem a necessidade de utilizar bibliotecas RMI/JNDI ou outras mais complexas de integração.&lt;br /&gt;
&lt;br /&gt;
== Funcionamento ==&lt;br /&gt;
O lado servidor será &amp;quot;levantado&amp;quot; junto com o plugin. A partir deste momento o servidor já estará escutando a porta e aguardado conexão dos terminais.&lt;br /&gt;
&lt;br /&gt;
A utilização é simples:&lt;br /&gt;
# Cria uma instância do BISModulesSocketClient, passe no construtor o host e a porta do servidor BISERP para que o cliente conecte-se;&lt;br /&gt;
# Chama os métodos passando os atributos desejados e aguarde pela resposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo entre BISModulesSocketClient e BISModulesSocketServer ==&lt;br /&gt;
&lt;br /&gt;
Abaixo estão listados os comandos utilizados atualmente pelas duas classes para abstrair a comunicação. Para utilizar as classes não é necessário se familiarizar com o protocolo, apenas para manutenção e implementação das mesmas.&lt;br /&gt;
&lt;br /&gt;
{{stop|Chamada Pela Fachada|Quando o BISModulesSocketServer faz o repasse da chamada dos métodos na parte do Core (do BIS ou dos Plugins), deve sempre chamar a fachada de acesso. Para que o servidor de aplicações instancie as transações e o Interceptor da fachada possa fazer seu trabalho.&lt;br /&gt;
Uma chamada direta ao CRUD pode funcionar em alguns casos, mas com certeza desabilitará o [[BISLogger]], as transações dos EJBs e outros serviços oferecidos pelo servidor de aplicação.}}&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Serviço do BISModulesSocket ===&lt;br /&gt;
&lt;br /&gt;
==== serverTime ====&lt;br /&gt;
Recupera o horário do Servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Número qualquer para identificar a requisição. O mesmo valor é retornado na resposta.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_TIME&lt;br /&gt;
|&amp;lt;Long&amp;gt; System.currentTimeMillis() do servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Exatamente mesmo valor recebido na requisição, mesmo que null.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISCore ===&lt;br /&gt;
&lt;br /&gt;
==== getProperty ====&lt;br /&gt;
Busca no servidor uma propriedade do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETPROPERTY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_PROPERTY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Propriedade a ser recuperada no servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_VALUE&lt;br /&gt;
|String - Valor da propriedade do sistema, null caso a propriedade tenha o valor nulo ou não tenha sido encontrado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETPROPERTY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== hasPermissionKey ====&lt;br /&gt;
Envia para o servidor a autenticação de um usuário e uma chave de segurança para saber se o usuário tem acesso para a chave passada. Note que, seguindo a funcionalidade do Kernel, o método lança exception caso a autenticação falhe, caso o usuário não tenha autorização o retorno será false.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|HASPERMISSIONKEY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_ACCESSKEY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Chave de acesso para questionar.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_RESPONSE&lt;br /&gt;
|Boolean - True caso o usuário tenha acesso a chave, false caso contrário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_HASPERMISSIONKEY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== postBISLog ====&lt;br /&gt;
Envia para o servidor um registro de LOG para ser salvo. Como não há como ter um controle de sincronia de objeto (um ID local como nos objetos do PDV), casa post gerará um objeto novo no servidor. Por isso é preciso controlar os posts pelo lado do cliente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|POSTBISLOG&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_POSTBISLOG_BISLOGOBJ&lt;br /&gt;
|&amp;lt;BISLogVO&amp;gt; - Objeto completo com o registro de erro pronto para ser cadastrado no sistema.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_POSTBISLOG&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== notifyActiveSupport ====&lt;br /&gt;
Este método força o envio de uma mensage para o sistema de suporte ativo do BISERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|NOTIFYACTIVESUPPORT&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_NOTIFYACTIVESUPPORT_MSG&lt;br /&gt;
|&amp;lt;String&amp;gt; - Mensagem a ser enviada para o suporte.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_NOTIFYACTIVESUPPORT&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findBISCertificateList ====&lt;br /&gt;
Busca uma lista de certificados do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_MO&lt;br /&gt;
|&amp;lt;BISCertificateMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELISTLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;BISCertificateVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findCompanyList ====&lt;br /&gt;
Busca uma lista de empresas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_MO&lt;br /&gt;
|&amp;lt;CompanyMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;CompanyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findUserList ====&lt;br /&gt;
Busca uma lista de usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_MO&lt;br /&gt;
|&amp;lt;UserMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;UserVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== createNewTokenToUser ====&lt;br /&gt;
Solicita ao servidor que gere um novo token para o usuário passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requsição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_TOKEN&lt;br /&gt;
|&amp;lt;String&amp;gt; - Token recém criado para o usuário.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISModules ===&lt;br /&gt;
&lt;br /&gt;
==== registerTerminal ====&lt;br /&gt;
Faz o registro do terminal no servidor do BIS. Necessário para que o BIS reconheça esse terminal e possa gerencia-lo adequadamente, como sincronizar dados, conhecer status, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_UNIQUEID&lt;br /&gt;
|&amp;lt;String&amp;gt; - ID do terminal. String gerada que deve ser única par o terminal. Normalmente usado o macaddress da máquina por já ser uma númeração única.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID Gerado pelo servidor que passará a identificar o terminal no servidor&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVItemListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os itens mais novos que esta data. Se for nulo, retornamos todos os itens.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVItemVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPropertiesListToSync ====&lt;br /&gt;
&lt;br /&gt;
Solicita do módulo PDV uma lista das propriedades de configuração para o aplicativo BISPDV definidas para uma determinada empresa. Esta lista terá trará todas as propriedades com o prefixo &amp;quot;br.com.biserp.bismodules.pdv.pdvapp.centralconfig&amp;quot; e no sufixo o ID da empresa separado por um &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPROPERTIESLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PropertyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findFiscalIBPTRatiosListToSync ====&lt;br /&gt;
Solicita do módulo Fiscal uma lista dos ratios fornecida pelo IBPT usada para calcular o total de imposto aproximado pago no cupom. Esta lista terá apenas os objetos alterados a partir da data passada. Método usado para sincronizar novos objetos nos terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no temrinal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os objetos mais novos que esta data. Se for nulo, retornamos todos os objetos.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;FiscalIBPTRatioVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPaymentListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPAYMENTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVPaymentVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVContractListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de contratos (convênios) para venda no caixa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVCONTRACTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVContractVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVTokenList ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_MO&lt;br /&gt;
|&amp;lt;PDVTokenMO&amp;gt; MO para filtrar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; para organizar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ATTRIBUTE&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Atributos que devem ser populados nos objetos da lista.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lockPDVToken ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser bloqueado&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; - Token bloqueado para edição&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== saveAndUnlockToken ====&lt;br /&gt;
Solicita do módulo PDV que salva uma comanda e a deixe desbloqueada para edição por outros terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SAVEANDUNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SAVEANDUNLOCKTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; Objeto representando o token a ser salvo e desbloqueado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SAVEANDUNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== unlockToken ====&lt;br /&gt;
Solicita do módulo PDV que desbloqueie uma comanda da edição.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|UNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_UNLOCKTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser desbloqueado da edição.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_UNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clearTokens ====&lt;br /&gt;
Solicita do módulo PDV que limpe e desbloqueie as comandas informadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CLEARTOKENS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CLEARTOKENS_TOKENS&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; Coleção de comandas a serem limpas e desbloqueadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CLEARTOKENS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCheckoutVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCheckoutVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCheckoutVO&amp;gt;&amp;gt; Coleção de checkouts para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCupomVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCupomVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCUPOMVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCupomVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCUPOMVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== syncDocFiscalVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos DocFiscalVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCDOCFISCALVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;DocFiscalVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCDOCFISCALVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVNFCeLastDocumentNumber ====&lt;br /&gt;
Solicita ao servidor que retorne o número do documento do último cupom emitido para uma determinada empresa e série da documento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCSERIAL&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da série do documento desejado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCNUMBER&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do último documento emitido para a empresa e na série solicitada.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findLocationCountryListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Países alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCountryVO&amp;gt; Retorna uma lista com todos os LocationCountryVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationStateListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Estados alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_IDCOUNTRY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do País que se deseja os estados.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de países para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationStateVO&amp;gt; Retorna uma lista com todos os LocationStateVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationCityListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_IDSTATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de estados para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCityVO&amp;gt; Retorna uma lista com todos os LocationCityVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationAddressListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_IDCITY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de cidade para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationAddressVO&amp;gt; Retorna uma lista com todos os LocationAddressVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== importSATXML ====&lt;br /&gt;
&lt;br /&gt;
Solicita ao servidor que importe um arquivo de XML do SAT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|IMPORTSATXML&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_IMPORTSATXML_XML&lt;br /&gt;
|&amp;lt;String&amp;gt; Conteúdo do arquivo XML a ser importado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_IMPORTSATXML&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== getSEFAZStatus ====&lt;br /&gt;
&lt;br /&gt;
Recupera o status atual de comunicação com a SEFAZ (para emissão de NFe/NFCe).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETSEFAZSTATUS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETSEFAZSTATUS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SEFAZSTATUS&lt;br /&gt;
|&amp;lt;SEFAZStatusVO&amp;gt; Objeto SEFAZStatusVO com as informações solicitadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1671</id>
		<title>Módulo Item</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1671"/>
		<updated>2025-11-20T13:42:53Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Fator de Conversão na Prática */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo &#039;&#039;&#039;Item&#039;&#039;&#039; é o módulo responsável por cadastrar os itens de consumo, produtos de revenda, fabricação própria para venda ou consumo, etc. Este módulo oferecerá um cadastro com controle de preços, markups, custos, entre outras funcionalidades que servirão de suporte para diversos outros módulos, como PDV, Controle de Estoques, Base de Custos para Planilhas de Cálculos, etc.&lt;br /&gt;
&lt;br /&gt;
Para oferecer todo o conceito o módulo é dividido nos seguintes cadastros:&lt;br /&gt;
&lt;br /&gt;
= Categoria do Item =&lt;br /&gt;
&lt;br /&gt;
A categoria do item tem a finalidade de organizar e agrupar os itens de acordo com suas categorias. Mutias vezes a categoria é o corredor em que as mercadorias são agrupadas, como &amp;quot;Bazar&amp;quot;, &amp;quot;Açougue&amp;quot;, &amp;quot;Produtos de Limpeza&amp;quot;, etc. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Estrutura Hierárquica:&#039;&#039;&#039; As categorias são uma estrutura hierárquica, isto é, permite que uma categoria seja adiciona dentro da outra.&lt;br /&gt;
** &#039;&#039;&#039;Nomes Únicos &#039;por Pai&#039;:&#039;&#039;&#039; Os nomes das categorias são únicos dentro do mesmo pai. Em outras palavras, os nomes das categorias só podem se repetir se estiverem em pontos diferentes da estrutura hierárquica.&lt;br /&gt;
** &#039;&#039;&#039;Permite Itens:&#039;&#039;&#039; Esta opção define se os itens podem ser alocados nesta categoria ou não. Quando a opção estiver desmarcada nenhum código de item deverá ser definido nesta categoria. Esta função permite que um determinado tipo de item possa ser alocado nesta categoria, mas força que os itens tenham que ser alocados nas subcategorias.&lt;br /&gt;
** &#039;&#039;&#039;Congelamento de Preços:&#039;&#039;&#039; Este atributo define se os preços dos itens nesta categoria devem permanecer congelados quando forem editados ou houver uma entrada de NFe.&lt;br /&gt;
** &#039;&#039;&#039;Arredondamento de Preços:&#039;&#039;&#039; Permite definir uma regra de arredondamento dos preços de venda de todos os itens que estão nesta categoria. Uma vez definida, nenhum item deverá ter um preço diferente do arredondamento definido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Validar a estrutura de uso por Itens e Tipo de Itens quando a categoria pai for alterada.&#039;&#039;&#039; - A categoria pai de uma categoria não pode ser alterada se algum item estiver associado à ela ou à alguma subcategoria enquanto que o seu tipo de item aponta para a categoria pai. Em outras palavras, caso ao alterar a categoria de posição na hierarquia se não invalidará as condições do tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Hierarquia Cíclica.&#039;&#039;&#039; - Garantir que durante a atualização uma categoria não passa a apontar &amp;quot;como pai&amp;quot; uma categoria que está abaixo dela na hierarquia, criando um relacionamento cíclico.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se temos exatamente 1 ItemCategoryCompanyVO por Empresa&#039;&#039;&#039; - Validar se o temos exatamente 1 definição de dados por empresa. Não devemos ter nem duplicadas, nem faltando. (BUG: 270)&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Categoria de Item Sendo Usado Por Código do Item, Tipo do Item ou outra Categoria de Item&#039;&#039;&#039; - Antes de excluir uma categoria é preciso confirmar se ela não está em uso por outro objeto. Ela pode estar em uso por um código de item (verificar se o Item está ativo), ser referenciada pelo Tipo de Item (também verificar se o mesmo está ativo) ou ser pai de outra categoria (que também precisa verificar se ainda esta ativa). Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Markup, Congelamento de Preços e Arredondamento de Preços são Obrigatórios quando a Categoria permite que itens sejam adicionados.&#039;&#039;&#039; - Validar se estão preenchidos quando a categoria permitir itens, validar se estão nulos quando a categoria não permitir itens. Quando a categoria não permitir itens, o campo MarkUp Mínimo também deve ser nulo.&lt;br /&gt;
&lt;br /&gt;
= Tipo do Item =&lt;br /&gt;
&lt;br /&gt;
O tipo do item tem a finalidade de agrupar todos os itens de um mesmo tipo. Entende-se por tipo de produto &amp;quot;o que o produto é&amp;quot;, por exemplo: Refrigerante, Água, Suco, Pasta de Dente, Pão de Queijo, etc. Não faz parte do tipo a marca, embalagem, quantidades etc. Marca, quantidade, códigos, preços, etc. são parte do cadastro do Iten e não do tipo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo do Item:&#039;&#039;&#039; O nome do tipo de item é usado para identificar o cadastro. Deve ser único.&lt;br /&gt;
** &#039;&#039;&#039;Prefixo:&#039;&#039;&#039; O prefixo é um &amp;quot;começo&amp;quot; da descrição, que será usada em todos os itens desse mesmo tipo. Ao forçar que todos os itens comecem com o mesmo prefixo ajuda na organização do cadastro do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;Descrição de Exemplo: &#039;&#039;&#039; Cada tipo de item deve ter um espaço para orientar o usuário sobre quais as informações importantes para aquele tipo de produto, além de definir a ordem em que devem aparecer.&lt;br /&gt;
** &#039;&#039;&#039;Associação com Aliquota ICMS:&#039;&#039;&#039; No tipo do item devemos definir qual a alíquota de tributação do ICMS que deverá ser utilizada em todos os itens desse tipo. Centralizando e simplificando as configurações.&lt;br /&gt;
** &#039;&#039;&#039;Associação com As categorias:&#039;&#039;&#039; Cada tipo de item deve associar no mínimo uma categoria de itens. Cada item deste tipo deverá associar seus códigos nessas categorias ou suas subcategorias. O tipo de item pode permitir associação com mais de um &amp;quot;nó&amp;quot; da hierarquia da categoria. Permitindo assim que itens do mesmo tipo possam ser lançados em categorias diferentes. Como por exemplo um refrigerante com um código lançado na categoria de &amp;quot;Geladeiras/Loja&amp;quot; e outro código em &amp;quot;Restaurante/SelfService&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Categoria em Uso por Itens continua Disponível&#039;&#039;&#039; - Quando um tipo de item é alterado, é preciso validar se os itens desse tipo atualmente cadastrados não ficarão inválidos caso a categoria não esteja mais associada ao tipo de item. Ou seja, quando um item associado a esse tipo de item já estiver utilizando determinada categoria ela não pode ser excluída do tipo de item. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Alteração do Prefixo reflete nos itens existentes&#039;&#039;&#039; - Caso o prefixo seja alterado, todos os itens deste tipo de item devem ter seu nome atualizado de acordo com o novo prefixo. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Verifica Definições de Impostos para cada empresa&#039;&#039;&#039; - Verifica a definição dos impostos para cada empresa existente.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Tipo e Alíquota no ECF igual à Alíquota Efetiva&#039;&#039;&#039; - Verifica se o tipo do ICMS definido no tipo de item e a alíquota efetiva do do cálculo é coerente com os valores cadastrados no objeto ICMSVO, usado no momento de venda do ECF.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Natureza da Receita e Tabela são obrigatórios para os CSTs 02, 03, 04, 05, 06, 07, 08 e 09&#039;&#039;&#039; - Para todos esses CSTs, os campos de Natureza da Receita e Tabela ser validado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Verificar se a tabela é valida para o CST de Saída informado&#039;&#039;&#039; - Quando a tabela é informada, ela deve ser coerente com o código do CST de saída informado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Verificar se o Natureza é válida para a Tabela informada&#039;&#039;&#039; - Ao informar um código da Natureza da Receita o BIS deve verificar se o código da Receita é válido para a tabela sendo usada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Tipo de Item Sendo Usado no Momento&#039;&#039;&#039; - Antes de excluir o tipo de item é preciso verificar se ele não está em uso no momento. Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
&lt;br /&gt;
= ICMS =&lt;br /&gt;
&lt;br /&gt;
O objeto ICMS é a definição das alíquotas de ICMS utilizadas pelos Itens/Tipo de Itens. As alíquotas devem ser cadastradas conforme as alíquotas que a empresa utiliza.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo de Alíquota&#039;&#039;&#039; - As alíquotas podem ser de 3 tipos diferentes: Isento, Substituição e Tributada.&lt;br /&gt;
** &#039;&#039;&#039;Alíquota&#039;&#039;&#039; - A alíquota é a percentagem usado para calcular o valor do tributo. A alíquota quando definida é um valor positivo.&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - As alíquotas devem ter um nome que facilite a identificação da alíquota para o usuário. Este nome deve ser único.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Definição Obrigatória da Alíquota quando o tipo for Tributado&#039;&#039;&#039; - A definição da alíquota é obrigatória sempre que o tipo for Tributada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Não definição da Alíquota para os tipos Isento e Substituição.&#039;&#039;&#039; - Para os tipos Isento e Substituição o valor da alíquota devem estar nulos.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Em uso por algum tipo de item&#039;&#039;&#039; - durante a tentativa de exclusão, verificar se o ICMS não está em uso atualmente por algum Tipo de Item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ItemCodeGroup =&lt;br /&gt;
&lt;br /&gt;
O Grupo de Código de Item tem a finalidade de agrupar diferentes códigos de itens e fazer com que SEMPRE tenham o mesmo preço de venda. Independente de custo, categorias markups, arredondamentos, etc. Uma vez que um preço de venda de um item for alterado, os demais vão segui-lo fielmente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - Tudo grupo de código deve ter um nome para facilitar a identificação dos itens que fazem parte do grupo.&lt;br /&gt;
** &#039;&#039;&#039;Lista de Còdigos&#039;&#039;&#039; - Dentro de um mesmo grupo podem ser associados 0+ códigos de itens. Códigos de um mesmo item podem fazer parte do mesmo grupo.&lt;br /&gt;
** &#039;&#039;&#039;Sempre o mesmo preço de venda&#039;&#039;&#039; - Independente das diferentes configurações que um código de item pode ter dentro do mesmo grupo, como diferentes categorias, MarkUps, Custos, definições de arredondamento, package ratios, etc.. O preço de venda de todos os itens do grupo devem ter exatamente o mesmo valor. Mesmo que para isso tenha que desrespeitar qualquer outra regra do sistema (como arredondamento, ou cálculo de package, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Códigos de Itens já associados a outros grupos&#039;&#039;&#039; - Durante a inserção ou atualização, um grupo não deve permitir que um código de item já associado à outro grupo seja associado a este. Em outras palavras, um código de item não pode estar associado em mais de um grupo ao mesmo tempo.&lt;br /&gt;
&lt;br /&gt;
= Item = &lt;br /&gt;
&lt;br /&gt;
A entidade Item representa um produto qualquer da empresa. Esse produto por ser um insumo, uma matéria prima ou um produto de venda (ou revenda).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Fixação do prefixo da descrição de acordo com o tipo do Item&#039;&#039;&#039; - Todo item deve ser de algum &#039;&#039;Tipo de Item&#039;&#039;. Uma vez que o tipo de item esteja definido, a descrição do item obrigatoriamente deve começar com o valor do &#039;&#039;Prefixo&#039;&#039; definido no &#039;&#039;Tipo de Item&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Obrigatoriedade da Marca ou da Descrição&#039;&#039;&#039; - Todo item deve ter preenchidos no mínimo um dos campos &#039;&#039;Marca&#039;&#039; ou &#039;&#039;Descrição&#039;&#039;. Mesmo para produtos de fabricação própria, é recomendável definir a marca da empresa por questões de organização dos itens. Caso nenhum dos dois seja preenchido a descrição pode acabar sendo apenas o &#039;&#039;Prefixo&#039;&#039; do &#039;&#039;Tipo de Item&#039;&#039;. Para Itens &amp;quot;genéricos&amp;quot;, cuja marca não importa, pois em cada momento uma marca diferente é comprada ou usada, a marca não é necessária, mas uma descrição sim.&lt;br /&gt;
** &#039;&#039;&#039;Dimensão e Unidade de Medida Padrão&#039;&#039;&#039; - Todo item tem uma dimensão (Massa, Unidades, Volume, Cumprimento, etc.) e uma unidade de medida (Kg, Unidades, Litros, Metros, etc.) a que se refere o item. Essa unidade ajuda identifica a unidade de quantização padrão desse item. A unidade em que por padrão esse item é comprado, vendido e movimentado. Outras unidades diferentes para movimentar o mesmo item podem ser definidas em códigos diferentes.&lt;br /&gt;
** &#039;&#039;&#039;Custo&#039;&#039;&#039; - Todo Item tem um custo único padrão. Esse custo é sempre o mesmo, independente da empresa.&lt;br /&gt;
** &#039;&#039;&#039;Códigos dos Itens:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Múltiplos Códigos&#039;&#039;&#039; - Cada item pode ter mais que um código definido, ou seja, uma lista de códigos. Códigos são a maneira definir um modo quantidade, preço de venda, pacote, etc. de um determinado Item. Normalmente tem uma identificação única (e normalmente numérica, embora não obrigatória) para ser referenciada em terminais, notas, códigos de barras, etc. No entanto a identificação única não deve ser obrigatória. Um item pode ter um código para definir uma determinada quantidade de movimentação de entrada ou saída, ou simplesmente para definir uma nova unidade de medida. Por exemplo, produtos identificados hora por Kilos hora por Unidades.&lt;br /&gt;
*** &#039;&#039;&#039;Categoria do Item&#039;&#039;&#039; - De acordo com o &#039;&#039;Tipo de Item&#039;&#039; definido no Item, cada código do item deverá ser alocado em uma das categorias definidas no &#039;&#039;Tipo de Item&#039;&#039;. Apesar de ser o mesmo código, cada um pode gerar venda em uma categoria diferente, ou utilizar o MarkUp diferentes de acordo com o definido em cada categoria.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Validar requisito de Obrigatoriedade entre Marca e Descrição&#039;&#039;&#039; - Um dos campos deve sempre ser preenchido.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Validar inconsistência entre Fabricação do Produto e Origem do Item&#039;&#039;&#039; - Se o produto for de fabricação própria, ele não pode ter uma das opções de importado definida em Origem do Item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Validar finalidade do item&#039;&#039;&#039; - Todo item deve ter no mínimo 1 finalidade definida em seu cadastro.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Preenchimento completo dos pesos e volumes das embalagens&#039;&#039;&#039; - Se algum campo for preenchido, ele deve ser preenchido por completo! Por exemplo, se o &amp;quot;Peso Drenado&amp;quot; for definido, obrigatoriamente sua unidade de medida deve ser preenchida, o mesmo para o caso contrário: se a unidade for definida, a quantidade também deverá ser!&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Não permite que um Item tenha dois códigos iguais definidos&#039;&#039;&#039; - Validar se o código sendo inserido/alterado não tem definido duas vezes o mesmo código.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Os códigos de item só podem ser associados às categorias definidas no tipo de item&#039;&#039;&#039; - Validar se a categoria enviada no ItemCodeVO é uma das categorias disponibilizadas no ItemTypeVO associado ao ItemVO. Os códigos ficam limitados a usarem apenas as categorias permitidas de acordo com o tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se a Categoria do Item permite a associação dos itens&#039;&#039;&#039; - Os códigos de itens não podem ser associados às categorias que não permitem a associação de itens.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Validar Finalidade do Item&#039;&#039;&#039; - O campo de finalidade não pode ter alguns alguns valores de acordo os valores definidos nos outros campos, conforme as seguintes regras:&lt;br /&gt;
*** &#039;&#039;&#039;Revenda:&#039;&#039;&#039; Não pode ser definido quando o produto for de &#039;&#039;&#039;Fabricação Própria&#039;&#039;&#039;.&lt;br /&gt;
*** &#039;&#039;&#039;Produto Acabado:&#039;&#039;&#039; Não pode ser definido quando o produto for &#039;&#039;&#039;Produzido por Terceiros&#039;&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;[ve0009] Valida Item Próprio em Tipo de Substituição&#039;&#039;&#039; - Valida se o Item é de produção própria e está em um tipo de item com a tributação de ICMS definida como Substituição Tributária.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Descrição do Item&#039;&#039;&#039; - Valida se a descrição do item é única entre os itens ativos no momento.&lt;br /&gt;
** &#039;&#039;&#039;[ve0011] Itens de Revenda não podem ser Descartáveis&#039;&#039;&#039; - Valida se o item tiver o propósito como revenda, não permite que seja do tipo descartável.&lt;br /&gt;
&lt;br /&gt;
== Pacotes / Equivalência de Unidades ==&lt;br /&gt;
&lt;br /&gt;
Um único item (&amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;) do sistema pode ter diversos código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), chamados de pacotes. A ideia de pacotes é que o mesmo item possa ser vendidos em proporções ou embalagens diferentes, por exemplo, mini-coxinhas podem ser vendidas ao centro, por unidade, por quilo ou empacotadas em bandeijas.&lt;br /&gt;
&lt;br /&gt;
Para resolver essa questão o item apresenta uma &#039;&#039;&#039;Régua de Equivalência&#039;&#039;&#039;, que estabelece a relação de proporção de quantidades entre as diferentes gandezas. Por exemplo, define-se que a 1Und tem 30g e que 1 Bandeija tem 30 unidades. Deste ponto em diante o sistema saberá vender o item em bandeijas, unidades (e suas variações como pares, dúzias, etc.) ou quilo (e suas variações como gramas, toneladas, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Embora um item possa trabalhar com diferentes sistemas de unidades de medidas, uma unidade de medida principal e imutável é atribuída ao item. Esta unidade é a utilizada pelo sistema para concentrar as quantidades de estoque, relatórios de quantidade de vendas, etc.. Deve ser a unidade de medida que a empresa costuma utilizar no seu dia a dia para contabilizar os itens. Muitas vezes é considerada a menor unidade divísivel do item para evitar trabalhar com frações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão de Quantidade ===&lt;br /&gt;
&lt;br /&gt;
Um conceito presa ser definido neste ponto: para efeitos de cálculo, criamos o &#039;&#039;&#039;Fator de Conversão de Quantidade&#039;&#039;&#039; (&#039;&#039;&#039;Quantity Conversion Factor&#039;&#039;&#039;) ou &#039;&#039;&#039;qcFactor&#039;&#039;&#039;. Esse fator representa o multiplicador necessário para transformar a quantidade de um código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;) na quantidade equivalente do item (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), considerando suas unidades de medida e quantidade do pacote.&lt;br /&gt;
&lt;br /&gt;
Esse fator é obtido a partir da seguinte equação verdade:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;qtyItemVO = qcFactor * qtyItemCodeVO&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou sua equivalente:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;qtyItemCodeVO = qtyItemVO / qcFactor&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Em palavras...|Com o &#039;&#039;&#039;qcFactor&#039;&#039;&#039;  na mão, temos que: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;cada unidade vendida do código equivale &amp;quot;X&amp;quot; unidades vendidas do item&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
ou mais precisamente: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;cada unidade vendida do código equivale &amp;quot;qcFactor&amp;quot; unidades vendidas do item&#039;&#039;&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assim, o valor de &#039;&#039;&#039;qcFactor&#039;&#039;&#039; é definido da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;fatorCQ = unitRatio * packageRatio&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde:&lt;br /&gt;
* &#039;&#039;&#039;unitRatio&#039;&#039;&#039; - É a razão entre os fatores das unidades de medida do código e da unidade principal.&lt;br /&gt;
:* &#039;&#039;&#039;Exemplo:&#039;&#039;&#039; A unidade principal é Kilograma, e a do código é Gramas. Se o fator de Kilograma é 1, a de gramas será 1000, representando que 1Kg = 1000g. Neste caso &#039;&#039;&#039;unitRatio = 1/1000 = 0,001&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;packageRatio&#039;&#039;&#039; - É a definição do usuário estabelecendo uma proporção de quantidade de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exemplo ====&lt;br /&gt;
&lt;br /&gt;
O cadastro de &#039;&#039;&#039;Mini Coxinhas&#039;&#039;&#039; produzida pela empresa estabelece o seguinte:&lt;br /&gt;
* &#039;&#039;&#039;Unidade Principal:&#039;&#039;&#039; Definido em Kilos, pois o usuário entende que Kilos é a unidade mais usual para trabalhar (controlar estoque, custo, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Relações de Grandezas:&#039;&#039;&#039; Para cobrir seus diferentes métodos de venda o usuário estabelece a seguinte relação de Grandezas:&lt;br /&gt;
:* &#039;&#039;&#039;1 Und = 30g&#039;&#039;&#039; - Define que 1 unidade de Mini Coxinha tem o tamanho de 30g.&lt;br /&gt;
:* &#039;&#039;&#039;1 Bandeja = 2 Dúzia&#039;&#039;&#039; - A unidade personalizada Bandeija equivale a 1 dúzia.&lt;br /&gt;
* &#039;&#039;&#039;Códigos de Vendas:&#039;&#039;&#039;&lt;br /&gt;
:* &#039;&#039;&#039;1 - Venda por Kilo:&#039;&#039;&#039; - Neste código o usuário define o tamanho do pacote em 1, a unidade &#039;Kilogram&#039; e que o códigio é divisível.&lt;br /&gt;
:* &#039;&#039;&#039;2 - Venda por Cento:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Centro&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;3 - Venda por Unidade:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Unidade&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;4 - Venda por Bandeija:&#039;&#039;&#039; - Aqui, define o tamanho do pacote em 2, a unidade em &#039;Bandeija&#039; e que o código é indivisível.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em relação ao código para trabalhar com essas informações vamos dividir em partes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{java|Preparação da Régua e Definições|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // Utilizamos a classe MeasureUtil para facilitar a criação da Régua e medidas&lt;br /&gt;
    MeasureRulerVO rulerVO = MeasureUtil.createSimpleMeasureRulerVO(BigDecimal.ONE, WEIGHTUNIT.KILOGRAM); // Cria a régua com a unidade principal, estabelecendo a razão 1&lt;br /&gt;
    MeasureUtil.fillSmartRuler(rulerVO, BigDecimal.ONE, UNITUNIT.UNIT, new BigDecimal(&amp;quot;30&amp;quot;), WEIGHTUNIT.GRAM); // Estabelece que 1 unidade = 30 gramas&lt;br /&gt;
&lt;br /&gt;
    // Unidade de medida personalizada, oferecida pelo sistema&lt;br /&gt;
    MeasureCustomVO measureCustomVO = new MeasureCustomVO();&lt;br /&gt;
    measureCustomVO.setCode(&amp;quot;BDJ&amp;quot;);&lt;br /&gt;
    measureCustomVO.setDescription(&amp;quot;Bandeja&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Estabelece a relação da unidade personalizada com uma unidade presente na régua: 1BDJ = 1Dúzia&lt;br /&gt;
    MeasureEquivalenceVO equiVO = new MeasureEquivalenceVO();&lt;br /&gt;
    equiVO.setMeasureCustomVO(measureCustomVO);&lt;br /&gt;
    equiVO.setReferencequantity(new BigDecimal(&amp;quot;2&amp;quot;));&lt;br /&gt;
    equiVO.setReferenceunit(UNITUNIT.DOZEN);&lt;br /&gt;
    equiVO.setMeasurerulervo(rulerVO);&lt;br /&gt;
    rulerVO.getMeasurerulerequivalencelist().add(equiVO);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que passamos as definições de proporções do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; para a &amp;lt;code&amp;gt;MeasureRulerVO&amp;lt;/code&amp;gt;, conseguimos calcular o &#039;&#039;&#039;qcFactor&#039;&#039;&#039; facilmente com o método &amp;lt;code&amp;gt;MeasureUtil.convertTo(...)&amp;lt;/code&amp;gt;. Para o cadastro exemplo acima:&lt;br /&gt;
&lt;br /&gt;
{{java|Cálculo do qcFactor:|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    WEIGHTUNIT itemVOUnit = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 1 - Kilo&lt;br /&gt;
    WEIGHTUNIT itemCodeVOUnit1 = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
    BigDecimal packageRatio1 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor1 = MeasureUtil.convertTo(rulerVO, packageRatio1, itemCodeVOUnit1, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 1:&amp;quot; + qcFactor1); // Saída: 1.0000000000&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 2 - Cento&lt;br /&gt;
    UNITUNIT itemCodeVOUnit2 = UNITUNIT.CENT;&lt;br /&gt;
    BigDecimal packageRatio2 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor2 = MeasureUtil.convertTo(rulerVO, packageRatio2, itemCodeVOUnit2, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 2:&amp;quot; + qcFactor2); // Saída: 3.0000300003 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 3 - Unidade&lt;br /&gt;
    UNITUNIT itemCodeVOUnit3 = UNITUNIT.UNIT;&lt;br /&gt;
    BigDecimal packageRatio3 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor3 = MeasureUtil.convertTo(rulerVO, packageRatio3, itemCodeVOUnit3, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 3:&amp;quot; + qcFactor3); // Saída: 0.0300003000 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 4 - Bandeja&lt;br /&gt;
    // A unidade de medida personalizada precisa ser encapsulada com o MeasureEquivalenceBean para utilizar na MeasureUtil.&lt;br /&gt;
    MeasureEquivalenceBean itemCodeVOUnit4 = new MeasureEquivalenceBean();&lt;br /&gt;
    itemCodeVOUnit4.setEquiVO(equiVO);&lt;br /&gt;
    BigDecimal packageRatio4 = new BigDecimal(&amp;quot;1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor4 = MeasureUtil.convertTo(rulerVO, packageRatio4, itemCodeVOUnit4, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 4:&amp;quot; + qcFactor4); // Saída: 0.7200072001 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão na Prática ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para calcular o custo do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; a partir do custo de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;, precisamos considerar as definições de pacote e unidade de medida como visto no cálculo do &#039;&#039;&#039;Fator de Conversão de Quantidade&#039;&#039;&#039; acima. Devemos considerar que o &#039;&#039;&#039;custo por unidade de medida&#039;&#039;&#039; de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; e de &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; são os mesmos, apenas proporcionais às suas unidades de medida e quantidades de pacote, podemos utilizar o mesmo &#039;&#039;&#039;qcFactor&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A única questão é que são grandezas proporcionalmente invertidas, ou seja, &#039;&#039;&#039;quando maior a quantidade menor o custo&#039;&#039;&#039;&#039;&#039; e vice-versa. No exemplo acima da Mini Coxinha, imaginemos que o o custo do Kilo seja de R$ 10,00. A unidade, que pesa 30g, teria um custo por unidade de R$ 0,30. Estabelecemos acima que o &#039;&#039;&#039;qcFactor&#039;&#039;&#039; da unidade é &#039;&#039;&#039;0.0300003000&#039;&#039;&#039;. Ao multiplicar a quantidade de &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; pelo &#039;&#039;&#039;qcFactor&#039;&#039;&#039; chegamos na quantidade equivalente do &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;, neste caso, se temos o custo de &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; teriamos que dividí-lo pelo mesmo &#039;&#039;&#039;qcFactor&#039;&#039;&#039; para chegar no custo de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;. E na operação inversa, podemos multiplicar o custo de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; para chegar o custo de &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;. O que podemos resumir na seguinte tabela de conversão:&lt;br /&gt;
&lt;br /&gt;
* ItemCodeVO.cost = ItemVO.cost * qcFactor&lt;br /&gt;
* ItemCodeVO.quantity = ItemVO.quantity / qcFactor&lt;br /&gt;
&lt;br /&gt;
E sua inversão:&lt;br /&gt;
* ItemVO.cost = ItemCodeVO.cost / qcFactor&lt;br /&gt;
* ItemVO.quantity = ItemCodeVO.quantity * qcFactor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Métodos Utilitários|A classe &amp;lt;code&amp;gt;ItemUtils&amp;lt;/code&amp;gt; contém métodos para autilizar na criação da régua, conversões e cálculo do &#039;&#039;&#039;qcFactor&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Convenção do qcFactor|&lt;br /&gt;
A definição do fator de conversão entre os objetos &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; e &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; foi criada desde o príncio do sistema, e comumente chamada de &#039;&#039;&#039;divider&#039;&#039;&#039;. No entanto nunca foi respeitado a &amp;quot;direção&amp;quot; desse fator, em &lt;br /&gt;
partes do código &#039;&#039;&#039;divider &amp;amp;equals; qcFactor&#039;&#039;&#039;, e, em outras, &#039;&#039;&#039;divider &amp;amp;equals; 1/qcFactor&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A criação da nomenclatura e definição dessa &amp;quot;direção&amp;quot; do fator tente a resolver essa confusão, facilitar a implementação e erros causados por essa misturança do cálculo em diferentes partes do sistema.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Divider&amp;quot; continua presente em partes do código pois ele não foi compeltamente revisado. Mas a medida que novos códigos sejam criados ou revisados, é esperado que a nomenclatura &#039;divider&#039; deixe de ser utilizada.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Definição do Preço de Venda ==&lt;br /&gt;
&lt;br /&gt;
Há vários fatores sobre a lógica de calcular definir um novo preço de venda. Como as políticas de arredondamento, congelamento de preço, replicação do preço para outros códigos do mesmo grupo, a movimentação de novos preços para histórico, etc.&lt;br /&gt;
&lt;br /&gt;
A ordem das operações lógicas a serem aplicadas sobre o ItemPriceVO devem ser conforme a ordem dos métodos listados abaixo. Cada método executa a operação a partir de um determinado ponto. Isso permite que diferentes eventos que causam a alteração do preço de venda possam acionar o ciclo a partir de diferentes pontos.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Define um Novo preço de Venda para um Código&#039;&#039;&#039; - O início do processo. Quando um novo preço de venda deve ser definido em um código de item. Este passo utiliza o valor recebido as as definições do próprio ItemCode para realizar toda a sequência lógica do preço de venda.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Definition()&#039;&#039;&#039; - Método responsável por carregar as informações do ItemCodeVO e iniciar o processo definição do novo preço de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicar Regras de Arredondamento&#039;&#039;&#039; - Dependendo das configurações da Categoria do Item definida no Código do Item, o preço precisará ser arredondado para respeitar essas políticas.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_RoundApply()&#039;&#039;&#039; - Este método recebe o valor do novo preço e a política de arredondamento para aplicar as regras de arredondamento. Uma vez aplicado os arredondamentos o valor será passado para o próximo método da cadeia (o &#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;) para a efetivação em todos os grupos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Aplicação da Política|Para centralizar o código de aplicação da política, a efetiva aplicação do arredondamento fica na classe utilitária &#039;&#039;&#039;ItemUtils&#039;&#039;&#039; no método &#039;&#039;&#039;applyRoundPricePolicy()&#039;&#039;&#039;. Podendo ser acessado de qualquer ponto, como classes da UI.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Disseminação do Preço de Venda pelo Grupo&#039;&#039;&#039; - Caso o &#039;&#039;ItemCode&#039;&#039; cujo preço de venda esteja sendo alterado faça parte de um grupo, este preço de venda deverá ser disseminado para todos os &#039;&#039;ItemCode&#039;&#039; do Grupo.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;&#039; - Avalia se o &#039;&#039;ItemCode&#039;&#039; cujo preço deve ser alterado faz parte de um grupo. Caso faça ele pesquisa todos os itens do grupo e chama o método &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; todos os envolvidos. Este método não faz qualquer processamento no valor, apenas verifica os códigos envolvidos no grupo e aplica o valor, congelado ou não conforme informado via parâmetros). O valor será aplicado a todos do grupo conforme recebido, &amp;quot;passando por cima&amp;quot; das configurações de arredondamento e políticas de congelamento de cada código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicação do Preço de Venda ao Objeto&#039;&#039;&#039; - Caso haja real alteração no ItemPriceVO uma cópia deve ser convertida para o ItemPriceHistoryVO e persistida. Por fim atualizar o ItemPriceVO na base de dados.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; - Método responsável por atualizar as definições sobre o preço de venda (ItemPriceVO) de um &#039;&#039;Código de Item&#039;&#039;. Este método recebe o novo valor, se o preço estará congelado, e outros atributos para identificação do ItemPriceVO correto (dependendo da assinatura). De acordo com os valores passados, este método avalia se haverá alteração das informações atuais, cria um novo objeto para o histórico de preços (ItemPriceHistoryVO) e salva os dados atuais. Em seguida faz as alterações necessárias ao ItemPriceVO e já o persiste no banco.&lt;br /&gt;
*: &#039;&#039;&#039;Este é (e deve continuar sendo) o único método que fará a atualização do ItemPriceVO no banco de dados!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eventos de Alteração do Preço de Venda ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cadastro/Alteração de Itens&#039;&#039;&#039; - Quando um item é cadastrado ou alterado ele tem definições de códigos e consequentemente de preços de vendas. Neste caso avaliamos as seguintes condições para cada código:&lt;br /&gt;
** &#039;&#039;&#039;Não tem um grupo associado&#039;&#039;&#039; - Se não tem um grupo adicionado, temos que definir e processar o preço completamente. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tem um grupo associado:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos definir novos valores para o código e para o grupo&#039;&#039;&#039; - Se devemos associar novos valores para este novo código e para o grupo em que ele vai entrar, processamos o valor deste código completamente, e como a associação ao grupo é feita antes da definição dos preços, a lógica do updateItemPrice fará a disseminação deste valor nos outros códigos do grupo quando chegar no passo &#039;&#039;_GroupDisseminate()&#039;&#039;. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos copiar o valor atual sendo praticado no grupo&#039;&#039;&#039; - Neste caso vamos buscar o valor de qualquer código do grupo (afinal devem ser todos iguais) e copiamos seus valores. Tanto o valor praticado, quanto um eventual valor que esteja congelado. Chama o &#039;&#039;&#039;_Apply()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Descongelar o Preço de Venda&#039;&#039;&#039; - Descongelar significa efetivar o preço que está congelado como o preço praticado para venda. Para evitar qualquer reprocessamento no valor, mas ainda assim garantir que o novo valor efetivo de venda será definido em todos os códigos do mesmo grupo este método chama o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Descartar Preço Congelado&#039;&#039;&#039; - Quando não queremos que o preço congelado entre em vigor podemos simplesmente descartar o preço congelado, e manter o código com o mesmo preço que já tinha. Neste caso queremos que todos os códigos do mesmo grupo descartem seu preço congelado e que continuem mantendo o preço já praticado. Para evitar o processamento dos valores mas ainda realizar a operação em todos os códigos do grupo chamamos o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:updateItemPriceFlow.png|frame|center|Diagrama do fluxo da lógica de alteração do preço de venda de um Código de Item. E entrada dos eventos que causam essas alterações.]]&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1670</id>
		<title>Módulo Item</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1670"/>
		<updated>2025-11-20T13:39:26Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Fator de Conversão de Custo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo &#039;&#039;&#039;Item&#039;&#039;&#039; é o módulo responsável por cadastrar os itens de consumo, produtos de revenda, fabricação própria para venda ou consumo, etc. Este módulo oferecerá um cadastro com controle de preços, markups, custos, entre outras funcionalidades que servirão de suporte para diversos outros módulos, como PDV, Controle de Estoques, Base de Custos para Planilhas de Cálculos, etc.&lt;br /&gt;
&lt;br /&gt;
Para oferecer todo o conceito o módulo é dividido nos seguintes cadastros:&lt;br /&gt;
&lt;br /&gt;
= Categoria do Item =&lt;br /&gt;
&lt;br /&gt;
A categoria do item tem a finalidade de organizar e agrupar os itens de acordo com suas categorias. Mutias vezes a categoria é o corredor em que as mercadorias são agrupadas, como &amp;quot;Bazar&amp;quot;, &amp;quot;Açougue&amp;quot;, &amp;quot;Produtos de Limpeza&amp;quot;, etc. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Estrutura Hierárquica:&#039;&#039;&#039; As categorias são uma estrutura hierárquica, isto é, permite que uma categoria seja adiciona dentro da outra.&lt;br /&gt;
** &#039;&#039;&#039;Nomes Únicos &#039;por Pai&#039;:&#039;&#039;&#039; Os nomes das categorias são únicos dentro do mesmo pai. Em outras palavras, os nomes das categorias só podem se repetir se estiverem em pontos diferentes da estrutura hierárquica.&lt;br /&gt;
** &#039;&#039;&#039;Permite Itens:&#039;&#039;&#039; Esta opção define se os itens podem ser alocados nesta categoria ou não. Quando a opção estiver desmarcada nenhum código de item deverá ser definido nesta categoria. Esta função permite que um determinado tipo de item possa ser alocado nesta categoria, mas força que os itens tenham que ser alocados nas subcategorias.&lt;br /&gt;
** &#039;&#039;&#039;Congelamento de Preços:&#039;&#039;&#039; Este atributo define se os preços dos itens nesta categoria devem permanecer congelados quando forem editados ou houver uma entrada de NFe.&lt;br /&gt;
** &#039;&#039;&#039;Arredondamento de Preços:&#039;&#039;&#039; Permite definir uma regra de arredondamento dos preços de venda de todos os itens que estão nesta categoria. Uma vez definida, nenhum item deverá ter um preço diferente do arredondamento definido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Validar a estrutura de uso por Itens e Tipo de Itens quando a categoria pai for alterada.&#039;&#039;&#039; - A categoria pai de uma categoria não pode ser alterada se algum item estiver associado à ela ou à alguma subcategoria enquanto que o seu tipo de item aponta para a categoria pai. Em outras palavras, caso ao alterar a categoria de posição na hierarquia se não invalidará as condições do tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Hierarquia Cíclica.&#039;&#039;&#039; - Garantir que durante a atualização uma categoria não passa a apontar &amp;quot;como pai&amp;quot; uma categoria que está abaixo dela na hierarquia, criando um relacionamento cíclico.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se temos exatamente 1 ItemCategoryCompanyVO por Empresa&#039;&#039;&#039; - Validar se o temos exatamente 1 definição de dados por empresa. Não devemos ter nem duplicadas, nem faltando. (BUG: 270)&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Categoria de Item Sendo Usado Por Código do Item, Tipo do Item ou outra Categoria de Item&#039;&#039;&#039; - Antes de excluir uma categoria é preciso confirmar se ela não está em uso por outro objeto. Ela pode estar em uso por um código de item (verificar se o Item está ativo), ser referenciada pelo Tipo de Item (também verificar se o mesmo está ativo) ou ser pai de outra categoria (que também precisa verificar se ainda esta ativa). Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Markup, Congelamento de Preços e Arredondamento de Preços são Obrigatórios quando a Categoria permite que itens sejam adicionados.&#039;&#039;&#039; - Validar se estão preenchidos quando a categoria permitir itens, validar se estão nulos quando a categoria não permitir itens. Quando a categoria não permitir itens, o campo MarkUp Mínimo também deve ser nulo.&lt;br /&gt;
&lt;br /&gt;
= Tipo do Item =&lt;br /&gt;
&lt;br /&gt;
O tipo do item tem a finalidade de agrupar todos os itens de um mesmo tipo. Entende-se por tipo de produto &amp;quot;o que o produto é&amp;quot;, por exemplo: Refrigerante, Água, Suco, Pasta de Dente, Pão de Queijo, etc. Não faz parte do tipo a marca, embalagem, quantidades etc. Marca, quantidade, códigos, preços, etc. são parte do cadastro do Iten e não do tipo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo do Item:&#039;&#039;&#039; O nome do tipo de item é usado para identificar o cadastro. Deve ser único.&lt;br /&gt;
** &#039;&#039;&#039;Prefixo:&#039;&#039;&#039; O prefixo é um &amp;quot;começo&amp;quot; da descrição, que será usada em todos os itens desse mesmo tipo. Ao forçar que todos os itens comecem com o mesmo prefixo ajuda na organização do cadastro do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;Descrição de Exemplo: &#039;&#039;&#039; Cada tipo de item deve ter um espaço para orientar o usuário sobre quais as informações importantes para aquele tipo de produto, além de definir a ordem em que devem aparecer.&lt;br /&gt;
** &#039;&#039;&#039;Associação com Aliquota ICMS:&#039;&#039;&#039; No tipo do item devemos definir qual a alíquota de tributação do ICMS que deverá ser utilizada em todos os itens desse tipo. Centralizando e simplificando as configurações.&lt;br /&gt;
** &#039;&#039;&#039;Associação com As categorias:&#039;&#039;&#039; Cada tipo de item deve associar no mínimo uma categoria de itens. Cada item deste tipo deverá associar seus códigos nessas categorias ou suas subcategorias. O tipo de item pode permitir associação com mais de um &amp;quot;nó&amp;quot; da hierarquia da categoria. Permitindo assim que itens do mesmo tipo possam ser lançados em categorias diferentes. Como por exemplo um refrigerante com um código lançado na categoria de &amp;quot;Geladeiras/Loja&amp;quot; e outro código em &amp;quot;Restaurante/SelfService&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Categoria em Uso por Itens continua Disponível&#039;&#039;&#039; - Quando um tipo de item é alterado, é preciso validar se os itens desse tipo atualmente cadastrados não ficarão inválidos caso a categoria não esteja mais associada ao tipo de item. Ou seja, quando um item associado a esse tipo de item já estiver utilizando determinada categoria ela não pode ser excluída do tipo de item. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Alteração do Prefixo reflete nos itens existentes&#039;&#039;&#039; - Caso o prefixo seja alterado, todos os itens deste tipo de item devem ter seu nome atualizado de acordo com o novo prefixo. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Verifica Definições de Impostos para cada empresa&#039;&#039;&#039; - Verifica a definição dos impostos para cada empresa existente.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Tipo e Alíquota no ECF igual à Alíquota Efetiva&#039;&#039;&#039; - Verifica se o tipo do ICMS definido no tipo de item e a alíquota efetiva do do cálculo é coerente com os valores cadastrados no objeto ICMSVO, usado no momento de venda do ECF.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Natureza da Receita e Tabela são obrigatórios para os CSTs 02, 03, 04, 05, 06, 07, 08 e 09&#039;&#039;&#039; - Para todos esses CSTs, os campos de Natureza da Receita e Tabela ser validado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Verificar se a tabela é valida para o CST de Saída informado&#039;&#039;&#039; - Quando a tabela é informada, ela deve ser coerente com o código do CST de saída informado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Verificar se o Natureza é válida para a Tabela informada&#039;&#039;&#039; - Ao informar um código da Natureza da Receita o BIS deve verificar se o código da Receita é válido para a tabela sendo usada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Tipo de Item Sendo Usado no Momento&#039;&#039;&#039; - Antes de excluir o tipo de item é preciso verificar se ele não está em uso no momento. Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
&lt;br /&gt;
= ICMS =&lt;br /&gt;
&lt;br /&gt;
O objeto ICMS é a definição das alíquotas de ICMS utilizadas pelos Itens/Tipo de Itens. As alíquotas devem ser cadastradas conforme as alíquotas que a empresa utiliza.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo de Alíquota&#039;&#039;&#039; - As alíquotas podem ser de 3 tipos diferentes: Isento, Substituição e Tributada.&lt;br /&gt;
** &#039;&#039;&#039;Alíquota&#039;&#039;&#039; - A alíquota é a percentagem usado para calcular o valor do tributo. A alíquota quando definida é um valor positivo.&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - As alíquotas devem ter um nome que facilite a identificação da alíquota para o usuário. Este nome deve ser único.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Definição Obrigatória da Alíquota quando o tipo for Tributado&#039;&#039;&#039; - A definição da alíquota é obrigatória sempre que o tipo for Tributada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Não definição da Alíquota para os tipos Isento e Substituição.&#039;&#039;&#039; - Para os tipos Isento e Substituição o valor da alíquota devem estar nulos.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Em uso por algum tipo de item&#039;&#039;&#039; - durante a tentativa de exclusão, verificar se o ICMS não está em uso atualmente por algum Tipo de Item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ItemCodeGroup =&lt;br /&gt;
&lt;br /&gt;
O Grupo de Código de Item tem a finalidade de agrupar diferentes códigos de itens e fazer com que SEMPRE tenham o mesmo preço de venda. Independente de custo, categorias markups, arredondamentos, etc. Uma vez que um preço de venda de um item for alterado, os demais vão segui-lo fielmente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - Tudo grupo de código deve ter um nome para facilitar a identificação dos itens que fazem parte do grupo.&lt;br /&gt;
** &#039;&#039;&#039;Lista de Còdigos&#039;&#039;&#039; - Dentro de um mesmo grupo podem ser associados 0+ códigos de itens. Códigos de um mesmo item podem fazer parte do mesmo grupo.&lt;br /&gt;
** &#039;&#039;&#039;Sempre o mesmo preço de venda&#039;&#039;&#039; - Independente das diferentes configurações que um código de item pode ter dentro do mesmo grupo, como diferentes categorias, MarkUps, Custos, definições de arredondamento, package ratios, etc.. O preço de venda de todos os itens do grupo devem ter exatamente o mesmo valor. Mesmo que para isso tenha que desrespeitar qualquer outra regra do sistema (como arredondamento, ou cálculo de package, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Códigos de Itens já associados a outros grupos&#039;&#039;&#039; - Durante a inserção ou atualização, um grupo não deve permitir que um código de item já associado à outro grupo seja associado a este. Em outras palavras, um código de item não pode estar associado em mais de um grupo ao mesmo tempo.&lt;br /&gt;
&lt;br /&gt;
= Item = &lt;br /&gt;
&lt;br /&gt;
A entidade Item representa um produto qualquer da empresa. Esse produto por ser um insumo, uma matéria prima ou um produto de venda (ou revenda).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Fixação do prefixo da descrição de acordo com o tipo do Item&#039;&#039;&#039; - Todo item deve ser de algum &#039;&#039;Tipo de Item&#039;&#039;. Uma vez que o tipo de item esteja definido, a descrição do item obrigatoriamente deve começar com o valor do &#039;&#039;Prefixo&#039;&#039; definido no &#039;&#039;Tipo de Item&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Obrigatoriedade da Marca ou da Descrição&#039;&#039;&#039; - Todo item deve ter preenchidos no mínimo um dos campos &#039;&#039;Marca&#039;&#039; ou &#039;&#039;Descrição&#039;&#039;. Mesmo para produtos de fabricação própria, é recomendável definir a marca da empresa por questões de organização dos itens. Caso nenhum dos dois seja preenchido a descrição pode acabar sendo apenas o &#039;&#039;Prefixo&#039;&#039; do &#039;&#039;Tipo de Item&#039;&#039;. Para Itens &amp;quot;genéricos&amp;quot;, cuja marca não importa, pois em cada momento uma marca diferente é comprada ou usada, a marca não é necessária, mas uma descrição sim.&lt;br /&gt;
** &#039;&#039;&#039;Dimensão e Unidade de Medida Padrão&#039;&#039;&#039; - Todo item tem uma dimensão (Massa, Unidades, Volume, Cumprimento, etc.) e uma unidade de medida (Kg, Unidades, Litros, Metros, etc.) a que se refere o item. Essa unidade ajuda identifica a unidade de quantização padrão desse item. A unidade em que por padrão esse item é comprado, vendido e movimentado. Outras unidades diferentes para movimentar o mesmo item podem ser definidas em códigos diferentes.&lt;br /&gt;
** &#039;&#039;&#039;Custo&#039;&#039;&#039; - Todo Item tem um custo único padrão. Esse custo é sempre o mesmo, independente da empresa.&lt;br /&gt;
** &#039;&#039;&#039;Códigos dos Itens:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Múltiplos Códigos&#039;&#039;&#039; - Cada item pode ter mais que um código definido, ou seja, uma lista de códigos. Códigos são a maneira definir um modo quantidade, preço de venda, pacote, etc. de um determinado Item. Normalmente tem uma identificação única (e normalmente numérica, embora não obrigatória) para ser referenciada em terminais, notas, códigos de barras, etc. No entanto a identificação única não deve ser obrigatória. Um item pode ter um código para definir uma determinada quantidade de movimentação de entrada ou saída, ou simplesmente para definir uma nova unidade de medida. Por exemplo, produtos identificados hora por Kilos hora por Unidades.&lt;br /&gt;
*** &#039;&#039;&#039;Categoria do Item&#039;&#039;&#039; - De acordo com o &#039;&#039;Tipo de Item&#039;&#039; definido no Item, cada código do item deverá ser alocado em uma das categorias definidas no &#039;&#039;Tipo de Item&#039;&#039;. Apesar de ser o mesmo código, cada um pode gerar venda em uma categoria diferente, ou utilizar o MarkUp diferentes de acordo com o definido em cada categoria.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Validar requisito de Obrigatoriedade entre Marca e Descrição&#039;&#039;&#039; - Um dos campos deve sempre ser preenchido.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Validar inconsistência entre Fabricação do Produto e Origem do Item&#039;&#039;&#039; - Se o produto for de fabricação própria, ele não pode ter uma das opções de importado definida em Origem do Item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Validar finalidade do item&#039;&#039;&#039; - Todo item deve ter no mínimo 1 finalidade definida em seu cadastro.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Preenchimento completo dos pesos e volumes das embalagens&#039;&#039;&#039; - Se algum campo for preenchido, ele deve ser preenchido por completo! Por exemplo, se o &amp;quot;Peso Drenado&amp;quot; for definido, obrigatoriamente sua unidade de medida deve ser preenchida, o mesmo para o caso contrário: se a unidade for definida, a quantidade também deverá ser!&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Não permite que um Item tenha dois códigos iguais definidos&#039;&#039;&#039; - Validar se o código sendo inserido/alterado não tem definido duas vezes o mesmo código.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Os códigos de item só podem ser associados às categorias definidas no tipo de item&#039;&#039;&#039; - Validar se a categoria enviada no ItemCodeVO é uma das categorias disponibilizadas no ItemTypeVO associado ao ItemVO. Os códigos ficam limitados a usarem apenas as categorias permitidas de acordo com o tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se a Categoria do Item permite a associação dos itens&#039;&#039;&#039; - Os códigos de itens não podem ser associados às categorias que não permitem a associação de itens.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Validar Finalidade do Item&#039;&#039;&#039; - O campo de finalidade não pode ter alguns alguns valores de acordo os valores definidos nos outros campos, conforme as seguintes regras:&lt;br /&gt;
*** &#039;&#039;&#039;Revenda:&#039;&#039;&#039; Não pode ser definido quando o produto for de &#039;&#039;&#039;Fabricação Própria&#039;&#039;&#039;.&lt;br /&gt;
*** &#039;&#039;&#039;Produto Acabado:&#039;&#039;&#039; Não pode ser definido quando o produto for &#039;&#039;&#039;Produzido por Terceiros&#039;&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;[ve0009] Valida Item Próprio em Tipo de Substituição&#039;&#039;&#039; - Valida se o Item é de produção própria e está em um tipo de item com a tributação de ICMS definida como Substituição Tributária.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Descrição do Item&#039;&#039;&#039; - Valida se a descrição do item é única entre os itens ativos no momento.&lt;br /&gt;
** &#039;&#039;&#039;[ve0011] Itens de Revenda não podem ser Descartáveis&#039;&#039;&#039; - Valida se o item tiver o propósito como revenda, não permite que seja do tipo descartável.&lt;br /&gt;
&lt;br /&gt;
== Pacotes / Equivalência de Unidades ==&lt;br /&gt;
&lt;br /&gt;
Um único item (&amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;) do sistema pode ter diversos código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), chamados de pacotes. A ideia de pacotes é que o mesmo item possa ser vendidos em proporções ou embalagens diferentes, por exemplo, mini-coxinhas podem ser vendidas ao centro, por unidade, por quilo ou empacotadas em bandeijas.&lt;br /&gt;
&lt;br /&gt;
Para resolver essa questão o item apresenta uma &#039;&#039;&#039;Régua de Equivalência&#039;&#039;&#039;, que estabelece a relação de proporção de quantidades entre as diferentes gandezas. Por exemplo, define-se que a 1Und tem 30g e que 1 Bandeija tem 30 unidades. Deste ponto em diante o sistema saberá vender o item em bandeijas, unidades (e suas variações como pares, dúzias, etc.) ou quilo (e suas variações como gramas, toneladas, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Embora um item possa trabalhar com diferentes sistemas de unidades de medidas, uma unidade de medida principal e imutável é atribuída ao item. Esta unidade é a utilizada pelo sistema para concentrar as quantidades de estoque, relatórios de quantidade de vendas, etc.. Deve ser a unidade de medida que a empresa costuma utilizar no seu dia a dia para contabilizar os itens. Muitas vezes é considerada a menor unidade divísivel do item para evitar trabalhar com frações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão de Quantidade ===&lt;br /&gt;
&lt;br /&gt;
Um conceito presa ser definido neste ponto: para efeitos de cálculo, criamos o &#039;&#039;&#039;Fator de Conversão de Quantidade&#039;&#039;&#039; (&#039;&#039;&#039;Quantity Conversion Factor&#039;&#039;&#039;) ou &#039;&#039;&#039;qcFactor&#039;&#039;&#039;. Esse fator representa o multiplicador necessário para transformar a quantidade de um código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;) na quantidade equivalente do item (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), considerando suas unidades de medida e quantidade do pacote.&lt;br /&gt;
&lt;br /&gt;
Esse fator é obtido a partir da seguinte equação verdade:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;qtyItemVO = qcFactor * qtyItemCodeVO&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou sua equivalente:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;qtyItemCodeVO = qtyItemVO / qcFactor&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Em palavras...|Com o &#039;&#039;&#039;qcFactor&#039;&#039;&#039;  na mão, temos que: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;cada unidade vendida do código equivale &amp;quot;X&amp;quot; unidades vendidas do item&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
ou mais precisamente: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;cada unidade vendida do código equivale &amp;quot;qcFactor&amp;quot; unidades vendidas do item&#039;&#039;&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assim, o valor de &#039;&#039;&#039;qcFactor&#039;&#039;&#039; é definido da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;fatorCQ = unitRatio * packageRatio&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde:&lt;br /&gt;
* &#039;&#039;&#039;unitRatio&#039;&#039;&#039; - É a razão entre os fatores das unidades de medida do código e da unidade principal.&lt;br /&gt;
:* &#039;&#039;&#039;Exemplo:&#039;&#039;&#039; A unidade principal é Kilograma, e a do código é Gramas. Se o fator de Kilograma é 1, a de gramas será 1000, representando que 1Kg = 1000g. Neste caso &#039;&#039;&#039;unitRatio = 1/1000 = 0,001&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;packageRatio&#039;&#039;&#039; - É a definição do usuário estabelecendo uma proporção de quantidade de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exemplo ====&lt;br /&gt;
&lt;br /&gt;
O cadastro de &#039;&#039;&#039;Mini Coxinhas&#039;&#039;&#039; produzida pela empresa estabelece o seguinte:&lt;br /&gt;
* &#039;&#039;&#039;Unidade Principal:&#039;&#039;&#039; Definido em Kilos, pois o usuário entende que Kilos é a unidade mais usual para trabalhar (controlar estoque, custo, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Relações de Grandezas:&#039;&#039;&#039; Para cobrir seus diferentes métodos de venda o usuário estabelece a seguinte relação de Grandezas:&lt;br /&gt;
:* &#039;&#039;&#039;1 Und = 30g&#039;&#039;&#039; - Define que 1 unidade de Mini Coxinha tem o tamanho de 30g.&lt;br /&gt;
:* &#039;&#039;&#039;1 Bandeja = 2 Dúzia&#039;&#039;&#039; - A unidade personalizada Bandeija equivale a 1 dúzia.&lt;br /&gt;
* &#039;&#039;&#039;Códigos de Vendas:&#039;&#039;&#039;&lt;br /&gt;
:* &#039;&#039;&#039;1 - Venda por Kilo:&#039;&#039;&#039; - Neste código o usuário define o tamanho do pacote em 1, a unidade &#039;Kilogram&#039; e que o códigio é divisível.&lt;br /&gt;
:* &#039;&#039;&#039;2 - Venda por Cento:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Centro&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;3 - Venda por Unidade:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Unidade&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;4 - Venda por Bandeija:&#039;&#039;&#039; - Aqui, define o tamanho do pacote em 2, a unidade em &#039;Bandeija&#039; e que o código é indivisível.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em relação ao código para trabalhar com essas informações vamos dividir em partes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{java|Preparação da Régua e Definições|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // Utilizamos a classe MeasureUtil para facilitar a criação da Régua e medidas&lt;br /&gt;
    MeasureRulerVO rulerVO = MeasureUtil.createSimpleMeasureRulerVO(BigDecimal.ONE, WEIGHTUNIT.KILOGRAM); // Cria a régua com a unidade principal, estabelecendo a razão 1&lt;br /&gt;
    MeasureUtil.fillSmartRuler(rulerVO, BigDecimal.ONE, UNITUNIT.UNIT, new BigDecimal(&amp;quot;30&amp;quot;), WEIGHTUNIT.GRAM); // Estabelece que 1 unidade = 30 gramas&lt;br /&gt;
&lt;br /&gt;
    // Unidade de medida personalizada, oferecida pelo sistema&lt;br /&gt;
    MeasureCustomVO measureCustomVO = new MeasureCustomVO();&lt;br /&gt;
    measureCustomVO.setCode(&amp;quot;BDJ&amp;quot;);&lt;br /&gt;
    measureCustomVO.setDescription(&amp;quot;Bandeja&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Estabelece a relação da unidade personalizada com uma unidade presente na régua: 1BDJ = 1Dúzia&lt;br /&gt;
    MeasureEquivalenceVO equiVO = new MeasureEquivalenceVO();&lt;br /&gt;
    equiVO.setMeasureCustomVO(measureCustomVO);&lt;br /&gt;
    equiVO.setReferencequantity(new BigDecimal(&amp;quot;2&amp;quot;));&lt;br /&gt;
    equiVO.setReferenceunit(UNITUNIT.DOZEN);&lt;br /&gt;
    equiVO.setMeasurerulervo(rulerVO);&lt;br /&gt;
    rulerVO.getMeasurerulerequivalencelist().add(equiVO);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que passamos as definições de proporções do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; para a &amp;lt;code&amp;gt;MeasureRulerVO&amp;lt;/code&amp;gt;, conseguimos calcular o &#039;&#039;&#039;qcFactor&#039;&#039;&#039; facilmente com o método &amp;lt;code&amp;gt;MeasureUtil.convertTo(...)&amp;lt;/code&amp;gt;. Para o cadastro exemplo acima:&lt;br /&gt;
&lt;br /&gt;
{{java|Cálculo do qcFactor:|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    WEIGHTUNIT itemVOUnit = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 1 - Kilo&lt;br /&gt;
    WEIGHTUNIT itemCodeVOUnit1 = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
    BigDecimal packageRatio1 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor1 = MeasureUtil.convertTo(rulerVO, packageRatio1, itemCodeVOUnit1, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 1:&amp;quot; + qcFactor1); // Saída: 1.0000000000&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 2 - Cento&lt;br /&gt;
    UNITUNIT itemCodeVOUnit2 = UNITUNIT.CENT;&lt;br /&gt;
    BigDecimal packageRatio2 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor2 = MeasureUtil.convertTo(rulerVO, packageRatio2, itemCodeVOUnit2, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 2:&amp;quot; + qcFactor2); // Saída: 3.0000300003 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 3 - Unidade&lt;br /&gt;
    UNITUNIT itemCodeVOUnit3 = UNITUNIT.UNIT;&lt;br /&gt;
    BigDecimal packageRatio3 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor3 = MeasureUtil.convertTo(rulerVO, packageRatio3, itemCodeVOUnit3, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 3:&amp;quot; + qcFactor3); // Saída: 0.0300003000 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 4 - Bandeja&lt;br /&gt;
    // A unidade de medida personalizada precisa ser encapsulada com o MeasureEquivalenceBean para utilizar na MeasureUtil.&lt;br /&gt;
    MeasureEquivalenceBean itemCodeVOUnit4 = new MeasureEquivalenceBean();&lt;br /&gt;
    itemCodeVOUnit4.setEquiVO(equiVO);&lt;br /&gt;
    BigDecimal packageRatio4 = new BigDecimal(&amp;quot;1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor4 = MeasureUtil.convertTo(rulerVO, packageRatio4, itemCodeVOUnit4, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 4:&amp;quot; + qcFactor4); // Saída: 0.7200072001 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão na Prática ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para calcular o custo do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; a partir do custo de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;, precisamos considerar as definições de pacote e unidade de medida como visto no cálculo do &#039;&#039;&#039;Fator de Conversão de Quantidade&#039;&#039;&#039; acima. Devemos considerar que o &#039;&#039;&#039;custo por unidade de medida&#039;&#039;&#039; de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; e de &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; são os mesmos, apenas proporcionais às suas unidades de medida e quantidades de pacote, podemos utilizar o mesmo &#039;&#039;&#039;qcFactor&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A única questão é que são grandezas proporcionalmente invertidas, ou seja, &#039;&#039;&#039;quando maior a quantidade menor o custo&#039;&#039;&#039;&#039;&#039; e vice-versa. No exemplo acima da Mini Coxinha, imaginemos que o o custo do Kilo seja de R$ 10,00. A unidade, que pesa 30g, teria um custo por unidade de R$ 0,30. Estabelecemos acima que o &#039;&#039;&#039;qcFactor&#039;&#039;&#039; da unidade é &#039;&#039;&#039;0.0300003000&#039;&#039;&#039;. Ao multiplicar a quantidade de &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; pelo &#039;&#039;&#039;qcFactor&#039;&#039;&#039; chegamos na quantidade equivalente do &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;, neste caso, se temos o custo de &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; teriamos que dividí-lo pelo mesmo &#039;&#039;&#039;qcFactor&#039;&#039;&#039; para chegar no custo de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;. E na operação inversa, podemos multiplicar o custo de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; para chegar o custo de &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;. O que podemos resumir na seguinte tabela de conversão:&lt;br /&gt;
&lt;br /&gt;
* ItemCodeVO.cost = ItemVO.cost * qcFactor&lt;br /&gt;
* ItemCodeVO.quantity = ItemVO.quantity / qcFactor&lt;br /&gt;
&lt;br /&gt;
E sua inversão:&lt;br /&gt;
* ItemVO.cost = ItemCodeVO.cost / qcFactor&lt;br /&gt;
* ItemVO.quantity = ItemCodeVO.quantity * qcFactor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Métodos Utilitários|A classe &amp;lt;code&amp;gt;ItemUtils&amp;lt;/code&amp;gt; contém métodos para autilizar na criação da régua, conversões e cálculo do &#039;&#039;&#039;qcFactor&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{stop|Convenção do qcFactor|A definição do fator de conversão entre os objetos &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; e &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; foi criada desde o príncio do sistema, e comumente chamada de &#039;&#039;&#039;divider&#039;&#039;&#039;. No entanto nunca foi respeitado a &amp;quot;direção&amp;quot; desse fator, em partes do código divider = qcFactor e em outras divider = 1/qcFactor.&lt;br /&gt;
&lt;br /&gt;
A criação da nomenclatura e definição dessa &amp;quot;direção&amp;quot; do fator tente a resolver essa confusão, facilitar a implementação e erros causados por essa misturança do cálculo em diferentes partes do sistema.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Divider&amp;quot; continua presente em partes do código pois ele não foi compeltamente revisado. Mas a medida que novos códigos sejam criados ou revisados, é esperado que a nomenclatura &#039;divider&#039; deixe de ser utilizada.}}&lt;br /&gt;
&lt;br /&gt;
== Definição do Preço de Venda ==&lt;br /&gt;
&lt;br /&gt;
Há vários fatores sobre a lógica de calcular definir um novo preço de venda. Como as políticas de arredondamento, congelamento de preço, replicação do preço para outros códigos do mesmo grupo, a movimentação de novos preços para histórico, etc.&lt;br /&gt;
&lt;br /&gt;
A ordem das operações lógicas a serem aplicadas sobre o ItemPriceVO devem ser conforme a ordem dos métodos listados abaixo. Cada método executa a operação a partir de um determinado ponto. Isso permite que diferentes eventos que causam a alteração do preço de venda possam acionar o ciclo a partir de diferentes pontos.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Define um Novo preço de Venda para um Código&#039;&#039;&#039; - O início do processo. Quando um novo preço de venda deve ser definido em um código de item. Este passo utiliza o valor recebido as as definições do próprio ItemCode para realizar toda a sequência lógica do preço de venda.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Definition()&#039;&#039;&#039; - Método responsável por carregar as informações do ItemCodeVO e iniciar o processo definição do novo preço de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicar Regras de Arredondamento&#039;&#039;&#039; - Dependendo das configurações da Categoria do Item definida no Código do Item, o preço precisará ser arredondado para respeitar essas políticas.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_RoundApply()&#039;&#039;&#039; - Este método recebe o valor do novo preço e a política de arredondamento para aplicar as regras de arredondamento. Uma vez aplicado os arredondamentos o valor será passado para o próximo método da cadeia (o &#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;) para a efetivação em todos os grupos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Aplicação da Política|Para centralizar o código de aplicação da política, a efetiva aplicação do arredondamento fica na classe utilitária &#039;&#039;&#039;ItemUtils&#039;&#039;&#039; no método &#039;&#039;&#039;applyRoundPricePolicy()&#039;&#039;&#039;. Podendo ser acessado de qualquer ponto, como classes da UI.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Disseminação do Preço de Venda pelo Grupo&#039;&#039;&#039; - Caso o &#039;&#039;ItemCode&#039;&#039; cujo preço de venda esteja sendo alterado faça parte de um grupo, este preço de venda deverá ser disseminado para todos os &#039;&#039;ItemCode&#039;&#039; do Grupo.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;&#039; - Avalia se o &#039;&#039;ItemCode&#039;&#039; cujo preço deve ser alterado faz parte de um grupo. Caso faça ele pesquisa todos os itens do grupo e chama o método &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; todos os envolvidos. Este método não faz qualquer processamento no valor, apenas verifica os códigos envolvidos no grupo e aplica o valor, congelado ou não conforme informado via parâmetros). O valor será aplicado a todos do grupo conforme recebido, &amp;quot;passando por cima&amp;quot; das configurações de arredondamento e políticas de congelamento de cada código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicação do Preço de Venda ao Objeto&#039;&#039;&#039; - Caso haja real alteração no ItemPriceVO uma cópia deve ser convertida para o ItemPriceHistoryVO e persistida. Por fim atualizar o ItemPriceVO na base de dados.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; - Método responsável por atualizar as definições sobre o preço de venda (ItemPriceVO) de um &#039;&#039;Código de Item&#039;&#039;. Este método recebe o novo valor, se o preço estará congelado, e outros atributos para identificação do ItemPriceVO correto (dependendo da assinatura). De acordo com os valores passados, este método avalia se haverá alteração das informações atuais, cria um novo objeto para o histórico de preços (ItemPriceHistoryVO) e salva os dados atuais. Em seguida faz as alterações necessárias ao ItemPriceVO e já o persiste no banco.&lt;br /&gt;
*: &#039;&#039;&#039;Este é (e deve continuar sendo) o único método que fará a atualização do ItemPriceVO no banco de dados!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eventos de Alteração do Preço de Venda ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cadastro/Alteração de Itens&#039;&#039;&#039; - Quando um item é cadastrado ou alterado ele tem definições de códigos e consequentemente de preços de vendas. Neste caso avaliamos as seguintes condições para cada código:&lt;br /&gt;
** &#039;&#039;&#039;Não tem um grupo associado&#039;&#039;&#039; - Se não tem um grupo adicionado, temos que definir e processar o preço completamente. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tem um grupo associado:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos definir novos valores para o código e para o grupo&#039;&#039;&#039; - Se devemos associar novos valores para este novo código e para o grupo em que ele vai entrar, processamos o valor deste código completamente, e como a associação ao grupo é feita antes da definição dos preços, a lógica do updateItemPrice fará a disseminação deste valor nos outros códigos do grupo quando chegar no passo &#039;&#039;_GroupDisseminate()&#039;&#039;. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos copiar o valor atual sendo praticado no grupo&#039;&#039;&#039; - Neste caso vamos buscar o valor de qualquer código do grupo (afinal devem ser todos iguais) e copiamos seus valores. Tanto o valor praticado, quanto um eventual valor que esteja congelado. Chama o &#039;&#039;&#039;_Apply()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Descongelar o Preço de Venda&#039;&#039;&#039; - Descongelar significa efetivar o preço que está congelado como o preço praticado para venda. Para evitar qualquer reprocessamento no valor, mas ainda assim garantir que o novo valor efetivo de venda será definido em todos os códigos do mesmo grupo este método chama o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Descartar Preço Congelado&#039;&#039;&#039; - Quando não queremos que o preço congelado entre em vigor podemos simplesmente descartar o preço congelado, e manter o código com o mesmo preço que já tinha. Neste caso queremos que todos os códigos do mesmo grupo descartem seu preço congelado e que continuem mantendo o preço já praticado. Para evitar o processamento dos valores mas ainda realizar a operação em todos os códigos do grupo chamamos o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:updateItemPriceFlow.png|frame|center|Diagrama do fluxo da lógica de alteração do preço de venda de um Código de Item. E entrada dos eventos que causam essas alterações.]]&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1669</id>
		<title>Módulo Item</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1669"/>
		<updated>2025-11-20T13:22:54Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Fator de Conversão de Custo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo &#039;&#039;&#039;Item&#039;&#039;&#039; é o módulo responsável por cadastrar os itens de consumo, produtos de revenda, fabricação própria para venda ou consumo, etc. Este módulo oferecerá um cadastro com controle de preços, markups, custos, entre outras funcionalidades que servirão de suporte para diversos outros módulos, como PDV, Controle de Estoques, Base de Custos para Planilhas de Cálculos, etc.&lt;br /&gt;
&lt;br /&gt;
Para oferecer todo o conceito o módulo é dividido nos seguintes cadastros:&lt;br /&gt;
&lt;br /&gt;
= Categoria do Item =&lt;br /&gt;
&lt;br /&gt;
A categoria do item tem a finalidade de organizar e agrupar os itens de acordo com suas categorias. Mutias vezes a categoria é o corredor em que as mercadorias são agrupadas, como &amp;quot;Bazar&amp;quot;, &amp;quot;Açougue&amp;quot;, &amp;quot;Produtos de Limpeza&amp;quot;, etc. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Estrutura Hierárquica:&#039;&#039;&#039; As categorias são uma estrutura hierárquica, isto é, permite que uma categoria seja adiciona dentro da outra.&lt;br /&gt;
** &#039;&#039;&#039;Nomes Únicos &#039;por Pai&#039;:&#039;&#039;&#039; Os nomes das categorias são únicos dentro do mesmo pai. Em outras palavras, os nomes das categorias só podem se repetir se estiverem em pontos diferentes da estrutura hierárquica.&lt;br /&gt;
** &#039;&#039;&#039;Permite Itens:&#039;&#039;&#039; Esta opção define se os itens podem ser alocados nesta categoria ou não. Quando a opção estiver desmarcada nenhum código de item deverá ser definido nesta categoria. Esta função permite que um determinado tipo de item possa ser alocado nesta categoria, mas força que os itens tenham que ser alocados nas subcategorias.&lt;br /&gt;
** &#039;&#039;&#039;Congelamento de Preços:&#039;&#039;&#039; Este atributo define se os preços dos itens nesta categoria devem permanecer congelados quando forem editados ou houver uma entrada de NFe.&lt;br /&gt;
** &#039;&#039;&#039;Arredondamento de Preços:&#039;&#039;&#039; Permite definir uma regra de arredondamento dos preços de venda de todos os itens que estão nesta categoria. Uma vez definida, nenhum item deverá ter um preço diferente do arredondamento definido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Validar a estrutura de uso por Itens e Tipo de Itens quando a categoria pai for alterada.&#039;&#039;&#039; - A categoria pai de uma categoria não pode ser alterada se algum item estiver associado à ela ou à alguma subcategoria enquanto que o seu tipo de item aponta para a categoria pai. Em outras palavras, caso ao alterar a categoria de posição na hierarquia se não invalidará as condições do tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Hierarquia Cíclica.&#039;&#039;&#039; - Garantir que durante a atualização uma categoria não passa a apontar &amp;quot;como pai&amp;quot; uma categoria que está abaixo dela na hierarquia, criando um relacionamento cíclico.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se temos exatamente 1 ItemCategoryCompanyVO por Empresa&#039;&#039;&#039; - Validar se o temos exatamente 1 definição de dados por empresa. Não devemos ter nem duplicadas, nem faltando. (BUG: 270)&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Categoria de Item Sendo Usado Por Código do Item, Tipo do Item ou outra Categoria de Item&#039;&#039;&#039; - Antes de excluir uma categoria é preciso confirmar se ela não está em uso por outro objeto. Ela pode estar em uso por um código de item (verificar se o Item está ativo), ser referenciada pelo Tipo de Item (também verificar se o mesmo está ativo) ou ser pai de outra categoria (que também precisa verificar se ainda esta ativa). Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Markup, Congelamento de Preços e Arredondamento de Preços são Obrigatórios quando a Categoria permite que itens sejam adicionados.&#039;&#039;&#039; - Validar se estão preenchidos quando a categoria permitir itens, validar se estão nulos quando a categoria não permitir itens. Quando a categoria não permitir itens, o campo MarkUp Mínimo também deve ser nulo.&lt;br /&gt;
&lt;br /&gt;
= Tipo do Item =&lt;br /&gt;
&lt;br /&gt;
O tipo do item tem a finalidade de agrupar todos os itens de um mesmo tipo. Entende-se por tipo de produto &amp;quot;o que o produto é&amp;quot;, por exemplo: Refrigerante, Água, Suco, Pasta de Dente, Pão de Queijo, etc. Não faz parte do tipo a marca, embalagem, quantidades etc. Marca, quantidade, códigos, preços, etc. são parte do cadastro do Iten e não do tipo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo do Item:&#039;&#039;&#039; O nome do tipo de item é usado para identificar o cadastro. Deve ser único.&lt;br /&gt;
** &#039;&#039;&#039;Prefixo:&#039;&#039;&#039; O prefixo é um &amp;quot;começo&amp;quot; da descrição, que será usada em todos os itens desse mesmo tipo. Ao forçar que todos os itens comecem com o mesmo prefixo ajuda na organização do cadastro do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;Descrição de Exemplo: &#039;&#039;&#039; Cada tipo de item deve ter um espaço para orientar o usuário sobre quais as informações importantes para aquele tipo de produto, além de definir a ordem em que devem aparecer.&lt;br /&gt;
** &#039;&#039;&#039;Associação com Aliquota ICMS:&#039;&#039;&#039; No tipo do item devemos definir qual a alíquota de tributação do ICMS que deverá ser utilizada em todos os itens desse tipo. Centralizando e simplificando as configurações.&lt;br /&gt;
** &#039;&#039;&#039;Associação com As categorias:&#039;&#039;&#039; Cada tipo de item deve associar no mínimo uma categoria de itens. Cada item deste tipo deverá associar seus códigos nessas categorias ou suas subcategorias. O tipo de item pode permitir associação com mais de um &amp;quot;nó&amp;quot; da hierarquia da categoria. Permitindo assim que itens do mesmo tipo possam ser lançados em categorias diferentes. Como por exemplo um refrigerante com um código lançado na categoria de &amp;quot;Geladeiras/Loja&amp;quot; e outro código em &amp;quot;Restaurante/SelfService&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Categoria em Uso por Itens continua Disponível&#039;&#039;&#039; - Quando um tipo de item é alterado, é preciso validar se os itens desse tipo atualmente cadastrados não ficarão inválidos caso a categoria não esteja mais associada ao tipo de item. Ou seja, quando um item associado a esse tipo de item já estiver utilizando determinada categoria ela não pode ser excluída do tipo de item. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Alteração do Prefixo reflete nos itens existentes&#039;&#039;&#039; - Caso o prefixo seja alterado, todos os itens deste tipo de item devem ter seu nome atualizado de acordo com o novo prefixo. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Verifica Definições de Impostos para cada empresa&#039;&#039;&#039; - Verifica a definição dos impostos para cada empresa existente.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Tipo e Alíquota no ECF igual à Alíquota Efetiva&#039;&#039;&#039; - Verifica se o tipo do ICMS definido no tipo de item e a alíquota efetiva do do cálculo é coerente com os valores cadastrados no objeto ICMSVO, usado no momento de venda do ECF.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Natureza da Receita e Tabela são obrigatórios para os CSTs 02, 03, 04, 05, 06, 07, 08 e 09&#039;&#039;&#039; - Para todos esses CSTs, os campos de Natureza da Receita e Tabela ser validado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Verificar se a tabela é valida para o CST de Saída informado&#039;&#039;&#039; - Quando a tabela é informada, ela deve ser coerente com o código do CST de saída informado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Verificar se o Natureza é válida para a Tabela informada&#039;&#039;&#039; - Ao informar um código da Natureza da Receita o BIS deve verificar se o código da Receita é válido para a tabela sendo usada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Tipo de Item Sendo Usado no Momento&#039;&#039;&#039; - Antes de excluir o tipo de item é preciso verificar se ele não está em uso no momento. Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
&lt;br /&gt;
= ICMS =&lt;br /&gt;
&lt;br /&gt;
O objeto ICMS é a definição das alíquotas de ICMS utilizadas pelos Itens/Tipo de Itens. As alíquotas devem ser cadastradas conforme as alíquotas que a empresa utiliza.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo de Alíquota&#039;&#039;&#039; - As alíquotas podem ser de 3 tipos diferentes: Isento, Substituição e Tributada.&lt;br /&gt;
** &#039;&#039;&#039;Alíquota&#039;&#039;&#039; - A alíquota é a percentagem usado para calcular o valor do tributo. A alíquota quando definida é um valor positivo.&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - As alíquotas devem ter um nome que facilite a identificação da alíquota para o usuário. Este nome deve ser único.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Definição Obrigatória da Alíquota quando o tipo for Tributado&#039;&#039;&#039; - A definição da alíquota é obrigatória sempre que o tipo for Tributada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Não definição da Alíquota para os tipos Isento e Substituição.&#039;&#039;&#039; - Para os tipos Isento e Substituição o valor da alíquota devem estar nulos.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Em uso por algum tipo de item&#039;&#039;&#039; - durante a tentativa de exclusão, verificar se o ICMS não está em uso atualmente por algum Tipo de Item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ItemCodeGroup =&lt;br /&gt;
&lt;br /&gt;
O Grupo de Código de Item tem a finalidade de agrupar diferentes códigos de itens e fazer com que SEMPRE tenham o mesmo preço de venda. Independente de custo, categorias markups, arredondamentos, etc. Uma vez que um preço de venda de um item for alterado, os demais vão segui-lo fielmente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - Tudo grupo de código deve ter um nome para facilitar a identificação dos itens que fazem parte do grupo.&lt;br /&gt;
** &#039;&#039;&#039;Lista de Còdigos&#039;&#039;&#039; - Dentro de um mesmo grupo podem ser associados 0+ códigos de itens. Códigos de um mesmo item podem fazer parte do mesmo grupo.&lt;br /&gt;
** &#039;&#039;&#039;Sempre o mesmo preço de venda&#039;&#039;&#039; - Independente das diferentes configurações que um código de item pode ter dentro do mesmo grupo, como diferentes categorias, MarkUps, Custos, definições de arredondamento, package ratios, etc.. O preço de venda de todos os itens do grupo devem ter exatamente o mesmo valor. Mesmo que para isso tenha que desrespeitar qualquer outra regra do sistema (como arredondamento, ou cálculo de package, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Códigos de Itens já associados a outros grupos&#039;&#039;&#039; - Durante a inserção ou atualização, um grupo não deve permitir que um código de item já associado à outro grupo seja associado a este. Em outras palavras, um código de item não pode estar associado em mais de um grupo ao mesmo tempo.&lt;br /&gt;
&lt;br /&gt;
= Item = &lt;br /&gt;
&lt;br /&gt;
A entidade Item representa um produto qualquer da empresa. Esse produto por ser um insumo, uma matéria prima ou um produto de venda (ou revenda).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Fixação do prefixo da descrição de acordo com o tipo do Item&#039;&#039;&#039; - Todo item deve ser de algum &#039;&#039;Tipo de Item&#039;&#039;. Uma vez que o tipo de item esteja definido, a descrição do item obrigatoriamente deve começar com o valor do &#039;&#039;Prefixo&#039;&#039; definido no &#039;&#039;Tipo de Item&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Obrigatoriedade da Marca ou da Descrição&#039;&#039;&#039; - Todo item deve ter preenchidos no mínimo um dos campos &#039;&#039;Marca&#039;&#039; ou &#039;&#039;Descrição&#039;&#039;. Mesmo para produtos de fabricação própria, é recomendável definir a marca da empresa por questões de organização dos itens. Caso nenhum dos dois seja preenchido a descrição pode acabar sendo apenas o &#039;&#039;Prefixo&#039;&#039; do &#039;&#039;Tipo de Item&#039;&#039;. Para Itens &amp;quot;genéricos&amp;quot;, cuja marca não importa, pois em cada momento uma marca diferente é comprada ou usada, a marca não é necessária, mas uma descrição sim.&lt;br /&gt;
** &#039;&#039;&#039;Dimensão e Unidade de Medida Padrão&#039;&#039;&#039; - Todo item tem uma dimensão (Massa, Unidades, Volume, Cumprimento, etc.) e uma unidade de medida (Kg, Unidades, Litros, Metros, etc.) a que se refere o item. Essa unidade ajuda identifica a unidade de quantização padrão desse item. A unidade em que por padrão esse item é comprado, vendido e movimentado. Outras unidades diferentes para movimentar o mesmo item podem ser definidas em códigos diferentes.&lt;br /&gt;
** &#039;&#039;&#039;Custo&#039;&#039;&#039; - Todo Item tem um custo único padrão. Esse custo é sempre o mesmo, independente da empresa.&lt;br /&gt;
** &#039;&#039;&#039;Códigos dos Itens:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Múltiplos Códigos&#039;&#039;&#039; - Cada item pode ter mais que um código definido, ou seja, uma lista de códigos. Códigos são a maneira definir um modo quantidade, preço de venda, pacote, etc. de um determinado Item. Normalmente tem uma identificação única (e normalmente numérica, embora não obrigatória) para ser referenciada em terminais, notas, códigos de barras, etc. No entanto a identificação única não deve ser obrigatória. Um item pode ter um código para definir uma determinada quantidade de movimentação de entrada ou saída, ou simplesmente para definir uma nova unidade de medida. Por exemplo, produtos identificados hora por Kilos hora por Unidades.&lt;br /&gt;
*** &#039;&#039;&#039;Categoria do Item&#039;&#039;&#039; - De acordo com o &#039;&#039;Tipo de Item&#039;&#039; definido no Item, cada código do item deverá ser alocado em uma das categorias definidas no &#039;&#039;Tipo de Item&#039;&#039;. Apesar de ser o mesmo código, cada um pode gerar venda em uma categoria diferente, ou utilizar o MarkUp diferentes de acordo com o definido em cada categoria.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Validar requisito de Obrigatoriedade entre Marca e Descrição&#039;&#039;&#039; - Um dos campos deve sempre ser preenchido.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Validar inconsistência entre Fabricação do Produto e Origem do Item&#039;&#039;&#039; - Se o produto for de fabricação própria, ele não pode ter uma das opções de importado definida em Origem do Item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Validar finalidade do item&#039;&#039;&#039; - Todo item deve ter no mínimo 1 finalidade definida em seu cadastro.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Preenchimento completo dos pesos e volumes das embalagens&#039;&#039;&#039; - Se algum campo for preenchido, ele deve ser preenchido por completo! Por exemplo, se o &amp;quot;Peso Drenado&amp;quot; for definido, obrigatoriamente sua unidade de medida deve ser preenchida, o mesmo para o caso contrário: se a unidade for definida, a quantidade também deverá ser!&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Não permite que um Item tenha dois códigos iguais definidos&#039;&#039;&#039; - Validar se o código sendo inserido/alterado não tem definido duas vezes o mesmo código.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Os códigos de item só podem ser associados às categorias definidas no tipo de item&#039;&#039;&#039; - Validar se a categoria enviada no ItemCodeVO é uma das categorias disponibilizadas no ItemTypeVO associado ao ItemVO. Os códigos ficam limitados a usarem apenas as categorias permitidas de acordo com o tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se a Categoria do Item permite a associação dos itens&#039;&#039;&#039; - Os códigos de itens não podem ser associados às categorias que não permitem a associação de itens.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Validar Finalidade do Item&#039;&#039;&#039; - O campo de finalidade não pode ter alguns alguns valores de acordo os valores definidos nos outros campos, conforme as seguintes regras:&lt;br /&gt;
*** &#039;&#039;&#039;Revenda:&#039;&#039;&#039; Não pode ser definido quando o produto for de &#039;&#039;&#039;Fabricação Própria&#039;&#039;&#039;.&lt;br /&gt;
*** &#039;&#039;&#039;Produto Acabado:&#039;&#039;&#039; Não pode ser definido quando o produto for &#039;&#039;&#039;Produzido por Terceiros&#039;&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;[ve0009] Valida Item Próprio em Tipo de Substituição&#039;&#039;&#039; - Valida se o Item é de produção própria e está em um tipo de item com a tributação de ICMS definida como Substituição Tributária.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Descrição do Item&#039;&#039;&#039; - Valida se a descrição do item é única entre os itens ativos no momento.&lt;br /&gt;
** &#039;&#039;&#039;[ve0011] Itens de Revenda não podem ser Descartáveis&#039;&#039;&#039; - Valida se o item tiver o propósito como revenda, não permite que seja do tipo descartável.&lt;br /&gt;
&lt;br /&gt;
== Pacotes / Equivalência de Unidades ==&lt;br /&gt;
&lt;br /&gt;
Um único item (&amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;) do sistema pode ter diversos código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), chamados de pacotes. A ideia de pacotes é que o mesmo item possa ser vendidos em proporções ou embalagens diferentes, por exemplo, mini-coxinhas podem ser vendidas ao centro, por unidade, por quilo ou empacotadas em bandeijas.&lt;br /&gt;
&lt;br /&gt;
Para resolver essa questão o item apresenta uma &#039;&#039;&#039;Régua de Equivalência&#039;&#039;&#039;, que estabelece a relação de proporção de quantidades entre as diferentes gandezas. Por exemplo, define-se que a 1Und tem 30g e que 1 Bandeija tem 30 unidades. Deste ponto em diante o sistema saberá vender o item em bandeijas, unidades (e suas variações como pares, dúzias, etc.) ou quilo (e suas variações como gramas, toneladas, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Embora um item possa trabalhar com diferentes sistemas de unidades de medidas, uma unidade de medida principal e imutável é atribuída ao item. Esta unidade é a utilizada pelo sistema para concentrar as quantidades de estoque, relatórios de quantidade de vendas, etc.. Deve ser a unidade de medida que a empresa costuma utilizar no seu dia a dia para contabilizar os itens. Muitas vezes é considerada a menor unidade divísivel do item para evitar trabalhar com frações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão de Quantidade ===&lt;br /&gt;
&lt;br /&gt;
Um conceito presa ser definido neste ponto: para efeitos de cálculo, criamos o &#039;&#039;&#039;Fator de Conversão de Quantidade&#039;&#039;&#039; (&#039;&#039;&#039;Quantity Conversion Factor&#039;&#039;&#039;) ou &#039;&#039;&#039;qcFactor&#039;&#039;&#039;. Esse fator representa o multiplicador necessário para transformar a quantidade de um código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;) na quantidade equivalente do item (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), considerando suas unidades de medida e quantidade do pacote.&lt;br /&gt;
&lt;br /&gt;
Esse fator é obtido a partir da seguinte equação verdade:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;qtyItemVO = qcFactor * qtyItemCodeVO&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou sua equivalente:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;qtyItemCodeVO = qtyItemVO / qcFactor&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Em palavras...|Com o &#039;&#039;&#039;qcFactor&#039;&#039;&#039;  na mão, temos que: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;cada unidade vendida do código equivale &amp;quot;X&amp;quot; unidades vendidas do item&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
ou mais precisamente: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;cada unidade vendida do código equivale &amp;quot;qcFactor&amp;quot; unidades vendidas do item&#039;&#039;&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assim, o valor de &#039;&#039;&#039;qcFactor&#039;&#039;&#039; é definido da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;fatorCQ = unitRatio * packageRatio&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde:&lt;br /&gt;
* &#039;&#039;&#039;unitRatio&#039;&#039;&#039; - É a razão entre os fatores das unidades de medida do código e da unidade principal.&lt;br /&gt;
:* &#039;&#039;&#039;Exemplo:&#039;&#039;&#039; A unidade principal é Kilograma, e a do código é Gramas. Se o fator de Kilograma é 1, a de gramas será 1000, representando que 1Kg = 1000g. Neste caso &#039;&#039;&#039;unitRatio = 1/1000 = 0,001&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;packageRatio&#039;&#039;&#039; - É a definição do usuário estabelecendo uma proporção de quantidade de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exemplo ====&lt;br /&gt;
&lt;br /&gt;
O cadastro de &#039;&#039;&#039;Mini Coxinhas&#039;&#039;&#039; produzida pela empresa estabelece o seguinte:&lt;br /&gt;
* &#039;&#039;&#039;Unidade Principal:&#039;&#039;&#039; Definido em Kilos, pois o usuário entende que Kilos é a unidade mais usual para trabalhar (controlar estoque, custo, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Relações de Grandezas:&#039;&#039;&#039; Para cobrir seus diferentes métodos de venda o usuário estabelece a seguinte relação de Grandezas:&lt;br /&gt;
:* &#039;&#039;&#039;1 Und = 30g&#039;&#039;&#039; - Define que 1 unidade de Mini Coxinha tem o tamanho de 30g.&lt;br /&gt;
:* &#039;&#039;&#039;1 Bandeja = 2 Dúzia&#039;&#039;&#039; - A unidade personalizada Bandeija equivale a 1 dúzia.&lt;br /&gt;
* &#039;&#039;&#039;Códigos de Vendas:&#039;&#039;&#039;&lt;br /&gt;
:* &#039;&#039;&#039;1 - Venda por Kilo:&#039;&#039;&#039; - Neste código o usuário define o tamanho do pacote em 1, a unidade &#039;Kilogram&#039; e que o códigio é divisível.&lt;br /&gt;
:* &#039;&#039;&#039;2 - Venda por Cento:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Centro&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;3 - Venda por Unidade:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Unidade&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;4 - Venda por Bandeija:&#039;&#039;&#039; - Aqui, define o tamanho do pacote em 2, a unidade em &#039;Bandeija&#039; e que o código é indivisível.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em relação ao código para trabalhar com essas informações vamos dividir em partes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{java|Preparação da Régua e Definições|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // Utilizamos a classe MeasureUtil para facilitar a criação da Régua e medidas&lt;br /&gt;
    MeasureRulerVO rulerVO = MeasureUtil.createSimpleMeasureRulerVO(BigDecimal.ONE, WEIGHTUNIT.KILOGRAM); // Cria a régua com a unidade principal, estabelecendo a razão 1&lt;br /&gt;
    MeasureUtil.fillSmartRuler(rulerVO, BigDecimal.ONE, UNITUNIT.UNIT, new BigDecimal(&amp;quot;30&amp;quot;), WEIGHTUNIT.GRAM); // Estabelece que 1 unidade = 30 gramas&lt;br /&gt;
&lt;br /&gt;
    // Unidade de medida personalizada, oferecida pelo sistema&lt;br /&gt;
    MeasureCustomVO measureCustomVO = new MeasureCustomVO();&lt;br /&gt;
    measureCustomVO.setCode(&amp;quot;BDJ&amp;quot;);&lt;br /&gt;
    measureCustomVO.setDescription(&amp;quot;Bandeja&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Estabelece a relação da unidade personalizada com uma unidade presente na régua: 1BDJ = 1Dúzia&lt;br /&gt;
    MeasureEquivalenceVO equiVO = new MeasureEquivalenceVO();&lt;br /&gt;
    equiVO.setMeasureCustomVO(measureCustomVO);&lt;br /&gt;
    equiVO.setReferencequantity(new BigDecimal(&amp;quot;2&amp;quot;));&lt;br /&gt;
    equiVO.setReferenceunit(UNITUNIT.DOZEN);&lt;br /&gt;
    equiVO.setMeasurerulervo(rulerVO);&lt;br /&gt;
    rulerVO.getMeasurerulerequivalencelist().add(equiVO);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que passamos as definições de proporções do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; para a &amp;lt;code&amp;gt;MeasureRulerVO&amp;lt;/code&amp;gt;, conseguimos calcular o &#039;&#039;&#039;qcFactor&#039;&#039;&#039; facilmente com o método &amp;lt;code&amp;gt;MeasureUtil.convertTo(...)&amp;lt;/code&amp;gt;. Para o cadastro exemplo acima:&lt;br /&gt;
&lt;br /&gt;
{{java|Cálculo do qcFactor:|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    WEIGHTUNIT itemVOUnit = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 1 - Kilo&lt;br /&gt;
    WEIGHTUNIT itemCodeVOUnit1 = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
    BigDecimal packageRatio1 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor1 = MeasureUtil.convertTo(rulerVO, packageRatio1, itemCodeVOUnit1, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 1:&amp;quot; + qcFactor1); // Saída: 1.0000000000&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 2 - Cento&lt;br /&gt;
    UNITUNIT itemCodeVOUnit2 = UNITUNIT.CENT;&lt;br /&gt;
    BigDecimal packageRatio2 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor2 = MeasureUtil.convertTo(rulerVO, packageRatio2, itemCodeVOUnit2, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 2:&amp;quot; + qcFactor2); // Saída: 3.0000300003 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 3 - Unidade&lt;br /&gt;
    UNITUNIT itemCodeVOUnit3 = UNITUNIT.UNIT;&lt;br /&gt;
    BigDecimal packageRatio3 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor3 = MeasureUtil.convertTo(rulerVO, packageRatio3, itemCodeVOUnit3, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 3:&amp;quot; + qcFactor3); // Saída: 0.0300003000 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 4 - Bandeja&lt;br /&gt;
    // A unidade de medida personalizada precisa ser encapsulada com o MeasureEquivalenceBean para utilizar na MeasureUtil.&lt;br /&gt;
    MeasureEquivalenceBean itemCodeVOUnit4 = new MeasureEquivalenceBean();&lt;br /&gt;
    itemCodeVOUnit4.setEquiVO(equiVO);&lt;br /&gt;
    BigDecimal packageRatio4 = new BigDecimal(&amp;quot;1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor4 = MeasureUtil.convertTo(rulerVO, packageRatio4, itemCodeVOUnit4, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 4:&amp;quot; + qcFactor4); // Saída: 0.7200072001 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão de Custo ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para calcular o custo do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; a partir do custo de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;, precisamos considerar as definições de pacote e unidade de medida como visto no cálculo do &#039;&#039;&#039;Fator de Conversão de Quantidade&#039;&#039;&#039; acima. Devemos considerar que o &#039;&#039;&#039;custo por unidade de medida&#039;&#039;&#039; de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; e de &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; são os mesmos, apenas proporcionais às suas unidades de medida e quantidades de pacote, podemos utilizar o mesmo &#039;&#039;&#039;qcFactor&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A única questão é que são grandezas proporcionalmente invertidas, ou seja, &#039;&#039;&#039;quando maior a quantidade menor o custo&#039;&#039;&#039;&#039;&#039; e vice-versa. No exemplo acima da Mini Coxinha, imaginemos que o o custo do Kilo seja de R$ 10,00. A unidade, que pesa 30g, teria um custo por unidade de R$ 0,30. Estabelecemos acima que o &#039;&#039;&#039;qcFactor&#039;&#039;&#039; da unidade é &#039;&#039;&#039;0.0300003000&#039;&#039;&#039;. Ao multiplicar a quantidade de &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; pelo &#039;&#039;&#039;qcFactor&#039;&#039;&#039; chegamos na quantidade equivalente do &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;, neste caso, se temos o custo de &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; teriamos que dividí-lo pelo mesmo &#039;&#039;&#039;qcFactor&#039;&#039;&#039; para chegar no custo de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;. E na operação inversa, podemos multiplicar o custo de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; para chegar o custo de &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;. O que podemos resumir na seguinte tabela de conversão:&lt;br /&gt;
&lt;br /&gt;
* ItemCodeVO.cost = ItemVO.cost * qcFactor&lt;br /&gt;
* ItemCodeVO.quantity = ItemVO.quantity / qcFactor&lt;br /&gt;
&lt;br /&gt;
E sua inversão:&lt;br /&gt;
* ItemVO.cost = ItemCodeVO.cost / qcFactor&lt;br /&gt;
* ItemVO.quantity = ItemCodeVO.quantity * qcFactor&lt;br /&gt;
&lt;br /&gt;
== Definição do Preço de Venda ==&lt;br /&gt;
&lt;br /&gt;
Há vários fatores sobre a lógica de calcular definir um novo preço de venda. Como as políticas de arredondamento, congelamento de preço, replicação do preço para outros códigos do mesmo grupo, a movimentação de novos preços para histórico, etc.&lt;br /&gt;
&lt;br /&gt;
A ordem das operações lógicas a serem aplicadas sobre o ItemPriceVO devem ser conforme a ordem dos métodos listados abaixo. Cada método executa a operação a partir de um determinado ponto. Isso permite que diferentes eventos que causam a alteração do preço de venda possam acionar o ciclo a partir de diferentes pontos.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Define um Novo preço de Venda para um Código&#039;&#039;&#039; - O início do processo. Quando um novo preço de venda deve ser definido em um código de item. Este passo utiliza o valor recebido as as definições do próprio ItemCode para realizar toda a sequência lógica do preço de venda.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Definition()&#039;&#039;&#039; - Método responsável por carregar as informações do ItemCodeVO e iniciar o processo definição do novo preço de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicar Regras de Arredondamento&#039;&#039;&#039; - Dependendo das configurações da Categoria do Item definida no Código do Item, o preço precisará ser arredondado para respeitar essas políticas.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_RoundApply()&#039;&#039;&#039; - Este método recebe o valor do novo preço e a política de arredondamento para aplicar as regras de arredondamento. Uma vez aplicado os arredondamentos o valor será passado para o próximo método da cadeia (o &#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;) para a efetivação em todos os grupos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Aplicação da Política|Para centralizar o código de aplicação da política, a efetiva aplicação do arredondamento fica na classe utilitária &#039;&#039;&#039;ItemUtils&#039;&#039;&#039; no método &#039;&#039;&#039;applyRoundPricePolicy()&#039;&#039;&#039;. Podendo ser acessado de qualquer ponto, como classes da UI.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Disseminação do Preço de Venda pelo Grupo&#039;&#039;&#039; - Caso o &#039;&#039;ItemCode&#039;&#039; cujo preço de venda esteja sendo alterado faça parte de um grupo, este preço de venda deverá ser disseminado para todos os &#039;&#039;ItemCode&#039;&#039; do Grupo.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;&#039; - Avalia se o &#039;&#039;ItemCode&#039;&#039; cujo preço deve ser alterado faz parte de um grupo. Caso faça ele pesquisa todos os itens do grupo e chama o método &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; todos os envolvidos. Este método não faz qualquer processamento no valor, apenas verifica os códigos envolvidos no grupo e aplica o valor, congelado ou não conforme informado via parâmetros). O valor será aplicado a todos do grupo conforme recebido, &amp;quot;passando por cima&amp;quot; das configurações de arredondamento e políticas de congelamento de cada código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicação do Preço de Venda ao Objeto&#039;&#039;&#039; - Caso haja real alteração no ItemPriceVO uma cópia deve ser convertida para o ItemPriceHistoryVO e persistida. Por fim atualizar o ItemPriceVO na base de dados.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; - Método responsável por atualizar as definições sobre o preço de venda (ItemPriceVO) de um &#039;&#039;Código de Item&#039;&#039;. Este método recebe o novo valor, se o preço estará congelado, e outros atributos para identificação do ItemPriceVO correto (dependendo da assinatura). De acordo com os valores passados, este método avalia se haverá alteração das informações atuais, cria um novo objeto para o histórico de preços (ItemPriceHistoryVO) e salva os dados atuais. Em seguida faz as alterações necessárias ao ItemPriceVO e já o persiste no banco.&lt;br /&gt;
*: &#039;&#039;&#039;Este é (e deve continuar sendo) o único método que fará a atualização do ItemPriceVO no banco de dados!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eventos de Alteração do Preço de Venda ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cadastro/Alteração de Itens&#039;&#039;&#039; - Quando um item é cadastrado ou alterado ele tem definições de códigos e consequentemente de preços de vendas. Neste caso avaliamos as seguintes condições para cada código:&lt;br /&gt;
** &#039;&#039;&#039;Não tem um grupo associado&#039;&#039;&#039; - Se não tem um grupo adicionado, temos que definir e processar o preço completamente. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tem um grupo associado:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos definir novos valores para o código e para o grupo&#039;&#039;&#039; - Se devemos associar novos valores para este novo código e para o grupo em que ele vai entrar, processamos o valor deste código completamente, e como a associação ao grupo é feita antes da definição dos preços, a lógica do updateItemPrice fará a disseminação deste valor nos outros códigos do grupo quando chegar no passo &#039;&#039;_GroupDisseminate()&#039;&#039;. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos copiar o valor atual sendo praticado no grupo&#039;&#039;&#039; - Neste caso vamos buscar o valor de qualquer código do grupo (afinal devem ser todos iguais) e copiamos seus valores. Tanto o valor praticado, quanto um eventual valor que esteja congelado. Chama o &#039;&#039;&#039;_Apply()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Descongelar o Preço de Venda&#039;&#039;&#039; - Descongelar significa efetivar o preço que está congelado como o preço praticado para venda. Para evitar qualquer reprocessamento no valor, mas ainda assim garantir que o novo valor efetivo de venda será definido em todos os códigos do mesmo grupo este método chama o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Descartar Preço Congelado&#039;&#039;&#039; - Quando não queremos que o preço congelado entre em vigor podemos simplesmente descartar o preço congelado, e manter o código com o mesmo preço que já tinha. Neste caso queremos que todos os códigos do mesmo grupo descartem seu preço congelado e que continuem mantendo o preço já praticado. Para evitar o processamento dos valores mas ainda realizar a operação em todos os códigos do grupo chamamos o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:updateItemPriceFlow.png|frame|center|Diagrama do fluxo da lógica de alteração do preço de venda de um Código de Item. E entrada dos eventos que causam essas alterações.]]&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1668</id>
		<title>Módulo Item</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1668"/>
		<updated>2025-11-20T13:07:31Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Fator de Conversão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo &#039;&#039;&#039;Item&#039;&#039;&#039; é o módulo responsável por cadastrar os itens de consumo, produtos de revenda, fabricação própria para venda ou consumo, etc. Este módulo oferecerá um cadastro com controle de preços, markups, custos, entre outras funcionalidades que servirão de suporte para diversos outros módulos, como PDV, Controle de Estoques, Base de Custos para Planilhas de Cálculos, etc.&lt;br /&gt;
&lt;br /&gt;
Para oferecer todo o conceito o módulo é dividido nos seguintes cadastros:&lt;br /&gt;
&lt;br /&gt;
= Categoria do Item =&lt;br /&gt;
&lt;br /&gt;
A categoria do item tem a finalidade de organizar e agrupar os itens de acordo com suas categorias. Mutias vezes a categoria é o corredor em que as mercadorias são agrupadas, como &amp;quot;Bazar&amp;quot;, &amp;quot;Açougue&amp;quot;, &amp;quot;Produtos de Limpeza&amp;quot;, etc. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Estrutura Hierárquica:&#039;&#039;&#039; As categorias são uma estrutura hierárquica, isto é, permite que uma categoria seja adiciona dentro da outra.&lt;br /&gt;
** &#039;&#039;&#039;Nomes Únicos &#039;por Pai&#039;:&#039;&#039;&#039; Os nomes das categorias são únicos dentro do mesmo pai. Em outras palavras, os nomes das categorias só podem se repetir se estiverem em pontos diferentes da estrutura hierárquica.&lt;br /&gt;
** &#039;&#039;&#039;Permite Itens:&#039;&#039;&#039; Esta opção define se os itens podem ser alocados nesta categoria ou não. Quando a opção estiver desmarcada nenhum código de item deverá ser definido nesta categoria. Esta função permite que um determinado tipo de item possa ser alocado nesta categoria, mas força que os itens tenham que ser alocados nas subcategorias.&lt;br /&gt;
** &#039;&#039;&#039;Congelamento de Preços:&#039;&#039;&#039; Este atributo define se os preços dos itens nesta categoria devem permanecer congelados quando forem editados ou houver uma entrada de NFe.&lt;br /&gt;
** &#039;&#039;&#039;Arredondamento de Preços:&#039;&#039;&#039; Permite definir uma regra de arredondamento dos preços de venda de todos os itens que estão nesta categoria. Uma vez definida, nenhum item deverá ter um preço diferente do arredondamento definido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Validar a estrutura de uso por Itens e Tipo de Itens quando a categoria pai for alterada.&#039;&#039;&#039; - A categoria pai de uma categoria não pode ser alterada se algum item estiver associado à ela ou à alguma subcategoria enquanto que o seu tipo de item aponta para a categoria pai. Em outras palavras, caso ao alterar a categoria de posição na hierarquia se não invalidará as condições do tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Hierarquia Cíclica.&#039;&#039;&#039; - Garantir que durante a atualização uma categoria não passa a apontar &amp;quot;como pai&amp;quot; uma categoria que está abaixo dela na hierarquia, criando um relacionamento cíclico.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se temos exatamente 1 ItemCategoryCompanyVO por Empresa&#039;&#039;&#039; - Validar se o temos exatamente 1 definição de dados por empresa. Não devemos ter nem duplicadas, nem faltando. (BUG: 270)&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Categoria de Item Sendo Usado Por Código do Item, Tipo do Item ou outra Categoria de Item&#039;&#039;&#039; - Antes de excluir uma categoria é preciso confirmar se ela não está em uso por outro objeto. Ela pode estar em uso por um código de item (verificar se o Item está ativo), ser referenciada pelo Tipo de Item (também verificar se o mesmo está ativo) ou ser pai de outra categoria (que também precisa verificar se ainda esta ativa). Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Markup, Congelamento de Preços e Arredondamento de Preços são Obrigatórios quando a Categoria permite que itens sejam adicionados.&#039;&#039;&#039; - Validar se estão preenchidos quando a categoria permitir itens, validar se estão nulos quando a categoria não permitir itens. Quando a categoria não permitir itens, o campo MarkUp Mínimo também deve ser nulo.&lt;br /&gt;
&lt;br /&gt;
= Tipo do Item =&lt;br /&gt;
&lt;br /&gt;
O tipo do item tem a finalidade de agrupar todos os itens de um mesmo tipo. Entende-se por tipo de produto &amp;quot;o que o produto é&amp;quot;, por exemplo: Refrigerante, Água, Suco, Pasta de Dente, Pão de Queijo, etc. Não faz parte do tipo a marca, embalagem, quantidades etc. Marca, quantidade, códigos, preços, etc. são parte do cadastro do Iten e não do tipo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo do Item:&#039;&#039;&#039; O nome do tipo de item é usado para identificar o cadastro. Deve ser único.&lt;br /&gt;
** &#039;&#039;&#039;Prefixo:&#039;&#039;&#039; O prefixo é um &amp;quot;começo&amp;quot; da descrição, que será usada em todos os itens desse mesmo tipo. Ao forçar que todos os itens comecem com o mesmo prefixo ajuda na organização do cadastro do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;Descrição de Exemplo: &#039;&#039;&#039; Cada tipo de item deve ter um espaço para orientar o usuário sobre quais as informações importantes para aquele tipo de produto, além de definir a ordem em que devem aparecer.&lt;br /&gt;
** &#039;&#039;&#039;Associação com Aliquota ICMS:&#039;&#039;&#039; No tipo do item devemos definir qual a alíquota de tributação do ICMS que deverá ser utilizada em todos os itens desse tipo. Centralizando e simplificando as configurações.&lt;br /&gt;
** &#039;&#039;&#039;Associação com As categorias:&#039;&#039;&#039; Cada tipo de item deve associar no mínimo uma categoria de itens. Cada item deste tipo deverá associar seus códigos nessas categorias ou suas subcategorias. O tipo de item pode permitir associação com mais de um &amp;quot;nó&amp;quot; da hierarquia da categoria. Permitindo assim que itens do mesmo tipo possam ser lançados em categorias diferentes. Como por exemplo um refrigerante com um código lançado na categoria de &amp;quot;Geladeiras/Loja&amp;quot; e outro código em &amp;quot;Restaurante/SelfService&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Categoria em Uso por Itens continua Disponível&#039;&#039;&#039; - Quando um tipo de item é alterado, é preciso validar se os itens desse tipo atualmente cadastrados não ficarão inválidos caso a categoria não esteja mais associada ao tipo de item. Ou seja, quando um item associado a esse tipo de item já estiver utilizando determinada categoria ela não pode ser excluída do tipo de item. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Alteração do Prefixo reflete nos itens existentes&#039;&#039;&#039; - Caso o prefixo seja alterado, todos os itens deste tipo de item devem ter seu nome atualizado de acordo com o novo prefixo. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Verifica Definições de Impostos para cada empresa&#039;&#039;&#039; - Verifica a definição dos impostos para cada empresa existente.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Tipo e Alíquota no ECF igual à Alíquota Efetiva&#039;&#039;&#039; - Verifica se o tipo do ICMS definido no tipo de item e a alíquota efetiva do do cálculo é coerente com os valores cadastrados no objeto ICMSVO, usado no momento de venda do ECF.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Natureza da Receita e Tabela são obrigatórios para os CSTs 02, 03, 04, 05, 06, 07, 08 e 09&#039;&#039;&#039; - Para todos esses CSTs, os campos de Natureza da Receita e Tabela ser validado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Verificar se a tabela é valida para o CST de Saída informado&#039;&#039;&#039; - Quando a tabela é informada, ela deve ser coerente com o código do CST de saída informado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Verificar se o Natureza é válida para a Tabela informada&#039;&#039;&#039; - Ao informar um código da Natureza da Receita o BIS deve verificar se o código da Receita é válido para a tabela sendo usada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Tipo de Item Sendo Usado no Momento&#039;&#039;&#039; - Antes de excluir o tipo de item é preciso verificar se ele não está em uso no momento. Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
&lt;br /&gt;
= ICMS =&lt;br /&gt;
&lt;br /&gt;
O objeto ICMS é a definição das alíquotas de ICMS utilizadas pelos Itens/Tipo de Itens. As alíquotas devem ser cadastradas conforme as alíquotas que a empresa utiliza.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo de Alíquota&#039;&#039;&#039; - As alíquotas podem ser de 3 tipos diferentes: Isento, Substituição e Tributada.&lt;br /&gt;
** &#039;&#039;&#039;Alíquota&#039;&#039;&#039; - A alíquota é a percentagem usado para calcular o valor do tributo. A alíquota quando definida é um valor positivo.&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - As alíquotas devem ter um nome que facilite a identificação da alíquota para o usuário. Este nome deve ser único.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Definição Obrigatória da Alíquota quando o tipo for Tributado&#039;&#039;&#039; - A definição da alíquota é obrigatória sempre que o tipo for Tributada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Não definição da Alíquota para os tipos Isento e Substituição.&#039;&#039;&#039; - Para os tipos Isento e Substituição o valor da alíquota devem estar nulos.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Em uso por algum tipo de item&#039;&#039;&#039; - durante a tentativa de exclusão, verificar se o ICMS não está em uso atualmente por algum Tipo de Item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ItemCodeGroup =&lt;br /&gt;
&lt;br /&gt;
O Grupo de Código de Item tem a finalidade de agrupar diferentes códigos de itens e fazer com que SEMPRE tenham o mesmo preço de venda. Independente de custo, categorias markups, arredondamentos, etc. Uma vez que um preço de venda de um item for alterado, os demais vão segui-lo fielmente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - Tudo grupo de código deve ter um nome para facilitar a identificação dos itens que fazem parte do grupo.&lt;br /&gt;
** &#039;&#039;&#039;Lista de Còdigos&#039;&#039;&#039; - Dentro de um mesmo grupo podem ser associados 0+ códigos de itens. Códigos de um mesmo item podem fazer parte do mesmo grupo.&lt;br /&gt;
** &#039;&#039;&#039;Sempre o mesmo preço de venda&#039;&#039;&#039; - Independente das diferentes configurações que um código de item pode ter dentro do mesmo grupo, como diferentes categorias, MarkUps, Custos, definições de arredondamento, package ratios, etc.. O preço de venda de todos os itens do grupo devem ter exatamente o mesmo valor. Mesmo que para isso tenha que desrespeitar qualquer outra regra do sistema (como arredondamento, ou cálculo de package, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Códigos de Itens já associados a outros grupos&#039;&#039;&#039; - Durante a inserção ou atualização, um grupo não deve permitir que um código de item já associado à outro grupo seja associado a este. Em outras palavras, um código de item não pode estar associado em mais de um grupo ao mesmo tempo.&lt;br /&gt;
&lt;br /&gt;
= Item = &lt;br /&gt;
&lt;br /&gt;
A entidade Item representa um produto qualquer da empresa. Esse produto por ser um insumo, uma matéria prima ou um produto de venda (ou revenda).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Fixação do prefixo da descrição de acordo com o tipo do Item&#039;&#039;&#039; - Todo item deve ser de algum &#039;&#039;Tipo de Item&#039;&#039;. Uma vez que o tipo de item esteja definido, a descrição do item obrigatoriamente deve começar com o valor do &#039;&#039;Prefixo&#039;&#039; definido no &#039;&#039;Tipo de Item&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Obrigatoriedade da Marca ou da Descrição&#039;&#039;&#039; - Todo item deve ter preenchidos no mínimo um dos campos &#039;&#039;Marca&#039;&#039; ou &#039;&#039;Descrição&#039;&#039;. Mesmo para produtos de fabricação própria, é recomendável definir a marca da empresa por questões de organização dos itens. Caso nenhum dos dois seja preenchido a descrição pode acabar sendo apenas o &#039;&#039;Prefixo&#039;&#039; do &#039;&#039;Tipo de Item&#039;&#039;. Para Itens &amp;quot;genéricos&amp;quot;, cuja marca não importa, pois em cada momento uma marca diferente é comprada ou usada, a marca não é necessária, mas uma descrição sim.&lt;br /&gt;
** &#039;&#039;&#039;Dimensão e Unidade de Medida Padrão&#039;&#039;&#039; - Todo item tem uma dimensão (Massa, Unidades, Volume, Cumprimento, etc.) e uma unidade de medida (Kg, Unidades, Litros, Metros, etc.) a que se refere o item. Essa unidade ajuda identifica a unidade de quantização padrão desse item. A unidade em que por padrão esse item é comprado, vendido e movimentado. Outras unidades diferentes para movimentar o mesmo item podem ser definidas em códigos diferentes.&lt;br /&gt;
** &#039;&#039;&#039;Custo&#039;&#039;&#039; - Todo Item tem um custo único padrão. Esse custo é sempre o mesmo, independente da empresa.&lt;br /&gt;
** &#039;&#039;&#039;Códigos dos Itens:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Múltiplos Códigos&#039;&#039;&#039; - Cada item pode ter mais que um código definido, ou seja, uma lista de códigos. Códigos são a maneira definir um modo quantidade, preço de venda, pacote, etc. de um determinado Item. Normalmente tem uma identificação única (e normalmente numérica, embora não obrigatória) para ser referenciada em terminais, notas, códigos de barras, etc. No entanto a identificação única não deve ser obrigatória. Um item pode ter um código para definir uma determinada quantidade de movimentação de entrada ou saída, ou simplesmente para definir uma nova unidade de medida. Por exemplo, produtos identificados hora por Kilos hora por Unidades.&lt;br /&gt;
*** &#039;&#039;&#039;Categoria do Item&#039;&#039;&#039; - De acordo com o &#039;&#039;Tipo de Item&#039;&#039; definido no Item, cada código do item deverá ser alocado em uma das categorias definidas no &#039;&#039;Tipo de Item&#039;&#039;. Apesar de ser o mesmo código, cada um pode gerar venda em uma categoria diferente, ou utilizar o MarkUp diferentes de acordo com o definido em cada categoria.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Validar requisito de Obrigatoriedade entre Marca e Descrição&#039;&#039;&#039; - Um dos campos deve sempre ser preenchido.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Validar inconsistência entre Fabricação do Produto e Origem do Item&#039;&#039;&#039; - Se o produto for de fabricação própria, ele não pode ter uma das opções de importado definida em Origem do Item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Validar finalidade do item&#039;&#039;&#039; - Todo item deve ter no mínimo 1 finalidade definida em seu cadastro.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Preenchimento completo dos pesos e volumes das embalagens&#039;&#039;&#039; - Se algum campo for preenchido, ele deve ser preenchido por completo! Por exemplo, se o &amp;quot;Peso Drenado&amp;quot; for definido, obrigatoriamente sua unidade de medida deve ser preenchida, o mesmo para o caso contrário: se a unidade for definida, a quantidade também deverá ser!&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Não permite que um Item tenha dois códigos iguais definidos&#039;&#039;&#039; - Validar se o código sendo inserido/alterado não tem definido duas vezes o mesmo código.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Os códigos de item só podem ser associados às categorias definidas no tipo de item&#039;&#039;&#039; - Validar se a categoria enviada no ItemCodeVO é uma das categorias disponibilizadas no ItemTypeVO associado ao ItemVO. Os códigos ficam limitados a usarem apenas as categorias permitidas de acordo com o tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se a Categoria do Item permite a associação dos itens&#039;&#039;&#039; - Os códigos de itens não podem ser associados às categorias que não permitem a associação de itens.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Validar Finalidade do Item&#039;&#039;&#039; - O campo de finalidade não pode ter alguns alguns valores de acordo os valores definidos nos outros campos, conforme as seguintes regras:&lt;br /&gt;
*** &#039;&#039;&#039;Revenda:&#039;&#039;&#039; Não pode ser definido quando o produto for de &#039;&#039;&#039;Fabricação Própria&#039;&#039;&#039;.&lt;br /&gt;
*** &#039;&#039;&#039;Produto Acabado:&#039;&#039;&#039; Não pode ser definido quando o produto for &#039;&#039;&#039;Produzido por Terceiros&#039;&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;[ve0009] Valida Item Próprio em Tipo de Substituição&#039;&#039;&#039; - Valida se o Item é de produção própria e está em um tipo de item com a tributação de ICMS definida como Substituição Tributária.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Descrição do Item&#039;&#039;&#039; - Valida se a descrição do item é única entre os itens ativos no momento.&lt;br /&gt;
** &#039;&#039;&#039;[ve0011] Itens de Revenda não podem ser Descartáveis&#039;&#039;&#039; - Valida se o item tiver o propósito como revenda, não permite que seja do tipo descartável.&lt;br /&gt;
&lt;br /&gt;
== Pacotes / Equivalência de Unidades ==&lt;br /&gt;
&lt;br /&gt;
Um único item (&amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;) do sistema pode ter diversos código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), chamados de pacotes. A ideia de pacotes é que o mesmo item possa ser vendidos em proporções ou embalagens diferentes, por exemplo, mini-coxinhas podem ser vendidas ao centro, por unidade, por quilo ou empacotadas em bandeijas.&lt;br /&gt;
&lt;br /&gt;
Para resolver essa questão o item apresenta uma &#039;&#039;&#039;Régua de Equivalência&#039;&#039;&#039;, que estabelece a relação de proporção de quantidades entre as diferentes gandezas. Por exemplo, define-se que a 1Und tem 30g e que 1 Bandeija tem 30 unidades. Deste ponto em diante o sistema saberá vender o item em bandeijas, unidades (e suas variações como pares, dúzias, etc.) ou quilo (e suas variações como gramas, toneladas, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Embora um item possa trabalhar com diferentes sistemas de unidades de medidas, uma unidade de medida principal e imutável é atribuída ao item. Esta unidade é a utilizada pelo sistema para concentrar as quantidades de estoque, relatórios de quantidade de vendas, etc.. Deve ser a unidade de medida que a empresa costuma utilizar no seu dia a dia para contabilizar os itens. Muitas vezes é considerada a menor unidade divísivel do item para evitar trabalhar com frações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão de Quantidade ===&lt;br /&gt;
&lt;br /&gt;
Um conceito presa ser definido neste ponto: para efeitos de cálculo, criamos o &#039;&#039;&#039;Fator de Conversão de Quantidade&#039;&#039;&#039; (&#039;&#039;&#039;Quantity Conversion Factor&#039;&#039;&#039;) ou &#039;&#039;&#039;qcFactor&#039;&#039;&#039;. Esse fator representa o multiplicador necessário para transformar a quantidade de um código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;) na quantidade equivalente do item (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), considerando suas unidades de medida e quantidade do pacote.&lt;br /&gt;
&lt;br /&gt;
Esse fator é obtido a partir da seguinte equação verdade:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;qtyItemVO = qcFactor * qtyItemCodeVO&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou sua equivalente:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;qtyItemCodeVO = qtyItemVO / qcFactor&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Em palavras...|Com o &#039;&#039;&#039;qcFactor&#039;&#039;&#039;  na mão, temos que: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;cada unidade vendida do código equivale &amp;quot;X&amp;quot; unidades vendidas do item&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
ou mais precisamente: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;cada unidade vendida do código equivale &amp;quot;qcFactor&amp;quot; unidades vendidas do item&#039;&#039;&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assim, o valor de &#039;&#039;&#039;qcFactor&#039;&#039;&#039; é definido da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;fatorCQ = unitRatio * packageRatio&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde:&lt;br /&gt;
* &#039;&#039;&#039;unitRatio&#039;&#039;&#039; - É a razão entre os fatores das unidades de medida do código e da unidade principal.&lt;br /&gt;
:* &#039;&#039;&#039;Exemplo:&#039;&#039;&#039; A unidade principal é Kilograma, e a do código é Gramas. Se o fator de Kilograma é 1, a de gramas será 1000, representando que 1Kg = 1000g. Neste caso &#039;&#039;&#039;unitRatio = 1/1000 = 0,001&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;packageRatio&#039;&#039;&#039; - É a definição do usuário estabelecendo uma proporção de quantidade de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exemplo ====&lt;br /&gt;
&lt;br /&gt;
O cadastro de &#039;&#039;&#039;Mini Coxinhas&#039;&#039;&#039; produzida pela empresa estabelece o seguinte:&lt;br /&gt;
* &#039;&#039;&#039;Unidade Principal:&#039;&#039;&#039; Definido em Kilos, pois o usuário entende que Kilos é a unidade mais usual para trabalhar (controlar estoque, custo, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Relações de Grandezas:&#039;&#039;&#039; Para cobrir seus diferentes métodos de venda o usuário estabelece a seguinte relação de Grandezas:&lt;br /&gt;
:* &#039;&#039;&#039;1 Und = 30g&#039;&#039;&#039; - Define que 1 unidade de Mini Coxinha tem o tamanho de 30g.&lt;br /&gt;
:* &#039;&#039;&#039;1 Bandeja = 2 Dúzia&#039;&#039;&#039; - A unidade personalizada Bandeija equivale a 1 dúzia.&lt;br /&gt;
* &#039;&#039;&#039;Códigos de Vendas:&#039;&#039;&#039;&lt;br /&gt;
:* &#039;&#039;&#039;1 - Venda por Kilo:&#039;&#039;&#039; - Neste código o usuário define o tamanho do pacote em 1, a unidade &#039;Kilogram&#039; e que o códigio é divisível.&lt;br /&gt;
:* &#039;&#039;&#039;2 - Venda por Cento:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Centro&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;3 - Venda por Unidade:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Unidade&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;4 - Venda por Bandeija:&#039;&#039;&#039; - Aqui, define o tamanho do pacote em 2, a unidade em &#039;Bandeija&#039; e que o código é indivisível.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em relação ao código para trabalhar com essas informações vamos dividir em partes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{java|Preparação da Régua e Definições|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // Utilizamos a classe MeasureUtil para facilitar a criação da Régua e medidas&lt;br /&gt;
    MeasureRulerVO rulerVO = MeasureUtil.createSimpleMeasureRulerVO(BigDecimal.ONE, WEIGHTUNIT.KILOGRAM); // Cria a régua com a unidade principal, estabelecendo a razão 1&lt;br /&gt;
    MeasureUtil.fillSmartRuler(rulerVO, BigDecimal.ONE, UNITUNIT.UNIT, new BigDecimal(&amp;quot;30&amp;quot;), WEIGHTUNIT.GRAM); // Estabelece que 1 unidade = 30 gramas&lt;br /&gt;
&lt;br /&gt;
    // Unidade de medida personalizada, oferecida pelo sistema&lt;br /&gt;
    MeasureCustomVO measureCustomVO = new MeasureCustomVO();&lt;br /&gt;
    measureCustomVO.setCode(&amp;quot;BDJ&amp;quot;);&lt;br /&gt;
    measureCustomVO.setDescription(&amp;quot;Bandeja&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Estabelece a relação da unidade personalizada com uma unidade presente na régua: 1BDJ = 1Dúzia&lt;br /&gt;
    MeasureEquivalenceVO equiVO = new MeasureEquivalenceVO();&lt;br /&gt;
    equiVO.setMeasureCustomVO(measureCustomVO);&lt;br /&gt;
    equiVO.setReferencequantity(new BigDecimal(&amp;quot;2&amp;quot;));&lt;br /&gt;
    equiVO.setReferenceunit(UNITUNIT.DOZEN);&lt;br /&gt;
    equiVO.setMeasurerulervo(rulerVO);&lt;br /&gt;
    rulerVO.getMeasurerulerequivalencelist().add(equiVO);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que passamos as definições de proporções do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; para a &amp;lt;code&amp;gt;MeasureRulerVO&amp;lt;/code&amp;gt;, conseguimos calcular o &#039;&#039;&#039;qcFactor&#039;&#039;&#039; facilmente com o método &amp;lt;code&amp;gt;MeasureUtil.convertTo(...)&amp;lt;/code&amp;gt;. Para o cadastro exemplo acima:&lt;br /&gt;
&lt;br /&gt;
{{java|Cálculo do qcFactor:|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    WEIGHTUNIT itemVOUnit = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 1 - Kilo&lt;br /&gt;
    WEIGHTUNIT itemCodeVOUnit1 = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
    BigDecimal packageRatio1 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor1 = MeasureUtil.convertTo(rulerVO, packageRatio1, itemCodeVOUnit1, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 1:&amp;quot; + qcFactor1); // Saída: 1.0000000000&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 2 - Cento&lt;br /&gt;
    UNITUNIT itemCodeVOUnit2 = UNITUNIT.CENT;&lt;br /&gt;
    BigDecimal packageRatio2 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor2 = MeasureUtil.convertTo(rulerVO, packageRatio2, itemCodeVOUnit2, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 2:&amp;quot; + qcFactor2); // Saída: 3.0000300003 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 3 - Unidade&lt;br /&gt;
    UNITUNIT itemCodeVOUnit3 = UNITUNIT.UNIT;&lt;br /&gt;
    BigDecimal packageRatio3 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor3 = MeasureUtil.convertTo(rulerVO, packageRatio3, itemCodeVOUnit3, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 3:&amp;quot; + qcFactor3); // Saída: 0.0300003000 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 4 - Bandeja&lt;br /&gt;
    // A unidade de medida personalizada precisa ser encapsulada com o MeasureEquivalenceBean para utilizar na MeasureUtil.&lt;br /&gt;
    MeasureEquivalenceBean itemCodeVOUnit4 = new MeasureEquivalenceBean();&lt;br /&gt;
    itemCodeVOUnit4.setEquiVO(equiVO);&lt;br /&gt;
    BigDecimal packageRatio4 = new BigDecimal(&amp;quot;1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor4 = MeasureUtil.convertTo(rulerVO, packageRatio4, itemCodeVOUnit4, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 4:&amp;quot; + qcFactor4); // Saída: 0.7200072001 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão de Custo ===&lt;br /&gt;
&lt;br /&gt;
== Definição do Preço de Venda ==&lt;br /&gt;
&lt;br /&gt;
Há vários fatores sobre a lógica de calcular definir um novo preço de venda. Como as políticas de arredondamento, congelamento de preço, replicação do preço para outros códigos do mesmo grupo, a movimentação de novos preços para histórico, etc.&lt;br /&gt;
&lt;br /&gt;
A ordem das operações lógicas a serem aplicadas sobre o ItemPriceVO devem ser conforme a ordem dos métodos listados abaixo. Cada método executa a operação a partir de um determinado ponto. Isso permite que diferentes eventos que causam a alteração do preço de venda possam acionar o ciclo a partir de diferentes pontos.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Define um Novo preço de Venda para um Código&#039;&#039;&#039; - O início do processo. Quando um novo preço de venda deve ser definido em um código de item. Este passo utiliza o valor recebido as as definições do próprio ItemCode para realizar toda a sequência lógica do preço de venda.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Definition()&#039;&#039;&#039; - Método responsável por carregar as informações do ItemCodeVO e iniciar o processo definição do novo preço de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicar Regras de Arredondamento&#039;&#039;&#039; - Dependendo das configurações da Categoria do Item definida no Código do Item, o preço precisará ser arredondado para respeitar essas políticas.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_RoundApply()&#039;&#039;&#039; - Este método recebe o valor do novo preço e a política de arredondamento para aplicar as regras de arredondamento. Uma vez aplicado os arredondamentos o valor será passado para o próximo método da cadeia (o &#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;) para a efetivação em todos os grupos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Aplicação da Política|Para centralizar o código de aplicação da política, a efetiva aplicação do arredondamento fica na classe utilitária &#039;&#039;&#039;ItemUtils&#039;&#039;&#039; no método &#039;&#039;&#039;applyRoundPricePolicy()&#039;&#039;&#039;. Podendo ser acessado de qualquer ponto, como classes da UI.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Disseminação do Preço de Venda pelo Grupo&#039;&#039;&#039; - Caso o &#039;&#039;ItemCode&#039;&#039; cujo preço de venda esteja sendo alterado faça parte de um grupo, este preço de venda deverá ser disseminado para todos os &#039;&#039;ItemCode&#039;&#039; do Grupo.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;&#039; - Avalia se o &#039;&#039;ItemCode&#039;&#039; cujo preço deve ser alterado faz parte de um grupo. Caso faça ele pesquisa todos os itens do grupo e chama o método &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; todos os envolvidos. Este método não faz qualquer processamento no valor, apenas verifica os códigos envolvidos no grupo e aplica o valor, congelado ou não conforme informado via parâmetros). O valor será aplicado a todos do grupo conforme recebido, &amp;quot;passando por cima&amp;quot; das configurações de arredondamento e políticas de congelamento de cada código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicação do Preço de Venda ao Objeto&#039;&#039;&#039; - Caso haja real alteração no ItemPriceVO uma cópia deve ser convertida para o ItemPriceHistoryVO e persistida. Por fim atualizar o ItemPriceVO na base de dados.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; - Método responsável por atualizar as definições sobre o preço de venda (ItemPriceVO) de um &#039;&#039;Código de Item&#039;&#039;. Este método recebe o novo valor, se o preço estará congelado, e outros atributos para identificação do ItemPriceVO correto (dependendo da assinatura). De acordo com os valores passados, este método avalia se haverá alteração das informações atuais, cria um novo objeto para o histórico de preços (ItemPriceHistoryVO) e salva os dados atuais. Em seguida faz as alterações necessárias ao ItemPriceVO e já o persiste no banco.&lt;br /&gt;
*: &#039;&#039;&#039;Este é (e deve continuar sendo) o único método que fará a atualização do ItemPriceVO no banco de dados!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eventos de Alteração do Preço de Venda ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cadastro/Alteração de Itens&#039;&#039;&#039; - Quando um item é cadastrado ou alterado ele tem definições de códigos e consequentemente de preços de vendas. Neste caso avaliamos as seguintes condições para cada código:&lt;br /&gt;
** &#039;&#039;&#039;Não tem um grupo associado&#039;&#039;&#039; - Se não tem um grupo adicionado, temos que definir e processar o preço completamente. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tem um grupo associado:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos definir novos valores para o código e para o grupo&#039;&#039;&#039; - Se devemos associar novos valores para este novo código e para o grupo em que ele vai entrar, processamos o valor deste código completamente, e como a associação ao grupo é feita antes da definição dos preços, a lógica do updateItemPrice fará a disseminação deste valor nos outros códigos do grupo quando chegar no passo &#039;&#039;_GroupDisseminate()&#039;&#039;. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos copiar o valor atual sendo praticado no grupo&#039;&#039;&#039; - Neste caso vamos buscar o valor de qualquer código do grupo (afinal devem ser todos iguais) e copiamos seus valores. Tanto o valor praticado, quanto um eventual valor que esteja congelado. Chama o &#039;&#039;&#039;_Apply()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Descongelar o Preço de Venda&#039;&#039;&#039; - Descongelar significa efetivar o preço que está congelado como o preço praticado para venda. Para evitar qualquer reprocessamento no valor, mas ainda assim garantir que o novo valor efetivo de venda será definido em todos os códigos do mesmo grupo este método chama o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Descartar Preço Congelado&#039;&#039;&#039; - Quando não queremos que o preço congelado entre em vigor podemos simplesmente descartar o preço congelado, e manter o código com o mesmo preço que já tinha. Neste caso queremos que todos os códigos do mesmo grupo descartem seu preço congelado e que continuem mantendo o preço já praticado. Para evitar o processamento dos valores mas ainda realizar a operação em todos os códigos do grupo chamamos o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:updateItemPriceFlow.png|frame|center|Diagrama do fluxo da lógica de alteração do preço de venda de um Código de Item. E entrada dos eventos que causam essas alterações.]]&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1667</id>
		<title>Módulo Item</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1667"/>
		<updated>2025-11-20T13:05:55Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Fator de Conversão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo &#039;&#039;&#039;Item&#039;&#039;&#039; é o módulo responsável por cadastrar os itens de consumo, produtos de revenda, fabricação própria para venda ou consumo, etc. Este módulo oferecerá um cadastro com controle de preços, markups, custos, entre outras funcionalidades que servirão de suporte para diversos outros módulos, como PDV, Controle de Estoques, Base de Custos para Planilhas de Cálculos, etc.&lt;br /&gt;
&lt;br /&gt;
Para oferecer todo o conceito o módulo é dividido nos seguintes cadastros:&lt;br /&gt;
&lt;br /&gt;
= Categoria do Item =&lt;br /&gt;
&lt;br /&gt;
A categoria do item tem a finalidade de organizar e agrupar os itens de acordo com suas categorias. Mutias vezes a categoria é o corredor em que as mercadorias são agrupadas, como &amp;quot;Bazar&amp;quot;, &amp;quot;Açougue&amp;quot;, &amp;quot;Produtos de Limpeza&amp;quot;, etc. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Estrutura Hierárquica:&#039;&#039;&#039; As categorias são uma estrutura hierárquica, isto é, permite que uma categoria seja adiciona dentro da outra.&lt;br /&gt;
** &#039;&#039;&#039;Nomes Únicos &#039;por Pai&#039;:&#039;&#039;&#039; Os nomes das categorias são únicos dentro do mesmo pai. Em outras palavras, os nomes das categorias só podem se repetir se estiverem em pontos diferentes da estrutura hierárquica.&lt;br /&gt;
** &#039;&#039;&#039;Permite Itens:&#039;&#039;&#039; Esta opção define se os itens podem ser alocados nesta categoria ou não. Quando a opção estiver desmarcada nenhum código de item deverá ser definido nesta categoria. Esta função permite que um determinado tipo de item possa ser alocado nesta categoria, mas força que os itens tenham que ser alocados nas subcategorias.&lt;br /&gt;
** &#039;&#039;&#039;Congelamento de Preços:&#039;&#039;&#039; Este atributo define se os preços dos itens nesta categoria devem permanecer congelados quando forem editados ou houver uma entrada de NFe.&lt;br /&gt;
** &#039;&#039;&#039;Arredondamento de Preços:&#039;&#039;&#039; Permite definir uma regra de arredondamento dos preços de venda de todos os itens que estão nesta categoria. Uma vez definida, nenhum item deverá ter um preço diferente do arredondamento definido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Validar a estrutura de uso por Itens e Tipo de Itens quando a categoria pai for alterada.&#039;&#039;&#039; - A categoria pai de uma categoria não pode ser alterada se algum item estiver associado à ela ou à alguma subcategoria enquanto que o seu tipo de item aponta para a categoria pai. Em outras palavras, caso ao alterar a categoria de posição na hierarquia se não invalidará as condições do tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Hierarquia Cíclica.&#039;&#039;&#039; - Garantir que durante a atualização uma categoria não passa a apontar &amp;quot;como pai&amp;quot; uma categoria que está abaixo dela na hierarquia, criando um relacionamento cíclico.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se temos exatamente 1 ItemCategoryCompanyVO por Empresa&#039;&#039;&#039; - Validar se o temos exatamente 1 definição de dados por empresa. Não devemos ter nem duplicadas, nem faltando. (BUG: 270)&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Categoria de Item Sendo Usado Por Código do Item, Tipo do Item ou outra Categoria de Item&#039;&#039;&#039; - Antes de excluir uma categoria é preciso confirmar se ela não está em uso por outro objeto. Ela pode estar em uso por um código de item (verificar se o Item está ativo), ser referenciada pelo Tipo de Item (também verificar se o mesmo está ativo) ou ser pai de outra categoria (que também precisa verificar se ainda esta ativa). Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Markup, Congelamento de Preços e Arredondamento de Preços são Obrigatórios quando a Categoria permite que itens sejam adicionados.&#039;&#039;&#039; - Validar se estão preenchidos quando a categoria permitir itens, validar se estão nulos quando a categoria não permitir itens. Quando a categoria não permitir itens, o campo MarkUp Mínimo também deve ser nulo.&lt;br /&gt;
&lt;br /&gt;
= Tipo do Item =&lt;br /&gt;
&lt;br /&gt;
O tipo do item tem a finalidade de agrupar todos os itens de um mesmo tipo. Entende-se por tipo de produto &amp;quot;o que o produto é&amp;quot;, por exemplo: Refrigerante, Água, Suco, Pasta de Dente, Pão de Queijo, etc. Não faz parte do tipo a marca, embalagem, quantidades etc. Marca, quantidade, códigos, preços, etc. são parte do cadastro do Iten e não do tipo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo do Item:&#039;&#039;&#039; O nome do tipo de item é usado para identificar o cadastro. Deve ser único.&lt;br /&gt;
** &#039;&#039;&#039;Prefixo:&#039;&#039;&#039; O prefixo é um &amp;quot;começo&amp;quot; da descrição, que será usada em todos os itens desse mesmo tipo. Ao forçar que todos os itens comecem com o mesmo prefixo ajuda na organização do cadastro do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;Descrição de Exemplo: &#039;&#039;&#039; Cada tipo de item deve ter um espaço para orientar o usuário sobre quais as informações importantes para aquele tipo de produto, além de definir a ordem em que devem aparecer.&lt;br /&gt;
** &#039;&#039;&#039;Associação com Aliquota ICMS:&#039;&#039;&#039; No tipo do item devemos definir qual a alíquota de tributação do ICMS que deverá ser utilizada em todos os itens desse tipo. Centralizando e simplificando as configurações.&lt;br /&gt;
** &#039;&#039;&#039;Associação com As categorias:&#039;&#039;&#039; Cada tipo de item deve associar no mínimo uma categoria de itens. Cada item deste tipo deverá associar seus códigos nessas categorias ou suas subcategorias. O tipo de item pode permitir associação com mais de um &amp;quot;nó&amp;quot; da hierarquia da categoria. Permitindo assim que itens do mesmo tipo possam ser lançados em categorias diferentes. Como por exemplo um refrigerante com um código lançado na categoria de &amp;quot;Geladeiras/Loja&amp;quot; e outro código em &amp;quot;Restaurante/SelfService&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Categoria em Uso por Itens continua Disponível&#039;&#039;&#039; - Quando um tipo de item é alterado, é preciso validar se os itens desse tipo atualmente cadastrados não ficarão inválidos caso a categoria não esteja mais associada ao tipo de item. Ou seja, quando um item associado a esse tipo de item já estiver utilizando determinada categoria ela não pode ser excluída do tipo de item. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Alteração do Prefixo reflete nos itens existentes&#039;&#039;&#039; - Caso o prefixo seja alterado, todos os itens deste tipo de item devem ter seu nome atualizado de acordo com o novo prefixo. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Verifica Definições de Impostos para cada empresa&#039;&#039;&#039; - Verifica a definição dos impostos para cada empresa existente.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Tipo e Alíquota no ECF igual à Alíquota Efetiva&#039;&#039;&#039; - Verifica se o tipo do ICMS definido no tipo de item e a alíquota efetiva do do cálculo é coerente com os valores cadastrados no objeto ICMSVO, usado no momento de venda do ECF.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Natureza da Receita e Tabela são obrigatórios para os CSTs 02, 03, 04, 05, 06, 07, 08 e 09&#039;&#039;&#039; - Para todos esses CSTs, os campos de Natureza da Receita e Tabela ser validado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Verificar se a tabela é valida para o CST de Saída informado&#039;&#039;&#039; - Quando a tabela é informada, ela deve ser coerente com o código do CST de saída informado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Verificar se o Natureza é válida para a Tabela informada&#039;&#039;&#039; - Ao informar um código da Natureza da Receita o BIS deve verificar se o código da Receita é válido para a tabela sendo usada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Tipo de Item Sendo Usado no Momento&#039;&#039;&#039; - Antes de excluir o tipo de item é preciso verificar se ele não está em uso no momento. Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
&lt;br /&gt;
= ICMS =&lt;br /&gt;
&lt;br /&gt;
O objeto ICMS é a definição das alíquotas de ICMS utilizadas pelos Itens/Tipo de Itens. As alíquotas devem ser cadastradas conforme as alíquotas que a empresa utiliza.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo de Alíquota&#039;&#039;&#039; - As alíquotas podem ser de 3 tipos diferentes: Isento, Substituição e Tributada.&lt;br /&gt;
** &#039;&#039;&#039;Alíquota&#039;&#039;&#039; - A alíquota é a percentagem usado para calcular o valor do tributo. A alíquota quando definida é um valor positivo.&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - As alíquotas devem ter um nome que facilite a identificação da alíquota para o usuário. Este nome deve ser único.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Definição Obrigatória da Alíquota quando o tipo for Tributado&#039;&#039;&#039; - A definição da alíquota é obrigatória sempre que o tipo for Tributada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Não definição da Alíquota para os tipos Isento e Substituição.&#039;&#039;&#039; - Para os tipos Isento e Substituição o valor da alíquota devem estar nulos.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Em uso por algum tipo de item&#039;&#039;&#039; - durante a tentativa de exclusão, verificar se o ICMS não está em uso atualmente por algum Tipo de Item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ItemCodeGroup =&lt;br /&gt;
&lt;br /&gt;
O Grupo de Código de Item tem a finalidade de agrupar diferentes códigos de itens e fazer com que SEMPRE tenham o mesmo preço de venda. Independente de custo, categorias markups, arredondamentos, etc. Uma vez que um preço de venda de um item for alterado, os demais vão segui-lo fielmente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - Tudo grupo de código deve ter um nome para facilitar a identificação dos itens que fazem parte do grupo.&lt;br /&gt;
** &#039;&#039;&#039;Lista de Còdigos&#039;&#039;&#039; - Dentro de um mesmo grupo podem ser associados 0+ códigos de itens. Códigos de um mesmo item podem fazer parte do mesmo grupo.&lt;br /&gt;
** &#039;&#039;&#039;Sempre o mesmo preço de venda&#039;&#039;&#039; - Independente das diferentes configurações que um código de item pode ter dentro do mesmo grupo, como diferentes categorias, MarkUps, Custos, definições de arredondamento, package ratios, etc.. O preço de venda de todos os itens do grupo devem ter exatamente o mesmo valor. Mesmo que para isso tenha que desrespeitar qualquer outra regra do sistema (como arredondamento, ou cálculo de package, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Códigos de Itens já associados a outros grupos&#039;&#039;&#039; - Durante a inserção ou atualização, um grupo não deve permitir que um código de item já associado à outro grupo seja associado a este. Em outras palavras, um código de item não pode estar associado em mais de um grupo ao mesmo tempo.&lt;br /&gt;
&lt;br /&gt;
= Item = &lt;br /&gt;
&lt;br /&gt;
A entidade Item representa um produto qualquer da empresa. Esse produto por ser um insumo, uma matéria prima ou um produto de venda (ou revenda).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Fixação do prefixo da descrição de acordo com o tipo do Item&#039;&#039;&#039; - Todo item deve ser de algum &#039;&#039;Tipo de Item&#039;&#039;. Uma vez que o tipo de item esteja definido, a descrição do item obrigatoriamente deve começar com o valor do &#039;&#039;Prefixo&#039;&#039; definido no &#039;&#039;Tipo de Item&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Obrigatoriedade da Marca ou da Descrição&#039;&#039;&#039; - Todo item deve ter preenchidos no mínimo um dos campos &#039;&#039;Marca&#039;&#039; ou &#039;&#039;Descrição&#039;&#039;. Mesmo para produtos de fabricação própria, é recomendável definir a marca da empresa por questões de organização dos itens. Caso nenhum dos dois seja preenchido a descrição pode acabar sendo apenas o &#039;&#039;Prefixo&#039;&#039; do &#039;&#039;Tipo de Item&#039;&#039;. Para Itens &amp;quot;genéricos&amp;quot;, cuja marca não importa, pois em cada momento uma marca diferente é comprada ou usada, a marca não é necessária, mas uma descrição sim.&lt;br /&gt;
** &#039;&#039;&#039;Dimensão e Unidade de Medida Padrão&#039;&#039;&#039; - Todo item tem uma dimensão (Massa, Unidades, Volume, Cumprimento, etc.) e uma unidade de medida (Kg, Unidades, Litros, Metros, etc.) a que se refere o item. Essa unidade ajuda identifica a unidade de quantização padrão desse item. A unidade em que por padrão esse item é comprado, vendido e movimentado. Outras unidades diferentes para movimentar o mesmo item podem ser definidas em códigos diferentes.&lt;br /&gt;
** &#039;&#039;&#039;Custo&#039;&#039;&#039; - Todo Item tem um custo único padrão. Esse custo é sempre o mesmo, independente da empresa.&lt;br /&gt;
** &#039;&#039;&#039;Códigos dos Itens:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Múltiplos Códigos&#039;&#039;&#039; - Cada item pode ter mais que um código definido, ou seja, uma lista de códigos. Códigos são a maneira definir um modo quantidade, preço de venda, pacote, etc. de um determinado Item. Normalmente tem uma identificação única (e normalmente numérica, embora não obrigatória) para ser referenciada em terminais, notas, códigos de barras, etc. No entanto a identificação única não deve ser obrigatória. Um item pode ter um código para definir uma determinada quantidade de movimentação de entrada ou saída, ou simplesmente para definir uma nova unidade de medida. Por exemplo, produtos identificados hora por Kilos hora por Unidades.&lt;br /&gt;
*** &#039;&#039;&#039;Categoria do Item&#039;&#039;&#039; - De acordo com o &#039;&#039;Tipo de Item&#039;&#039; definido no Item, cada código do item deverá ser alocado em uma das categorias definidas no &#039;&#039;Tipo de Item&#039;&#039;. Apesar de ser o mesmo código, cada um pode gerar venda em uma categoria diferente, ou utilizar o MarkUp diferentes de acordo com o definido em cada categoria.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Validar requisito de Obrigatoriedade entre Marca e Descrição&#039;&#039;&#039; - Um dos campos deve sempre ser preenchido.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Validar inconsistência entre Fabricação do Produto e Origem do Item&#039;&#039;&#039; - Se o produto for de fabricação própria, ele não pode ter uma das opções de importado definida em Origem do Item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Validar finalidade do item&#039;&#039;&#039; - Todo item deve ter no mínimo 1 finalidade definida em seu cadastro.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Preenchimento completo dos pesos e volumes das embalagens&#039;&#039;&#039; - Se algum campo for preenchido, ele deve ser preenchido por completo! Por exemplo, se o &amp;quot;Peso Drenado&amp;quot; for definido, obrigatoriamente sua unidade de medida deve ser preenchida, o mesmo para o caso contrário: se a unidade for definida, a quantidade também deverá ser!&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Não permite que um Item tenha dois códigos iguais definidos&#039;&#039;&#039; - Validar se o código sendo inserido/alterado não tem definido duas vezes o mesmo código.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Os códigos de item só podem ser associados às categorias definidas no tipo de item&#039;&#039;&#039; - Validar se a categoria enviada no ItemCodeVO é uma das categorias disponibilizadas no ItemTypeVO associado ao ItemVO. Os códigos ficam limitados a usarem apenas as categorias permitidas de acordo com o tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se a Categoria do Item permite a associação dos itens&#039;&#039;&#039; - Os códigos de itens não podem ser associados às categorias que não permitem a associação de itens.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Validar Finalidade do Item&#039;&#039;&#039; - O campo de finalidade não pode ter alguns alguns valores de acordo os valores definidos nos outros campos, conforme as seguintes regras:&lt;br /&gt;
*** &#039;&#039;&#039;Revenda:&#039;&#039;&#039; Não pode ser definido quando o produto for de &#039;&#039;&#039;Fabricação Própria&#039;&#039;&#039;.&lt;br /&gt;
*** &#039;&#039;&#039;Produto Acabado:&#039;&#039;&#039; Não pode ser definido quando o produto for &#039;&#039;&#039;Produzido por Terceiros&#039;&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;[ve0009] Valida Item Próprio em Tipo de Substituição&#039;&#039;&#039; - Valida se o Item é de produção própria e está em um tipo de item com a tributação de ICMS definida como Substituição Tributária.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Descrição do Item&#039;&#039;&#039; - Valida se a descrição do item é única entre os itens ativos no momento.&lt;br /&gt;
** &#039;&#039;&#039;[ve0011] Itens de Revenda não podem ser Descartáveis&#039;&#039;&#039; - Valida se o item tiver o propósito como revenda, não permite que seja do tipo descartável.&lt;br /&gt;
&lt;br /&gt;
== Pacotes / Equivalência de Unidades ==&lt;br /&gt;
&lt;br /&gt;
Um único item (&amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;) do sistema pode ter diversos código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), chamados de pacotes. A ideia de pacotes é que o mesmo item possa ser vendidos em proporções ou embalagens diferentes, por exemplo, mini-coxinhas podem ser vendidas ao centro, por unidade, por quilo ou empacotadas em bandeijas.&lt;br /&gt;
&lt;br /&gt;
Para resolver essa questão o item apresenta uma &#039;&#039;&#039;Régua de Equivalência&#039;&#039;&#039;, que estabelece a relação de proporção de quantidades entre as diferentes gandezas. Por exemplo, define-se que a 1Und tem 30g e que 1 Bandeija tem 30 unidades. Deste ponto em diante o sistema saberá vender o item em bandeijas, unidades (e suas variações como pares, dúzias, etc.) ou quilo (e suas variações como gramas, toneladas, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Embora um item possa trabalhar com diferentes sistemas de unidades de medidas, uma unidade de medida principal e imutável é atribuída ao item. Esta unidade é a utilizada pelo sistema para concentrar as quantidades de estoque, relatórios de quantidade de vendas, etc.. Deve ser a unidade de medida que a empresa costuma utilizar no seu dia a dia para contabilizar os itens. Muitas vezes é considerada a menor unidade divísivel do item para evitar trabalhar com frações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão ===&lt;br /&gt;
&lt;br /&gt;
Um conceito presa ser definido neste ponto: para efeitos de cálculo, criamos o &#039;&#039;&#039;Fator de Conversão de Quantidade&#039;&#039;&#039; (&#039;&#039;&#039;Quantity Conversion Factor&#039;&#039;&#039;) ou &#039;&#039;&#039;qcFactor&#039;&#039;&#039;. Esse fator representa o multiplicador necessário para transformar a quantidade de um código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;) na quantidade equivalente do item (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), considerando suas unidades de medida e quantidade do pacote.&lt;br /&gt;
&lt;br /&gt;
Esse fator é obtido a partir da seguinte equação verdade:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;qtyItemVO = qcFactor * qtyItemCodeVO&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou sua equivalente:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;qtyItemCodeVO = qtyItemVO / qcFactor&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Em palavras...|Com o &#039;&#039;&#039;qcFactor&#039;&#039;&#039;  na mão, temos que: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;cada unidade vendida do código equivale &amp;quot;X&amp;quot; unidades vendidas do item&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
ou mais precisamente: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;cada unidade vendida do código equivale &amp;quot;qcFactor&amp;quot; unidades vendidas do item&#039;&#039;&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assim, o valor de &#039;&#039;&#039;qcFactor&#039;&#039;&#039; é definido da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;fatorCQ = unitRatio * packageRatio&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde:&lt;br /&gt;
* &#039;&#039;&#039;unitRatio&#039;&#039;&#039; - É a razão entre os fatores das unidades de medida do código e da unidade principal.&lt;br /&gt;
:* &#039;&#039;&#039;Exemplo:&#039;&#039;&#039; A unidade principal é Kilograma, e a do código é Gramas. Se o fator de Kilograma é 1, a de gramas será 1000, representando que 1Kg = 1000g. Neste caso &#039;&#039;&#039;unitRatio = 1/1000 = 0,001&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;packageRatio&#039;&#039;&#039; - É a definição do usuário estabelecendo uma proporção de quantidade de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exemplo ====&lt;br /&gt;
&lt;br /&gt;
O cadastro de &#039;&#039;&#039;Mini Coxinhas&#039;&#039;&#039; produzida pela empresa estabelece o seguinte:&lt;br /&gt;
* &#039;&#039;&#039;Unidade Principal:&#039;&#039;&#039; Definido em Kilos, pois o usuário entende que Kilos é a unidade mais usual para trabalhar (controlar estoque, custo, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Relações de Grandezas:&#039;&#039;&#039; Para cobrir seus diferentes métodos de venda o usuário estabelece a seguinte relação de Grandezas:&lt;br /&gt;
:* &#039;&#039;&#039;1 Und = 30g&#039;&#039;&#039; - Define que 1 unidade de Mini Coxinha tem o tamanho de 30g.&lt;br /&gt;
:* &#039;&#039;&#039;1 Bandeja = 2 Dúzia&#039;&#039;&#039; - A unidade personalizada Bandeija equivale a 1 dúzia.&lt;br /&gt;
* &#039;&#039;&#039;Códigos de Vendas:&#039;&#039;&#039;&lt;br /&gt;
:* &#039;&#039;&#039;1 - Venda por Kilo:&#039;&#039;&#039; - Neste código o usuário define o tamanho do pacote em 1, a unidade &#039;Kilogram&#039; e que o códigio é divisível.&lt;br /&gt;
:* &#039;&#039;&#039;2 - Venda por Cento:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Centro&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;3 - Venda por Unidade:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Unidade&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;4 - Venda por Bandeija:&#039;&#039;&#039; - Aqui, define o tamanho do pacote em 2, a unidade em &#039;Bandeija&#039; e que o código é indivisível.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em relação ao código para trabalhar com essas informações vamos dividir em partes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{java|Preparação da Régua e Definições|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // Utilizamos a classe MeasureUtil para facilitar a criação da Régua e medidas&lt;br /&gt;
    MeasureRulerVO rulerVO = MeasureUtil.createSimpleMeasureRulerVO(BigDecimal.ONE, WEIGHTUNIT.KILOGRAM); // Cria a régua com a unidade principal, estabelecendo a razão 1&lt;br /&gt;
    MeasureUtil.fillSmartRuler(rulerVO, BigDecimal.ONE, UNITUNIT.UNIT, new BigDecimal(&amp;quot;30&amp;quot;), WEIGHTUNIT.GRAM); // Estabelece que 1 unidade = 30 gramas&lt;br /&gt;
&lt;br /&gt;
    // Unidade de medida personalizada, oferecida pelo sistema&lt;br /&gt;
    MeasureCustomVO measureCustomVO = new MeasureCustomVO();&lt;br /&gt;
    measureCustomVO.setCode(&amp;quot;BDJ&amp;quot;);&lt;br /&gt;
    measureCustomVO.setDescription(&amp;quot;Bandeja&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Estabelece a relação da unidade personalizada com uma unidade presente na régua: 1BDJ = 1Dúzia&lt;br /&gt;
    MeasureEquivalenceVO equiVO = new MeasureEquivalenceVO();&lt;br /&gt;
    equiVO.setMeasureCustomVO(measureCustomVO);&lt;br /&gt;
    equiVO.setReferencequantity(new BigDecimal(&amp;quot;2&amp;quot;));&lt;br /&gt;
    equiVO.setReferenceunit(UNITUNIT.DOZEN);&lt;br /&gt;
    equiVO.setMeasurerulervo(rulerVO);&lt;br /&gt;
    rulerVO.getMeasurerulerequivalencelist().add(equiVO);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que passamos as definições de proporções do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; para a &amp;lt;code&amp;gt;MeasureRulerVO&amp;lt;/code&amp;gt;, conseguimos calcular o &#039;&#039;&#039;qcFactor&#039;&#039;&#039; facilmente com o método &amp;lt;code&amp;gt;MeasureUtil.convertTo(...)&amp;lt;/code&amp;gt;. Para o cadastro exemplo acima:&lt;br /&gt;
&lt;br /&gt;
{{java|Cálculo do qcFactor:|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    WEIGHTUNIT itemVOUnit = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 1 - Kilo&lt;br /&gt;
    WEIGHTUNIT itemCodeVOUnit1 = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
    BigDecimal packageRatio1 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor1 = MeasureUtil.convertTo(rulerVO, packageRatio1, itemCodeVOUnit1, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 1:&amp;quot; + qcFactor1); // Saída: 1.0000000000&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 2 - Cento&lt;br /&gt;
    UNITUNIT itemCodeVOUnit2 = UNITUNIT.CENT;&lt;br /&gt;
    BigDecimal packageRatio2 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor2 = MeasureUtil.convertTo(rulerVO, packageRatio2, itemCodeVOUnit2, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 2:&amp;quot; + qcFactor2); // Saída: 3.0000300003 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 3 - Unidade&lt;br /&gt;
    UNITUNIT itemCodeVOUnit3 = UNITUNIT.UNIT;&lt;br /&gt;
    BigDecimal packageRatio3 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor3 = MeasureUtil.convertTo(rulerVO, packageRatio3, itemCodeVOUnit3, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 3:&amp;quot; + qcFactor3); // Saída: 0.0300003000 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 4 - Bandeja&lt;br /&gt;
    // A unidade de medida personalizada precisa ser encapsulada com o MeasureEquivalenceBean para utilizar na MeasureUtil.&lt;br /&gt;
    MeasureEquivalenceBean itemCodeVOUnit4 = new MeasureEquivalenceBean();&lt;br /&gt;
    itemCodeVOUnit4.setEquiVO(equiVO);&lt;br /&gt;
    BigDecimal packageRatio4 = new BigDecimal(&amp;quot;1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor4 = MeasureUtil.convertTo(rulerVO, packageRatio4, itemCodeVOUnit4, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 4:&amp;quot; + qcFactor4); // Saída: 0.7200072001 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== Definição do Preço de Venda ==&lt;br /&gt;
&lt;br /&gt;
Há vários fatores sobre a lógica de calcular definir um novo preço de venda. Como as políticas de arredondamento, congelamento de preço, replicação do preço para outros códigos do mesmo grupo, a movimentação de novos preços para histórico, etc.&lt;br /&gt;
&lt;br /&gt;
A ordem das operações lógicas a serem aplicadas sobre o ItemPriceVO devem ser conforme a ordem dos métodos listados abaixo. Cada método executa a operação a partir de um determinado ponto. Isso permite que diferentes eventos que causam a alteração do preço de venda possam acionar o ciclo a partir de diferentes pontos.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Define um Novo preço de Venda para um Código&#039;&#039;&#039; - O início do processo. Quando um novo preço de venda deve ser definido em um código de item. Este passo utiliza o valor recebido as as definições do próprio ItemCode para realizar toda a sequência lógica do preço de venda.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Definition()&#039;&#039;&#039; - Método responsável por carregar as informações do ItemCodeVO e iniciar o processo definição do novo preço de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicar Regras de Arredondamento&#039;&#039;&#039; - Dependendo das configurações da Categoria do Item definida no Código do Item, o preço precisará ser arredondado para respeitar essas políticas.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_RoundApply()&#039;&#039;&#039; - Este método recebe o valor do novo preço e a política de arredondamento para aplicar as regras de arredondamento. Uma vez aplicado os arredondamentos o valor será passado para o próximo método da cadeia (o &#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;) para a efetivação em todos os grupos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Aplicação da Política|Para centralizar o código de aplicação da política, a efetiva aplicação do arredondamento fica na classe utilitária &#039;&#039;&#039;ItemUtils&#039;&#039;&#039; no método &#039;&#039;&#039;applyRoundPricePolicy()&#039;&#039;&#039;. Podendo ser acessado de qualquer ponto, como classes da UI.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Disseminação do Preço de Venda pelo Grupo&#039;&#039;&#039; - Caso o &#039;&#039;ItemCode&#039;&#039; cujo preço de venda esteja sendo alterado faça parte de um grupo, este preço de venda deverá ser disseminado para todos os &#039;&#039;ItemCode&#039;&#039; do Grupo.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;&#039; - Avalia se o &#039;&#039;ItemCode&#039;&#039; cujo preço deve ser alterado faz parte de um grupo. Caso faça ele pesquisa todos os itens do grupo e chama o método &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; todos os envolvidos. Este método não faz qualquer processamento no valor, apenas verifica os códigos envolvidos no grupo e aplica o valor, congelado ou não conforme informado via parâmetros). O valor será aplicado a todos do grupo conforme recebido, &amp;quot;passando por cima&amp;quot; das configurações de arredondamento e políticas de congelamento de cada código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicação do Preço de Venda ao Objeto&#039;&#039;&#039; - Caso haja real alteração no ItemPriceVO uma cópia deve ser convertida para o ItemPriceHistoryVO e persistida. Por fim atualizar o ItemPriceVO na base de dados.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; - Método responsável por atualizar as definições sobre o preço de venda (ItemPriceVO) de um &#039;&#039;Código de Item&#039;&#039;. Este método recebe o novo valor, se o preço estará congelado, e outros atributos para identificação do ItemPriceVO correto (dependendo da assinatura). De acordo com os valores passados, este método avalia se haverá alteração das informações atuais, cria um novo objeto para o histórico de preços (ItemPriceHistoryVO) e salva os dados atuais. Em seguida faz as alterações necessárias ao ItemPriceVO e já o persiste no banco.&lt;br /&gt;
*: &#039;&#039;&#039;Este é (e deve continuar sendo) o único método que fará a atualização do ItemPriceVO no banco de dados!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eventos de Alteração do Preço de Venda ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cadastro/Alteração de Itens&#039;&#039;&#039; - Quando um item é cadastrado ou alterado ele tem definições de códigos e consequentemente de preços de vendas. Neste caso avaliamos as seguintes condições para cada código:&lt;br /&gt;
** &#039;&#039;&#039;Não tem um grupo associado&#039;&#039;&#039; - Se não tem um grupo adicionado, temos que definir e processar o preço completamente. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tem um grupo associado:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos definir novos valores para o código e para o grupo&#039;&#039;&#039; - Se devemos associar novos valores para este novo código e para o grupo em que ele vai entrar, processamos o valor deste código completamente, e como a associação ao grupo é feita antes da definição dos preços, a lógica do updateItemPrice fará a disseminação deste valor nos outros códigos do grupo quando chegar no passo &#039;&#039;_GroupDisseminate()&#039;&#039;. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos copiar o valor atual sendo praticado no grupo&#039;&#039;&#039; - Neste caso vamos buscar o valor de qualquer código do grupo (afinal devem ser todos iguais) e copiamos seus valores. Tanto o valor praticado, quanto um eventual valor que esteja congelado. Chama o &#039;&#039;&#039;_Apply()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Descongelar o Preço de Venda&#039;&#039;&#039; - Descongelar significa efetivar o preço que está congelado como o preço praticado para venda. Para evitar qualquer reprocessamento no valor, mas ainda assim garantir que o novo valor efetivo de venda será definido em todos os códigos do mesmo grupo este método chama o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Descartar Preço Congelado&#039;&#039;&#039; - Quando não queremos que o preço congelado entre em vigor podemos simplesmente descartar o preço congelado, e manter o código com o mesmo preço que já tinha. Neste caso queremos que todos os códigos do mesmo grupo descartem seu preço congelado e que continuem mantendo o preço já praticado. Para evitar o processamento dos valores mas ainda realizar a operação em todos os códigos do grupo chamamos o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:updateItemPriceFlow.png|frame|center|Diagrama do fluxo da lógica de alteração do preço de venda de um Código de Item. E entrada dos eventos que causam essas alterações.]]&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1666</id>
		<title>Módulo Item</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1666"/>
		<updated>2025-11-20T13:04:24Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Fator de Conversão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo &#039;&#039;&#039;Item&#039;&#039;&#039; é o módulo responsável por cadastrar os itens de consumo, produtos de revenda, fabricação própria para venda ou consumo, etc. Este módulo oferecerá um cadastro com controle de preços, markups, custos, entre outras funcionalidades que servirão de suporte para diversos outros módulos, como PDV, Controle de Estoques, Base de Custos para Planilhas de Cálculos, etc.&lt;br /&gt;
&lt;br /&gt;
Para oferecer todo o conceito o módulo é dividido nos seguintes cadastros:&lt;br /&gt;
&lt;br /&gt;
= Categoria do Item =&lt;br /&gt;
&lt;br /&gt;
A categoria do item tem a finalidade de organizar e agrupar os itens de acordo com suas categorias. Mutias vezes a categoria é o corredor em que as mercadorias são agrupadas, como &amp;quot;Bazar&amp;quot;, &amp;quot;Açougue&amp;quot;, &amp;quot;Produtos de Limpeza&amp;quot;, etc. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Estrutura Hierárquica:&#039;&#039;&#039; As categorias são uma estrutura hierárquica, isto é, permite que uma categoria seja adiciona dentro da outra.&lt;br /&gt;
** &#039;&#039;&#039;Nomes Únicos &#039;por Pai&#039;:&#039;&#039;&#039; Os nomes das categorias são únicos dentro do mesmo pai. Em outras palavras, os nomes das categorias só podem se repetir se estiverem em pontos diferentes da estrutura hierárquica.&lt;br /&gt;
** &#039;&#039;&#039;Permite Itens:&#039;&#039;&#039; Esta opção define se os itens podem ser alocados nesta categoria ou não. Quando a opção estiver desmarcada nenhum código de item deverá ser definido nesta categoria. Esta função permite que um determinado tipo de item possa ser alocado nesta categoria, mas força que os itens tenham que ser alocados nas subcategorias.&lt;br /&gt;
** &#039;&#039;&#039;Congelamento de Preços:&#039;&#039;&#039; Este atributo define se os preços dos itens nesta categoria devem permanecer congelados quando forem editados ou houver uma entrada de NFe.&lt;br /&gt;
** &#039;&#039;&#039;Arredondamento de Preços:&#039;&#039;&#039; Permite definir uma regra de arredondamento dos preços de venda de todos os itens que estão nesta categoria. Uma vez definida, nenhum item deverá ter um preço diferente do arredondamento definido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Validar a estrutura de uso por Itens e Tipo de Itens quando a categoria pai for alterada.&#039;&#039;&#039; - A categoria pai de uma categoria não pode ser alterada se algum item estiver associado à ela ou à alguma subcategoria enquanto que o seu tipo de item aponta para a categoria pai. Em outras palavras, caso ao alterar a categoria de posição na hierarquia se não invalidará as condições do tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Hierarquia Cíclica.&#039;&#039;&#039; - Garantir que durante a atualização uma categoria não passa a apontar &amp;quot;como pai&amp;quot; uma categoria que está abaixo dela na hierarquia, criando um relacionamento cíclico.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se temos exatamente 1 ItemCategoryCompanyVO por Empresa&#039;&#039;&#039; - Validar se o temos exatamente 1 definição de dados por empresa. Não devemos ter nem duplicadas, nem faltando. (BUG: 270)&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Categoria de Item Sendo Usado Por Código do Item, Tipo do Item ou outra Categoria de Item&#039;&#039;&#039; - Antes de excluir uma categoria é preciso confirmar se ela não está em uso por outro objeto. Ela pode estar em uso por um código de item (verificar se o Item está ativo), ser referenciada pelo Tipo de Item (também verificar se o mesmo está ativo) ou ser pai de outra categoria (que também precisa verificar se ainda esta ativa). Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Markup, Congelamento de Preços e Arredondamento de Preços são Obrigatórios quando a Categoria permite que itens sejam adicionados.&#039;&#039;&#039; - Validar se estão preenchidos quando a categoria permitir itens, validar se estão nulos quando a categoria não permitir itens. Quando a categoria não permitir itens, o campo MarkUp Mínimo também deve ser nulo.&lt;br /&gt;
&lt;br /&gt;
= Tipo do Item =&lt;br /&gt;
&lt;br /&gt;
O tipo do item tem a finalidade de agrupar todos os itens de um mesmo tipo. Entende-se por tipo de produto &amp;quot;o que o produto é&amp;quot;, por exemplo: Refrigerante, Água, Suco, Pasta de Dente, Pão de Queijo, etc. Não faz parte do tipo a marca, embalagem, quantidades etc. Marca, quantidade, códigos, preços, etc. são parte do cadastro do Iten e não do tipo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo do Item:&#039;&#039;&#039; O nome do tipo de item é usado para identificar o cadastro. Deve ser único.&lt;br /&gt;
** &#039;&#039;&#039;Prefixo:&#039;&#039;&#039; O prefixo é um &amp;quot;começo&amp;quot; da descrição, que será usada em todos os itens desse mesmo tipo. Ao forçar que todos os itens comecem com o mesmo prefixo ajuda na organização do cadastro do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;Descrição de Exemplo: &#039;&#039;&#039; Cada tipo de item deve ter um espaço para orientar o usuário sobre quais as informações importantes para aquele tipo de produto, além de definir a ordem em que devem aparecer.&lt;br /&gt;
** &#039;&#039;&#039;Associação com Aliquota ICMS:&#039;&#039;&#039; No tipo do item devemos definir qual a alíquota de tributação do ICMS que deverá ser utilizada em todos os itens desse tipo. Centralizando e simplificando as configurações.&lt;br /&gt;
** &#039;&#039;&#039;Associação com As categorias:&#039;&#039;&#039; Cada tipo de item deve associar no mínimo uma categoria de itens. Cada item deste tipo deverá associar seus códigos nessas categorias ou suas subcategorias. O tipo de item pode permitir associação com mais de um &amp;quot;nó&amp;quot; da hierarquia da categoria. Permitindo assim que itens do mesmo tipo possam ser lançados em categorias diferentes. Como por exemplo um refrigerante com um código lançado na categoria de &amp;quot;Geladeiras/Loja&amp;quot; e outro código em &amp;quot;Restaurante/SelfService&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Categoria em Uso por Itens continua Disponível&#039;&#039;&#039; - Quando um tipo de item é alterado, é preciso validar se os itens desse tipo atualmente cadastrados não ficarão inválidos caso a categoria não esteja mais associada ao tipo de item. Ou seja, quando um item associado a esse tipo de item já estiver utilizando determinada categoria ela não pode ser excluída do tipo de item. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Alteração do Prefixo reflete nos itens existentes&#039;&#039;&#039; - Caso o prefixo seja alterado, todos os itens deste tipo de item devem ter seu nome atualizado de acordo com o novo prefixo. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Verifica Definições de Impostos para cada empresa&#039;&#039;&#039; - Verifica a definição dos impostos para cada empresa existente.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Tipo e Alíquota no ECF igual à Alíquota Efetiva&#039;&#039;&#039; - Verifica se o tipo do ICMS definido no tipo de item e a alíquota efetiva do do cálculo é coerente com os valores cadastrados no objeto ICMSVO, usado no momento de venda do ECF.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Natureza da Receita e Tabela são obrigatórios para os CSTs 02, 03, 04, 05, 06, 07, 08 e 09&#039;&#039;&#039; - Para todos esses CSTs, os campos de Natureza da Receita e Tabela ser validado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Verificar se a tabela é valida para o CST de Saída informado&#039;&#039;&#039; - Quando a tabela é informada, ela deve ser coerente com o código do CST de saída informado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Verificar se o Natureza é válida para a Tabela informada&#039;&#039;&#039; - Ao informar um código da Natureza da Receita o BIS deve verificar se o código da Receita é válido para a tabela sendo usada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Tipo de Item Sendo Usado no Momento&#039;&#039;&#039; - Antes de excluir o tipo de item é preciso verificar se ele não está em uso no momento. Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
&lt;br /&gt;
= ICMS =&lt;br /&gt;
&lt;br /&gt;
O objeto ICMS é a definição das alíquotas de ICMS utilizadas pelos Itens/Tipo de Itens. As alíquotas devem ser cadastradas conforme as alíquotas que a empresa utiliza.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo de Alíquota&#039;&#039;&#039; - As alíquotas podem ser de 3 tipos diferentes: Isento, Substituição e Tributada.&lt;br /&gt;
** &#039;&#039;&#039;Alíquota&#039;&#039;&#039; - A alíquota é a percentagem usado para calcular o valor do tributo. A alíquota quando definida é um valor positivo.&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - As alíquotas devem ter um nome que facilite a identificação da alíquota para o usuário. Este nome deve ser único.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Definição Obrigatória da Alíquota quando o tipo for Tributado&#039;&#039;&#039; - A definição da alíquota é obrigatória sempre que o tipo for Tributada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Não definição da Alíquota para os tipos Isento e Substituição.&#039;&#039;&#039; - Para os tipos Isento e Substituição o valor da alíquota devem estar nulos.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Em uso por algum tipo de item&#039;&#039;&#039; - durante a tentativa de exclusão, verificar se o ICMS não está em uso atualmente por algum Tipo de Item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ItemCodeGroup =&lt;br /&gt;
&lt;br /&gt;
O Grupo de Código de Item tem a finalidade de agrupar diferentes códigos de itens e fazer com que SEMPRE tenham o mesmo preço de venda. Independente de custo, categorias markups, arredondamentos, etc. Uma vez que um preço de venda de um item for alterado, os demais vão segui-lo fielmente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - Tudo grupo de código deve ter um nome para facilitar a identificação dos itens que fazem parte do grupo.&lt;br /&gt;
** &#039;&#039;&#039;Lista de Còdigos&#039;&#039;&#039; - Dentro de um mesmo grupo podem ser associados 0+ códigos de itens. Códigos de um mesmo item podem fazer parte do mesmo grupo.&lt;br /&gt;
** &#039;&#039;&#039;Sempre o mesmo preço de venda&#039;&#039;&#039; - Independente das diferentes configurações que um código de item pode ter dentro do mesmo grupo, como diferentes categorias, MarkUps, Custos, definições de arredondamento, package ratios, etc.. O preço de venda de todos os itens do grupo devem ter exatamente o mesmo valor. Mesmo que para isso tenha que desrespeitar qualquer outra regra do sistema (como arredondamento, ou cálculo de package, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Códigos de Itens já associados a outros grupos&#039;&#039;&#039; - Durante a inserção ou atualização, um grupo não deve permitir que um código de item já associado à outro grupo seja associado a este. Em outras palavras, um código de item não pode estar associado em mais de um grupo ao mesmo tempo.&lt;br /&gt;
&lt;br /&gt;
= Item = &lt;br /&gt;
&lt;br /&gt;
A entidade Item representa um produto qualquer da empresa. Esse produto por ser um insumo, uma matéria prima ou um produto de venda (ou revenda).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Fixação do prefixo da descrição de acordo com o tipo do Item&#039;&#039;&#039; - Todo item deve ser de algum &#039;&#039;Tipo de Item&#039;&#039;. Uma vez que o tipo de item esteja definido, a descrição do item obrigatoriamente deve começar com o valor do &#039;&#039;Prefixo&#039;&#039; definido no &#039;&#039;Tipo de Item&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Obrigatoriedade da Marca ou da Descrição&#039;&#039;&#039; - Todo item deve ter preenchidos no mínimo um dos campos &#039;&#039;Marca&#039;&#039; ou &#039;&#039;Descrição&#039;&#039;. Mesmo para produtos de fabricação própria, é recomendável definir a marca da empresa por questões de organização dos itens. Caso nenhum dos dois seja preenchido a descrição pode acabar sendo apenas o &#039;&#039;Prefixo&#039;&#039; do &#039;&#039;Tipo de Item&#039;&#039;. Para Itens &amp;quot;genéricos&amp;quot;, cuja marca não importa, pois em cada momento uma marca diferente é comprada ou usada, a marca não é necessária, mas uma descrição sim.&lt;br /&gt;
** &#039;&#039;&#039;Dimensão e Unidade de Medida Padrão&#039;&#039;&#039; - Todo item tem uma dimensão (Massa, Unidades, Volume, Cumprimento, etc.) e uma unidade de medida (Kg, Unidades, Litros, Metros, etc.) a que se refere o item. Essa unidade ajuda identifica a unidade de quantização padrão desse item. A unidade em que por padrão esse item é comprado, vendido e movimentado. Outras unidades diferentes para movimentar o mesmo item podem ser definidas em códigos diferentes.&lt;br /&gt;
** &#039;&#039;&#039;Custo&#039;&#039;&#039; - Todo Item tem um custo único padrão. Esse custo é sempre o mesmo, independente da empresa.&lt;br /&gt;
** &#039;&#039;&#039;Códigos dos Itens:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Múltiplos Códigos&#039;&#039;&#039; - Cada item pode ter mais que um código definido, ou seja, uma lista de códigos. Códigos são a maneira definir um modo quantidade, preço de venda, pacote, etc. de um determinado Item. Normalmente tem uma identificação única (e normalmente numérica, embora não obrigatória) para ser referenciada em terminais, notas, códigos de barras, etc. No entanto a identificação única não deve ser obrigatória. Um item pode ter um código para definir uma determinada quantidade de movimentação de entrada ou saída, ou simplesmente para definir uma nova unidade de medida. Por exemplo, produtos identificados hora por Kilos hora por Unidades.&lt;br /&gt;
*** &#039;&#039;&#039;Categoria do Item&#039;&#039;&#039; - De acordo com o &#039;&#039;Tipo de Item&#039;&#039; definido no Item, cada código do item deverá ser alocado em uma das categorias definidas no &#039;&#039;Tipo de Item&#039;&#039;. Apesar de ser o mesmo código, cada um pode gerar venda em uma categoria diferente, ou utilizar o MarkUp diferentes de acordo com o definido em cada categoria.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Validar requisito de Obrigatoriedade entre Marca e Descrição&#039;&#039;&#039; - Um dos campos deve sempre ser preenchido.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Validar inconsistência entre Fabricação do Produto e Origem do Item&#039;&#039;&#039; - Se o produto for de fabricação própria, ele não pode ter uma das opções de importado definida em Origem do Item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Validar finalidade do item&#039;&#039;&#039; - Todo item deve ter no mínimo 1 finalidade definida em seu cadastro.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Preenchimento completo dos pesos e volumes das embalagens&#039;&#039;&#039; - Se algum campo for preenchido, ele deve ser preenchido por completo! Por exemplo, se o &amp;quot;Peso Drenado&amp;quot; for definido, obrigatoriamente sua unidade de medida deve ser preenchida, o mesmo para o caso contrário: se a unidade for definida, a quantidade também deverá ser!&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Não permite que um Item tenha dois códigos iguais definidos&#039;&#039;&#039; - Validar se o código sendo inserido/alterado não tem definido duas vezes o mesmo código.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Os códigos de item só podem ser associados às categorias definidas no tipo de item&#039;&#039;&#039; - Validar se a categoria enviada no ItemCodeVO é uma das categorias disponibilizadas no ItemTypeVO associado ao ItemVO. Os códigos ficam limitados a usarem apenas as categorias permitidas de acordo com o tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se a Categoria do Item permite a associação dos itens&#039;&#039;&#039; - Os códigos de itens não podem ser associados às categorias que não permitem a associação de itens.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Validar Finalidade do Item&#039;&#039;&#039; - O campo de finalidade não pode ter alguns alguns valores de acordo os valores definidos nos outros campos, conforme as seguintes regras:&lt;br /&gt;
*** &#039;&#039;&#039;Revenda:&#039;&#039;&#039; Não pode ser definido quando o produto for de &#039;&#039;&#039;Fabricação Própria&#039;&#039;&#039;.&lt;br /&gt;
*** &#039;&#039;&#039;Produto Acabado:&#039;&#039;&#039; Não pode ser definido quando o produto for &#039;&#039;&#039;Produzido por Terceiros&#039;&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;[ve0009] Valida Item Próprio em Tipo de Substituição&#039;&#039;&#039; - Valida se o Item é de produção própria e está em um tipo de item com a tributação de ICMS definida como Substituição Tributária.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Descrição do Item&#039;&#039;&#039; - Valida se a descrição do item é única entre os itens ativos no momento.&lt;br /&gt;
** &#039;&#039;&#039;[ve0011] Itens de Revenda não podem ser Descartáveis&#039;&#039;&#039; - Valida se o item tiver o propósito como revenda, não permite que seja do tipo descartável.&lt;br /&gt;
&lt;br /&gt;
== Pacotes / Equivalência de Unidades ==&lt;br /&gt;
&lt;br /&gt;
Um único item (&amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;) do sistema pode ter diversos código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), chamados de pacotes. A ideia de pacotes é que o mesmo item possa ser vendidos em proporções ou embalagens diferentes, por exemplo, mini-coxinhas podem ser vendidas ao centro, por unidade, por quilo ou empacotadas em bandeijas.&lt;br /&gt;
&lt;br /&gt;
Para resolver essa questão o item apresenta uma &#039;&#039;&#039;Régua de Equivalência&#039;&#039;&#039;, que estabelece a relação de proporção de quantidades entre as diferentes gandezas. Por exemplo, define-se que a 1Und tem 30g e que 1 Bandeija tem 30 unidades. Deste ponto em diante o sistema saberá vender o item em bandeijas, unidades (e suas variações como pares, dúzias, etc.) ou quilo (e suas variações como gramas, toneladas, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Embora um item possa trabalhar com diferentes sistemas de unidades de medidas, uma unidade de medida principal e imutável é atribuída ao item. Esta unidade é a utilizada pelo sistema para concentrar as quantidades de estoque, relatórios de quantidade de vendas, etc.. Deve ser a unidade de medida que a empresa costuma utilizar no seu dia a dia para contabilizar os itens. Muitas vezes é considerada a menor unidade divísivel do item para evitar trabalhar com frações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão ===&lt;br /&gt;
&lt;br /&gt;
Um conceito presa ser definido neste ponto: para efeitos de cálculo, criamos o &#039;&#039;&#039;Fator de Conversão de Quantidade&#039;&#039;&#039; (&#039;&#039;&#039;Quantity Conversion Factor&#039;&#039;&#039;) ou &#039;&#039;&#039;qcFactor&#039;&#039;&#039;. Esse fator representa o multiplicador necessário para transformar a quantidade de um código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;) na quantidade equivalente do item (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), considerando suas unidades de medida e quantidade do pacote.&lt;br /&gt;
&lt;br /&gt;
Esse fator é obtido a partir da seguinte equação verdade:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;qtyItemVO = qcFactor * qtyItemCodeVO&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Em palavras...|Com o &#039;&#039;&#039;qcFactor&#039;&#039;&#039;  na mão, temos que: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;cada unidade vendida do código equivale &amp;quot;X&amp;quot; unidades vendidas do item&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
ou mais precisamente: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;cada unidade vendida do código equivale &amp;quot;qcFactor&amp;quot; unidades vendidas do item&#039;&#039;&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assim, o valor de &#039;&#039;&#039;qcFactor&#039;&#039;&#039; é definido da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;fatorCQ = unitRatio * packageRatio&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde:&lt;br /&gt;
* &#039;&#039;&#039;unitRatio&#039;&#039;&#039; - É a razão entre os fatores das unidades de medida do código e da unidade principal.&lt;br /&gt;
:* &#039;&#039;&#039;Exemplo:&#039;&#039;&#039; A unidade principal é Kilograma, e a do código é Gramas. Se o fator de Kilograma é 1, a de gramas será 1000, representando que 1Kg = 1000g. Neste caso &#039;&#039;&#039;unitRatio = 1/1000 = 0,001&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;packageRatio&#039;&#039;&#039; - É a definição do usuário estabelecendo uma proporção de quantidade de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exemplo ====&lt;br /&gt;
&lt;br /&gt;
O cadastro de &#039;&#039;&#039;Mini Coxinhas&#039;&#039;&#039; produzida pela empresa estabelece o seguinte:&lt;br /&gt;
* &#039;&#039;&#039;Unidade Principal:&#039;&#039;&#039; Definido em Kilos, pois o usuário entende que Kilos é a unidade mais usual para trabalhar (controlar estoque, custo, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Relações de Grandezas:&#039;&#039;&#039; Para cobrir seus diferentes métodos de venda o usuário estabelece a seguinte relação de Grandezas:&lt;br /&gt;
:* &#039;&#039;&#039;1 Und = 30g&#039;&#039;&#039; - Define que 1 unidade de Mini Coxinha tem o tamanho de 30g.&lt;br /&gt;
:* &#039;&#039;&#039;1 Bandeja = 2 Dúzia&#039;&#039;&#039; - A unidade personalizada Bandeija equivale a 1 dúzia.&lt;br /&gt;
* &#039;&#039;&#039;Códigos de Vendas:&#039;&#039;&#039;&lt;br /&gt;
:* &#039;&#039;&#039;1 - Venda por Kilo:&#039;&#039;&#039; - Neste código o usuário define o tamanho do pacote em 1, a unidade &#039;Kilogram&#039; e que o códigio é divisível.&lt;br /&gt;
:* &#039;&#039;&#039;2 - Venda por Cento:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Centro&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;3 - Venda por Unidade:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Unidade&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;4 - Venda por Bandeija:&#039;&#039;&#039; - Aqui, define o tamanho do pacote em 2, a unidade em &#039;Bandeija&#039; e que o código é indivisível.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em relação ao código para trabalhar com essas informações vamos dividir em partes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{java|Preparação da Régua e Definições|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // Utilizamos a classe MeasureUtil para facilitar a criação da Régua e medidas&lt;br /&gt;
    MeasureRulerVO rulerVO = MeasureUtil.createSimpleMeasureRulerVO(BigDecimal.ONE, WEIGHTUNIT.KILOGRAM); // Cria a régua com a unidade principal, estabelecendo a razão 1&lt;br /&gt;
    MeasureUtil.fillSmartRuler(rulerVO, BigDecimal.ONE, UNITUNIT.UNIT, new BigDecimal(&amp;quot;30&amp;quot;), WEIGHTUNIT.GRAM); // Estabelece que 1 unidade = 30 gramas&lt;br /&gt;
&lt;br /&gt;
    // Unidade de medida personalizada, oferecida pelo sistema&lt;br /&gt;
    MeasureCustomVO measureCustomVO = new MeasureCustomVO();&lt;br /&gt;
    measureCustomVO.setCode(&amp;quot;BDJ&amp;quot;);&lt;br /&gt;
    measureCustomVO.setDescription(&amp;quot;Bandeja&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Estabelece a relação da unidade personalizada com uma unidade presente na régua: 1BDJ = 1Dúzia&lt;br /&gt;
    MeasureEquivalenceVO equiVO = new MeasureEquivalenceVO();&lt;br /&gt;
    equiVO.setMeasureCustomVO(measureCustomVO);&lt;br /&gt;
    equiVO.setReferencequantity(new BigDecimal(&amp;quot;2&amp;quot;));&lt;br /&gt;
    equiVO.setReferenceunit(UNITUNIT.DOZEN);&lt;br /&gt;
    equiVO.setMeasurerulervo(rulerVO);&lt;br /&gt;
    rulerVO.getMeasurerulerequivalencelist().add(equiVO);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que passamos as definições de proporções do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; para a &amp;lt;code&amp;gt;MeasureRulerVO&amp;lt;/code&amp;gt;, conseguimos calcular o &#039;&#039;&#039;qcFactor&#039;&#039;&#039; facilmente com o método &amp;lt;code&amp;gt;MeasureUtil.convertTo(...)&amp;lt;/code&amp;gt;. Para o cadastro exemplo acima:&lt;br /&gt;
&lt;br /&gt;
{{java|Cálculo do qcFactor:|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    WEIGHTUNIT itemVOUnit = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 1 - Kilo&lt;br /&gt;
    WEIGHTUNIT itemCodeVOUnit1 = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
    BigDecimal packageRatio1 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor1 = MeasureUtil.convertTo(rulerVO, packageRatio1, itemCodeVOUnit1, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 1:&amp;quot; + qcFactor1); // Saída: 1.0000000000&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 2 - Cento&lt;br /&gt;
    UNITUNIT itemCodeVOUnit2 = UNITUNIT.CENT;&lt;br /&gt;
    BigDecimal packageRatio2 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor2 = MeasureUtil.convertTo(rulerVO, packageRatio2, itemCodeVOUnit2, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 2:&amp;quot; + qcFactor2); // Saída: 3.0000300003 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 3 - Unidade&lt;br /&gt;
    UNITUNIT itemCodeVOUnit3 = UNITUNIT.UNIT;&lt;br /&gt;
    BigDecimal packageRatio3 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor3 = MeasureUtil.convertTo(rulerVO, packageRatio3, itemCodeVOUnit3, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 3:&amp;quot; + qcFactor3); // Saída: 0.0300003000 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 4 - Bandeja&lt;br /&gt;
    // A unidade de medida personalizada precisa ser encapsulada com o MeasureEquivalenceBean para utilizar na MeasureUtil.&lt;br /&gt;
    MeasureEquivalenceBean itemCodeVOUnit4 = new MeasureEquivalenceBean();&lt;br /&gt;
    itemCodeVOUnit4.setEquiVO(equiVO);&lt;br /&gt;
    BigDecimal packageRatio4 = new BigDecimal(&amp;quot;1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor4 = MeasureUtil.convertTo(rulerVO, packageRatio4, itemCodeVOUnit4, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 4:&amp;quot; + qcFactor4); // Saída: 0.7200072001 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== Definição do Preço de Venda ==&lt;br /&gt;
&lt;br /&gt;
Há vários fatores sobre a lógica de calcular definir um novo preço de venda. Como as políticas de arredondamento, congelamento de preço, replicação do preço para outros códigos do mesmo grupo, a movimentação de novos preços para histórico, etc.&lt;br /&gt;
&lt;br /&gt;
A ordem das operações lógicas a serem aplicadas sobre o ItemPriceVO devem ser conforme a ordem dos métodos listados abaixo. Cada método executa a operação a partir de um determinado ponto. Isso permite que diferentes eventos que causam a alteração do preço de venda possam acionar o ciclo a partir de diferentes pontos.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Define um Novo preço de Venda para um Código&#039;&#039;&#039; - O início do processo. Quando um novo preço de venda deve ser definido em um código de item. Este passo utiliza o valor recebido as as definições do próprio ItemCode para realizar toda a sequência lógica do preço de venda.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Definition()&#039;&#039;&#039; - Método responsável por carregar as informações do ItemCodeVO e iniciar o processo definição do novo preço de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicar Regras de Arredondamento&#039;&#039;&#039; - Dependendo das configurações da Categoria do Item definida no Código do Item, o preço precisará ser arredondado para respeitar essas políticas.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_RoundApply()&#039;&#039;&#039; - Este método recebe o valor do novo preço e a política de arredondamento para aplicar as regras de arredondamento. Uma vez aplicado os arredondamentos o valor será passado para o próximo método da cadeia (o &#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;) para a efetivação em todos os grupos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Aplicação da Política|Para centralizar o código de aplicação da política, a efetiva aplicação do arredondamento fica na classe utilitária &#039;&#039;&#039;ItemUtils&#039;&#039;&#039; no método &#039;&#039;&#039;applyRoundPricePolicy()&#039;&#039;&#039;. Podendo ser acessado de qualquer ponto, como classes da UI.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Disseminação do Preço de Venda pelo Grupo&#039;&#039;&#039; - Caso o &#039;&#039;ItemCode&#039;&#039; cujo preço de venda esteja sendo alterado faça parte de um grupo, este preço de venda deverá ser disseminado para todos os &#039;&#039;ItemCode&#039;&#039; do Grupo.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;&#039; - Avalia se o &#039;&#039;ItemCode&#039;&#039; cujo preço deve ser alterado faz parte de um grupo. Caso faça ele pesquisa todos os itens do grupo e chama o método &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; todos os envolvidos. Este método não faz qualquer processamento no valor, apenas verifica os códigos envolvidos no grupo e aplica o valor, congelado ou não conforme informado via parâmetros). O valor será aplicado a todos do grupo conforme recebido, &amp;quot;passando por cima&amp;quot; das configurações de arredondamento e políticas de congelamento de cada código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicação do Preço de Venda ao Objeto&#039;&#039;&#039; - Caso haja real alteração no ItemPriceVO uma cópia deve ser convertida para o ItemPriceHistoryVO e persistida. Por fim atualizar o ItemPriceVO na base de dados.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; - Método responsável por atualizar as definições sobre o preço de venda (ItemPriceVO) de um &#039;&#039;Código de Item&#039;&#039;. Este método recebe o novo valor, se o preço estará congelado, e outros atributos para identificação do ItemPriceVO correto (dependendo da assinatura). De acordo com os valores passados, este método avalia se haverá alteração das informações atuais, cria um novo objeto para o histórico de preços (ItemPriceHistoryVO) e salva os dados atuais. Em seguida faz as alterações necessárias ao ItemPriceVO e já o persiste no banco.&lt;br /&gt;
*: &#039;&#039;&#039;Este é (e deve continuar sendo) o único método que fará a atualização do ItemPriceVO no banco de dados!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eventos de Alteração do Preço de Venda ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cadastro/Alteração de Itens&#039;&#039;&#039; - Quando um item é cadastrado ou alterado ele tem definições de códigos e consequentemente de preços de vendas. Neste caso avaliamos as seguintes condições para cada código:&lt;br /&gt;
** &#039;&#039;&#039;Não tem um grupo associado&#039;&#039;&#039; - Se não tem um grupo adicionado, temos que definir e processar o preço completamente. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tem um grupo associado:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos definir novos valores para o código e para o grupo&#039;&#039;&#039; - Se devemos associar novos valores para este novo código e para o grupo em que ele vai entrar, processamos o valor deste código completamente, e como a associação ao grupo é feita antes da definição dos preços, a lógica do updateItemPrice fará a disseminação deste valor nos outros códigos do grupo quando chegar no passo &#039;&#039;_GroupDisseminate()&#039;&#039;. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos copiar o valor atual sendo praticado no grupo&#039;&#039;&#039; - Neste caso vamos buscar o valor de qualquer código do grupo (afinal devem ser todos iguais) e copiamos seus valores. Tanto o valor praticado, quanto um eventual valor que esteja congelado. Chama o &#039;&#039;&#039;_Apply()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Descongelar o Preço de Venda&#039;&#039;&#039; - Descongelar significa efetivar o preço que está congelado como o preço praticado para venda. Para evitar qualquer reprocessamento no valor, mas ainda assim garantir que o novo valor efetivo de venda será definido em todos os códigos do mesmo grupo este método chama o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Descartar Preço Congelado&#039;&#039;&#039; - Quando não queremos que o preço congelado entre em vigor podemos simplesmente descartar o preço congelado, e manter o código com o mesmo preço que já tinha. Neste caso queremos que todos os códigos do mesmo grupo descartem seu preço congelado e que continuem mantendo o preço já praticado. Para evitar o processamento dos valores mas ainda realizar a operação em todos os códigos do grupo chamamos o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:updateItemPriceFlow.png|frame|center|Diagrama do fluxo da lógica de alteração do preço de venda de um Código de Item. E entrada dos eventos que causam essas alterações.]]&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1665</id>
		<title>Módulo Item</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1665"/>
		<updated>2025-11-20T13:03:25Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Exemplo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo &#039;&#039;&#039;Item&#039;&#039;&#039; é o módulo responsável por cadastrar os itens de consumo, produtos de revenda, fabricação própria para venda ou consumo, etc. Este módulo oferecerá um cadastro com controle de preços, markups, custos, entre outras funcionalidades que servirão de suporte para diversos outros módulos, como PDV, Controle de Estoques, Base de Custos para Planilhas de Cálculos, etc.&lt;br /&gt;
&lt;br /&gt;
Para oferecer todo o conceito o módulo é dividido nos seguintes cadastros:&lt;br /&gt;
&lt;br /&gt;
= Categoria do Item =&lt;br /&gt;
&lt;br /&gt;
A categoria do item tem a finalidade de organizar e agrupar os itens de acordo com suas categorias. Mutias vezes a categoria é o corredor em que as mercadorias são agrupadas, como &amp;quot;Bazar&amp;quot;, &amp;quot;Açougue&amp;quot;, &amp;quot;Produtos de Limpeza&amp;quot;, etc. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Estrutura Hierárquica:&#039;&#039;&#039; As categorias são uma estrutura hierárquica, isto é, permite que uma categoria seja adiciona dentro da outra.&lt;br /&gt;
** &#039;&#039;&#039;Nomes Únicos &#039;por Pai&#039;:&#039;&#039;&#039; Os nomes das categorias são únicos dentro do mesmo pai. Em outras palavras, os nomes das categorias só podem se repetir se estiverem em pontos diferentes da estrutura hierárquica.&lt;br /&gt;
** &#039;&#039;&#039;Permite Itens:&#039;&#039;&#039; Esta opção define se os itens podem ser alocados nesta categoria ou não. Quando a opção estiver desmarcada nenhum código de item deverá ser definido nesta categoria. Esta função permite que um determinado tipo de item possa ser alocado nesta categoria, mas força que os itens tenham que ser alocados nas subcategorias.&lt;br /&gt;
** &#039;&#039;&#039;Congelamento de Preços:&#039;&#039;&#039; Este atributo define se os preços dos itens nesta categoria devem permanecer congelados quando forem editados ou houver uma entrada de NFe.&lt;br /&gt;
** &#039;&#039;&#039;Arredondamento de Preços:&#039;&#039;&#039; Permite definir uma regra de arredondamento dos preços de venda de todos os itens que estão nesta categoria. Uma vez definida, nenhum item deverá ter um preço diferente do arredondamento definido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Validar a estrutura de uso por Itens e Tipo de Itens quando a categoria pai for alterada.&#039;&#039;&#039; - A categoria pai de uma categoria não pode ser alterada se algum item estiver associado à ela ou à alguma subcategoria enquanto que o seu tipo de item aponta para a categoria pai. Em outras palavras, caso ao alterar a categoria de posição na hierarquia se não invalidará as condições do tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Hierarquia Cíclica.&#039;&#039;&#039; - Garantir que durante a atualização uma categoria não passa a apontar &amp;quot;como pai&amp;quot; uma categoria que está abaixo dela na hierarquia, criando um relacionamento cíclico.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se temos exatamente 1 ItemCategoryCompanyVO por Empresa&#039;&#039;&#039; - Validar se o temos exatamente 1 definição de dados por empresa. Não devemos ter nem duplicadas, nem faltando. (BUG: 270)&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Categoria de Item Sendo Usado Por Código do Item, Tipo do Item ou outra Categoria de Item&#039;&#039;&#039; - Antes de excluir uma categoria é preciso confirmar se ela não está em uso por outro objeto. Ela pode estar em uso por um código de item (verificar se o Item está ativo), ser referenciada pelo Tipo de Item (também verificar se o mesmo está ativo) ou ser pai de outra categoria (que também precisa verificar se ainda esta ativa). Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Markup, Congelamento de Preços e Arredondamento de Preços são Obrigatórios quando a Categoria permite que itens sejam adicionados.&#039;&#039;&#039; - Validar se estão preenchidos quando a categoria permitir itens, validar se estão nulos quando a categoria não permitir itens. Quando a categoria não permitir itens, o campo MarkUp Mínimo também deve ser nulo.&lt;br /&gt;
&lt;br /&gt;
= Tipo do Item =&lt;br /&gt;
&lt;br /&gt;
O tipo do item tem a finalidade de agrupar todos os itens de um mesmo tipo. Entende-se por tipo de produto &amp;quot;o que o produto é&amp;quot;, por exemplo: Refrigerante, Água, Suco, Pasta de Dente, Pão de Queijo, etc. Não faz parte do tipo a marca, embalagem, quantidades etc. Marca, quantidade, códigos, preços, etc. são parte do cadastro do Iten e não do tipo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo do Item:&#039;&#039;&#039; O nome do tipo de item é usado para identificar o cadastro. Deve ser único.&lt;br /&gt;
** &#039;&#039;&#039;Prefixo:&#039;&#039;&#039; O prefixo é um &amp;quot;começo&amp;quot; da descrição, que será usada em todos os itens desse mesmo tipo. Ao forçar que todos os itens comecem com o mesmo prefixo ajuda na organização do cadastro do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;Descrição de Exemplo: &#039;&#039;&#039; Cada tipo de item deve ter um espaço para orientar o usuário sobre quais as informações importantes para aquele tipo de produto, além de definir a ordem em que devem aparecer.&lt;br /&gt;
** &#039;&#039;&#039;Associação com Aliquota ICMS:&#039;&#039;&#039; No tipo do item devemos definir qual a alíquota de tributação do ICMS que deverá ser utilizada em todos os itens desse tipo. Centralizando e simplificando as configurações.&lt;br /&gt;
** &#039;&#039;&#039;Associação com As categorias:&#039;&#039;&#039; Cada tipo de item deve associar no mínimo uma categoria de itens. Cada item deste tipo deverá associar seus códigos nessas categorias ou suas subcategorias. O tipo de item pode permitir associação com mais de um &amp;quot;nó&amp;quot; da hierarquia da categoria. Permitindo assim que itens do mesmo tipo possam ser lançados em categorias diferentes. Como por exemplo um refrigerante com um código lançado na categoria de &amp;quot;Geladeiras/Loja&amp;quot; e outro código em &amp;quot;Restaurante/SelfService&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Categoria em Uso por Itens continua Disponível&#039;&#039;&#039; - Quando um tipo de item é alterado, é preciso validar se os itens desse tipo atualmente cadastrados não ficarão inválidos caso a categoria não esteja mais associada ao tipo de item. Ou seja, quando um item associado a esse tipo de item já estiver utilizando determinada categoria ela não pode ser excluída do tipo de item. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Alteração do Prefixo reflete nos itens existentes&#039;&#039;&#039; - Caso o prefixo seja alterado, todos os itens deste tipo de item devem ter seu nome atualizado de acordo com o novo prefixo. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Verifica Definições de Impostos para cada empresa&#039;&#039;&#039; - Verifica a definição dos impostos para cada empresa existente.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Tipo e Alíquota no ECF igual à Alíquota Efetiva&#039;&#039;&#039; - Verifica se o tipo do ICMS definido no tipo de item e a alíquota efetiva do do cálculo é coerente com os valores cadastrados no objeto ICMSVO, usado no momento de venda do ECF.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Natureza da Receita e Tabela são obrigatórios para os CSTs 02, 03, 04, 05, 06, 07, 08 e 09&#039;&#039;&#039; - Para todos esses CSTs, os campos de Natureza da Receita e Tabela ser validado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Verificar se a tabela é valida para o CST de Saída informado&#039;&#039;&#039; - Quando a tabela é informada, ela deve ser coerente com o código do CST de saída informado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Verificar se o Natureza é válida para a Tabela informada&#039;&#039;&#039; - Ao informar um código da Natureza da Receita o BIS deve verificar se o código da Receita é válido para a tabela sendo usada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Tipo de Item Sendo Usado no Momento&#039;&#039;&#039; - Antes de excluir o tipo de item é preciso verificar se ele não está em uso no momento. Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
&lt;br /&gt;
= ICMS =&lt;br /&gt;
&lt;br /&gt;
O objeto ICMS é a definição das alíquotas de ICMS utilizadas pelos Itens/Tipo de Itens. As alíquotas devem ser cadastradas conforme as alíquotas que a empresa utiliza.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo de Alíquota&#039;&#039;&#039; - As alíquotas podem ser de 3 tipos diferentes: Isento, Substituição e Tributada.&lt;br /&gt;
** &#039;&#039;&#039;Alíquota&#039;&#039;&#039; - A alíquota é a percentagem usado para calcular o valor do tributo. A alíquota quando definida é um valor positivo.&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - As alíquotas devem ter um nome que facilite a identificação da alíquota para o usuário. Este nome deve ser único.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Definição Obrigatória da Alíquota quando o tipo for Tributado&#039;&#039;&#039; - A definição da alíquota é obrigatória sempre que o tipo for Tributada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Não definição da Alíquota para os tipos Isento e Substituição.&#039;&#039;&#039; - Para os tipos Isento e Substituição o valor da alíquota devem estar nulos.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Em uso por algum tipo de item&#039;&#039;&#039; - durante a tentativa de exclusão, verificar se o ICMS não está em uso atualmente por algum Tipo de Item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ItemCodeGroup =&lt;br /&gt;
&lt;br /&gt;
O Grupo de Código de Item tem a finalidade de agrupar diferentes códigos de itens e fazer com que SEMPRE tenham o mesmo preço de venda. Independente de custo, categorias markups, arredondamentos, etc. Uma vez que um preço de venda de um item for alterado, os demais vão segui-lo fielmente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - Tudo grupo de código deve ter um nome para facilitar a identificação dos itens que fazem parte do grupo.&lt;br /&gt;
** &#039;&#039;&#039;Lista de Còdigos&#039;&#039;&#039; - Dentro de um mesmo grupo podem ser associados 0+ códigos de itens. Códigos de um mesmo item podem fazer parte do mesmo grupo.&lt;br /&gt;
** &#039;&#039;&#039;Sempre o mesmo preço de venda&#039;&#039;&#039; - Independente das diferentes configurações que um código de item pode ter dentro do mesmo grupo, como diferentes categorias, MarkUps, Custos, definições de arredondamento, package ratios, etc.. O preço de venda de todos os itens do grupo devem ter exatamente o mesmo valor. Mesmo que para isso tenha que desrespeitar qualquer outra regra do sistema (como arredondamento, ou cálculo de package, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Códigos de Itens já associados a outros grupos&#039;&#039;&#039; - Durante a inserção ou atualização, um grupo não deve permitir que um código de item já associado à outro grupo seja associado a este. Em outras palavras, um código de item não pode estar associado em mais de um grupo ao mesmo tempo.&lt;br /&gt;
&lt;br /&gt;
= Item = &lt;br /&gt;
&lt;br /&gt;
A entidade Item representa um produto qualquer da empresa. Esse produto por ser um insumo, uma matéria prima ou um produto de venda (ou revenda).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Fixação do prefixo da descrição de acordo com o tipo do Item&#039;&#039;&#039; - Todo item deve ser de algum &#039;&#039;Tipo de Item&#039;&#039;. Uma vez que o tipo de item esteja definido, a descrição do item obrigatoriamente deve começar com o valor do &#039;&#039;Prefixo&#039;&#039; definido no &#039;&#039;Tipo de Item&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Obrigatoriedade da Marca ou da Descrição&#039;&#039;&#039; - Todo item deve ter preenchidos no mínimo um dos campos &#039;&#039;Marca&#039;&#039; ou &#039;&#039;Descrição&#039;&#039;. Mesmo para produtos de fabricação própria, é recomendável definir a marca da empresa por questões de organização dos itens. Caso nenhum dos dois seja preenchido a descrição pode acabar sendo apenas o &#039;&#039;Prefixo&#039;&#039; do &#039;&#039;Tipo de Item&#039;&#039;. Para Itens &amp;quot;genéricos&amp;quot;, cuja marca não importa, pois em cada momento uma marca diferente é comprada ou usada, a marca não é necessária, mas uma descrição sim.&lt;br /&gt;
** &#039;&#039;&#039;Dimensão e Unidade de Medida Padrão&#039;&#039;&#039; - Todo item tem uma dimensão (Massa, Unidades, Volume, Cumprimento, etc.) e uma unidade de medida (Kg, Unidades, Litros, Metros, etc.) a que se refere o item. Essa unidade ajuda identifica a unidade de quantização padrão desse item. A unidade em que por padrão esse item é comprado, vendido e movimentado. Outras unidades diferentes para movimentar o mesmo item podem ser definidas em códigos diferentes.&lt;br /&gt;
** &#039;&#039;&#039;Custo&#039;&#039;&#039; - Todo Item tem um custo único padrão. Esse custo é sempre o mesmo, independente da empresa.&lt;br /&gt;
** &#039;&#039;&#039;Códigos dos Itens:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Múltiplos Códigos&#039;&#039;&#039; - Cada item pode ter mais que um código definido, ou seja, uma lista de códigos. Códigos são a maneira definir um modo quantidade, preço de venda, pacote, etc. de um determinado Item. Normalmente tem uma identificação única (e normalmente numérica, embora não obrigatória) para ser referenciada em terminais, notas, códigos de barras, etc. No entanto a identificação única não deve ser obrigatória. Um item pode ter um código para definir uma determinada quantidade de movimentação de entrada ou saída, ou simplesmente para definir uma nova unidade de medida. Por exemplo, produtos identificados hora por Kilos hora por Unidades.&lt;br /&gt;
*** &#039;&#039;&#039;Categoria do Item&#039;&#039;&#039; - De acordo com o &#039;&#039;Tipo de Item&#039;&#039; definido no Item, cada código do item deverá ser alocado em uma das categorias definidas no &#039;&#039;Tipo de Item&#039;&#039;. Apesar de ser o mesmo código, cada um pode gerar venda em uma categoria diferente, ou utilizar o MarkUp diferentes de acordo com o definido em cada categoria.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Validar requisito de Obrigatoriedade entre Marca e Descrição&#039;&#039;&#039; - Um dos campos deve sempre ser preenchido.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Validar inconsistência entre Fabricação do Produto e Origem do Item&#039;&#039;&#039; - Se o produto for de fabricação própria, ele não pode ter uma das opções de importado definida em Origem do Item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Validar finalidade do item&#039;&#039;&#039; - Todo item deve ter no mínimo 1 finalidade definida em seu cadastro.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Preenchimento completo dos pesos e volumes das embalagens&#039;&#039;&#039; - Se algum campo for preenchido, ele deve ser preenchido por completo! Por exemplo, se o &amp;quot;Peso Drenado&amp;quot; for definido, obrigatoriamente sua unidade de medida deve ser preenchida, o mesmo para o caso contrário: se a unidade for definida, a quantidade também deverá ser!&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Não permite que um Item tenha dois códigos iguais definidos&#039;&#039;&#039; - Validar se o código sendo inserido/alterado não tem definido duas vezes o mesmo código.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Os códigos de item só podem ser associados às categorias definidas no tipo de item&#039;&#039;&#039; - Validar se a categoria enviada no ItemCodeVO é uma das categorias disponibilizadas no ItemTypeVO associado ao ItemVO. Os códigos ficam limitados a usarem apenas as categorias permitidas de acordo com o tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se a Categoria do Item permite a associação dos itens&#039;&#039;&#039; - Os códigos de itens não podem ser associados às categorias que não permitem a associação de itens.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Validar Finalidade do Item&#039;&#039;&#039; - O campo de finalidade não pode ter alguns alguns valores de acordo os valores definidos nos outros campos, conforme as seguintes regras:&lt;br /&gt;
*** &#039;&#039;&#039;Revenda:&#039;&#039;&#039; Não pode ser definido quando o produto for de &#039;&#039;&#039;Fabricação Própria&#039;&#039;&#039;.&lt;br /&gt;
*** &#039;&#039;&#039;Produto Acabado:&#039;&#039;&#039; Não pode ser definido quando o produto for &#039;&#039;&#039;Produzido por Terceiros&#039;&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;[ve0009] Valida Item Próprio em Tipo de Substituição&#039;&#039;&#039; - Valida se o Item é de produção própria e está em um tipo de item com a tributação de ICMS definida como Substituição Tributária.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Descrição do Item&#039;&#039;&#039; - Valida se a descrição do item é única entre os itens ativos no momento.&lt;br /&gt;
** &#039;&#039;&#039;[ve0011] Itens de Revenda não podem ser Descartáveis&#039;&#039;&#039; - Valida se o item tiver o propósito como revenda, não permite que seja do tipo descartável.&lt;br /&gt;
&lt;br /&gt;
== Pacotes / Equivalência de Unidades ==&lt;br /&gt;
&lt;br /&gt;
Um único item (&amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;) do sistema pode ter diversos código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), chamados de pacotes. A ideia de pacotes é que o mesmo item possa ser vendidos em proporções ou embalagens diferentes, por exemplo, mini-coxinhas podem ser vendidas ao centro, por unidade, por quilo ou empacotadas em bandeijas.&lt;br /&gt;
&lt;br /&gt;
Para resolver essa questão o item apresenta uma &#039;&#039;&#039;Régua de Equivalência&#039;&#039;&#039;, que estabelece a relação de proporção de quantidades entre as diferentes gandezas. Por exemplo, define-se que a 1Und tem 30g e que 1 Bandeija tem 30 unidades. Deste ponto em diante o sistema saberá vender o item em bandeijas, unidades (e suas variações como pares, dúzias, etc.) ou quilo (e suas variações como gramas, toneladas, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Embora um item possa trabalhar com diferentes sistemas de unidades de medidas, uma unidade de medida principal e imutável é atribuída ao item. Esta unidade é a utilizada pelo sistema para concentrar as quantidades de estoque, relatórios de quantidade de vendas, etc.. Deve ser a unidade de medida que a empresa costuma utilizar no seu dia a dia para contabilizar os itens. Muitas vezes é considerada a menor unidade divísivel do item para evitar trabalhar com frações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão ===&lt;br /&gt;
&lt;br /&gt;
Um conceito presa ser definido neste ponto: para efeitos de cálculo, criamos o &#039;&#039;&#039;Fator de Conversão de Quantidade&#039;&#039;&#039; (&#039;&#039;&#039;Quantity Conversion Factor&#039;&#039;&#039;) ou &#039;&#039;&#039;qcFactor&#039;&#039;&#039;. Esse fator representa o multiplicador necessário para transformar a quantidade de um código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;) na quantidade equivalente do item (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), considerando suas unidades de medida e quantidade do pacote.&lt;br /&gt;
&lt;br /&gt;
Esse fator é obtido a partir da seguinte equação verdade:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;qtyItemVO = qcFactor * qtyItemCodeVO&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assim, o valor de &#039;&#039;&#039;qcFactor&#039;&#039;&#039; é definido da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;fatorCQ = unitRatio * packageRatio&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde:&lt;br /&gt;
* &#039;&#039;&#039;unitRatio&#039;&#039;&#039; - É a razão entre os fatores das unidades de medida do código e da unidade principal.&lt;br /&gt;
:* &#039;&#039;&#039;Exemplo:&#039;&#039;&#039; A unidade principal é Kilograma, e a do código é Gramas. Se o fator de Kilograma é 1, a de gramas será 1000, representando que 1Kg = 1000g. Neste caso &#039;&#039;&#039;unitRatio = 1/1000 = 0,001&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;packageRatio&#039;&#039;&#039; - É a definição do usuário estabelecendo uma proporção de quantidade de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exemplo ====&lt;br /&gt;
&lt;br /&gt;
O cadastro de &#039;&#039;&#039;Mini Coxinhas&#039;&#039;&#039; produzida pela empresa estabelece o seguinte:&lt;br /&gt;
* &#039;&#039;&#039;Unidade Principal:&#039;&#039;&#039; Definido em Kilos, pois o usuário entende que Kilos é a unidade mais usual para trabalhar (controlar estoque, custo, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Relações de Grandezas:&#039;&#039;&#039; Para cobrir seus diferentes métodos de venda o usuário estabelece a seguinte relação de Grandezas:&lt;br /&gt;
:* &#039;&#039;&#039;1 Und = 30g&#039;&#039;&#039; - Define que 1 unidade de Mini Coxinha tem o tamanho de 30g.&lt;br /&gt;
:* &#039;&#039;&#039;1 Bandeja = 2 Dúzia&#039;&#039;&#039; - A unidade personalizada Bandeija equivale a 1 dúzia.&lt;br /&gt;
* &#039;&#039;&#039;Códigos de Vendas:&#039;&#039;&#039;&lt;br /&gt;
:* &#039;&#039;&#039;1 - Venda por Kilo:&#039;&#039;&#039; - Neste código o usuário define o tamanho do pacote em 1, a unidade &#039;Kilogram&#039; e que o códigio é divisível.&lt;br /&gt;
:* &#039;&#039;&#039;2 - Venda por Cento:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Centro&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;3 - Venda por Unidade:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Unidade&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;4 - Venda por Bandeija:&#039;&#039;&#039; - Aqui, define o tamanho do pacote em 2, a unidade em &#039;Bandeija&#039; e que o código é indivisível.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em relação ao código para trabalhar com essas informações vamos dividir em partes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{java|Preparação da Régua e Definições|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // Utilizamos a classe MeasureUtil para facilitar a criação da Régua e medidas&lt;br /&gt;
    MeasureRulerVO rulerVO = MeasureUtil.createSimpleMeasureRulerVO(BigDecimal.ONE, WEIGHTUNIT.KILOGRAM); // Cria a régua com a unidade principal, estabelecendo a razão 1&lt;br /&gt;
    MeasureUtil.fillSmartRuler(rulerVO, BigDecimal.ONE, UNITUNIT.UNIT, new BigDecimal(&amp;quot;30&amp;quot;), WEIGHTUNIT.GRAM); // Estabelece que 1 unidade = 30 gramas&lt;br /&gt;
&lt;br /&gt;
    // Unidade de medida personalizada, oferecida pelo sistema&lt;br /&gt;
    MeasureCustomVO measureCustomVO = new MeasureCustomVO();&lt;br /&gt;
    measureCustomVO.setCode(&amp;quot;BDJ&amp;quot;);&lt;br /&gt;
    measureCustomVO.setDescription(&amp;quot;Bandeja&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Estabelece a relação da unidade personalizada com uma unidade presente na régua: 1BDJ = 1Dúzia&lt;br /&gt;
    MeasureEquivalenceVO equiVO = new MeasureEquivalenceVO();&lt;br /&gt;
    equiVO.setMeasureCustomVO(measureCustomVO);&lt;br /&gt;
    equiVO.setReferencequantity(new BigDecimal(&amp;quot;2&amp;quot;));&lt;br /&gt;
    equiVO.setReferenceunit(UNITUNIT.DOZEN);&lt;br /&gt;
    equiVO.setMeasurerulervo(rulerVO);&lt;br /&gt;
    rulerVO.getMeasurerulerequivalencelist().add(equiVO);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que passamos as definições de proporções do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; para a &amp;lt;code&amp;gt;MeasureRulerVO&amp;lt;/code&amp;gt;, conseguimos calcular o &#039;&#039;&#039;qcFactor&#039;&#039;&#039; facilmente com o método &amp;lt;code&amp;gt;MeasureUtil.convertTo(...)&amp;lt;/code&amp;gt;. Para o cadastro exemplo acima:&lt;br /&gt;
&lt;br /&gt;
{{java|Cálculo do qcFactor:|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    WEIGHTUNIT itemVOUnit = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 1 - Kilo&lt;br /&gt;
    WEIGHTUNIT itemCodeVOUnit1 = WEIGHTUNIT.KILOGRAM;&lt;br /&gt;
    BigDecimal packageRatio1 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor1 = MeasureUtil.convertTo(rulerVO, packageRatio1, itemCodeVOUnit1, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 1:&amp;quot; + qcFactor1); // Saída: 1.0000000000&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 2 - Cento&lt;br /&gt;
    UNITUNIT itemCodeVOUnit2 = UNITUNIT.CENT;&lt;br /&gt;
    BigDecimal packageRatio2 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor2 = MeasureUtil.convertTo(rulerVO, packageRatio2, itemCodeVOUnit2, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 2:&amp;quot; + qcFactor2); // Saída: 3.0000300003 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 3 - Unidade&lt;br /&gt;
    UNITUNIT itemCodeVOUnit3 = UNITUNIT.UNIT;&lt;br /&gt;
    BigDecimal packageRatio3 = BigDecimal.ONE;&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor3 = MeasureUtil.convertTo(rulerVO, packageRatio3, itemCodeVOUnit3, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 3:&amp;quot; + qcFactor3); // Saída: 0.0300003000 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
    // ----- Código 4 - Bandeja&lt;br /&gt;
    // A unidade de medida personalizada precisa ser encapsulada com o MeasureEquivalenceBean para utilizar na MeasureUtil.&lt;br /&gt;
    MeasureEquivalenceBean itemCodeVOUnit4 = new MeasureEquivalenceBean();&lt;br /&gt;
    itemCodeVOUnit4.setEquiVO(equiVO);&lt;br /&gt;
    BigDecimal packageRatio4 = new BigDecimal(&amp;quot;1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    BigDecimal qcFactor4 = MeasureUtil.convertTo(rulerVO, packageRatio4, itemCodeVOUnit4, itemVOUnit);&lt;br /&gt;
    System.out.println(&amp;quot;qcFactor 4:&amp;quot; + qcFactor4); // Saída: 0.7200072001 (Imprecisão do cáculo por dízima)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== Definição do Preço de Venda ==&lt;br /&gt;
&lt;br /&gt;
Há vários fatores sobre a lógica de calcular definir um novo preço de venda. Como as políticas de arredondamento, congelamento de preço, replicação do preço para outros códigos do mesmo grupo, a movimentação de novos preços para histórico, etc.&lt;br /&gt;
&lt;br /&gt;
A ordem das operações lógicas a serem aplicadas sobre o ItemPriceVO devem ser conforme a ordem dos métodos listados abaixo. Cada método executa a operação a partir de um determinado ponto. Isso permite que diferentes eventos que causam a alteração do preço de venda possam acionar o ciclo a partir de diferentes pontos.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Define um Novo preço de Venda para um Código&#039;&#039;&#039; - O início do processo. Quando um novo preço de venda deve ser definido em um código de item. Este passo utiliza o valor recebido as as definições do próprio ItemCode para realizar toda a sequência lógica do preço de venda.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Definition()&#039;&#039;&#039; - Método responsável por carregar as informações do ItemCodeVO e iniciar o processo definição do novo preço de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicar Regras de Arredondamento&#039;&#039;&#039; - Dependendo das configurações da Categoria do Item definida no Código do Item, o preço precisará ser arredondado para respeitar essas políticas.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_RoundApply()&#039;&#039;&#039; - Este método recebe o valor do novo preço e a política de arredondamento para aplicar as regras de arredondamento. Uma vez aplicado os arredondamentos o valor será passado para o próximo método da cadeia (o &#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;) para a efetivação em todos os grupos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Aplicação da Política|Para centralizar o código de aplicação da política, a efetiva aplicação do arredondamento fica na classe utilitária &#039;&#039;&#039;ItemUtils&#039;&#039;&#039; no método &#039;&#039;&#039;applyRoundPricePolicy()&#039;&#039;&#039;. Podendo ser acessado de qualquer ponto, como classes da UI.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Disseminação do Preço de Venda pelo Grupo&#039;&#039;&#039; - Caso o &#039;&#039;ItemCode&#039;&#039; cujo preço de venda esteja sendo alterado faça parte de um grupo, este preço de venda deverá ser disseminado para todos os &#039;&#039;ItemCode&#039;&#039; do Grupo.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;&#039; - Avalia se o &#039;&#039;ItemCode&#039;&#039; cujo preço deve ser alterado faz parte de um grupo. Caso faça ele pesquisa todos os itens do grupo e chama o método &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; todos os envolvidos. Este método não faz qualquer processamento no valor, apenas verifica os códigos envolvidos no grupo e aplica o valor, congelado ou não conforme informado via parâmetros). O valor será aplicado a todos do grupo conforme recebido, &amp;quot;passando por cima&amp;quot; das configurações de arredondamento e políticas de congelamento de cada código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicação do Preço de Venda ao Objeto&#039;&#039;&#039; - Caso haja real alteração no ItemPriceVO uma cópia deve ser convertida para o ItemPriceHistoryVO e persistida. Por fim atualizar o ItemPriceVO na base de dados.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; - Método responsável por atualizar as definições sobre o preço de venda (ItemPriceVO) de um &#039;&#039;Código de Item&#039;&#039;. Este método recebe o novo valor, se o preço estará congelado, e outros atributos para identificação do ItemPriceVO correto (dependendo da assinatura). De acordo com os valores passados, este método avalia se haverá alteração das informações atuais, cria um novo objeto para o histórico de preços (ItemPriceHistoryVO) e salva os dados atuais. Em seguida faz as alterações necessárias ao ItemPriceVO e já o persiste no banco.&lt;br /&gt;
*: &#039;&#039;&#039;Este é (e deve continuar sendo) o único método que fará a atualização do ItemPriceVO no banco de dados!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eventos de Alteração do Preço de Venda ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cadastro/Alteração de Itens&#039;&#039;&#039; - Quando um item é cadastrado ou alterado ele tem definições de códigos e consequentemente de preços de vendas. Neste caso avaliamos as seguintes condições para cada código:&lt;br /&gt;
** &#039;&#039;&#039;Não tem um grupo associado&#039;&#039;&#039; - Se não tem um grupo adicionado, temos que definir e processar o preço completamente. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tem um grupo associado:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos definir novos valores para o código e para o grupo&#039;&#039;&#039; - Se devemos associar novos valores para este novo código e para o grupo em que ele vai entrar, processamos o valor deste código completamente, e como a associação ao grupo é feita antes da definição dos preços, a lógica do updateItemPrice fará a disseminação deste valor nos outros códigos do grupo quando chegar no passo &#039;&#039;_GroupDisseminate()&#039;&#039;. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos copiar o valor atual sendo praticado no grupo&#039;&#039;&#039; - Neste caso vamos buscar o valor de qualquer código do grupo (afinal devem ser todos iguais) e copiamos seus valores. Tanto o valor praticado, quanto um eventual valor que esteja congelado. Chama o &#039;&#039;&#039;_Apply()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Descongelar o Preço de Venda&#039;&#039;&#039; - Descongelar significa efetivar o preço que está congelado como o preço praticado para venda. Para evitar qualquer reprocessamento no valor, mas ainda assim garantir que o novo valor efetivo de venda será definido em todos os códigos do mesmo grupo este método chama o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Descartar Preço Congelado&#039;&#039;&#039; - Quando não queremos que o preço congelado entre em vigor podemos simplesmente descartar o preço congelado, e manter o código com o mesmo preço que já tinha. Neste caso queremos que todos os códigos do mesmo grupo descartem seu preço congelado e que continuem mantendo o preço já praticado. Para evitar o processamento dos valores mas ainda realizar a operação em todos os códigos do grupo chamamos o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:updateItemPriceFlow.png|frame|center|Diagrama do fluxo da lógica de alteração do preço de venda de um Código de Item. E entrada dos eventos que causam essas alterações.]]&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1664</id>
		<title>Módulo Item</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1664"/>
		<updated>2025-11-20T12:12:49Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Fator de Conversão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo &#039;&#039;&#039;Item&#039;&#039;&#039; é o módulo responsável por cadastrar os itens de consumo, produtos de revenda, fabricação própria para venda ou consumo, etc. Este módulo oferecerá um cadastro com controle de preços, markups, custos, entre outras funcionalidades que servirão de suporte para diversos outros módulos, como PDV, Controle de Estoques, Base de Custos para Planilhas de Cálculos, etc.&lt;br /&gt;
&lt;br /&gt;
Para oferecer todo o conceito o módulo é dividido nos seguintes cadastros:&lt;br /&gt;
&lt;br /&gt;
= Categoria do Item =&lt;br /&gt;
&lt;br /&gt;
A categoria do item tem a finalidade de organizar e agrupar os itens de acordo com suas categorias. Mutias vezes a categoria é o corredor em que as mercadorias são agrupadas, como &amp;quot;Bazar&amp;quot;, &amp;quot;Açougue&amp;quot;, &amp;quot;Produtos de Limpeza&amp;quot;, etc. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Estrutura Hierárquica:&#039;&#039;&#039; As categorias são uma estrutura hierárquica, isto é, permite que uma categoria seja adiciona dentro da outra.&lt;br /&gt;
** &#039;&#039;&#039;Nomes Únicos &#039;por Pai&#039;:&#039;&#039;&#039; Os nomes das categorias são únicos dentro do mesmo pai. Em outras palavras, os nomes das categorias só podem se repetir se estiverem em pontos diferentes da estrutura hierárquica.&lt;br /&gt;
** &#039;&#039;&#039;Permite Itens:&#039;&#039;&#039; Esta opção define se os itens podem ser alocados nesta categoria ou não. Quando a opção estiver desmarcada nenhum código de item deverá ser definido nesta categoria. Esta função permite que um determinado tipo de item possa ser alocado nesta categoria, mas força que os itens tenham que ser alocados nas subcategorias.&lt;br /&gt;
** &#039;&#039;&#039;Congelamento de Preços:&#039;&#039;&#039; Este atributo define se os preços dos itens nesta categoria devem permanecer congelados quando forem editados ou houver uma entrada de NFe.&lt;br /&gt;
** &#039;&#039;&#039;Arredondamento de Preços:&#039;&#039;&#039; Permite definir uma regra de arredondamento dos preços de venda de todos os itens que estão nesta categoria. Uma vez definida, nenhum item deverá ter um preço diferente do arredondamento definido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Validar a estrutura de uso por Itens e Tipo de Itens quando a categoria pai for alterada.&#039;&#039;&#039; - A categoria pai de uma categoria não pode ser alterada se algum item estiver associado à ela ou à alguma subcategoria enquanto que o seu tipo de item aponta para a categoria pai. Em outras palavras, caso ao alterar a categoria de posição na hierarquia se não invalidará as condições do tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Hierarquia Cíclica.&#039;&#039;&#039; - Garantir que durante a atualização uma categoria não passa a apontar &amp;quot;como pai&amp;quot; uma categoria que está abaixo dela na hierarquia, criando um relacionamento cíclico.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se temos exatamente 1 ItemCategoryCompanyVO por Empresa&#039;&#039;&#039; - Validar se o temos exatamente 1 definição de dados por empresa. Não devemos ter nem duplicadas, nem faltando. (BUG: 270)&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Categoria de Item Sendo Usado Por Código do Item, Tipo do Item ou outra Categoria de Item&#039;&#039;&#039; - Antes de excluir uma categoria é preciso confirmar se ela não está em uso por outro objeto. Ela pode estar em uso por um código de item (verificar se o Item está ativo), ser referenciada pelo Tipo de Item (também verificar se o mesmo está ativo) ou ser pai de outra categoria (que também precisa verificar se ainda esta ativa). Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Markup, Congelamento de Preços e Arredondamento de Preços são Obrigatórios quando a Categoria permite que itens sejam adicionados.&#039;&#039;&#039; - Validar se estão preenchidos quando a categoria permitir itens, validar se estão nulos quando a categoria não permitir itens. Quando a categoria não permitir itens, o campo MarkUp Mínimo também deve ser nulo.&lt;br /&gt;
&lt;br /&gt;
= Tipo do Item =&lt;br /&gt;
&lt;br /&gt;
O tipo do item tem a finalidade de agrupar todos os itens de um mesmo tipo. Entende-se por tipo de produto &amp;quot;o que o produto é&amp;quot;, por exemplo: Refrigerante, Água, Suco, Pasta de Dente, Pão de Queijo, etc. Não faz parte do tipo a marca, embalagem, quantidades etc. Marca, quantidade, códigos, preços, etc. são parte do cadastro do Iten e não do tipo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo do Item:&#039;&#039;&#039; O nome do tipo de item é usado para identificar o cadastro. Deve ser único.&lt;br /&gt;
** &#039;&#039;&#039;Prefixo:&#039;&#039;&#039; O prefixo é um &amp;quot;começo&amp;quot; da descrição, que será usada em todos os itens desse mesmo tipo. Ao forçar que todos os itens comecem com o mesmo prefixo ajuda na organização do cadastro do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;Descrição de Exemplo: &#039;&#039;&#039; Cada tipo de item deve ter um espaço para orientar o usuário sobre quais as informações importantes para aquele tipo de produto, além de definir a ordem em que devem aparecer.&lt;br /&gt;
** &#039;&#039;&#039;Associação com Aliquota ICMS:&#039;&#039;&#039; No tipo do item devemos definir qual a alíquota de tributação do ICMS que deverá ser utilizada em todos os itens desse tipo. Centralizando e simplificando as configurações.&lt;br /&gt;
** &#039;&#039;&#039;Associação com As categorias:&#039;&#039;&#039; Cada tipo de item deve associar no mínimo uma categoria de itens. Cada item deste tipo deverá associar seus códigos nessas categorias ou suas subcategorias. O tipo de item pode permitir associação com mais de um &amp;quot;nó&amp;quot; da hierarquia da categoria. Permitindo assim que itens do mesmo tipo possam ser lançados em categorias diferentes. Como por exemplo um refrigerante com um código lançado na categoria de &amp;quot;Geladeiras/Loja&amp;quot; e outro código em &amp;quot;Restaurante/SelfService&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Categoria em Uso por Itens continua Disponível&#039;&#039;&#039; - Quando um tipo de item é alterado, é preciso validar se os itens desse tipo atualmente cadastrados não ficarão inválidos caso a categoria não esteja mais associada ao tipo de item. Ou seja, quando um item associado a esse tipo de item já estiver utilizando determinada categoria ela não pode ser excluída do tipo de item. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Alteração do Prefixo reflete nos itens existentes&#039;&#039;&#039; - Caso o prefixo seja alterado, todos os itens deste tipo de item devem ter seu nome atualizado de acordo com o novo prefixo. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Verifica Definições de Impostos para cada empresa&#039;&#039;&#039; - Verifica a definição dos impostos para cada empresa existente.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Tipo e Alíquota no ECF igual à Alíquota Efetiva&#039;&#039;&#039; - Verifica se o tipo do ICMS definido no tipo de item e a alíquota efetiva do do cálculo é coerente com os valores cadastrados no objeto ICMSVO, usado no momento de venda do ECF.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Natureza da Receita e Tabela são obrigatórios para os CSTs 02, 03, 04, 05, 06, 07, 08 e 09&#039;&#039;&#039; - Para todos esses CSTs, os campos de Natureza da Receita e Tabela ser validado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Verificar se a tabela é valida para o CST de Saída informado&#039;&#039;&#039; - Quando a tabela é informada, ela deve ser coerente com o código do CST de saída informado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Verificar se o Natureza é válida para a Tabela informada&#039;&#039;&#039; - Ao informar um código da Natureza da Receita o BIS deve verificar se o código da Receita é válido para a tabela sendo usada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Tipo de Item Sendo Usado no Momento&#039;&#039;&#039; - Antes de excluir o tipo de item é preciso verificar se ele não está em uso no momento. Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
&lt;br /&gt;
= ICMS =&lt;br /&gt;
&lt;br /&gt;
O objeto ICMS é a definição das alíquotas de ICMS utilizadas pelos Itens/Tipo de Itens. As alíquotas devem ser cadastradas conforme as alíquotas que a empresa utiliza.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo de Alíquota&#039;&#039;&#039; - As alíquotas podem ser de 3 tipos diferentes: Isento, Substituição e Tributada.&lt;br /&gt;
** &#039;&#039;&#039;Alíquota&#039;&#039;&#039; - A alíquota é a percentagem usado para calcular o valor do tributo. A alíquota quando definida é um valor positivo.&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - As alíquotas devem ter um nome que facilite a identificação da alíquota para o usuário. Este nome deve ser único.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Definição Obrigatória da Alíquota quando o tipo for Tributado&#039;&#039;&#039; - A definição da alíquota é obrigatória sempre que o tipo for Tributada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Não definição da Alíquota para os tipos Isento e Substituição.&#039;&#039;&#039; - Para os tipos Isento e Substituição o valor da alíquota devem estar nulos.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Em uso por algum tipo de item&#039;&#039;&#039; - durante a tentativa de exclusão, verificar se o ICMS não está em uso atualmente por algum Tipo de Item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ItemCodeGroup =&lt;br /&gt;
&lt;br /&gt;
O Grupo de Código de Item tem a finalidade de agrupar diferentes códigos de itens e fazer com que SEMPRE tenham o mesmo preço de venda. Independente de custo, categorias markups, arredondamentos, etc. Uma vez que um preço de venda de um item for alterado, os demais vão segui-lo fielmente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - Tudo grupo de código deve ter um nome para facilitar a identificação dos itens que fazem parte do grupo.&lt;br /&gt;
** &#039;&#039;&#039;Lista de Còdigos&#039;&#039;&#039; - Dentro de um mesmo grupo podem ser associados 0+ códigos de itens. Códigos de um mesmo item podem fazer parte do mesmo grupo.&lt;br /&gt;
** &#039;&#039;&#039;Sempre o mesmo preço de venda&#039;&#039;&#039; - Independente das diferentes configurações que um código de item pode ter dentro do mesmo grupo, como diferentes categorias, MarkUps, Custos, definições de arredondamento, package ratios, etc.. O preço de venda de todos os itens do grupo devem ter exatamente o mesmo valor. Mesmo que para isso tenha que desrespeitar qualquer outra regra do sistema (como arredondamento, ou cálculo de package, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Códigos de Itens já associados a outros grupos&#039;&#039;&#039; - Durante a inserção ou atualização, um grupo não deve permitir que um código de item já associado à outro grupo seja associado a este. Em outras palavras, um código de item não pode estar associado em mais de um grupo ao mesmo tempo.&lt;br /&gt;
&lt;br /&gt;
= Item = &lt;br /&gt;
&lt;br /&gt;
A entidade Item representa um produto qualquer da empresa. Esse produto por ser um insumo, uma matéria prima ou um produto de venda (ou revenda).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Fixação do prefixo da descrição de acordo com o tipo do Item&#039;&#039;&#039; - Todo item deve ser de algum &#039;&#039;Tipo de Item&#039;&#039;. Uma vez que o tipo de item esteja definido, a descrição do item obrigatoriamente deve começar com o valor do &#039;&#039;Prefixo&#039;&#039; definido no &#039;&#039;Tipo de Item&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Obrigatoriedade da Marca ou da Descrição&#039;&#039;&#039; - Todo item deve ter preenchidos no mínimo um dos campos &#039;&#039;Marca&#039;&#039; ou &#039;&#039;Descrição&#039;&#039;. Mesmo para produtos de fabricação própria, é recomendável definir a marca da empresa por questões de organização dos itens. Caso nenhum dos dois seja preenchido a descrição pode acabar sendo apenas o &#039;&#039;Prefixo&#039;&#039; do &#039;&#039;Tipo de Item&#039;&#039;. Para Itens &amp;quot;genéricos&amp;quot;, cuja marca não importa, pois em cada momento uma marca diferente é comprada ou usada, a marca não é necessária, mas uma descrição sim.&lt;br /&gt;
** &#039;&#039;&#039;Dimensão e Unidade de Medida Padrão&#039;&#039;&#039; - Todo item tem uma dimensão (Massa, Unidades, Volume, Cumprimento, etc.) e uma unidade de medida (Kg, Unidades, Litros, Metros, etc.) a que se refere o item. Essa unidade ajuda identifica a unidade de quantização padrão desse item. A unidade em que por padrão esse item é comprado, vendido e movimentado. Outras unidades diferentes para movimentar o mesmo item podem ser definidas em códigos diferentes.&lt;br /&gt;
** &#039;&#039;&#039;Custo&#039;&#039;&#039; - Todo Item tem um custo único padrão. Esse custo é sempre o mesmo, independente da empresa.&lt;br /&gt;
** &#039;&#039;&#039;Códigos dos Itens:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Múltiplos Códigos&#039;&#039;&#039; - Cada item pode ter mais que um código definido, ou seja, uma lista de códigos. Códigos são a maneira definir um modo quantidade, preço de venda, pacote, etc. de um determinado Item. Normalmente tem uma identificação única (e normalmente numérica, embora não obrigatória) para ser referenciada em terminais, notas, códigos de barras, etc. No entanto a identificação única não deve ser obrigatória. Um item pode ter um código para definir uma determinada quantidade de movimentação de entrada ou saída, ou simplesmente para definir uma nova unidade de medida. Por exemplo, produtos identificados hora por Kilos hora por Unidades.&lt;br /&gt;
*** &#039;&#039;&#039;Categoria do Item&#039;&#039;&#039; - De acordo com o &#039;&#039;Tipo de Item&#039;&#039; definido no Item, cada código do item deverá ser alocado em uma das categorias definidas no &#039;&#039;Tipo de Item&#039;&#039;. Apesar de ser o mesmo código, cada um pode gerar venda em uma categoria diferente, ou utilizar o MarkUp diferentes de acordo com o definido em cada categoria.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Validar requisito de Obrigatoriedade entre Marca e Descrição&#039;&#039;&#039; - Um dos campos deve sempre ser preenchido.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Validar inconsistência entre Fabricação do Produto e Origem do Item&#039;&#039;&#039; - Se o produto for de fabricação própria, ele não pode ter uma das opções de importado definida em Origem do Item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Validar finalidade do item&#039;&#039;&#039; - Todo item deve ter no mínimo 1 finalidade definida em seu cadastro.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Preenchimento completo dos pesos e volumes das embalagens&#039;&#039;&#039; - Se algum campo for preenchido, ele deve ser preenchido por completo! Por exemplo, se o &amp;quot;Peso Drenado&amp;quot; for definido, obrigatoriamente sua unidade de medida deve ser preenchida, o mesmo para o caso contrário: se a unidade for definida, a quantidade também deverá ser!&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Não permite que um Item tenha dois códigos iguais definidos&#039;&#039;&#039; - Validar se o código sendo inserido/alterado não tem definido duas vezes o mesmo código.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Os códigos de item só podem ser associados às categorias definidas no tipo de item&#039;&#039;&#039; - Validar se a categoria enviada no ItemCodeVO é uma das categorias disponibilizadas no ItemTypeVO associado ao ItemVO. Os códigos ficam limitados a usarem apenas as categorias permitidas de acordo com o tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se a Categoria do Item permite a associação dos itens&#039;&#039;&#039; - Os códigos de itens não podem ser associados às categorias que não permitem a associação de itens.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Validar Finalidade do Item&#039;&#039;&#039; - O campo de finalidade não pode ter alguns alguns valores de acordo os valores definidos nos outros campos, conforme as seguintes regras:&lt;br /&gt;
*** &#039;&#039;&#039;Revenda:&#039;&#039;&#039; Não pode ser definido quando o produto for de &#039;&#039;&#039;Fabricação Própria&#039;&#039;&#039;.&lt;br /&gt;
*** &#039;&#039;&#039;Produto Acabado:&#039;&#039;&#039; Não pode ser definido quando o produto for &#039;&#039;&#039;Produzido por Terceiros&#039;&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;[ve0009] Valida Item Próprio em Tipo de Substituição&#039;&#039;&#039; - Valida se o Item é de produção própria e está em um tipo de item com a tributação de ICMS definida como Substituição Tributária.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Descrição do Item&#039;&#039;&#039; - Valida se a descrição do item é única entre os itens ativos no momento.&lt;br /&gt;
** &#039;&#039;&#039;[ve0011] Itens de Revenda não podem ser Descartáveis&#039;&#039;&#039; - Valida se o item tiver o propósito como revenda, não permite que seja do tipo descartável.&lt;br /&gt;
&lt;br /&gt;
== Pacotes / Equivalência de Unidades ==&lt;br /&gt;
&lt;br /&gt;
Um único item (&amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;) do sistema pode ter diversos código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), chamados de pacotes. A ideia de pacotes é que o mesmo item possa ser vendidos em proporções ou embalagens diferentes, por exemplo, mini-coxinhas podem ser vendidas ao centro, por unidade, por quilo ou empacotadas em bandeijas.&lt;br /&gt;
&lt;br /&gt;
Para resolver essa questão o item apresenta uma &#039;&#039;&#039;Régua de Equivalência&#039;&#039;&#039;, que estabelece a relação de proporção de quantidades entre as diferentes gandezas. Por exemplo, define-se que a 1Und tem 30g e que 1 Bandeija tem 30 unidades. Deste ponto em diante o sistema saberá vender o item em bandeijas, unidades (e suas variações como pares, dúzias, etc.) ou quilo (e suas variações como gramas, toneladas, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Embora um item possa trabalhar com diferentes sistemas de unidades de medidas, uma unidade de medida principal e imutável é atribuída ao item. Esta unidade é a utilizada pelo sistema para concentrar as quantidades de estoque, relatórios de quantidade de vendas, etc.. Deve ser a unidade de medida que a empresa costuma utilizar no seu dia a dia para contabilizar os itens. Muitas vezes é considerada a menor unidade divísivel do item para evitar trabalhar com frações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão ===&lt;br /&gt;
&lt;br /&gt;
Um conceito presa ser definido neste ponto: para efeitos de cálculo, criamos o &#039;&#039;&#039;Fator de Conversão de Quantidade&#039;&#039;&#039; (&#039;&#039;&#039;Quantity Conversion Factor&#039;&#039;&#039;) ou &#039;&#039;&#039;qcFactor&#039;&#039;&#039;. Esse fator representa o multiplicador necessário para transformar a quantidade de um código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;) na quantidade equivalente do item (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), considerando suas unidades de medida e quantidade do pacote.&lt;br /&gt;
&lt;br /&gt;
Esse fator é obtido a partir da seguinte equação verdade:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;qtyItemVO = qcFactor * qtyItemCodeVO&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assim, o valor de &#039;&#039;&#039;qcFactor&#039;&#039;&#039; é definido da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;fatorCQ = unitRatio * packageRatio&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde:&lt;br /&gt;
* &#039;&#039;&#039;unitRatio&#039;&#039;&#039; - É a razão entre os fatores das unidades de medida do código e da unidade principal.&lt;br /&gt;
:* &#039;&#039;&#039;Exemplo:&#039;&#039;&#039; A unidade principal é Kilograma, e a do código é Gramas. Se o fator de Kilograma é 1, a de gramas será 1000, representando que 1Kg = 1000g. Neste caso &#039;&#039;&#039;unitRatio = 1/1000 = 0,001&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;packageRatio&#039;&#039;&#039; - É a definição do usuário estabelecendo uma proporção de quantidade de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exemplo ====&lt;br /&gt;
&lt;br /&gt;
O cadastro de &#039;&#039;&#039;Mini Coxinhas&#039;&#039;&#039; produzida pela empresa estabelece o seguinte:&lt;br /&gt;
* &#039;&#039;&#039;Unidade Principal:&#039;&#039;&#039; Definido em Kilos, pois o usuário entende que Kilos é a unidade mais usual para trabalhar (controlar estoque, custo, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Relações de Grandezas:&#039;&#039;&#039; Para cobrir seus diferentes métodos de venda o usuário estabelece a seguinte relação de Grandezas:&lt;br /&gt;
:* &#039;&#039;&#039;1 Und = 30g&#039;&#039;&#039; - Define que 1 unidade de Mini Coxinha tem o tamanho de 30g.&lt;br /&gt;
:* &#039;&#039;&#039;1 Bandeja = 1 Dúzia&#039;&#039;&#039; - A unidade personalizada Bandeija equivale a 1 dúzia.&lt;br /&gt;
* &#039;&#039;&#039;Códigos de Vendas:&#039;&#039;&#039;&lt;br /&gt;
:* &#039;&#039;&#039;1 - Venda por Kilo:&#039;&#039;&#039; - Neste código o usuário define o tamanho do pacote em 1, a unidade &#039;Kilogram&#039; e que o códigio é divisível.&lt;br /&gt;
:* &#039;&#039;&#039;2 - Venda por Cento:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Centro&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;3 - Venda por Unidade:&#039;&#039;&#039; - Neste, define o tamanho do pacote em 1, a unidade em &#039;Unidade&#039; e que o código é indivisível.&lt;br /&gt;
:* &#039;&#039;&#039;4 - Venda por Bandeija:&#039;&#039;&#039; - Aqui, define o tamanho do pacote em 1, a unidade em &#039;Bandeija&#039; e que o código é indivisível.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em relação ao código para trabalhar com essas informações vamos dividir em duas partes:&lt;br /&gt;
&#039;&#039;&#039;Preparação da Régua e Definições:&#039;&#039;&#039;&lt;br /&gt;
Montamos a MeasureRulerVO com as informações, um exemplo seria:&lt;br /&gt;
&lt;br /&gt;
== Definição do Preço de Venda ==&lt;br /&gt;
&lt;br /&gt;
Há vários fatores sobre a lógica de calcular definir um novo preço de venda. Como as políticas de arredondamento, congelamento de preço, replicação do preço para outros códigos do mesmo grupo, a movimentação de novos preços para histórico, etc.&lt;br /&gt;
&lt;br /&gt;
A ordem das operações lógicas a serem aplicadas sobre o ItemPriceVO devem ser conforme a ordem dos métodos listados abaixo. Cada método executa a operação a partir de um determinado ponto. Isso permite que diferentes eventos que causam a alteração do preço de venda possam acionar o ciclo a partir de diferentes pontos.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Define um Novo preço de Venda para um Código&#039;&#039;&#039; - O início do processo. Quando um novo preço de venda deve ser definido em um código de item. Este passo utiliza o valor recebido as as definições do próprio ItemCode para realizar toda a sequência lógica do preço de venda.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Definition()&#039;&#039;&#039; - Método responsável por carregar as informações do ItemCodeVO e iniciar o processo definição do novo preço de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicar Regras de Arredondamento&#039;&#039;&#039; - Dependendo das configurações da Categoria do Item definida no Código do Item, o preço precisará ser arredondado para respeitar essas políticas.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_RoundApply()&#039;&#039;&#039; - Este método recebe o valor do novo preço e a política de arredondamento para aplicar as regras de arredondamento. Uma vez aplicado os arredondamentos o valor será passado para o próximo método da cadeia (o &#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;) para a efetivação em todos os grupos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Aplicação da Política|Para centralizar o código de aplicação da política, a efetiva aplicação do arredondamento fica na classe utilitária &#039;&#039;&#039;ItemUtils&#039;&#039;&#039; no método &#039;&#039;&#039;applyRoundPricePolicy()&#039;&#039;&#039;. Podendo ser acessado de qualquer ponto, como classes da UI.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Disseminação do Preço de Venda pelo Grupo&#039;&#039;&#039; - Caso o &#039;&#039;ItemCode&#039;&#039; cujo preço de venda esteja sendo alterado faça parte de um grupo, este preço de venda deverá ser disseminado para todos os &#039;&#039;ItemCode&#039;&#039; do Grupo.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;&#039; - Avalia se o &#039;&#039;ItemCode&#039;&#039; cujo preço deve ser alterado faz parte de um grupo. Caso faça ele pesquisa todos os itens do grupo e chama o método &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; todos os envolvidos. Este método não faz qualquer processamento no valor, apenas verifica os códigos envolvidos no grupo e aplica o valor, congelado ou não conforme informado via parâmetros). O valor será aplicado a todos do grupo conforme recebido, &amp;quot;passando por cima&amp;quot; das configurações de arredondamento e políticas de congelamento de cada código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicação do Preço de Venda ao Objeto&#039;&#039;&#039; - Caso haja real alteração no ItemPriceVO uma cópia deve ser convertida para o ItemPriceHistoryVO e persistida. Por fim atualizar o ItemPriceVO na base de dados.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; - Método responsável por atualizar as definições sobre o preço de venda (ItemPriceVO) de um &#039;&#039;Código de Item&#039;&#039;. Este método recebe o novo valor, se o preço estará congelado, e outros atributos para identificação do ItemPriceVO correto (dependendo da assinatura). De acordo com os valores passados, este método avalia se haverá alteração das informações atuais, cria um novo objeto para o histórico de preços (ItemPriceHistoryVO) e salva os dados atuais. Em seguida faz as alterações necessárias ao ItemPriceVO e já o persiste no banco.&lt;br /&gt;
*: &#039;&#039;&#039;Este é (e deve continuar sendo) o único método que fará a atualização do ItemPriceVO no banco de dados!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eventos de Alteração do Preço de Venda ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cadastro/Alteração de Itens&#039;&#039;&#039; - Quando um item é cadastrado ou alterado ele tem definições de códigos e consequentemente de preços de vendas. Neste caso avaliamos as seguintes condições para cada código:&lt;br /&gt;
** &#039;&#039;&#039;Não tem um grupo associado&#039;&#039;&#039; - Se não tem um grupo adicionado, temos que definir e processar o preço completamente. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tem um grupo associado:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos definir novos valores para o código e para o grupo&#039;&#039;&#039; - Se devemos associar novos valores para este novo código e para o grupo em que ele vai entrar, processamos o valor deste código completamente, e como a associação ao grupo é feita antes da definição dos preços, a lógica do updateItemPrice fará a disseminação deste valor nos outros códigos do grupo quando chegar no passo &#039;&#039;_GroupDisseminate()&#039;&#039;. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos copiar o valor atual sendo praticado no grupo&#039;&#039;&#039; - Neste caso vamos buscar o valor de qualquer código do grupo (afinal devem ser todos iguais) e copiamos seus valores. Tanto o valor praticado, quanto um eventual valor que esteja congelado. Chama o &#039;&#039;&#039;_Apply()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Descongelar o Preço de Venda&#039;&#039;&#039; - Descongelar significa efetivar o preço que está congelado como o preço praticado para venda. Para evitar qualquer reprocessamento no valor, mas ainda assim garantir que o novo valor efetivo de venda será definido em todos os códigos do mesmo grupo este método chama o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Descartar Preço Congelado&#039;&#039;&#039; - Quando não queremos que o preço congelado entre em vigor podemos simplesmente descartar o preço congelado, e manter o código com o mesmo preço que já tinha. Neste caso queremos que todos os códigos do mesmo grupo descartem seu preço congelado e que continuem mantendo o preço já praticado. Para evitar o processamento dos valores mas ainda realizar a operação em todos os códigos do grupo chamamos o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:updateItemPriceFlow.png|frame|center|Diagrama do fluxo da lógica de alteração do preço de venda de um Código de Item. E entrada dos eventos que causam essas alterações.]]&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1663</id>
		<title>Módulo Item</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1663"/>
		<updated>2025-11-19T23:09:43Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Fator de Conversão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo &#039;&#039;&#039;Item&#039;&#039;&#039; é o módulo responsável por cadastrar os itens de consumo, produtos de revenda, fabricação própria para venda ou consumo, etc. Este módulo oferecerá um cadastro com controle de preços, markups, custos, entre outras funcionalidades que servirão de suporte para diversos outros módulos, como PDV, Controle de Estoques, Base de Custos para Planilhas de Cálculos, etc.&lt;br /&gt;
&lt;br /&gt;
Para oferecer todo o conceito o módulo é dividido nos seguintes cadastros:&lt;br /&gt;
&lt;br /&gt;
= Categoria do Item =&lt;br /&gt;
&lt;br /&gt;
A categoria do item tem a finalidade de organizar e agrupar os itens de acordo com suas categorias. Mutias vezes a categoria é o corredor em que as mercadorias são agrupadas, como &amp;quot;Bazar&amp;quot;, &amp;quot;Açougue&amp;quot;, &amp;quot;Produtos de Limpeza&amp;quot;, etc. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Estrutura Hierárquica:&#039;&#039;&#039; As categorias são uma estrutura hierárquica, isto é, permite que uma categoria seja adiciona dentro da outra.&lt;br /&gt;
** &#039;&#039;&#039;Nomes Únicos &#039;por Pai&#039;:&#039;&#039;&#039; Os nomes das categorias são únicos dentro do mesmo pai. Em outras palavras, os nomes das categorias só podem se repetir se estiverem em pontos diferentes da estrutura hierárquica.&lt;br /&gt;
** &#039;&#039;&#039;Permite Itens:&#039;&#039;&#039; Esta opção define se os itens podem ser alocados nesta categoria ou não. Quando a opção estiver desmarcada nenhum código de item deverá ser definido nesta categoria. Esta função permite que um determinado tipo de item possa ser alocado nesta categoria, mas força que os itens tenham que ser alocados nas subcategorias.&lt;br /&gt;
** &#039;&#039;&#039;Congelamento de Preços:&#039;&#039;&#039; Este atributo define se os preços dos itens nesta categoria devem permanecer congelados quando forem editados ou houver uma entrada de NFe.&lt;br /&gt;
** &#039;&#039;&#039;Arredondamento de Preços:&#039;&#039;&#039; Permite definir uma regra de arredondamento dos preços de venda de todos os itens que estão nesta categoria. Uma vez definida, nenhum item deverá ter um preço diferente do arredondamento definido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Validar a estrutura de uso por Itens e Tipo de Itens quando a categoria pai for alterada.&#039;&#039;&#039; - A categoria pai de uma categoria não pode ser alterada se algum item estiver associado à ela ou à alguma subcategoria enquanto que o seu tipo de item aponta para a categoria pai. Em outras palavras, caso ao alterar a categoria de posição na hierarquia se não invalidará as condições do tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Hierarquia Cíclica.&#039;&#039;&#039; - Garantir que durante a atualização uma categoria não passa a apontar &amp;quot;como pai&amp;quot; uma categoria que está abaixo dela na hierarquia, criando um relacionamento cíclico.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se temos exatamente 1 ItemCategoryCompanyVO por Empresa&#039;&#039;&#039; - Validar se o temos exatamente 1 definição de dados por empresa. Não devemos ter nem duplicadas, nem faltando. (BUG: 270)&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Categoria de Item Sendo Usado Por Código do Item, Tipo do Item ou outra Categoria de Item&#039;&#039;&#039; - Antes de excluir uma categoria é preciso confirmar se ela não está em uso por outro objeto. Ela pode estar em uso por um código de item (verificar se o Item está ativo), ser referenciada pelo Tipo de Item (também verificar se o mesmo está ativo) ou ser pai de outra categoria (que também precisa verificar se ainda esta ativa). Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Markup, Congelamento de Preços e Arredondamento de Preços são Obrigatórios quando a Categoria permite que itens sejam adicionados.&#039;&#039;&#039; - Validar se estão preenchidos quando a categoria permitir itens, validar se estão nulos quando a categoria não permitir itens. Quando a categoria não permitir itens, o campo MarkUp Mínimo também deve ser nulo.&lt;br /&gt;
&lt;br /&gt;
= Tipo do Item =&lt;br /&gt;
&lt;br /&gt;
O tipo do item tem a finalidade de agrupar todos os itens de um mesmo tipo. Entende-se por tipo de produto &amp;quot;o que o produto é&amp;quot;, por exemplo: Refrigerante, Água, Suco, Pasta de Dente, Pão de Queijo, etc. Não faz parte do tipo a marca, embalagem, quantidades etc. Marca, quantidade, códigos, preços, etc. são parte do cadastro do Iten e não do tipo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo do Item:&#039;&#039;&#039; O nome do tipo de item é usado para identificar o cadastro. Deve ser único.&lt;br /&gt;
** &#039;&#039;&#039;Prefixo:&#039;&#039;&#039; O prefixo é um &amp;quot;começo&amp;quot; da descrição, que será usada em todos os itens desse mesmo tipo. Ao forçar que todos os itens comecem com o mesmo prefixo ajuda na organização do cadastro do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;Descrição de Exemplo: &#039;&#039;&#039; Cada tipo de item deve ter um espaço para orientar o usuário sobre quais as informações importantes para aquele tipo de produto, além de definir a ordem em que devem aparecer.&lt;br /&gt;
** &#039;&#039;&#039;Associação com Aliquota ICMS:&#039;&#039;&#039; No tipo do item devemos definir qual a alíquota de tributação do ICMS que deverá ser utilizada em todos os itens desse tipo. Centralizando e simplificando as configurações.&lt;br /&gt;
** &#039;&#039;&#039;Associação com As categorias:&#039;&#039;&#039; Cada tipo de item deve associar no mínimo uma categoria de itens. Cada item deste tipo deverá associar seus códigos nessas categorias ou suas subcategorias. O tipo de item pode permitir associação com mais de um &amp;quot;nó&amp;quot; da hierarquia da categoria. Permitindo assim que itens do mesmo tipo possam ser lançados em categorias diferentes. Como por exemplo um refrigerante com um código lançado na categoria de &amp;quot;Geladeiras/Loja&amp;quot; e outro código em &amp;quot;Restaurante/SelfService&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Categoria em Uso por Itens continua Disponível&#039;&#039;&#039; - Quando um tipo de item é alterado, é preciso validar se os itens desse tipo atualmente cadastrados não ficarão inválidos caso a categoria não esteja mais associada ao tipo de item. Ou seja, quando um item associado a esse tipo de item já estiver utilizando determinada categoria ela não pode ser excluída do tipo de item. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Alteração do Prefixo reflete nos itens existentes&#039;&#039;&#039; - Caso o prefixo seja alterado, todos os itens deste tipo de item devem ter seu nome atualizado de acordo com o novo prefixo. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Verifica Definições de Impostos para cada empresa&#039;&#039;&#039; - Verifica a definição dos impostos para cada empresa existente.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Tipo e Alíquota no ECF igual à Alíquota Efetiva&#039;&#039;&#039; - Verifica se o tipo do ICMS definido no tipo de item e a alíquota efetiva do do cálculo é coerente com os valores cadastrados no objeto ICMSVO, usado no momento de venda do ECF.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Natureza da Receita e Tabela são obrigatórios para os CSTs 02, 03, 04, 05, 06, 07, 08 e 09&#039;&#039;&#039; - Para todos esses CSTs, os campos de Natureza da Receita e Tabela ser validado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Verificar se a tabela é valida para o CST de Saída informado&#039;&#039;&#039; - Quando a tabela é informada, ela deve ser coerente com o código do CST de saída informado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Verificar se o Natureza é válida para a Tabela informada&#039;&#039;&#039; - Ao informar um código da Natureza da Receita o BIS deve verificar se o código da Receita é válido para a tabela sendo usada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Tipo de Item Sendo Usado no Momento&#039;&#039;&#039; - Antes de excluir o tipo de item é preciso verificar se ele não está em uso no momento. Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
&lt;br /&gt;
= ICMS =&lt;br /&gt;
&lt;br /&gt;
O objeto ICMS é a definição das alíquotas de ICMS utilizadas pelos Itens/Tipo de Itens. As alíquotas devem ser cadastradas conforme as alíquotas que a empresa utiliza.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo de Alíquota&#039;&#039;&#039; - As alíquotas podem ser de 3 tipos diferentes: Isento, Substituição e Tributada.&lt;br /&gt;
** &#039;&#039;&#039;Alíquota&#039;&#039;&#039; - A alíquota é a percentagem usado para calcular o valor do tributo. A alíquota quando definida é um valor positivo.&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - As alíquotas devem ter um nome que facilite a identificação da alíquota para o usuário. Este nome deve ser único.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Definição Obrigatória da Alíquota quando o tipo for Tributado&#039;&#039;&#039; - A definição da alíquota é obrigatória sempre que o tipo for Tributada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Não definição da Alíquota para os tipos Isento e Substituição.&#039;&#039;&#039; - Para os tipos Isento e Substituição o valor da alíquota devem estar nulos.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Em uso por algum tipo de item&#039;&#039;&#039; - durante a tentativa de exclusão, verificar se o ICMS não está em uso atualmente por algum Tipo de Item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ItemCodeGroup =&lt;br /&gt;
&lt;br /&gt;
O Grupo de Código de Item tem a finalidade de agrupar diferentes códigos de itens e fazer com que SEMPRE tenham o mesmo preço de venda. Independente de custo, categorias markups, arredondamentos, etc. Uma vez que um preço de venda de um item for alterado, os demais vão segui-lo fielmente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - Tudo grupo de código deve ter um nome para facilitar a identificação dos itens que fazem parte do grupo.&lt;br /&gt;
** &#039;&#039;&#039;Lista de Còdigos&#039;&#039;&#039; - Dentro de um mesmo grupo podem ser associados 0+ códigos de itens. Códigos de um mesmo item podem fazer parte do mesmo grupo.&lt;br /&gt;
** &#039;&#039;&#039;Sempre o mesmo preço de venda&#039;&#039;&#039; - Independente das diferentes configurações que um código de item pode ter dentro do mesmo grupo, como diferentes categorias, MarkUps, Custos, definições de arredondamento, package ratios, etc.. O preço de venda de todos os itens do grupo devem ter exatamente o mesmo valor. Mesmo que para isso tenha que desrespeitar qualquer outra regra do sistema (como arredondamento, ou cálculo de package, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Códigos de Itens já associados a outros grupos&#039;&#039;&#039; - Durante a inserção ou atualização, um grupo não deve permitir que um código de item já associado à outro grupo seja associado a este. Em outras palavras, um código de item não pode estar associado em mais de um grupo ao mesmo tempo.&lt;br /&gt;
&lt;br /&gt;
= Item = &lt;br /&gt;
&lt;br /&gt;
A entidade Item representa um produto qualquer da empresa. Esse produto por ser um insumo, uma matéria prima ou um produto de venda (ou revenda).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Fixação do prefixo da descrição de acordo com o tipo do Item&#039;&#039;&#039; - Todo item deve ser de algum &#039;&#039;Tipo de Item&#039;&#039;. Uma vez que o tipo de item esteja definido, a descrição do item obrigatoriamente deve começar com o valor do &#039;&#039;Prefixo&#039;&#039; definido no &#039;&#039;Tipo de Item&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Obrigatoriedade da Marca ou da Descrição&#039;&#039;&#039; - Todo item deve ter preenchidos no mínimo um dos campos &#039;&#039;Marca&#039;&#039; ou &#039;&#039;Descrição&#039;&#039;. Mesmo para produtos de fabricação própria, é recomendável definir a marca da empresa por questões de organização dos itens. Caso nenhum dos dois seja preenchido a descrição pode acabar sendo apenas o &#039;&#039;Prefixo&#039;&#039; do &#039;&#039;Tipo de Item&#039;&#039;. Para Itens &amp;quot;genéricos&amp;quot;, cuja marca não importa, pois em cada momento uma marca diferente é comprada ou usada, a marca não é necessária, mas uma descrição sim.&lt;br /&gt;
** &#039;&#039;&#039;Dimensão e Unidade de Medida Padrão&#039;&#039;&#039; - Todo item tem uma dimensão (Massa, Unidades, Volume, Cumprimento, etc.) e uma unidade de medida (Kg, Unidades, Litros, Metros, etc.) a que se refere o item. Essa unidade ajuda identifica a unidade de quantização padrão desse item. A unidade em que por padrão esse item é comprado, vendido e movimentado. Outras unidades diferentes para movimentar o mesmo item podem ser definidas em códigos diferentes.&lt;br /&gt;
** &#039;&#039;&#039;Custo&#039;&#039;&#039; - Todo Item tem um custo único padrão. Esse custo é sempre o mesmo, independente da empresa.&lt;br /&gt;
** &#039;&#039;&#039;Códigos dos Itens:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Múltiplos Códigos&#039;&#039;&#039; - Cada item pode ter mais que um código definido, ou seja, uma lista de códigos. Códigos são a maneira definir um modo quantidade, preço de venda, pacote, etc. de um determinado Item. Normalmente tem uma identificação única (e normalmente numérica, embora não obrigatória) para ser referenciada em terminais, notas, códigos de barras, etc. No entanto a identificação única não deve ser obrigatória. Um item pode ter um código para definir uma determinada quantidade de movimentação de entrada ou saída, ou simplesmente para definir uma nova unidade de medida. Por exemplo, produtos identificados hora por Kilos hora por Unidades.&lt;br /&gt;
*** &#039;&#039;&#039;Categoria do Item&#039;&#039;&#039; - De acordo com o &#039;&#039;Tipo de Item&#039;&#039; definido no Item, cada código do item deverá ser alocado em uma das categorias definidas no &#039;&#039;Tipo de Item&#039;&#039;. Apesar de ser o mesmo código, cada um pode gerar venda em uma categoria diferente, ou utilizar o MarkUp diferentes de acordo com o definido em cada categoria.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Validar requisito de Obrigatoriedade entre Marca e Descrição&#039;&#039;&#039; - Um dos campos deve sempre ser preenchido.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Validar inconsistência entre Fabricação do Produto e Origem do Item&#039;&#039;&#039; - Se o produto for de fabricação própria, ele não pode ter uma das opções de importado definida em Origem do Item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Validar finalidade do item&#039;&#039;&#039; - Todo item deve ter no mínimo 1 finalidade definida em seu cadastro.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Preenchimento completo dos pesos e volumes das embalagens&#039;&#039;&#039; - Se algum campo for preenchido, ele deve ser preenchido por completo! Por exemplo, se o &amp;quot;Peso Drenado&amp;quot; for definido, obrigatoriamente sua unidade de medida deve ser preenchida, o mesmo para o caso contrário: se a unidade for definida, a quantidade também deverá ser!&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Não permite que um Item tenha dois códigos iguais definidos&#039;&#039;&#039; - Validar se o código sendo inserido/alterado não tem definido duas vezes o mesmo código.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Os códigos de item só podem ser associados às categorias definidas no tipo de item&#039;&#039;&#039; - Validar se a categoria enviada no ItemCodeVO é uma das categorias disponibilizadas no ItemTypeVO associado ao ItemVO. Os códigos ficam limitados a usarem apenas as categorias permitidas de acordo com o tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se a Categoria do Item permite a associação dos itens&#039;&#039;&#039; - Os códigos de itens não podem ser associados às categorias que não permitem a associação de itens.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Validar Finalidade do Item&#039;&#039;&#039; - O campo de finalidade não pode ter alguns alguns valores de acordo os valores definidos nos outros campos, conforme as seguintes regras:&lt;br /&gt;
*** &#039;&#039;&#039;Revenda:&#039;&#039;&#039; Não pode ser definido quando o produto for de &#039;&#039;&#039;Fabricação Própria&#039;&#039;&#039;.&lt;br /&gt;
*** &#039;&#039;&#039;Produto Acabado:&#039;&#039;&#039; Não pode ser definido quando o produto for &#039;&#039;&#039;Produzido por Terceiros&#039;&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;[ve0009] Valida Item Próprio em Tipo de Substituição&#039;&#039;&#039; - Valida se o Item é de produção própria e está em um tipo de item com a tributação de ICMS definida como Substituição Tributária.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Descrição do Item&#039;&#039;&#039; - Valida se a descrição do item é única entre os itens ativos no momento.&lt;br /&gt;
** &#039;&#039;&#039;[ve0011] Itens de Revenda não podem ser Descartáveis&#039;&#039;&#039; - Valida se o item tiver o propósito como revenda, não permite que seja do tipo descartável.&lt;br /&gt;
&lt;br /&gt;
== Pacotes / Equivalência de Unidades ==&lt;br /&gt;
&lt;br /&gt;
Um único item (&amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;) do sistema pode ter diversos código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), chamados de pacotes. A ideia de pacotes é que o mesmo item possa ser vendidos em proporções ou embalagens diferentes, por exemplo, mini-coxinhas podem ser vendidas ao centro, por unidade, por quilo ou empacotadas em bandeijas.&lt;br /&gt;
&lt;br /&gt;
Para resolver essa questão o item apresenta uma &#039;&#039;&#039;Régua de Equivalência&#039;&#039;&#039;, que estabelece a relação de proporção de quantidades entre as diferentes gandezas. Por exemplo, define-se que a 1Und tem 30g e que 1 Bandeija tem 30 unidades. Deste ponto em diante o sistema saberá vender o item em bandeijas, unidades (e suas variações como pares, dúzias, etc.) ou quilo (e suas variações como gramas, toneladas, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Embora um item possa trabalhar com diferentes sistemas de unidades de medidas, uma unidade de medida principal e imutável é atribuída ao item. Esta unidade é a utilizada pelo sistema para concentrar as quantidades de estoque, relatórios de quantidade de vendas, etc.. Deve ser a unidade de medida que a empresa costuma utilizar no seu dia a dia para contabilizar os itens. Muitas vezes é considerada a menor unidade divísivel do item para evitar trabalhar com frações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão ===&lt;br /&gt;
&lt;br /&gt;
Um conceito presa ser definido neste ponto: para efeitos de cálculo, criamos o &#039;&#039;&#039;Fator de Conversão de Quantidade&#039;&#039;&#039; ou &#039;&#039;&#039;fatorCQ&#039;&#039;&#039;. Esse fator indica o multiplicador necessário para transformar a quantidade de uma unidade de um código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;) em uma unidade principal do item (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;). Esse fator é obetido a partir da seguinte equação verdade:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;1 (Unidade de qtdeItemVO) = fatorCQ * 1 (unidade de qtdeItemCodeVO)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assim, o valor de &#039;&#039;&#039;fatorCQ&#039;&#039;&#039; é definido da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;fatorCQ = &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definição do Preço de Venda ==&lt;br /&gt;
&lt;br /&gt;
Há vários fatores sobre a lógica de calcular definir um novo preço de venda. Como as políticas de arredondamento, congelamento de preço, replicação do preço para outros códigos do mesmo grupo, a movimentação de novos preços para histórico, etc.&lt;br /&gt;
&lt;br /&gt;
A ordem das operações lógicas a serem aplicadas sobre o ItemPriceVO devem ser conforme a ordem dos métodos listados abaixo. Cada método executa a operação a partir de um determinado ponto. Isso permite que diferentes eventos que causam a alteração do preço de venda possam acionar o ciclo a partir de diferentes pontos.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Define um Novo preço de Venda para um Código&#039;&#039;&#039; - O início do processo. Quando um novo preço de venda deve ser definido em um código de item. Este passo utiliza o valor recebido as as definições do próprio ItemCode para realizar toda a sequência lógica do preço de venda.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Definition()&#039;&#039;&#039; - Método responsável por carregar as informações do ItemCodeVO e iniciar o processo definição do novo preço de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicar Regras de Arredondamento&#039;&#039;&#039; - Dependendo das configurações da Categoria do Item definida no Código do Item, o preço precisará ser arredondado para respeitar essas políticas.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_RoundApply()&#039;&#039;&#039; - Este método recebe o valor do novo preço e a política de arredondamento para aplicar as regras de arredondamento. Uma vez aplicado os arredondamentos o valor será passado para o próximo método da cadeia (o &#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;) para a efetivação em todos os grupos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Aplicação da Política|Para centralizar o código de aplicação da política, a efetiva aplicação do arredondamento fica na classe utilitária &#039;&#039;&#039;ItemUtils&#039;&#039;&#039; no método &#039;&#039;&#039;applyRoundPricePolicy()&#039;&#039;&#039;. Podendo ser acessado de qualquer ponto, como classes da UI.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Disseminação do Preço de Venda pelo Grupo&#039;&#039;&#039; - Caso o &#039;&#039;ItemCode&#039;&#039; cujo preço de venda esteja sendo alterado faça parte de um grupo, este preço de venda deverá ser disseminado para todos os &#039;&#039;ItemCode&#039;&#039; do Grupo.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;&#039; - Avalia se o &#039;&#039;ItemCode&#039;&#039; cujo preço deve ser alterado faz parte de um grupo. Caso faça ele pesquisa todos os itens do grupo e chama o método &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; todos os envolvidos. Este método não faz qualquer processamento no valor, apenas verifica os códigos envolvidos no grupo e aplica o valor, congelado ou não conforme informado via parâmetros). O valor será aplicado a todos do grupo conforme recebido, &amp;quot;passando por cima&amp;quot; das configurações de arredondamento e políticas de congelamento de cada código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicação do Preço de Venda ao Objeto&#039;&#039;&#039; - Caso haja real alteração no ItemPriceVO uma cópia deve ser convertida para o ItemPriceHistoryVO e persistida. Por fim atualizar o ItemPriceVO na base de dados.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; - Método responsável por atualizar as definições sobre o preço de venda (ItemPriceVO) de um &#039;&#039;Código de Item&#039;&#039;. Este método recebe o novo valor, se o preço estará congelado, e outros atributos para identificação do ItemPriceVO correto (dependendo da assinatura). De acordo com os valores passados, este método avalia se haverá alteração das informações atuais, cria um novo objeto para o histórico de preços (ItemPriceHistoryVO) e salva os dados atuais. Em seguida faz as alterações necessárias ao ItemPriceVO e já o persiste no banco.&lt;br /&gt;
*: &#039;&#039;&#039;Este é (e deve continuar sendo) o único método que fará a atualização do ItemPriceVO no banco de dados!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eventos de Alteração do Preço de Venda ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cadastro/Alteração de Itens&#039;&#039;&#039; - Quando um item é cadastrado ou alterado ele tem definições de códigos e consequentemente de preços de vendas. Neste caso avaliamos as seguintes condições para cada código:&lt;br /&gt;
** &#039;&#039;&#039;Não tem um grupo associado&#039;&#039;&#039; - Se não tem um grupo adicionado, temos que definir e processar o preço completamente. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tem um grupo associado:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos definir novos valores para o código e para o grupo&#039;&#039;&#039; - Se devemos associar novos valores para este novo código e para o grupo em que ele vai entrar, processamos o valor deste código completamente, e como a associação ao grupo é feita antes da definição dos preços, a lógica do updateItemPrice fará a disseminação deste valor nos outros códigos do grupo quando chegar no passo &#039;&#039;_GroupDisseminate()&#039;&#039;. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos copiar o valor atual sendo praticado no grupo&#039;&#039;&#039; - Neste caso vamos buscar o valor de qualquer código do grupo (afinal devem ser todos iguais) e copiamos seus valores. Tanto o valor praticado, quanto um eventual valor que esteja congelado. Chama o &#039;&#039;&#039;_Apply()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Descongelar o Preço de Venda&#039;&#039;&#039; - Descongelar significa efetivar o preço que está congelado como o preço praticado para venda. Para evitar qualquer reprocessamento no valor, mas ainda assim garantir que o novo valor efetivo de venda será definido em todos os códigos do mesmo grupo este método chama o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Descartar Preço Congelado&#039;&#039;&#039; - Quando não queremos que o preço congelado entre em vigor podemos simplesmente descartar o preço congelado, e manter o código com o mesmo preço que já tinha. Neste caso queremos que todos os códigos do mesmo grupo descartem seu preço congelado e que continuem mantendo o preço já praticado. Para evitar o processamento dos valores mas ainda realizar a operação em todos os códigos do grupo chamamos o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:updateItemPriceFlow.png|frame|center|Diagrama do fluxo da lógica de alteração do preço de venda de um Código de Item. E entrada dos eventos que causam essas alterações.]]&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1662</id>
		<title>Módulo Item</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1662"/>
		<updated>2025-11-19T22:58:24Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Definição do Preço de Venda */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo &#039;&#039;&#039;Item&#039;&#039;&#039; é o módulo responsável por cadastrar os itens de consumo, produtos de revenda, fabricação própria para venda ou consumo, etc. Este módulo oferecerá um cadastro com controle de preços, markups, custos, entre outras funcionalidades que servirão de suporte para diversos outros módulos, como PDV, Controle de Estoques, Base de Custos para Planilhas de Cálculos, etc.&lt;br /&gt;
&lt;br /&gt;
Para oferecer todo o conceito o módulo é dividido nos seguintes cadastros:&lt;br /&gt;
&lt;br /&gt;
= Categoria do Item =&lt;br /&gt;
&lt;br /&gt;
A categoria do item tem a finalidade de organizar e agrupar os itens de acordo com suas categorias. Mutias vezes a categoria é o corredor em que as mercadorias são agrupadas, como &amp;quot;Bazar&amp;quot;, &amp;quot;Açougue&amp;quot;, &amp;quot;Produtos de Limpeza&amp;quot;, etc. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Estrutura Hierárquica:&#039;&#039;&#039; As categorias são uma estrutura hierárquica, isto é, permite que uma categoria seja adiciona dentro da outra.&lt;br /&gt;
** &#039;&#039;&#039;Nomes Únicos &#039;por Pai&#039;:&#039;&#039;&#039; Os nomes das categorias são únicos dentro do mesmo pai. Em outras palavras, os nomes das categorias só podem se repetir se estiverem em pontos diferentes da estrutura hierárquica.&lt;br /&gt;
** &#039;&#039;&#039;Permite Itens:&#039;&#039;&#039; Esta opção define se os itens podem ser alocados nesta categoria ou não. Quando a opção estiver desmarcada nenhum código de item deverá ser definido nesta categoria. Esta função permite que um determinado tipo de item possa ser alocado nesta categoria, mas força que os itens tenham que ser alocados nas subcategorias.&lt;br /&gt;
** &#039;&#039;&#039;Congelamento de Preços:&#039;&#039;&#039; Este atributo define se os preços dos itens nesta categoria devem permanecer congelados quando forem editados ou houver uma entrada de NFe.&lt;br /&gt;
** &#039;&#039;&#039;Arredondamento de Preços:&#039;&#039;&#039; Permite definir uma regra de arredondamento dos preços de venda de todos os itens que estão nesta categoria. Uma vez definida, nenhum item deverá ter um preço diferente do arredondamento definido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Validar a estrutura de uso por Itens e Tipo de Itens quando a categoria pai for alterada.&#039;&#039;&#039; - A categoria pai de uma categoria não pode ser alterada se algum item estiver associado à ela ou à alguma subcategoria enquanto que o seu tipo de item aponta para a categoria pai. Em outras palavras, caso ao alterar a categoria de posição na hierarquia se não invalidará as condições do tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Hierarquia Cíclica.&#039;&#039;&#039; - Garantir que durante a atualização uma categoria não passa a apontar &amp;quot;como pai&amp;quot; uma categoria que está abaixo dela na hierarquia, criando um relacionamento cíclico.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se temos exatamente 1 ItemCategoryCompanyVO por Empresa&#039;&#039;&#039; - Validar se o temos exatamente 1 definição de dados por empresa. Não devemos ter nem duplicadas, nem faltando. (BUG: 270)&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Categoria de Item Sendo Usado Por Código do Item, Tipo do Item ou outra Categoria de Item&#039;&#039;&#039; - Antes de excluir uma categoria é preciso confirmar se ela não está em uso por outro objeto. Ela pode estar em uso por um código de item (verificar se o Item está ativo), ser referenciada pelo Tipo de Item (também verificar se o mesmo está ativo) ou ser pai de outra categoria (que também precisa verificar se ainda esta ativa). Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Markup, Congelamento de Preços e Arredondamento de Preços são Obrigatórios quando a Categoria permite que itens sejam adicionados.&#039;&#039;&#039; - Validar se estão preenchidos quando a categoria permitir itens, validar se estão nulos quando a categoria não permitir itens. Quando a categoria não permitir itens, o campo MarkUp Mínimo também deve ser nulo.&lt;br /&gt;
&lt;br /&gt;
= Tipo do Item =&lt;br /&gt;
&lt;br /&gt;
O tipo do item tem a finalidade de agrupar todos os itens de um mesmo tipo. Entende-se por tipo de produto &amp;quot;o que o produto é&amp;quot;, por exemplo: Refrigerante, Água, Suco, Pasta de Dente, Pão de Queijo, etc. Não faz parte do tipo a marca, embalagem, quantidades etc. Marca, quantidade, códigos, preços, etc. são parte do cadastro do Iten e não do tipo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo do Item:&#039;&#039;&#039; O nome do tipo de item é usado para identificar o cadastro. Deve ser único.&lt;br /&gt;
** &#039;&#039;&#039;Prefixo:&#039;&#039;&#039; O prefixo é um &amp;quot;começo&amp;quot; da descrição, que será usada em todos os itens desse mesmo tipo. Ao forçar que todos os itens comecem com o mesmo prefixo ajuda na organização do cadastro do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;Descrição de Exemplo: &#039;&#039;&#039; Cada tipo de item deve ter um espaço para orientar o usuário sobre quais as informações importantes para aquele tipo de produto, além de definir a ordem em que devem aparecer.&lt;br /&gt;
** &#039;&#039;&#039;Associação com Aliquota ICMS:&#039;&#039;&#039; No tipo do item devemos definir qual a alíquota de tributação do ICMS que deverá ser utilizada em todos os itens desse tipo. Centralizando e simplificando as configurações.&lt;br /&gt;
** &#039;&#039;&#039;Associação com As categorias:&#039;&#039;&#039; Cada tipo de item deve associar no mínimo uma categoria de itens. Cada item deste tipo deverá associar seus códigos nessas categorias ou suas subcategorias. O tipo de item pode permitir associação com mais de um &amp;quot;nó&amp;quot; da hierarquia da categoria. Permitindo assim que itens do mesmo tipo possam ser lançados em categorias diferentes. Como por exemplo um refrigerante com um código lançado na categoria de &amp;quot;Geladeiras/Loja&amp;quot; e outro código em &amp;quot;Restaurante/SelfService&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Categoria em Uso por Itens continua Disponível&#039;&#039;&#039; - Quando um tipo de item é alterado, é preciso validar se os itens desse tipo atualmente cadastrados não ficarão inválidos caso a categoria não esteja mais associada ao tipo de item. Ou seja, quando um item associado a esse tipo de item já estiver utilizando determinada categoria ela não pode ser excluída do tipo de item. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Alteração do Prefixo reflete nos itens existentes&#039;&#039;&#039; - Caso o prefixo seja alterado, todos os itens deste tipo de item devem ter seu nome atualizado de acordo com o novo prefixo. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Verifica Definições de Impostos para cada empresa&#039;&#039;&#039; - Verifica a definição dos impostos para cada empresa existente.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Tipo e Alíquota no ECF igual à Alíquota Efetiva&#039;&#039;&#039; - Verifica se o tipo do ICMS definido no tipo de item e a alíquota efetiva do do cálculo é coerente com os valores cadastrados no objeto ICMSVO, usado no momento de venda do ECF.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Natureza da Receita e Tabela são obrigatórios para os CSTs 02, 03, 04, 05, 06, 07, 08 e 09&#039;&#039;&#039; - Para todos esses CSTs, os campos de Natureza da Receita e Tabela ser validado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Verificar se a tabela é valida para o CST de Saída informado&#039;&#039;&#039; - Quando a tabela é informada, ela deve ser coerente com o código do CST de saída informado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Verificar se o Natureza é válida para a Tabela informada&#039;&#039;&#039; - Ao informar um código da Natureza da Receita o BIS deve verificar se o código da Receita é válido para a tabela sendo usada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Tipo de Item Sendo Usado no Momento&#039;&#039;&#039; - Antes de excluir o tipo de item é preciso verificar se ele não está em uso no momento. Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
&lt;br /&gt;
= ICMS =&lt;br /&gt;
&lt;br /&gt;
O objeto ICMS é a definição das alíquotas de ICMS utilizadas pelos Itens/Tipo de Itens. As alíquotas devem ser cadastradas conforme as alíquotas que a empresa utiliza.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo de Alíquota&#039;&#039;&#039; - As alíquotas podem ser de 3 tipos diferentes: Isento, Substituição e Tributada.&lt;br /&gt;
** &#039;&#039;&#039;Alíquota&#039;&#039;&#039; - A alíquota é a percentagem usado para calcular o valor do tributo. A alíquota quando definida é um valor positivo.&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - As alíquotas devem ter um nome que facilite a identificação da alíquota para o usuário. Este nome deve ser único.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Definição Obrigatória da Alíquota quando o tipo for Tributado&#039;&#039;&#039; - A definição da alíquota é obrigatória sempre que o tipo for Tributada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Não definição da Alíquota para os tipos Isento e Substituição.&#039;&#039;&#039; - Para os tipos Isento e Substituição o valor da alíquota devem estar nulos.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Em uso por algum tipo de item&#039;&#039;&#039; - durante a tentativa de exclusão, verificar se o ICMS não está em uso atualmente por algum Tipo de Item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ItemCodeGroup =&lt;br /&gt;
&lt;br /&gt;
O Grupo de Código de Item tem a finalidade de agrupar diferentes códigos de itens e fazer com que SEMPRE tenham o mesmo preço de venda. Independente de custo, categorias markups, arredondamentos, etc. Uma vez que um preço de venda de um item for alterado, os demais vão segui-lo fielmente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - Tudo grupo de código deve ter um nome para facilitar a identificação dos itens que fazem parte do grupo.&lt;br /&gt;
** &#039;&#039;&#039;Lista de Còdigos&#039;&#039;&#039; - Dentro de um mesmo grupo podem ser associados 0+ códigos de itens. Códigos de um mesmo item podem fazer parte do mesmo grupo.&lt;br /&gt;
** &#039;&#039;&#039;Sempre o mesmo preço de venda&#039;&#039;&#039; - Independente das diferentes configurações que um código de item pode ter dentro do mesmo grupo, como diferentes categorias, MarkUps, Custos, definições de arredondamento, package ratios, etc.. O preço de venda de todos os itens do grupo devem ter exatamente o mesmo valor. Mesmo que para isso tenha que desrespeitar qualquer outra regra do sistema (como arredondamento, ou cálculo de package, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Códigos de Itens já associados a outros grupos&#039;&#039;&#039; - Durante a inserção ou atualização, um grupo não deve permitir que um código de item já associado à outro grupo seja associado a este. Em outras palavras, um código de item não pode estar associado em mais de um grupo ao mesmo tempo.&lt;br /&gt;
&lt;br /&gt;
= Item = &lt;br /&gt;
&lt;br /&gt;
A entidade Item representa um produto qualquer da empresa. Esse produto por ser um insumo, uma matéria prima ou um produto de venda (ou revenda).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Fixação do prefixo da descrição de acordo com o tipo do Item&#039;&#039;&#039; - Todo item deve ser de algum &#039;&#039;Tipo de Item&#039;&#039;. Uma vez que o tipo de item esteja definido, a descrição do item obrigatoriamente deve começar com o valor do &#039;&#039;Prefixo&#039;&#039; definido no &#039;&#039;Tipo de Item&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Obrigatoriedade da Marca ou da Descrição&#039;&#039;&#039; - Todo item deve ter preenchidos no mínimo um dos campos &#039;&#039;Marca&#039;&#039; ou &#039;&#039;Descrição&#039;&#039;. Mesmo para produtos de fabricação própria, é recomendável definir a marca da empresa por questões de organização dos itens. Caso nenhum dos dois seja preenchido a descrição pode acabar sendo apenas o &#039;&#039;Prefixo&#039;&#039; do &#039;&#039;Tipo de Item&#039;&#039;. Para Itens &amp;quot;genéricos&amp;quot;, cuja marca não importa, pois em cada momento uma marca diferente é comprada ou usada, a marca não é necessária, mas uma descrição sim.&lt;br /&gt;
** &#039;&#039;&#039;Dimensão e Unidade de Medida Padrão&#039;&#039;&#039; - Todo item tem uma dimensão (Massa, Unidades, Volume, Cumprimento, etc.) e uma unidade de medida (Kg, Unidades, Litros, Metros, etc.) a que se refere o item. Essa unidade ajuda identifica a unidade de quantização padrão desse item. A unidade em que por padrão esse item é comprado, vendido e movimentado. Outras unidades diferentes para movimentar o mesmo item podem ser definidas em códigos diferentes.&lt;br /&gt;
** &#039;&#039;&#039;Custo&#039;&#039;&#039; - Todo Item tem um custo único padrão. Esse custo é sempre o mesmo, independente da empresa.&lt;br /&gt;
** &#039;&#039;&#039;Códigos dos Itens:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Múltiplos Códigos&#039;&#039;&#039; - Cada item pode ter mais que um código definido, ou seja, uma lista de códigos. Códigos são a maneira definir um modo quantidade, preço de venda, pacote, etc. de um determinado Item. Normalmente tem uma identificação única (e normalmente numérica, embora não obrigatória) para ser referenciada em terminais, notas, códigos de barras, etc. No entanto a identificação única não deve ser obrigatória. Um item pode ter um código para definir uma determinada quantidade de movimentação de entrada ou saída, ou simplesmente para definir uma nova unidade de medida. Por exemplo, produtos identificados hora por Kilos hora por Unidades.&lt;br /&gt;
*** &#039;&#039;&#039;Categoria do Item&#039;&#039;&#039; - De acordo com o &#039;&#039;Tipo de Item&#039;&#039; definido no Item, cada código do item deverá ser alocado em uma das categorias definidas no &#039;&#039;Tipo de Item&#039;&#039;. Apesar de ser o mesmo código, cada um pode gerar venda em uma categoria diferente, ou utilizar o MarkUp diferentes de acordo com o definido em cada categoria.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Validar requisito de Obrigatoriedade entre Marca e Descrição&#039;&#039;&#039; - Um dos campos deve sempre ser preenchido.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Validar inconsistência entre Fabricação do Produto e Origem do Item&#039;&#039;&#039; - Se o produto for de fabricação própria, ele não pode ter uma das opções de importado definida em Origem do Item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Validar finalidade do item&#039;&#039;&#039; - Todo item deve ter no mínimo 1 finalidade definida em seu cadastro.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Preenchimento completo dos pesos e volumes das embalagens&#039;&#039;&#039; - Se algum campo for preenchido, ele deve ser preenchido por completo! Por exemplo, se o &amp;quot;Peso Drenado&amp;quot; for definido, obrigatoriamente sua unidade de medida deve ser preenchida, o mesmo para o caso contrário: se a unidade for definida, a quantidade também deverá ser!&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Não permite que um Item tenha dois códigos iguais definidos&#039;&#039;&#039; - Validar se o código sendo inserido/alterado não tem definido duas vezes o mesmo código.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Os códigos de item só podem ser associados às categorias definidas no tipo de item&#039;&#039;&#039; - Validar se a categoria enviada no ItemCodeVO é uma das categorias disponibilizadas no ItemTypeVO associado ao ItemVO. Os códigos ficam limitados a usarem apenas as categorias permitidas de acordo com o tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se a Categoria do Item permite a associação dos itens&#039;&#039;&#039; - Os códigos de itens não podem ser associados às categorias que não permitem a associação de itens.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Validar Finalidade do Item&#039;&#039;&#039; - O campo de finalidade não pode ter alguns alguns valores de acordo os valores definidos nos outros campos, conforme as seguintes regras:&lt;br /&gt;
*** &#039;&#039;&#039;Revenda:&#039;&#039;&#039; Não pode ser definido quando o produto for de &#039;&#039;&#039;Fabricação Própria&#039;&#039;&#039;.&lt;br /&gt;
*** &#039;&#039;&#039;Produto Acabado:&#039;&#039;&#039; Não pode ser definido quando o produto for &#039;&#039;&#039;Produzido por Terceiros&#039;&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;[ve0009] Valida Item Próprio em Tipo de Substituição&#039;&#039;&#039; - Valida se o Item é de produção própria e está em um tipo de item com a tributação de ICMS definida como Substituição Tributária.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Descrição do Item&#039;&#039;&#039; - Valida se a descrição do item é única entre os itens ativos no momento.&lt;br /&gt;
** &#039;&#039;&#039;[ve0011] Itens de Revenda não podem ser Descartáveis&#039;&#039;&#039; - Valida se o item tiver o propósito como revenda, não permite que seja do tipo descartável.&lt;br /&gt;
&lt;br /&gt;
== Pacotes / Equivalência de Unidades ==&lt;br /&gt;
&lt;br /&gt;
Um único item (&amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;) do sistema pode ter diversos código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;), chamados de pacotes. A ideia de pacotes é que o mesmo item possa ser vendidos em proporções ou embalagens diferentes, por exemplo, mini-coxinhas podem ser vendidas ao centro, por unidade, por quilo ou empacotadas em bandeijas.&lt;br /&gt;
&lt;br /&gt;
Para resolver essa questão o item apresenta uma &#039;&#039;&#039;Régua de Equivalência&#039;&#039;&#039;, que estabelece a relação de proporção de quantidades entre as diferentes gandezas. Por exemplo, define-se que a 1Und tem 30g e que 1 Bandeija tem 30 unidades. Deste ponto em diante o sistema saberá vender o item em bandeijas, unidades (e suas variações como pares, dúzias, etc.) ou quilo (e suas variações como gramas, toneladas, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Embora um item possa trabalhar com diferentes sistemas de unidades de medidas, uma unidade de medida principal e imutável é atribuída ao item. Esta unidade é a utilizada pelo sistema para concentrar as quantidades de estoque, relatórios de quantidade de vendas, etc.. Deve ser a unidade de medida que a empresa costuma utilizar no seu dia a dia para contabilizar os itens. Muitas vezes é considerada a menor unidade divísivel do item para evitar trabalhar com frações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fator de Conversão ===&lt;br /&gt;
&lt;br /&gt;
Um conceito presa ser definido neste ponto: para efeitos de cálculo, criamos o &#039;&#039;&#039;Fator de Conversão de Quantidade&#039;&#039;&#039; ou &#039;&#039;&#039;fatorCQ&#039;&#039;&#039;. Esse fator indica o multiplicador necessário para transformar a quantidade de uma unidade de um código (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;) em uma unidade principal do item (&amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;). Esse fator é obetido a partir da seguinte equação verdade:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;qtdeItemVO = fatorCQ \times qtdeItemCodeVO&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;qtdeItemVO = fatorCQ \times qtdeItemCodeVO&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qtdeItemVO = fatorCQ \times qtdeItemCodeVO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definição do Preço de Venda ==&lt;br /&gt;
&lt;br /&gt;
Há vários fatores sobre a lógica de calcular definir um novo preço de venda. Como as políticas de arredondamento, congelamento de preço, replicação do preço para outros códigos do mesmo grupo, a movimentação de novos preços para histórico, etc.&lt;br /&gt;
&lt;br /&gt;
A ordem das operações lógicas a serem aplicadas sobre o ItemPriceVO devem ser conforme a ordem dos métodos listados abaixo. Cada método executa a operação a partir de um determinado ponto. Isso permite que diferentes eventos que causam a alteração do preço de venda possam acionar o ciclo a partir de diferentes pontos.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Define um Novo preço de Venda para um Código&#039;&#039;&#039; - O início do processo. Quando um novo preço de venda deve ser definido em um código de item. Este passo utiliza o valor recebido as as definições do próprio ItemCode para realizar toda a sequência lógica do preço de venda.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Definition()&#039;&#039;&#039; - Método responsável por carregar as informações do ItemCodeVO e iniciar o processo definição do novo preço de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicar Regras de Arredondamento&#039;&#039;&#039; - Dependendo das configurações da Categoria do Item definida no Código do Item, o preço precisará ser arredondado para respeitar essas políticas.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_RoundApply()&#039;&#039;&#039; - Este método recebe o valor do novo preço e a política de arredondamento para aplicar as regras de arredondamento. Uma vez aplicado os arredondamentos o valor será passado para o próximo método da cadeia (o &#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;) para a efetivação em todos os grupos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Aplicação da Política|Para centralizar o código de aplicação da política, a efetiva aplicação do arredondamento fica na classe utilitária &#039;&#039;&#039;ItemUtils&#039;&#039;&#039; no método &#039;&#039;&#039;applyRoundPricePolicy()&#039;&#039;&#039;. Podendo ser acessado de qualquer ponto, como classes da UI.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Disseminação do Preço de Venda pelo Grupo&#039;&#039;&#039; - Caso o &#039;&#039;ItemCode&#039;&#039; cujo preço de venda esteja sendo alterado faça parte de um grupo, este preço de venda deverá ser disseminado para todos os &#039;&#039;ItemCode&#039;&#039; do Grupo.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;&#039; - Avalia se o &#039;&#039;ItemCode&#039;&#039; cujo preço deve ser alterado faz parte de um grupo. Caso faça ele pesquisa todos os itens do grupo e chama o método &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; todos os envolvidos. Este método não faz qualquer processamento no valor, apenas verifica os códigos envolvidos no grupo e aplica o valor, congelado ou não conforme informado via parâmetros). O valor será aplicado a todos do grupo conforme recebido, &amp;quot;passando por cima&amp;quot; das configurações de arredondamento e políticas de congelamento de cada código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicação do Preço de Venda ao Objeto&#039;&#039;&#039; - Caso haja real alteração no ItemPriceVO uma cópia deve ser convertida para o ItemPriceHistoryVO e persistida. Por fim atualizar o ItemPriceVO na base de dados.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; - Método responsável por atualizar as definições sobre o preço de venda (ItemPriceVO) de um &#039;&#039;Código de Item&#039;&#039;. Este método recebe o novo valor, se o preço estará congelado, e outros atributos para identificação do ItemPriceVO correto (dependendo da assinatura). De acordo com os valores passados, este método avalia se haverá alteração das informações atuais, cria um novo objeto para o histórico de preços (ItemPriceHistoryVO) e salva os dados atuais. Em seguida faz as alterações necessárias ao ItemPriceVO e já o persiste no banco.&lt;br /&gt;
*: &#039;&#039;&#039;Este é (e deve continuar sendo) o único método que fará a atualização do ItemPriceVO no banco de dados!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eventos de Alteração do Preço de Venda ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cadastro/Alteração de Itens&#039;&#039;&#039; - Quando um item é cadastrado ou alterado ele tem definições de códigos e consequentemente de preços de vendas. Neste caso avaliamos as seguintes condições para cada código:&lt;br /&gt;
** &#039;&#039;&#039;Não tem um grupo associado&#039;&#039;&#039; - Se não tem um grupo adicionado, temos que definir e processar o preço completamente. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tem um grupo associado:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos definir novos valores para o código e para o grupo&#039;&#039;&#039; - Se devemos associar novos valores para este novo código e para o grupo em que ele vai entrar, processamos o valor deste código completamente, e como a associação ao grupo é feita antes da definição dos preços, a lógica do updateItemPrice fará a disseminação deste valor nos outros códigos do grupo quando chegar no passo &#039;&#039;_GroupDisseminate()&#039;&#039;. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos copiar o valor atual sendo praticado no grupo&#039;&#039;&#039; - Neste caso vamos buscar o valor de qualquer código do grupo (afinal devem ser todos iguais) e copiamos seus valores. Tanto o valor praticado, quanto um eventual valor que esteja congelado. Chama o &#039;&#039;&#039;_Apply()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Descongelar o Preço de Venda&#039;&#039;&#039; - Descongelar significa efetivar o preço que está congelado como o preço praticado para venda. Para evitar qualquer reprocessamento no valor, mas ainda assim garantir que o novo valor efetivo de venda será definido em todos os códigos do mesmo grupo este método chama o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Descartar Preço Congelado&#039;&#039;&#039; - Quando não queremos que o preço congelado entre em vigor podemos simplesmente descartar o preço congelado, e manter o código com o mesmo preço que já tinha. Neste caso queremos que todos os códigos do mesmo grupo descartem seu preço congelado e que continuem mantendo o preço já praticado. Para evitar o processamento dos valores mas ainda realizar a operação em todos os códigos do grupo chamamos o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:updateItemPriceFlow.png|frame|center|Diagrama do fluxo da lógica de alteração do preço de venda de um Código de Item. E entrada dos eventos que causam essas alterações.]]&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISPDV&amp;diff=1661</id>
		<title>BISPDV</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISPDV&amp;diff=1661"/>
		<updated>2025-11-19T22:33:22Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Items */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O BISPDV é a aplicação utilizada na frente de caixa para realização da venda ao consumidor e de outra funções pertinentes à venda e atendimento do cliente da loja.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Pendências, Informações e Guia sobre a implementação =&lt;br /&gt;
&lt;br /&gt;
* O projeto anterior (bis2.pdv) está sendo descontinuado por ainda ter código com suporte a ECF e SAT, que estão em caindo em desuso. Para rever e simplificar o código um novo projeto (bis.pdv) foi criado e o código está sendo revisado e repassado para o novo projeto. Uma vez concluído o projeto bis2.pdv será descontinuado.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alterações em andamento:&#039;&#039;&#039;&lt;br /&gt;
# Para agilidade, foi definido que não utilizaremos o RFWDAO, mas manter a arquitetura de DAO original.&lt;br /&gt;
# Removido código relacionados ao ECF e ao SAT, este novo projeto emitirá cupons apenas utilizando o NFCe, utilizando o código do módulo RFW.SEFAZ.&lt;br /&gt;
# O Bundle foi rebatizado para bispdvbundle.properties, e passou a utilizar as chaves BISPDV_NNNNNN. Todas as chaves antigas foram copiadas para o arquivo e ao fechamento da versão devem ser revisadas, e as sobreviventes renomeadas.&lt;br /&gt;
&lt;br /&gt;
= Inicialização do Sistema =&lt;br /&gt;
&lt;br /&gt;
[[Imagem:inicialização_pdvapp.png|center|Inicialização do Sistema]]&lt;br /&gt;
&lt;br /&gt;
A inicialização do aplicativo segue as seguintes regras:&lt;br /&gt;
&lt;br /&gt;
== PDVStarter ==&lt;br /&gt;
A aplicação deve ser inicializada sempre por esta classe que contém o método &#039;&#039;main()&#039;&#039;;&lt;br /&gt;
: Esta classe não faz absolutamente nada além de passar a chamada, incluindo os argumentos de linha de comando para a &#039;&#039;&#039;PDVUpdater&#039;&#039;&#039;. Sua existência tem a finalidade de permitir a incorporação de plugins, siffers, debugger e outras ferramentas na aplicação. Para isso, basta que a ferramenta implemente uma &#039;sósia&#039; desta classe (mesmo nome e package), e que sua bibliotexa (.jar) seja carregada no classpath antes dos .jars da própria aplicação. Após realizar o que for necessário a ferramenta deve repassar a chamada para &#039;&#039;&#039;PDVUpdater&#039;&#039;&#039; da mesma forma, para que a aplicação se inicie em seu fluxo normal.&lt;br /&gt;
&lt;br /&gt;
== PDVUpdater ==&lt;br /&gt;
&lt;br /&gt;
Esta classe que concentra as tarefas de inicialização da aplicação recebe os seguintes parâmetros:&lt;br /&gt;
* &#039;&#039;&#039;-help&#039;&#039;&#039; - Exibe este menu de opções.&lt;br /&gt;
* &#039;&#039;&#039;-testDarumaFW&#039;&#039;&#039; - Não inicializa a aplicacao. Tenta apenas inicializar as bibliotecas da DarumaDramework, verificando se as DLLs estão OK. Não faz comunicação com a impressora.&lt;br /&gt;
* &#039;&#039;&#039;-watcher&#039;&#039;&#039; - Habilita uma thread que imprime o valor de algumas variáveis do sistema a cada segundo no console do sistema.&lt;br /&gt;
* &#039;&#039;&#039;-autoSaleTest&#039;&#039;&#039; - Carrega um arquivo de vendas automáticas. Esse arquivo deve conter o que deve ser vendido, e as vendas serão feitas automaticamente no horário programado.&lt;br /&gt;
* &#039;&#039;&#039;-noUI&#039;&#039;&#039; - Não inicializa a UI do PDVApp. Útil quando estamos utilizando o -saleFile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Valida se é a única instância tentando bloquear o arquivo &#039;&#039;&#039;.\\instance.lock&#039;&#039;&#039; no diretório da aplicação.&lt;br /&gt;
&lt;br /&gt;
== PDVApp ==&lt;br /&gt;
&lt;br /&gt;
O &#039;&#039;&#039;PDVApp&#039;&#039;&#039; é o coração da aplicação. Funciona com uma série de máquinas de estado (workflows) que definem a lógica da operação da aplicação.&lt;br /&gt;
&lt;br /&gt;
= Workflows do Sistema =&lt;br /&gt;
== Principal: &#039;&#039;&#039;PDVState&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:workflow_pdvstate.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esse é o WORKFLOW geral da aplicação, é definida nos valores da enum &#039;&#039;&#039;PDVState&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;START&#039;&#039;&#039; - Valor inicial, utilizado somente na inicialização da aplicação.&lt;br /&gt;
*: Neste passo é iniciado o workflow &#039;&#039;&#039;StartCheckStatus&#039;&#039;&#039;, enquanto esse workflow secundário é executado, o PDVState é passado para o estado &#039;&#039;&#039;STARTCHECK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STARTCHECK&#039;&#039;&#039; - Estado enquanto a checagem inicial do sistema ocorre;&lt;br /&gt;
*: Se a checagem inicial finalizar com sucesso vai para o estado &#039;&#039;&#039;WAITINGLOGIN&#039;&#039;&#039;, em caso de erro vai para o &#039;&#039;&#039;STARTCHECK_FAIL&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STARTCHECK_FAIL&#039;&#039;&#039; - indicador de que o processo de checagem inicial terminou com erro.&lt;br /&gt;
*: Não há saída desse estado, a não ser reiniciar ou refazer a instalação do PDVApp.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WAITINGLOGIN&#039;&#039;&#039; - Sinaliza que o sistema está aguradando o login.&lt;br /&gt;
*: Fica nesse estado até que o PDVUI interaja com o usuário para executar o login.&lt;br /&gt;
*: Uma vez feita o login pelo método doLogin(), se realizado com sucesso para para o estado &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039; - Estado em que o sistema permite ser configurado, e permite acesso a outras funções administravias do checkout (como abrir e fechar o checkout).&lt;br /&gt;
*: Este já um estado de uso do sistema, deste estado o usuário pode entrar no modo de venda &#039;&#039;&#039;SALES&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALES&#039;&#039;&#039; - Estado em que o sistema entra no modo de vendas, permite a abertura de venda, venda de produtos, recebimento, etc.&lt;br /&gt;
*: Sempre que não estiver com uma venda aberta, o usuário pode voltar para o estado &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Uma vez nos estrados &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039; ou &#039;&#039;&#039;SALES&#039;&#039;&#039; o usuário não pode mais voltar para os outros estados até que a aplicação seja finalizada.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inicialização: &#039;&#039;&#039;StartCheckStatus&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:workflow_StartCheckStatus.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esse é o WORKFLOW que cuida da checagem e inicialização inicial do sistema. Seus funcionamento é assim:&lt;br /&gt;
* &#039;&#039;&#039;INITING&#039;&#039;&#039; - Estado inicial de começo das checkagens;&lt;br /&gt;
*: Neste estágio o sistema começa a ser inicializado, como carregamento dos bundles.&lt;br /&gt;
*: Tudo inicializado com sucesso, passa para o estado &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039; - Estado para verificação do banco de dados.&lt;br /&gt;
*: Verifica se o banco de dados existe, se não existir o cria;&lt;br /&gt;
*: Passa para o estado &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039; - Verifica se o banco de dados está na versão correta e faz as alterações/atualizações necessárias;&lt;br /&gt;
*: Quando atualizado passa para o &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;- Valida se a instalação do PDV está ok (empresa configurada, dados sincronizados, etc.).&lt;br /&gt;
*: Se a instalação estiver OK vai para o estado &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039;, caso contrário para &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;&lt;br /&gt;
*: Nesse estado o PDVApp não faz nada, mas serve de sinalização para o &#039;&#039;&#039;PDVUI&#039;&#039;&#039; que a instalação precisa ser realizada, e a tela é exibida. Quando a tela de instalação é finalizada, o PDVUI sinaliza para o &#039;&#039;&#039;PDVAapp&#039;&#039;&#039; que volta para o estado de &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039; - Estado sem operação, apenas sinalizando que a Instalação está completa.&lt;br /&gt;
*: Passa automaticamente para o estado &#039;&#039;&#039;START_TERMINALAPP&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;START_TERMINALAPP&#039;&#039;&#039; - Inicializa o Terminal Client (Reponsável por realizar a comunicação com o servidor).&lt;br /&gt;
*: Após inicializá-lo passa automaticamente para o estado &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039; - Valida se o ID atual configurado na estação PDV está válido e cadastrado corretamente no servidor.&lt;br /&gt;
*: Se o cadastro estiver OK passa para &#039;&#039;&#039;LOAD_CHECKOUT_DATA&#039;&#039;&#039;, caso contrário trava a aplicação em erro para garantir que seja reinstalada.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LOAD_CHECKOUT_DATA&#039;&#039;&#039; - Carrega as informações do CheckoutData, se existir, para continuar com a aplicação a partir do ponto em que estava. Se não encontrar, procura manualmente se há algum caixa em aberto no banco de dados e &amp;quot;cria&amp;quot; o CheckoutData para continuar o checkout aberto (e não perder sessões de checkouts a cada vez que se perde o CheckoutData). &#039;&#039;&#039;Em adicional&#039;&#039;&#039;, (re)carrega o CFSystem para que o sistema esteja pronto para emitir cupons fiscais.&lt;br /&gt;
*: Passa para o &#039;&#039;&#039;START_SYNCDATA&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;START_SYNCDATA&#039;&#039;&#039; - Inicializa a Thread responsável por sincronizar os dados com/do servidor.&lt;br /&gt;
*: Passa para o &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OK&#039;&#039;&#039; - Estado em que o WORKFLOW finalizou com sucesso. Utilizado para sinalizar outras partes do sistema que a inicialização terminou com sucesso e o sistema está pronto para ser utilizado.&lt;br /&gt;
*: Sinaliza o PDVApp de que este workflou finalizou através do método &#039;&#039;&#039;app.freeStartCheck()&#039;&#039;&#039;, que dá sequência no workflow &#039;&#039;&#039;PDVState&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== PDVUI ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== NFC-e ==&lt;br /&gt;
&lt;br /&gt;
A emissão de NFCe é realizada pelo mesmo site da NFe. O BISPDV utilizará o módulo [https://wiki.rodrigogml.eng.br/index.php/P%C3%A1gina_principal#RFW_-_Sefaz RFW.SEFAZ]. Toda a documentação técnica estará no site do módulo. &#039;&#039;&#039;Concentrar aqui apenas as informações relacionadas ao BISPDV e à configuração/utilização do módulo&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Cadastros do Sistema =&lt;br /&gt;
&lt;br /&gt;
== Items ==&lt;br /&gt;
&lt;br /&gt;
A aplicação BISPDV não suporta cadastro de itens diretamente no aplicativo. A base de itens para venda é sincronizada diretamente do servidor para a aplicação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para a aplicação é enviada apenas apenas os campos do cadastro de itens necessários para realizar a venda do produto, um objeto &amp;lt;code&amp;gt;PDVItemVO&amp;lt;/code&amp;gt; é montado com as informações da estrutura de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A conversão é feita a partir do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; e não de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;. Isso porque cada código de item pode ser vendido por preços diferentes, quantidades diferentes, unidades de medidas diferentes entre outros. Para o BISPDV cada código funciona como um produto cadastro diferente que pode ser vendido. Já no servidor, a venda de cada código é tratada como uma venda do mesmo item (respeitando a quantidade, preços, etc.). A conversão/envio dos códigos para venda no PDV é realizada da seguinte forma:&lt;br /&gt;
* Apenas produtos que tenham a finalidade marcada como &#039;&#039;&#039;Revenda&#039;&#039;&#039; ou &#039;&#039;&#039;Produto Acabado&#039;&#039;&#039; tem seus códigos sincronizados no PDV.&lt;br /&gt;
* O &amp;lt;code&amp;gt;ID&amp;lt;/code&amp;gt; aplicado no &amp;lt;code&amp;gt;PDVItemVO&amp;lt;/code&amp;gt; é o mesmo do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;, utilizado como referência para sincronizar os novos códigos ou alterações do servidor.&lt;br /&gt;
* O &amp;lt;code&amp;gt;IDItem&amp;lt;/code&amp;gt; é atribuído em outro atibuto, e é utilizado pelo servidor para associar o item do cupom (vendas) ao ItemVO correto. Essa medida visa não perder o relacionamento entre os objetos de Item de Documentos fiscais com o cadastro de item. Isso porque o objeto ItemCodeVO pode ser excluído do sistema, já o ItemVO é só marcado como excluído no sistema e mantido para efeitos de histório, ou seja, ItemCodeVO é um objeto volátil e não pode ser utilizado para referência ou vinculação com objetos de registro ou histórico.&lt;br /&gt;
* O servidor passar no atributo &amp;lt;code&amp;gt;startDate&amp;lt;/code&amp;gt; a última data de alteração do &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; (ou seus subojetos como &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;ItemPrice&amp;lt;/code&amp;gt;), para que o PDV saiba qual foi a última alteração dos objetos na sua base e, consultando a maior dessas datas entre todos os objetos, consegue utilizar essa data para requisitar os objetos alterados a partir dessadata (ao invés da data da última alteração, evitando problemas de sincronia de datas e deixar algum item dessincronizados).&lt;br /&gt;
* Como a venda ocorre com base nas definições do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;, mas o sistema precisa vincular a venda com o &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;, os campos que definem a &amp;quot;transformação&amp;quot; entre &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; e &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; são atribuídas no objeto nos seguintes atributos:&lt;br /&gt;
:* &#039;&#039;&#039;originalItemID&#039;&#039;&#039; - ID do &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; para associação com o item original.&lt;br /&gt;
:* &#039;&#039;&#039;originalDivider&#039;&#039;&#039; - Divisor de conversão&lt;br /&gt;
&lt;br /&gt;
= DOCUMENTAÇÃO A SER REVISADA! =&lt;br /&gt;
O Conteúdo a seguir precisa ser revisado desde a &amp;quot;reimplementação&amp;quot; do PDVApp (BIS2.PDV - Projeto com código do ECF e SAT) para o novo (BIS.PDV - Projeto dedicado apenas ao código do NFCe)&lt;br /&gt;
&lt;br /&gt;
== PayGo ==&lt;br /&gt;
&lt;br /&gt;
O PayGo é o sistema integrado de TEF do sistma.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observações Importantes&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;Site de suporte e manual do desenvolvedor:&#039;&#039;&#039; https://paygodev.readme.io/docs/vis%C3%A3o-geral&lt;br /&gt;
* &#039;&#039;&#039;Download do Kit de Integração:&#039;&#039;&#039; https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2&lt;br /&gt;
* O BISPDV utiliza a versão de troca de arquivos txt, que é a continuação da versão do da NTK na qual o sistema foi homologado inicialmente.&lt;br /&gt;
&lt;br /&gt;
=== Instalação Ambiente de Testes/Homologação ===&lt;br /&gt;
&lt;br /&gt;
Para instalação do ambiente de testes/homologação seguir as instruções do site: https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2.&lt;br /&gt;
Em 28/01/2025 solicitei cadastro para uma nova homologação e ativação do sistema e recebi um e-mail com o seguinte conteúdo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Giovanna de Mello Doroteio comentou\: Prezado(a), Rodrigo.&lt;br /&gt;
Agradecemos por escolher nossos serviços. Para garantir uma experiência tranquila e bem-sucedida durante a integração, estamos fornecendo os dados de instalação e informações sobre os adquirentes disponíveis em nosso servidor de testes.&lt;br /&gt;
&lt;br /&gt;
Dados de Instalação:&lt;br /&gt;
&lt;br /&gt;
Id de Instalação: 344384&lt;br /&gt;
Senha: A70C47D1&lt;br /&gt;
Adquirentes disponíveis em nosso servidor de testes:&lt;br /&gt;
&lt;br /&gt;
Adquirente DEMO:&lt;br /&gt;
Função: Simula uma sub-adquirente.&lt;br /&gt;
&lt;br /&gt;
Adquirente REDE:&lt;br /&gt;
Função: Simula uma adquirente.&lt;br /&gt;
Restrição no Ambiente de Sandbox: Aceita apenas valores inteiros.&lt;br /&gt;
Importante: Qualquer valor com centavos resultará em uma transação negada.&lt;br /&gt;
&lt;br /&gt;
Adquirente PIX C6 BANK:&lt;br /&gt;
Função: Simula operações com Pix e carteira digital.&lt;br /&gt;
Processo: Após uma transação, o QRCode para pagamento será gerado.&lt;br /&gt;
Aprovação Automática: A transação será aprovada automaticamente alguns segundos após a geração do QRCode.&lt;br /&gt;
&lt;br /&gt;
Para acessar a documentação completa de integração, por favor, visite: Sobre esse documento&lt;br /&gt;
Segue o kit de integração e o passo a passo para a habilitação dos logs, respectivamente: [&lt;br /&gt;
Kit de integração|https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2][&lt;br /&gt;
Kit de integração- Habilitação dos Logs.|https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2#aten%C3%A7%C3%A3o]&lt;br /&gt;
ATENÇÃO: É obrigatório habilitar os logs para realizar a homologação.&lt;br /&gt;
&lt;br /&gt;
Se você tiver alguma dúvida, precisar de assistência adicional ou encontrar qualquer problema durante o processo de integração, nossa equipe de suporte estará pronta para ajudar. Não hesite em entrar em contato conosco por meio deste chamado.&lt;br /&gt;
Agradecemos pela sua colaboração e estamos ansiosos para fornecer a melhor experiência possível durante sua fase de testes.&lt;br /&gt;
&lt;br /&gt;
Atenciosamente, SETIS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAT ==&lt;br /&gt;
&lt;br /&gt;
=== Informações ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Site Oficial:&#039;&#039;&#039; https://portal.fazenda.sp.gov.br/servicos/sat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Navegação dos Arquivos do Site&#039;&#039;&#039; (Procure pelas versões mais atualizadas na sessão de download do site oficial)&lt;br /&gt;
* &#039;&#039;&#039;Manual Orientacao SAT&#039;&#039;&#039; - arquivo geral com as orientações sobre como gerar a impressão do cupom, códigos de barras, tamanho, informações necessárias, qrcode, etc.&lt;br /&gt;
* &#039;&#039;&#039;Guia para Geração do QRCode&#039;&#039;&#039; - arquivo com as orientações para gerar o qrcode do cupom fiscal.&lt;br /&gt;
* &#039;&#039;&#039;Especificação de Requisitos do SAT&#039;&#039;&#039; - arquivo com as especificações para o desenvolvedor, como layout XML e outras informações técnicas.&lt;br /&gt;
&lt;br /&gt;
== Arquitetura ==&lt;br /&gt;
&lt;br /&gt;
O aplicativo apresenta a arquitetura dividia conforme o diagrama abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVArquitetura.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== PDVStarter == &lt;br /&gt;
&lt;br /&gt;
O PDVStarter é a classe inicial da aplicação, a classe que contém o método main(). Ela faz apenas algumas verificações mínimas e necessárias para o funcionamento, como definições do ambiente java, e logo seguida inicializa o &#039;&#039;&#039;PDVUI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== PDVUI ===&lt;br /&gt;
&lt;br /&gt;
PDVUI é a responsável pela Interface Gráfica da aplicação. A interface é montada toda com o JavaFX, por isso o método chamado no PDVUI para inicia-lo é o &#039;&#039;launch()&#039;&#039;. Ao iniciar, o JavaFX chamará o método &#039;&#039;start(Stage stage)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
O PDVUI é o responsável por montar as telas e a interface gráfica para o usuário, porém como todo o controle da aplicação é feita através do PDVApp o PDVUI lê os estados do PDVApp para saber que tela montar, que controles exibir, etc. O PDVUI é atualizado através de eventos emitidos pelo PDVApp.&lt;br /&gt;
&lt;br /&gt;
No PDVUI apenas as lógicas de UI são colocadas, como alguma validação de entradas do usuário, formatação e layout de tela, algumas questões de segurança para exibir ou esconder os componentes de tela, etc.&lt;br /&gt;
&lt;br /&gt;
==== PDVScreenInterface ====&lt;br /&gt;
&lt;br /&gt;
A classe PDVUI é a classe de controle geral da interface. Mas a cada estado do PDVState, a tela montada é &amp;quot;sub-controlada&amp;quot; pelas implementações de PDVScreenInterface. Em outras palavras, os únicos componentes que a PDVUI tem como filhas são as implementações dessa interface.&lt;br /&gt;
&lt;br /&gt;
Essas implementações montam uma tela para cada fase do sistema. Por exemplo, ao iniciar a aplicação é utilizada a &amp;quot;StartScreen&amp;quot;, que monta a tela para exibir as informações de inicialização e instalação, além da tela de Log-In. Após o login, o usuário é direcionado para a tela administrativa, montado pela &amp;quot;AdminScreen&amp;quot;. Caso o usuário entre no modo de vendas, toda a tela de venda ao consumidor (responsável por exibir as fotos de produtos ao fundo) é gerenciada pela &amp;quot;SaleScreen&amp;quot; e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Em geral, a PVDUI troca essa &amp;quot;Screen&amp;quot; para estado do PDVState. Dentro de cada estado do PDVState, seus substados são verificados e controlados por cada Screen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== BISPDVFrame ====&lt;br /&gt;
&lt;br /&gt;
Além das Screens que montam a &amp;quot;tela&amp;quot; da aplicação em cada estado, há as janelas chamadas de &amp;quot;Frames&amp;quot;. Esses frames são janelas modais que são colocadas por cima da Screen para indagar o usuário para realizar alguma função.&lt;br /&gt;
&lt;br /&gt;
Exemplos de Frames são as telas de configurações de Servidor ou do Sistema de Emissão do Cupom Fiscal, que aparecem por cima da AdminScreen. Ou a tela de identificação do cliente (CPF/Nota Paulista), que aparece por cima da SaleScreen ao começar uma nova venda.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PDVApp ==&lt;br /&gt;
&lt;br /&gt;
Esta classe Singleton é responsável pela inteligência da aplicação. Através desta classe são realizadas todas as as ações de vendas, configurações, validações, segurança etc. Assim como uma camada &amp;quot;CRUD&amp;quot;, esta classe faz a ligação entre as partes do sistema (CFSystem, Impressoras, TEF, Banco de Dados, etc.) e a interface do usuário (PDVUI).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Qualquer comando que o PDVUI receba do usuário, deve ser passado e tratado dentro do PDVApp, sincronizado se for o caso. O PDVApp processa e valida o comando.&lt;br /&gt;
&lt;br /&gt;
Abaixo o mapa completo dos estados e &amp;quot;sub-estados&amp;quot; que o PDVApp pode assumir:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVFullStateMap.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== PDVState ===&lt;br /&gt;
&lt;br /&gt;
O PDVApp pode ser considerado uma máquina de estados se analisar os passos que ele segue, e que ele guia o usuário. O controle do passo em que o PDVApp está é feito através do atributo PDVState dentro do próprio PDVApp.&lt;br /&gt;
&lt;br /&gt;
Assim que aplicação é iniciada, este estado é inicializado com o valor &amp;quot;START&amp;quot;, que implica que aplicação está iniciando. Em seguida ela seguirá o fluxo conforme a imagem abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVPDVState.png|center]]&lt;br /&gt;
&lt;br /&gt;
==== PDVStateSales ====&lt;br /&gt;
&lt;br /&gt;
Estes estatus servem como sub-status quando o PDVState está em SALES. Estes estados tem a função de definir em que passo da venda o PDVApp está no momento.&lt;br /&gt;
&lt;br /&gt;
Quando o PDVState entrar no estado &amp;quot;SALES&amp;quot;, o PDVStateSales deve iniciar no valor &amp;quot;NONE&amp;quot;. Assim como para que o PDVState possa sair do estado &amp;quot;SALES&amp;quot;, é obrigatório que o PDVStateSales tenha o valor &amp;quot;NONE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{nota|Recuperação de Desligamento|Em caso de recuperação de desligamento incorreto, o sistema pode entrar no modo PDVState &amp;quot;SALES&amp;quot; e o PDVStateSales já ter um valor carregado diferente. Que tenha sido persistido e recuperado junto com o CheckoutDat}}&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVPDVStateSales.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;NONE&#039;&#039;&#039; - Este estado indica que embora o PDVApp esteja no estado de venda, no momento não há nenhuma venda ocorrendo. Toda vez que o PDVState entrar em &#039;&#039;&#039;Selling&#039;&#039;&#039;, o PDVStateSales inicia neste estado. Assim como, para que o PDVState saia do estado &#039;&#039;&#039;Selling&#039;&#039;&#039;, é necessário que o PDVStateSales já tenha retornado para o NONE.&lt;br /&gt;
*: Apenas no caso de recuperação de desligamento incorreto o sistema o PDVState pode entrar em Selling, e já encontrar o PDVStateSale em um estado diferente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_SELLING&#039;&#039;&#039; - Este estado indica que há uma venda ocorrendo neste momento, e que a venda está efetivamente no estado de &amp;quot;venda&amp;quot;. Isto é, indica que a venda está no processo de registrar os itens que estão sendo vendidos ao consumidor.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_PAYMENT&#039;&#039;&#039; - Após o término do estado anterior, quando todos os itens já estão registrados para venda, passamos para o estado de planejamento dos pagamentos. Neste passo indicamos para o sistema como os pagamentos serão realizados. Só conseguimos passar para o passo seguinte depois de informar pagamentos suficientes para quitar o total dos produtos vendidos no passo anterior.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_FINALIZATION&#039;&#039;&#039; - Após informar os produtos e as formas de pagamento, o sistema entra neste passo para finalizar toda a venda. Neste passo o sistema processa toda a informação fornecida nos passos anteriores (itens e pagamentos), e executa tudo o que for necessário. Por exemplo, pagamentos com TEF, Tiquetes e outras operações que envolvam sistemas externos serão notificados e ativados no processamento deste passo.&lt;br /&gt;
*: Ao entrar neste passo o usuário não terá mais autonomia para retornar aos passos anteriores. A única condição que permitirá que o usuário volte ao passo anterior será a ocorrência de algum erro durante o processamento E QUE permita esse retrocesso ao passo anterior.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_SHOW&#039;&#039;&#039; - Ao terminar o processamento de finalização da venda, o sistema para neste passo. Neste passo o cupom e as informações continuam carregadas no PDVApp mas já estão todas processadas, salvas e finalizadas. Este passo tem apenas a finalidade de permitir que informações sejam exibidas ao usuário pelo UI. Assim que o usuário as confirmar, o sistema descarrega das variáveis esta venda e volta para o passo &#039;&#039;&#039;NONE&#039;&#039;&#039;, preparando-se para outra venda ou outra operação.&lt;br /&gt;
&lt;br /&gt;
=== PDVApp Listeners ===&lt;br /&gt;
&lt;br /&gt;
==== PDVSaleEventListener ====&lt;br /&gt;
&lt;br /&gt;
Este listener oferece notificações dos eventos relacionados a operação de venda ao consumidor. Como por exemplo, &amp;quot;Nova venda iniciada&amp;quot; (OPENCUPOM), &amp;quot;Última Venda Cancelada&amp;quot; (CALCELLASTCFX), &amp;quot;Venda atual cancelada&amp;quot; (CANCELHALFCFX), &amp;quot;Item Vendido/Registrado&amp;quot; (ITEMSOLD), e assim por diante....&lt;br /&gt;
&lt;br /&gt;
==== PDVStateChangeListener ====&lt;br /&gt;
&lt;br /&gt;
Este listener é acionado a cada alteração no valor do PDVState.&lt;br /&gt;
&lt;br /&gt;
== StartCheck ==&lt;br /&gt;
&lt;br /&gt;
StartCheck é a rotina de inicialização que o PDVApp executa logo após a aplicação ser iniciada, antes que o usuário possa realizar qualquer interação com a aplicação. A rotina do StartCheck segue os passos conforme o Fluxograma abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVStartCheck.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INITING&#039;&#039;&#039; - é apenas o primeiro estado, o estado inicial de quando a aplicação é carregada. Não há nenhuma execução neste estado, apenas é passado para o próximo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039; - Este passo é responsável por verificar o banco de dados local. Verifica sua existência e tentativa de conexão. Caso ele não exista, é criado. Caso não seja possível conectar, lança erro avisando o usuário que provavelmente há outra instância da aplicação rodando.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039; - Complementar a tarefa anterior, neste passo o sistema verifica a versão do banco de dados atual. Caso a aplicação tenha sido atualizada este passo executará os comandos necessários para atualizar o banco antes que o resto da aplicação tente acessa-lo. Caso a atualização tenha algum problema a aplicação é encerrada para evitar que o uso dos dados de forma incorreta danifiquem os dados.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039; - Este passo é essencial para a configuração da aplicação. Antes que o usuário possa utilizar a aplicação é necessário que alguma configurações sejam definidas, como por exemplo endereço do servidor, e periféricos pertinentes ao caixa. Caso a verificação perceba que alguma configuração inicial é necessária o StartCheck será interrompido e o sistema entrará no estado &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;. &lt;br /&gt;
*: Ao entrar neste estado o PDVUI detecta e exibirá o Wizard de configuração para o usuário. Uma vez que o Wizard seja finalizado ele envia ao PDVApp o comando para tentar o &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039; novamente. E em caso de sucesso, seguirá para o próximo passo.&lt;br /&gt;
*: Note que a maior parte das configurações, principalmente as que são iguais para todos os caixas, é definida pelo servidor e sincronizada para todos os caixas. Não há como altera-las diretamente na aplicação.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039; - Neste passo não há processamento, é apenas um passo indicativo de que a instalação está OK e que pode continuar. Um estado &amp;quot;contrário&amp;quot; ao &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;, fazendo que o StartCheck continue sua rotina.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039; - Durante a primeira inicialização/instalação da aplicação ela se registrará no servidor recebendo um ID único para identificação deste terminal deste ponto em diante. Servindo para rastrear tudo o que acontece em cada caixa/terminal de atendimento.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OK&#039;&#039;&#039; - Este é o passo final, que indica para as outras rotinas de que o StartCheck finalizou com sucesso é que o PDVApp está pronto para seguir para o próximo passo.&lt;br /&gt;
&lt;br /&gt;
== CFSystem ==&lt;br /&gt;
&lt;br /&gt;
O CFSystem (Sistema de Cupom Fiscal) é o nome dado para o encapsulamento dos diferentes sistemas de emissão de cupom fiscal - SAT, ECF, NFCe, etc. - suportados atualmente ou que venham a existir no futuro. Separando o controle da emissão do cupom fiscal das rotinas do sistema permite que o mesmo app seja reaproveitado para todas as tecnologias existes com pouca ou nenhuma adaptação.&lt;br /&gt;
&lt;br /&gt;
Esse encapsulamento funciona porque embora independente de como a tecnologia da emissão funcione a rotina de venda é sempre a mesma de forma geral: &amp;quot;Inicia a Venda - Registra Produtos - Executa Descontos e Totalizações - Recebe Pagamentos - Finaliza Venda&amp;quot;. A cada passo da venda o PDVApp chamará os métodos da interface do CFSystem para notificar os acontecimentos da venda. Devendo o CFSystem traduzir e organizar o funcionamento para cada tecnologia.&lt;br /&gt;
&lt;br /&gt;
O CFSystem é uma interface que permite as implementações das distintas tecnologias. Assim, cada implementação do CFSystem representa um equipamento e modelo de emissão diferentes. Por exemplo, a implementação para suporte do ECF Daruma é uma classe &amp;quot;CFSystemECFDaruma&amp;quot; que implementa a CFSystem.&lt;br /&gt;
&lt;br /&gt;
O CFSystem também apresenta os métodos para impressão de relatórios gerenciais e outros documentos não fiscais.&lt;br /&gt;
&lt;br /&gt;
=== CFSystemFactory ===&lt;br /&gt;
&lt;br /&gt;
Esta classe permite que a implementação correta do CFSystem seja retornada de acordo com os parâmetros de configuração passados. Seguindo o pattern &amp;quot;Factory&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Cupom Fiscal / PDVCupomVO ==&lt;br /&gt;
&lt;br /&gt;
Independente do sistema de emissão do cupom fiscal, o cupom fiscal é representado no sistema pelo PDVCupomVO. Para cada tipo de cupom fiscal (emitido por sistemas diferentes) o objeto apresentará um conjunto de atributos obrigatórios.&lt;br /&gt;
&lt;br /&gt;
=== Ciclo de Vida do Cupom Fiscal ===&lt;br /&gt;
&lt;br /&gt;
O cupom fiscal segue um ciclo de vida básico representado pela enumeration PDVCUPOMSTATUS, conforme o diagrama abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVCupomStatus.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados Adicionais|Alguns sistemas de emissão, como o NFCe, apresentam mais estados por conta do controle de transmissão e emissão. Esses estados adicionais serão tratados no capítulo próprio do sistema. Vale a pena verifica se esses estados devem continuar utilizando a mesma variável ou se deve ter um conjunto de estados a parte dentro do VO, para não interferir no funcionamento do PDVApp, uma vez que o sistema de emissão é abstraído pela interface CFSystem.}}&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISPDV&amp;diff=1660</id>
		<title>BISPDV</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISPDV&amp;diff=1660"/>
		<updated>2025-11-19T22:32:21Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Items */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O BISPDV é a aplicação utilizada na frente de caixa para realização da venda ao consumidor e de outra funções pertinentes à venda e atendimento do cliente da loja.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Pendências, Informações e Guia sobre a implementação =&lt;br /&gt;
&lt;br /&gt;
* O projeto anterior (bis2.pdv) está sendo descontinuado por ainda ter código com suporte a ECF e SAT, que estão em caindo em desuso. Para rever e simplificar o código um novo projeto (bis.pdv) foi criado e o código está sendo revisado e repassado para o novo projeto. Uma vez concluído o projeto bis2.pdv será descontinuado.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alterações em andamento:&#039;&#039;&#039;&lt;br /&gt;
# Para agilidade, foi definido que não utilizaremos o RFWDAO, mas manter a arquitetura de DAO original.&lt;br /&gt;
# Removido código relacionados ao ECF e ao SAT, este novo projeto emitirá cupons apenas utilizando o NFCe, utilizando o código do módulo RFW.SEFAZ.&lt;br /&gt;
# O Bundle foi rebatizado para bispdvbundle.properties, e passou a utilizar as chaves BISPDV_NNNNNN. Todas as chaves antigas foram copiadas para o arquivo e ao fechamento da versão devem ser revisadas, e as sobreviventes renomeadas.&lt;br /&gt;
&lt;br /&gt;
= Inicialização do Sistema =&lt;br /&gt;
&lt;br /&gt;
[[Imagem:inicialização_pdvapp.png|center|Inicialização do Sistema]]&lt;br /&gt;
&lt;br /&gt;
A inicialização do aplicativo segue as seguintes regras:&lt;br /&gt;
&lt;br /&gt;
== PDVStarter ==&lt;br /&gt;
A aplicação deve ser inicializada sempre por esta classe que contém o método &#039;&#039;main()&#039;&#039;;&lt;br /&gt;
: Esta classe não faz absolutamente nada além de passar a chamada, incluindo os argumentos de linha de comando para a &#039;&#039;&#039;PDVUpdater&#039;&#039;&#039;. Sua existência tem a finalidade de permitir a incorporação de plugins, siffers, debugger e outras ferramentas na aplicação. Para isso, basta que a ferramenta implemente uma &#039;sósia&#039; desta classe (mesmo nome e package), e que sua bibliotexa (.jar) seja carregada no classpath antes dos .jars da própria aplicação. Após realizar o que for necessário a ferramenta deve repassar a chamada para &#039;&#039;&#039;PDVUpdater&#039;&#039;&#039; da mesma forma, para que a aplicação se inicie em seu fluxo normal.&lt;br /&gt;
&lt;br /&gt;
== PDVUpdater ==&lt;br /&gt;
&lt;br /&gt;
Esta classe que concentra as tarefas de inicialização da aplicação recebe os seguintes parâmetros:&lt;br /&gt;
* &#039;&#039;&#039;-help&#039;&#039;&#039; - Exibe este menu de opções.&lt;br /&gt;
* &#039;&#039;&#039;-testDarumaFW&#039;&#039;&#039; - Não inicializa a aplicacao. Tenta apenas inicializar as bibliotecas da DarumaDramework, verificando se as DLLs estão OK. Não faz comunicação com a impressora.&lt;br /&gt;
* &#039;&#039;&#039;-watcher&#039;&#039;&#039; - Habilita uma thread que imprime o valor de algumas variáveis do sistema a cada segundo no console do sistema.&lt;br /&gt;
* &#039;&#039;&#039;-autoSaleTest&#039;&#039;&#039; - Carrega um arquivo de vendas automáticas. Esse arquivo deve conter o que deve ser vendido, e as vendas serão feitas automaticamente no horário programado.&lt;br /&gt;
* &#039;&#039;&#039;-noUI&#039;&#039;&#039; - Não inicializa a UI do PDVApp. Útil quando estamos utilizando o -saleFile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Valida se é a única instância tentando bloquear o arquivo &#039;&#039;&#039;.\\instance.lock&#039;&#039;&#039; no diretório da aplicação.&lt;br /&gt;
&lt;br /&gt;
== PDVApp ==&lt;br /&gt;
&lt;br /&gt;
O &#039;&#039;&#039;PDVApp&#039;&#039;&#039; é o coração da aplicação. Funciona com uma série de máquinas de estado (workflows) que definem a lógica da operação da aplicação.&lt;br /&gt;
&lt;br /&gt;
= Workflows do Sistema =&lt;br /&gt;
== Principal: &#039;&#039;&#039;PDVState&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:workflow_pdvstate.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esse é o WORKFLOW geral da aplicação, é definida nos valores da enum &#039;&#039;&#039;PDVState&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;START&#039;&#039;&#039; - Valor inicial, utilizado somente na inicialização da aplicação.&lt;br /&gt;
*: Neste passo é iniciado o workflow &#039;&#039;&#039;StartCheckStatus&#039;&#039;&#039;, enquanto esse workflow secundário é executado, o PDVState é passado para o estado &#039;&#039;&#039;STARTCHECK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STARTCHECK&#039;&#039;&#039; - Estado enquanto a checagem inicial do sistema ocorre;&lt;br /&gt;
*: Se a checagem inicial finalizar com sucesso vai para o estado &#039;&#039;&#039;WAITINGLOGIN&#039;&#039;&#039;, em caso de erro vai para o &#039;&#039;&#039;STARTCHECK_FAIL&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STARTCHECK_FAIL&#039;&#039;&#039; - indicador de que o processo de checagem inicial terminou com erro.&lt;br /&gt;
*: Não há saída desse estado, a não ser reiniciar ou refazer a instalação do PDVApp.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WAITINGLOGIN&#039;&#039;&#039; - Sinaliza que o sistema está aguradando o login.&lt;br /&gt;
*: Fica nesse estado até que o PDVUI interaja com o usuário para executar o login.&lt;br /&gt;
*: Uma vez feita o login pelo método doLogin(), se realizado com sucesso para para o estado &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039; - Estado em que o sistema permite ser configurado, e permite acesso a outras funções administravias do checkout (como abrir e fechar o checkout).&lt;br /&gt;
*: Este já um estado de uso do sistema, deste estado o usuário pode entrar no modo de venda &#039;&#039;&#039;SALES&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALES&#039;&#039;&#039; - Estado em que o sistema entra no modo de vendas, permite a abertura de venda, venda de produtos, recebimento, etc.&lt;br /&gt;
*: Sempre que não estiver com uma venda aberta, o usuário pode voltar para o estado &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Uma vez nos estrados &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039; ou &#039;&#039;&#039;SALES&#039;&#039;&#039; o usuário não pode mais voltar para os outros estados até que a aplicação seja finalizada.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inicialização: &#039;&#039;&#039;StartCheckStatus&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:workflow_StartCheckStatus.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esse é o WORKFLOW que cuida da checagem e inicialização inicial do sistema. Seus funcionamento é assim:&lt;br /&gt;
* &#039;&#039;&#039;INITING&#039;&#039;&#039; - Estado inicial de começo das checkagens;&lt;br /&gt;
*: Neste estágio o sistema começa a ser inicializado, como carregamento dos bundles.&lt;br /&gt;
*: Tudo inicializado com sucesso, passa para o estado &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039; - Estado para verificação do banco de dados.&lt;br /&gt;
*: Verifica se o banco de dados existe, se não existir o cria;&lt;br /&gt;
*: Passa para o estado &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039; - Verifica se o banco de dados está na versão correta e faz as alterações/atualizações necessárias;&lt;br /&gt;
*: Quando atualizado passa para o &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;- Valida se a instalação do PDV está ok (empresa configurada, dados sincronizados, etc.).&lt;br /&gt;
*: Se a instalação estiver OK vai para o estado &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039;, caso contrário para &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;&lt;br /&gt;
*: Nesse estado o PDVApp não faz nada, mas serve de sinalização para o &#039;&#039;&#039;PDVUI&#039;&#039;&#039; que a instalação precisa ser realizada, e a tela é exibida. Quando a tela de instalação é finalizada, o PDVUI sinaliza para o &#039;&#039;&#039;PDVAapp&#039;&#039;&#039; que volta para o estado de &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039; - Estado sem operação, apenas sinalizando que a Instalação está completa.&lt;br /&gt;
*: Passa automaticamente para o estado &#039;&#039;&#039;START_TERMINALAPP&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;START_TERMINALAPP&#039;&#039;&#039; - Inicializa o Terminal Client (Reponsável por realizar a comunicação com o servidor).&lt;br /&gt;
*: Após inicializá-lo passa automaticamente para o estado &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039; - Valida se o ID atual configurado na estação PDV está válido e cadastrado corretamente no servidor.&lt;br /&gt;
*: Se o cadastro estiver OK passa para &#039;&#039;&#039;LOAD_CHECKOUT_DATA&#039;&#039;&#039;, caso contrário trava a aplicação em erro para garantir que seja reinstalada.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LOAD_CHECKOUT_DATA&#039;&#039;&#039; - Carrega as informações do CheckoutData, se existir, para continuar com a aplicação a partir do ponto em que estava. Se não encontrar, procura manualmente se há algum caixa em aberto no banco de dados e &amp;quot;cria&amp;quot; o CheckoutData para continuar o checkout aberto (e não perder sessões de checkouts a cada vez que se perde o CheckoutData). &#039;&#039;&#039;Em adicional&#039;&#039;&#039;, (re)carrega o CFSystem para que o sistema esteja pronto para emitir cupons fiscais.&lt;br /&gt;
*: Passa para o &#039;&#039;&#039;START_SYNCDATA&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;START_SYNCDATA&#039;&#039;&#039; - Inicializa a Thread responsável por sincronizar os dados com/do servidor.&lt;br /&gt;
*: Passa para o &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OK&#039;&#039;&#039; - Estado em que o WORKFLOW finalizou com sucesso. Utilizado para sinalizar outras partes do sistema que a inicialização terminou com sucesso e o sistema está pronto para ser utilizado.&lt;br /&gt;
*: Sinaliza o PDVApp de que este workflou finalizou através do método &#039;&#039;&#039;app.freeStartCheck()&#039;&#039;&#039;, que dá sequência no workflow &#039;&#039;&#039;PDVState&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== PDVUI ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== NFC-e ==&lt;br /&gt;
&lt;br /&gt;
A emissão de NFCe é realizada pelo mesmo site da NFe. O BISPDV utilizará o módulo [https://wiki.rodrigogml.eng.br/index.php/P%C3%A1gina_principal#RFW_-_Sefaz RFW.SEFAZ]. Toda a documentação técnica estará no site do módulo. &#039;&#039;&#039;Concentrar aqui apenas as informações relacionadas ao BISPDV e à configuração/utilização do módulo&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Cadastros do Sistema =&lt;br /&gt;
&lt;br /&gt;
== Items ==&lt;br /&gt;
&lt;br /&gt;
A aplicação BISPDV não suporta cadastro de itens diretamente no aplicativo. A base de itens para venda é sincronizada diretamente do servidor para a aplicação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para a aplicação é enviada apenas apenas os campos do cadastro de itens necessários para realizar a venda do produto, um objeto &amp;lt;code&amp;gt;PDVItemVO&amp;lt;/code&amp;gt; é montado com as informações da estrutura de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A conversão é feita a partir do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; e não de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;. Isso porque cada código de item pode ser vendido por preços diferentes, quantidades diferentes, unidades de medidas diferentes entre outros. Para o BISPDV cada código funciona como um produto cadastro diferente que pode ser vendido. Já no servidor, a venda de cada código é tratada como uma venda do mesmo item (respeitando a quantidade, preços, etc.). A conversão/envio dos códigos para venda no PDV é realizada da seguinte forma:&lt;br /&gt;
* Apenas produtos que tenham a finalidade marcada como &#039;&#039;&#039;Revenda&#039;&#039;&#039; ou &#039;&#039;&#039;Produto Acabado&#039;&#039;&#039; tem seus códigos sincronizados no PDV.&lt;br /&gt;
* O &amp;lt;code&amp;gt;ID&amp;lt;/code&amp;gt; aplicado no &amp;lt;code&amp;gt;PDVItemVO&amp;lt;/code&amp;gt; é o mesmo do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;, utilizado como referência para sincronizar os novos códigos ou alterações do servidor.&lt;br /&gt;
* O &amp;lt;code&amp;gt;IDItem&amp;lt;/code&amp;gt; é atribuído em outro atibuto, e é utilizado pelo servidor para associar o item do cupom (vendas) ao ItemVO correto. Essa medida visa não perder o relacionamento entre os objetos de Item de Documentos fiscais com o cadastro de item. Isso porque o objeto ItemCodeVO pode ser excluído do sistema, já o ItemVO é só marcado como excluído no sistema e mantido para efeitos de histório, ou seja, ItemCodeVO é um objeto volátil e não pode ser utilizado para referência ou vinculação com objetos de registro ou histórico.&lt;br /&gt;
* O servidor passar no atributo &amp;lt;code&amp;gt;startDate&amp;lt;/code&amp;gt; a última data de alteração do &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; (ou seus subojetos como &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;code&amp;gt; ou &amp;lt;code&amp;gt;ItemPrice&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;), para que o PDV saiba qual foi a última alteração dos objetos na sua base e, consultando a maior dessas datas entre todos os objetos, consegue utilizar essa data para requisitar os objetos alterados a partir dessadata (ao invés da data da última alteração, evitando problemas de sincronia de datas e deixar algum item dessincronizados).&lt;br /&gt;
* Como a venda ocorre com base nas definições do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;, mas o sistema precisa vincular a venda com o &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;, os campos que definem a &amp;quot;transformação&amp;quot; entre &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; e &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; são atribuídas no objeto nos seguintes atributos:&lt;br /&gt;
:* &#039;&#039;&#039;originalItemID&#039;&#039;&#039; - ID do &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt; para associação com o item original.&lt;br /&gt;
:* &#039;&#039;&#039;originalDivider&#039;&#039;&#039; - Divisor de conversão&lt;br /&gt;
&lt;br /&gt;
= DOCUMENTAÇÃO A SER REVISADA! =&lt;br /&gt;
O Conteúdo a seguir precisa ser revisado desde a &amp;quot;reimplementação&amp;quot; do PDVApp (BIS2.PDV - Projeto com código do ECF e SAT) para o novo (BIS.PDV - Projeto dedicado apenas ao código do NFCe)&lt;br /&gt;
&lt;br /&gt;
== PayGo ==&lt;br /&gt;
&lt;br /&gt;
O PayGo é o sistema integrado de TEF do sistma.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observações Importantes&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;Site de suporte e manual do desenvolvedor:&#039;&#039;&#039; https://paygodev.readme.io/docs/vis%C3%A3o-geral&lt;br /&gt;
* &#039;&#039;&#039;Download do Kit de Integração:&#039;&#039;&#039; https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2&lt;br /&gt;
* O BISPDV utiliza a versão de troca de arquivos txt, que é a continuação da versão do da NTK na qual o sistema foi homologado inicialmente.&lt;br /&gt;
&lt;br /&gt;
=== Instalação Ambiente de Testes/Homologação ===&lt;br /&gt;
&lt;br /&gt;
Para instalação do ambiente de testes/homologação seguir as instruções do site: https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2.&lt;br /&gt;
Em 28/01/2025 solicitei cadastro para uma nova homologação e ativação do sistema e recebi um e-mail com o seguinte conteúdo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Giovanna de Mello Doroteio comentou\: Prezado(a), Rodrigo.&lt;br /&gt;
Agradecemos por escolher nossos serviços. Para garantir uma experiência tranquila e bem-sucedida durante a integração, estamos fornecendo os dados de instalação e informações sobre os adquirentes disponíveis em nosso servidor de testes.&lt;br /&gt;
&lt;br /&gt;
Dados de Instalação:&lt;br /&gt;
&lt;br /&gt;
Id de Instalação: 344384&lt;br /&gt;
Senha: A70C47D1&lt;br /&gt;
Adquirentes disponíveis em nosso servidor de testes:&lt;br /&gt;
&lt;br /&gt;
Adquirente DEMO:&lt;br /&gt;
Função: Simula uma sub-adquirente.&lt;br /&gt;
&lt;br /&gt;
Adquirente REDE:&lt;br /&gt;
Função: Simula uma adquirente.&lt;br /&gt;
Restrição no Ambiente de Sandbox: Aceita apenas valores inteiros.&lt;br /&gt;
Importante: Qualquer valor com centavos resultará em uma transação negada.&lt;br /&gt;
&lt;br /&gt;
Adquirente PIX C6 BANK:&lt;br /&gt;
Função: Simula operações com Pix e carteira digital.&lt;br /&gt;
Processo: Após uma transação, o QRCode para pagamento será gerado.&lt;br /&gt;
Aprovação Automática: A transação será aprovada automaticamente alguns segundos após a geração do QRCode.&lt;br /&gt;
&lt;br /&gt;
Para acessar a documentação completa de integração, por favor, visite: Sobre esse documento&lt;br /&gt;
Segue o kit de integração e o passo a passo para a habilitação dos logs, respectivamente: [&lt;br /&gt;
Kit de integração|https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2][&lt;br /&gt;
Kit de integração- Habilitação dos Logs.|https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2#aten%C3%A7%C3%A3o]&lt;br /&gt;
ATENÇÃO: É obrigatório habilitar os logs para realizar a homologação.&lt;br /&gt;
&lt;br /&gt;
Se você tiver alguma dúvida, precisar de assistência adicional ou encontrar qualquer problema durante o processo de integração, nossa equipe de suporte estará pronta para ajudar. Não hesite em entrar em contato conosco por meio deste chamado.&lt;br /&gt;
Agradecemos pela sua colaboração e estamos ansiosos para fornecer a melhor experiência possível durante sua fase de testes.&lt;br /&gt;
&lt;br /&gt;
Atenciosamente, SETIS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAT ==&lt;br /&gt;
&lt;br /&gt;
=== Informações ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Site Oficial:&#039;&#039;&#039; https://portal.fazenda.sp.gov.br/servicos/sat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Navegação dos Arquivos do Site&#039;&#039;&#039; (Procure pelas versões mais atualizadas na sessão de download do site oficial)&lt;br /&gt;
* &#039;&#039;&#039;Manual Orientacao SAT&#039;&#039;&#039; - arquivo geral com as orientações sobre como gerar a impressão do cupom, códigos de barras, tamanho, informações necessárias, qrcode, etc.&lt;br /&gt;
* &#039;&#039;&#039;Guia para Geração do QRCode&#039;&#039;&#039; - arquivo com as orientações para gerar o qrcode do cupom fiscal.&lt;br /&gt;
* &#039;&#039;&#039;Especificação de Requisitos do SAT&#039;&#039;&#039; - arquivo com as especificações para o desenvolvedor, como layout XML e outras informações técnicas.&lt;br /&gt;
&lt;br /&gt;
== Arquitetura ==&lt;br /&gt;
&lt;br /&gt;
O aplicativo apresenta a arquitetura dividia conforme o diagrama abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVArquitetura.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== PDVStarter == &lt;br /&gt;
&lt;br /&gt;
O PDVStarter é a classe inicial da aplicação, a classe que contém o método main(). Ela faz apenas algumas verificações mínimas e necessárias para o funcionamento, como definições do ambiente java, e logo seguida inicializa o &#039;&#039;&#039;PDVUI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== PDVUI ===&lt;br /&gt;
&lt;br /&gt;
PDVUI é a responsável pela Interface Gráfica da aplicação. A interface é montada toda com o JavaFX, por isso o método chamado no PDVUI para inicia-lo é o &#039;&#039;launch()&#039;&#039;. Ao iniciar, o JavaFX chamará o método &#039;&#039;start(Stage stage)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
O PDVUI é o responsável por montar as telas e a interface gráfica para o usuário, porém como todo o controle da aplicação é feita através do PDVApp o PDVUI lê os estados do PDVApp para saber que tela montar, que controles exibir, etc. O PDVUI é atualizado através de eventos emitidos pelo PDVApp.&lt;br /&gt;
&lt;br /&gt;
No PDVUI apenas as lógicas de UI são colocadas, como alguma validação de entradas do usuário, formatação e layout de tela, algumas questões de segurança para exibir ou esconder os componentes de tela, etc.&lt;br /&gt;
&lt;br /&gt;
==== PDVScreenInterface ====&lt;br /&gt;
&lt;br /&gt;
A classe PDVUI é a classe de controle geral da interface. Mas a cada estado do PDVState, a tela montada é &amp;quot;sub-controlada&amp;quot; pelas implementações de PDVScreenInterface. Em outras palavras, os únicos componentes que a PDVUI tem como filhas são as implementações dessa interface.&lt;br /&gt;
&lt;br /&gt;
Essas implementações montam uma tela para cada fase do sistema. Por exemplo, ao iniciar a aplicação é utilizada a &amp;quot;StartScreen&amp;quot;, que monta a tela para exibir as informações de inicialização e instalação, além da tela de Log-In. Após o login, o usuário é direcionado para a tela administrativa, montado pela &amp;quot;AdminScreen&amp;quot;. Caso o usuário entre no modo de vendas, toda a tela de venda ao consumidor (responsável por exibir as fotos de produtos ao fundo) é gerenciada pela &amp;quot;SaleScreen&amp;quot; e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Em geral, a PVDUI troca essa &amp;quot;Screen&amp;quot; para estado do PDVState. Dentro de cada estado do PDVState, seus substados são verificados e controlados por cada Screen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== BISPDVFrame ====&lt;br /&gt;
&lt;br /&gt;
Além das Screens que montam a &amp;quot;tela&amp;quot; da aplicação em cada estado, há as janelas chamadas de &amp;quot;Frames&amp;quot;. Esses frames são janelas modais que são colocadas por cima da Screen para indagar o usuário para realizar alguma função.&lt;br /&gt;
&lt;br /&gt;
Exemplos de Frames são as telas de configurações de Servidor ou do Sistema de Emissão do Cupom Fiscal, que aparecem por cima da AdminScreen. Ou a tela de identificação do cliente (CPF/Nota Paulista), que aparece por cima da SaleScreen ao começar uma nova venda.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PDVApp ==&lt;br /&gt;
&lt;br /&gt;
Esta classe Singleton é responsável pela inteligência da aplicação. Através desta classe são realizadas todas as as ações de vendas, configurações, validações, segurança etc. Assim como uma camada &amp;quot;CRUD&amp;quot;, esta classe faz a ligação entre as partes do sistema (CFSystem, Impressoras, TEF, Banco de Dados, etc.) e a interface do usuário (PDVUI).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Qualquer comando que o PDVUI receba do usuário, deve ser passado e tratado dentro do PDVApp, sincronizado se for o caso. O PDVApp processa e valida o comando.&lt;br /&gt;
&lt;br /&gt;
Abaixo o mapa completo dos estados e &amp;quot;sub-estados&amp;quot; que o PDVApp pode assumir:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVFullStateMap.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== PDVState ===&lt;br /&gt;
&lt;br /&gt;
O PDVApp pode ser considerado uma máquina de estados se analisar os passos que ele segue, e que ele guia o usuário. O controle do passo em que o PDVApp está é feito através do atributo PDVState dentro do próprio PDVApp.&lt;br /&gt;
&lt;br /&gt;
Assim que aplicação é iniciada, este estado é inicializado com o valor &amp;quot;START&amp;quot;, que implica que aplicação está iniciando. Em seguida ela seguirá o fluxo conforme a imagem abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVPDVState.png|center]]&lt;br /&gt;
&lt;br /&gt;
==== PDVStateSales ====&lt;br /&gt;
&lt;br /&gt;
Estes estatus servem como sub-status quando o PDVState está em SALES. Estes estados tem a função de definir em que passo da venda o PDVApp está no momento.&lt;br /&gt;
&lt;br /&gt;
Quando o PDVState entrar no estado &amp;quot;SALES&amp;quot;, o PDVStateSales deve iniciar no valor &amp;quot;NONE&amp;quot;. Assim como para que o PDVState possa sair do estado &amp;quot;SALES&amp;quot;, é obrigatório que o PDVStateSales tenha o valor &amp;quot;NONE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{nota|Recuperação de Desligamento|Em caso de recuperação de desligamento incorreto, o sistema pode entrar no modo PDVState &amp;quot;SALES&amp;quot; e o PDVStateSales já ter um valor carregado diferente. Que tenha sido persistido e recuperado junto com o CheckoutDat}}&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVPDVStateSales.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;NONE&#039;&#039;&#039; - Este estado indica que embora o PDVApp esteja no estado de venda, no momento não há nenhuma venda ocorrendo. Toda vez que o PDVState entrar em &#039;&#039;&#039;Selling&#039;&#039;&#039;, o PDVStateSales inicia neste estado. Assim como, para que o PDVState saia do estado &#039;&#039;&#039;Selling&#039;&#039;&#039;, é necessário que o PDVStateSales já tenha retornado para o NONE.&lt;br /&gt;
*: Apenas no caso de recuperação de desligamento incorreto o sistema o PDVState pode entrar em Selling, e já encontrar o PDVStateSale em um estado diferente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_SELLING&#039;&#039;&#039; - Este estado indica que há uma venda ocorrendo neste momento, e que a venda está efetivamente no estado de &amp;quot;venda&amp;quot;. Isto é, indica que a venda está no processo de registrar os itens que estão sendo vendidos ao consumidor.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_PAYMENT&#039;&#039;&#039; - Após o término do estado anterior, quando todos os itens já estão registrados para venda, passamos para o estado de planejamento dos pagamentos. Neste passo indicamos para o sistema como os pagamentos serão realizados. Só conseguimos passar para o passo seguinte depois de informar pagamentos suficientes para quitar o total dos produtos vendidos no passo anterior.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_FINALIZATION&#039;&#039;&#039; - Após informar os produtos e as formas de pagamento, o sistema entra neste passo para finalizar toda a venda. Neste passo o sistema processa toda a informação fornecida nos passos anteriores (itens e pagamentos), e executa tudo o que for necessário. Por exemplo, pagamentos com TEF, Tiquetes e outras operações que envolvam sistemas externos serão notificados e ativados no processamento deste passo.&lt;br /&gt;
*: Ao entrar neste passo o usuário não terá mais autonomia para retornar aos passos anteriores. A única condição que permitirá que o usuário volte ao passo anterior será a ocorrência de algum erro durante o processamento E QUE permita esse retrocesso ao passo anterior.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_SHOW&#039;&#039;&#039; - Ao terminar o processamento de finalização da venda, o sistema para neste passo. Neste passo o cupom e as informações continuam carregadas no PDVApp mas já estão todas processadas, salvas e finalizadas. Este passo tem apenas a finalidade de permitir que informações sejam exibidas ao usuário pelo UI. Assim que o usuário as confirmar, o sistema descarrega das variáveis esta venda e volta para o passo &#039;&#039;&#039;NONE&#039;&#039;&#039;, preparando-se para outra venda ou outra operação.&lt;br /&gt;
&lt;br /&gt;
=== PDVApp Listeners ===&lt;br /&gt;
&lt;br /&gt;
==== PDVSaleEventListener ====&lt;br /&gt;
&lt;br /&gt;
Este listener oferece notificações dos eventos relacionados a operação de venda ao consumidor. Como por exemplo, &amp;quot;Nova venda iniciada&amp;quot; (OPENCUPOM), &amp;quot;Última Venda Cancelada&amp;quot; (CALCELLASTCFX), &amp;quot;Venda atual cancelada&amp;quot; (CANCELHALFCFX), &amp;quot;Item Vendido/Registrado&amp;quot; (ITEMSOLD), e assim por diante....&lt;br /&gt;
&lt;br /&gt;
==== PDVStateChangeListener ====&lt;br /&gt;
&lt;br /&gt;
Este listener é acionado a cada alteração no valor do PDVState.&lt;br /&gt;
&lt;br /&gt;
== StartCheck ==&lt;br /&gt;
&lt;br /&gt;
StartCheck é a rotina de inicialização que o PDVApp executa logo após a aplicação ser iniciada, antes que o usuário possa realizar qualquer interação com a aplicação. A rotina do StartCheck segue os passos conforme o Fluxograma abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVStartCheck.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INITING&#039;&#039;&#039; - é apenas o primeiro estado, o estado inicial de quando a aplicação é carregada. Não há nenhuma execução neste estado, apenas é passado para o próximo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039; - Este passo é responsável por verificar o banco de dados local. Verifica sua existência e tentativa de conexão. Caso ele não exista, é criado. Caso não seja possível conectar, lança erro avisando o usuário que provavelmente há outra instância da aplicação rodando.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039; - Complementar a tarefa anterior, neste passo o sistema verifica a versão do banco de dados atual. Caso a aplicação tenha sido atualizada este passo executará os comandos necessários para atualizar o banco antes que o resto da aplicação tente acessa-lo. Caso a atualização tenha algum problema a aplicação é encerrada para evitar que o uso dos dados de forma incorreta danifiquem os dados.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039; - Este passo é essencial para a configuração da aplicação. Antes que o usuário possa utilizar a aplicação é necessário que alguma configurações sejam definidas, como por exemplo endereço do servidor, e periféricos pertinentes ao caixa. Caso a verificação perceba que alguma configuração inicial é necessária o StartCheck será interrompido e o sistema entrará no estado &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;. &lt;br /&gt;
*: Ao entrar neste estado o PDVUI detecta e exibirá o Wizard de configuração para o usuário. Uma vez que o Wizard seja finalizado ele envia ao PDVApp o comando para tentar o &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039; novamente. E em caso de sucesso, seguirá para o próximo passo.&lt;br /&gt;
*: Note que a maior parte das configurações, principalmente as que são iguais para todos os caixas, é definida pelo servidor e sincronizada para todos os caixas. Não há como altera-las diretamente na aplicação.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039; - Neste passo não há processamento, é apenas um passo indicativo de que a instalação está OK e que pode continuar. Um estado &amp;quot;contrário&amp;quot; ao &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;, fazendo que o StartCheck continue sua rotina.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039; - Durante a primeira inicialização/instalação da aplicação ela se registrará no servidor recebendo um ID único para identificação deste terminal deste ponto em diante. Servindo para rastrear tudo o que acontece em cada caixa/terminal de atendimento.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OK&#039;&#039;&#039; - Este é o passo final, que indica para as outras rotinas de que o StartCheck finalizou com sucesso é que o PDVApp está pronto para seguir para o próximo passo.&lt;br /&gt;
&lt;br /&gt;
== CFSystem ==&lt;br /&gt;
&lt;br /&gt;
O CFSystem (Sistema de Cupom Fiscal) é o nome dado para o encapsulamento dos diferentes sistemas de emissão de cupom fiscal - SAT, ECF, NFCe, etc. - suportados atualmente ou que venham a existir no futuro. Separando o controle da emissão do cupom fiscal das rotinas do sistema permite que o mesmo app seja reaproveitado para todas as tecnologias existes com pouca ou nenhuma adaptação.&lt;br /&gt;
&lt;br /&gt;
Esse encapsulamento funciona porque embora independente de como a tecnologia da emissão funcione a rotina de venda é sempre a mesma de forma geral: &amp;quot;Inicia a Venda - Registra Produtos - Executa Descontos e Totalizações - Recebe Pagamentos - Finaliza Venda&amp;quot;. A cada passo da venda o PDVApp chamará os métodos da interface do CFSystem para notificar os acontecimentos da venda. Devendo o CFSystem traduzir e organizar o funcionamento para cada tecnologia.&lt;br /&gt;
&lt;br /&gt;
O CFSystem é uma interface que permite as implementações das distintas tecnologias. Assim, cada implementação do CFSystem representa um equipamento e modelo de emissão diferentes. Por exemplo, a implementação para suporte do ECF Daruma é uma classe &amp;quot;CFSystemECFDaruma&amp;quot; que implementa a CFSystem.&lt;br /&gt;
&lt;br /&gt;
O CFSystem também apresenta os métodos para impressão de relatórios gerenciais e outros documentos não fiscais.&lt;br /&gt;
&lt;br /&gt;
=== CFSystemFactory ===&lt;br /&gt;
&lt;br /&gt;
Esta classe permite que a implementação correta do CFSystem seja retornada de acordo com os parâmetros de configuração passados. Seguindo o pattern &amp;quot;Factory&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Cupom Fiscal / PDVCupomVO ==&lt;br /&gt;
&lt;br /&gt;
Independente do sistema de emissão do cupom fiscal, o cupom fiscal é representado no sistema pelo PDVCupomVO. Para cada tipo de cupom fiscal (emitido por sistemas diferentes) o objeto apresentará um conjunto de atributos obrigatórios.&lt;br /&gt;
&lt;br /&gt;
=== Ciclo de Vida do Cupom Fiscal ===&lt;br /&gt;
&lt;br /&gt;
O cupom fiscal segue um ciclo de vida básico representado pela enumeration PDVCUPOMSTATUS, conforme o diagrama abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVCupomStatus.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados Adicionais|Alguns sistemas de emissão, como o NFCe, apresentam mais estados por conta do controle de transmissão e emissão. Esses estados adicionais serão tratados no capítulo próprio do sistema. Vale a pena verifica se esses estados devem continuar utilizando a mesma variável ou se deve ter um conjunto de estados a parte dentro do VO, para não interferir no funcionamento do PDVApp, uma vez que o sistema de emissão é abstraído pela interface CFSystem.}}&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISPDV&amp;diff=1659</id>
		<title>BISPDV</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISPDV&amp;diff=1659"/>
		<updated>2025-11-19T21:52:22Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* DOCUMENTAÇÃO A SER REVISADA! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O BISPDV é a aplicação utilizada na frente de caixa para realização da venda ao consumidor e de outra funções pertinentes à venda e atendimento do cliente da loja.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Pendências, Informações e Guia sobre a implementação =&lt;br /&gt;
&lt;br /&gt;
* O projeto anterior (bis2.pdv) está sendo descontinuado por ainda ter código com suporte a ECF e SAT, que estão em caindo em desuso. Para rever e simplificar o código um novo projeto (bis.pdv) foi criado e o código está sendo revisado e repassado para o novo projeto. Uma vez concluído o projeto bis2.pdv será descontinuado.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alterações em andamento:&#039;&#039;&#039;&lt;br /&gt;
# Para agilidade, foi definido que não utilizaremos o RFWDAO, mas manter a arquitetura de DAO original.&lt;br /&gt;
# Removido código relacionados ao ECF e ao SAT, este novo projeto emitirá cupons apenas utilizando o NFCe, utilizando o código do módulo RFW.SEFAZ.&lt;br /&gt;
# O Bundle foi rebatizado para bispdvbundle.properties, e passou a utilizar as chaves BISPDV_NNNNNN. Todas as chaves antigas foram copiadas para o arquivo e ao fechamento da versão devem ser revisadas, e as sobreviventes renomeadas.&lt;br /&gt;
&lt;br /&gt;
= Inicialização do Sistema =&lt;br /&gt;
&lt;br /&gt;
[[Imagem:inicialização_pdvapp.png|center|Inicialização do Sistema]]&lt;br /&gt;
&lt;br /&gt;
A inicialização do aplicativo segue as seguintes regras:&lt;br /&gt;
&lt;br /&gt;
== PDVStarter ==&lt;br /&gt;
A aplicação deve ser inicializada sempre por esta classe que contém o método &#039;&#039;main()&#039;&#039;;&lt;br /&gt;
: Esta classe não faz absolutamente nada além de passar a chamada, incluindo os argumentos de linha de comando para a &#039;&#039;&#039;PDVUpdater&#039;&#039;&#039;. Sua existência tem a finalidade de permitir a incorporação de plugins, siffers, debugger e outras ferramentas na aplicação. Para isso, basta que a ferramenta implemente uma &#039;sósia&#039; desta classe (mesmo nome e package), e que sua bibliotexa (.jar) seja carregada no classpath antes dos .jars da própria aplicação. Após realizar o que for necessário a ferramenta deve repassar a chamada para &#039;&#039;&#039;PDVUpdater&#039;&#039;&#039; da mesma forma, para que a aplicação se inicie em seu fluxo normal.&lt;br /&gt;
&lt;br /&gt;
== PDVUpdater ==&lt;br /&gt;
&lt;br /&gt;
Esta classe que concentra as tarefas de inicialização da aplicação recebe os seguintes parâmetros:&lt;br /&gt;
* &#039;&#039;&#039;-help&#039;&#039;&#039; - Exibe este menu de opções.&lt;br /&gt;
* &#039;&#039;&#039;-testDarumaFW&#039;&#039;&#039; - Não inicializa a aplicacao. Tenta apenas inicializar as bibliotecas da DarumaDramework, verificando se as DLLs estão OK. Não faz comunicação com a impressora.&lt;br /&gt;
* &#039;&#039;&#039;-watcher&#039;&#039;&#039; - Habilita uma thread que imprime o valor de algumas variáveis do sistema a cada segundo no console do sistema.&lt;br /&gt;
* &#039;&#039;&#039;-autoSaleTest&#039;&#039;&#039; - Carrega um arquivo de vendas automáticas. Esse arquivo deve conter o que deve ser vendido, e as vendas serão feitas automaticamente no horário programado.&lt;br /&gt;
* &#039;&#039;&#039;-noUI&#039;&#039;&#039; - Não inicializa a UI do PDVApp. Útil quando estamos utilizando o -saleFile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Valida se é a única instância tentando bloquear o arquivo &#039;&#039;&#039;.\\instance.lock&#039;&#039;&#039; no diretório da aplicação.&lt;br /&gt;
&lt;br /&gt;
== PDVApp ==&lt;br /&gt;
&lt;br /&gt;
O &#039;&#039;&#039;PDVApp&#039;&#039;&#039; é o coração da aplicação. Funciona com uma série de máquinas de estado (workflows) que definem a lógica da operação da aplicação.&lt;br /&gt;
&lt;br /&gt;
= Workflows do Sistema =&lt;br /&gt;
== Principal: &#039;&#039;&#039;PDVState&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:workflow_pdvstate.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esse é o WORKFLOW geral da aplicação, é definida nos valores da enum &#039;&#039;&#039;PDVState&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;START&#039;&#039;&#039; - Valor inicial, utilizado somente na inicialização da aplicação.&lt;br /&gt;
*: Neste passo é iniciado o workflow &#039;&#039;&#039;StartCheckStatus&#039;&#039;&#039;, enquanto esse workflow secundário é executado, o PDVState é passado para o estado &#039;&#039;&#039;STARTCHECK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STARTCHECK&#039;&#039;&#039; - Estado enquanto a checagem inicial do sistema ocorre;&lt;br /&gt;
*: Se a checagem inicial finalizar com sucesso vai para o estado &#039;&#039;&#039;WAITINGLOGIN&#039;&#039;&#039;, em caso de erro vai para o &#039;&#039;&#039;STARTCHECK_FAIL&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STARTCHECK_FAIL&#039;&#039;&#039; - indicador de que o processo de checagem inicial terminou com erro.&lt;br /&gt;
*: Não há saída desse estado, a não ser reiniciar ou refazer a instalação do PDVApp.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WAITINGLOGIN&#039;&#039;&#039; - Sinaliza que o sistema está aguradando o login.&lt;br /&gt;
*: Fica nesse estado até que o PDVUI interaja com o usuário para executar o login.&lt;br /&gt;
*: Uma vez feita o login pelo método doLogin(), se realizado com sucesso para para o estado &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039; - Estado em que o sistema permite ser configurado, e permite acesso a outras funções administravias do checkout (como abrir e fechar o checkout).&lt;br /&gt;
*: Este já um estado de uso do sistema, deste estado o usuário pode entrar no modo de venda &#039;&#039;&#039;SALES&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALES&#039;&#039;&#039; - Estado em que o sistema entra no modo de vendas, permite a abertura de venda, venda de produtos, recebimento, etc.&lt;br /&gt;
*: Sempre que não estiver com uma venda aberta, o usuário pode voltar para o estado &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Uma vez nos estrados &#039;&#039;&#039;ADMINISTRATIVE&#039;&#039;&#039; ou &#039;&#039;&#039;SALES&#039;&#039;&#039; o usuário não pode mais voltar para os outros estados até que a aplicação seja finalizada.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inicialização: &#039;&#039;&#039;StartCheckStatus&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagem:workflow_StartCheckStatus.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esse é o WORKFLOW que cuida da checagem e inicialização inicial do sistema. Seus funcionamento é assim:&lt;br /&gt;
* &#039;&#039;&#039;INITING&#039;&#039;&#039; - Estado inicial de começo das checkagens;&lt;br /&gt;
*: Neste estágio o sistema começa a ser inicializado, como carregamento dos bundles.&lt;br /&gt;
*: Tudo inicializado com sucesso, passa para o estado &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039; - Estado para verificação do banco de dados.&lt;br /&gt;
*: Verifica se o banco de dados existe, se não existir o cria;&lt;br /&gt;
*: Passa para o estado &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039; - Verifica se o banco de dados está na versão correta e faz as alterações/atualizações necessárias;&lt;br /&gt;
*: Quando atualizado passa para o &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;- Valida se a instalação do PDV está ok (empresa configurada, dados sincronizados, etc.).&lt;br /&gt;
*: Se a instalação estiver OK vai para o estado &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039;, caso contrário para &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;&lt;br /&gt;
*: Nesse estado o PDVApp não faz nada, mas serve de sinalização para o &#039;&#039;&#039;PDVUI&#039;&#039;&#039; que a instalação precisa ser realizada, e a tela é exibida. Quando a tela de instalação é finalizada, o PDVUI sinaliza para o &#039;&#039;&#039;PDVAapp&#039;&#039;&#039; que volta para o estado de &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039; - Estado sem operação, apenas sinalizando que a Instalação está completa.&lt;br /&gt;
*: Passa automaticamente para o estado &#039;&#039;&#039;START_TERMINALAPP&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;START_TERMINALAPP&#039;&#039;&#039; - Inicializa o Terminal Client (Reponsável por realizar a comunicação com o servidor).&lt;br /&gt;
*: Após inicializá-lo passa automaticamente para o estado &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039; - Valida se o ID atual configurado na estação PDV está válido e cadastrado corretamente no servidor.&lt;br /&gt;
*: Se o cadastro estiver OK passa para &#039;&#039;&#039;LOAD_CHECKOUT_DATA&#039;&#039;&#039;, caso contrário trava a aplicação em erro para garantir que seja reinstalada.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LOAD_CHECKOUT_DATA&#039;&#039;&#039; - Carrega as informações do CheckoutData, se existir, para continuar com a aplicação a partir do ponto em que estava. Se não encontrar, procura manualmente se há algum caixa em aberto no banco de dados e &amp;quot;cria&amp;quot; o CheckoutData para continuar o checkout aberto (e não perder sessões de checkouts a cada vez que se perde o CheckoutData). &#039;&#039;&#039;Em adicional&#039;&#039;&#039;, (re)carrega o CFSystem para que o sistema esteja pronto para emitir cupons fiscais.&lt;br /&gt;
*: Passa para o &#039;&#039;&#039;START_SYNCDATA&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;START_SYNCDATA&#039;&#039;&#039; - Inicializa a Thread responsável por sincronizar os dados com/do servidor.&lt;br /&gt;
*: Passa para o &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OK&#039;&#039;&#039; - Estado em que o WORKFLOW finalizou com sucesso. Utilizado para sinalizar outras partes do sistema que a inicialização terminou com sucesso e o sistema está pronto para ser utilizado.&lt;br /&gt;
*: Sinaliza o PDVApp de que este workflou finalizou através do método &#039;&#039;&#039;app.freeStartCheck()&#039;&#039;&#039;, que dá sequência no workflow &#039;&#039;&#039;PDVState&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== PDVUI ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== NFC-e ==&lt;br /&gt;
&lt;br /&gt;
A emissão de NFCe é realizada pelo mesmo site da NFe. O BISPDV utilizará o módulo [https://wiki.rodrigogml.eng.br/index.php/P%C3%A1gina_principal#RFW_-_Sefaz RFW.SEFAZ]. Toda a documentação técnica estará no site do módulo. &#039;&#039;&#039;Concentrar aqui apenas as informações relacionadas ao BISPDV e à configuração/utilização do módulo&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Cadastros do Sistema =&lt;br /&gt;
&lt;br /&gt;
== Items ==&lt;br /&gt;
&lt;br /&gt;
A aplicação BISPDV não suporta cadastro de itens diretamente no aplicativo. A base de itens para venda é sincronizada diretamente do servidor para a aplicação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para a aplicação é enviada apenas apenas os campos do cadastro de itens necessários para realizar a venda do produto, um objeto &amp;lt;code&amp;gt;PDVItemVO&amp;lt;/code&amp;gt; é montado com as informações da estrutura de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A conversão é feita a partir do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt; e não de &amp;lt;code&amp;gt;ItemVO&amp;lt;/code&amp;gt;. Isso porque cada código de item pode ser vendido por preços diferentes, quantidades diferentes, unidades de medidas diferentes entre outros. Para o BISPDV cada código funciona como um produto cadastro diferente que pode ser vendido. Já no servidor, a venda de cada código é tratada como uma venda do mesmo item (respeitando a quantidade, preços, etc.). A conversão/envio dos códigos para venda no PDV é realizada da seguinte forma:&lt;br /&gt;
* Apenas produtos que tenham a finalidade marcada como &#039;&#039;&#039;Revenda&#039;&#039;&#039; ou &#039;&#039;&#039;Produto Acabado&#039;&#039;&#039; tem seus códigos sincronizados no PDV.&lt;br /&gt;
* O &amp;lt;code&amp;gt;ID&amp;lt;/code&amp;gt; aplicado no &amp;lt;code&amp;gt;PDVItemVO&amp;lt;/code&amp;gt; é o mesmo do &amp;lt;code&amp;gt;ItemCodeVO&amp;lt;/code&amp;gt;, utilizado como referência para sincronizar os novos códigos ou alterações do servidor.&lt;br /&gt;
* O &amp;lt;code&amp;gt;IDItem&amp;lt;/code&amp;gt; é atribuído em outro atibuto, e é utilizado pelo servidor para associar o item do cupom (vendas) ao ItemVO correto. Essa medida visa não perder o relacionamento entre os objetos de Item de Documentos fiscais com o cadastro de item. Isso porque o objeto ItemCodeVO pode ser excluído do sistema, já o ItemVO é só marcado como excluído no sistema e mantido para efeitos de histório, ou seja, ItemCodeVO é um objeto volátil e não pode ser utilizado para referência ou vinculação com objetos de registro ou histórico.&lt;br /&gt;
* a&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DOCUMENTAÇÃO A SER REVISADA! =&lt;br /&gt;
O Conteúdo a seguir precisa ser revisado desde a &amp;quot;reimplementação&amp;quot; do PDVApp (BIS2.PDV - Projeto com código do ECF e SAT) para o novo (BIS.PDV - Projeto dedicado apenas ao código do NFCe)&lt;br /&gt;
&lt;br /&gt;
== PayGo ==&lt;br /&gt;
&lt;br /&gt;
O PayGo é o sistema integrado de TEF do sistma.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observações Importantes&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;Site de suporte e manual do desenvolvedor:&#039;&#039;&#039; https://paygodev.readme.io/docs/vis%C3%A3o-geral&lt;br /&gt;
* &#039;&#039;&#039;Download do Kit de Integração:&#039;&#039;&#039; https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2&lt;br /&gt;
* O BISPDV utiliza a versão de troca de arquivos txt, que é a continuação da versão do da NTK na qual o sistema foi homologado inicialmente.&lt;br /&gt;
&lt;br /&gt;
=== Instalação Ambiente de Testes/Homologação ===&lt;br /&gt;
&lt;br /&gt;
Para instalação do ambiente de testes/homologação seguir as instruções do site: https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2.&lt;br /&gt;
Em 28/01/2025 solicitei cadastro para uma nova homologação e ativação do sistema e recebi um e-mail com o seguinte conteúdo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Giovanna de Mello Doroteio comentou\: Prezado(a), Rodrigo.&lt;br /&gt;
Agradecemos por escolher nossos serviços. Para garantir uma experiência tranquila e bem-sucedida durante a integração, estamos fornecendo os dados de instalação e informações sobre os adquirentes disponíveis em nosso servidor de testes.&lt;br /&gt;
&lt;br /&gt;
Dados de Instalação:&lt;br /&gt;
&lt;br /&gt;
Id de Instalação: 344384&lt;br /&gt;
Senha: A70C47D1&lt;br /&gt;
Adquirentes disponíveis em nosso servidor de testes:&lt;br /&gt;
&lt;br /&gt;
Adquirente DEMO:&lt;br /&gt;
Função: Simula uma sub-adquirente.&lt;br /&gt;
&lt;br /&gt;
Adquirente REDE:&lt;br /&gt;
Função: Simula uma adquirente.&lt;br /&gt;
Restrição no Ambiente de Sandbox: Aceita apenas valores inteiros.&lt;br /&gt;
Importante: Qualquer valor com centavos resultará em uma transação negada.&lt;br /&gt;
&lt;br /&gt;
Adquirente PIX C6 BANK:&lt;br /&gt;
Função: Simula operações com Pix e carteira digital.&lt;br /&gt;
Processo: Após uma transação, o QRCode para pagamento será gerado.&lt;br /&gt;
Aprovação Automática: A transação será aprovada automaticamente alguns segundos após a geração do QRCode.&lt;br /&gt;
&lt;br /&gt;
Para acessar a documentação completa de integração, por favor, visite: Sobre esse documento&lt;br /&gt;
Segue o kit de integração e o passo a passo para a habilitação dos logs, respectivamente: [&lt;br /&gt;
Kit de integração|https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2][&lt;br /&gt;
Kit de integração- Habilitação dos Logs.|https://paygodev.readme.io/docs/kit-de-integra%C3%A7%C3%A3o-2#aten%C3%A7%C3%A3o]&lt;br /&gt;
ATENÇÃO: É obrigatório habilitar os logs para realizar a homologação.&lt;br /&gt;
&lt;br /&gt;
Se você tiver alguma dúvida, precisar de assistência adicional ou encontrar qualquer problema durante o processo de integração, nossa equipe de suporte estará pronta para ajudar. Não hesite em entrar em contato conosco por meio deste chamado.&lt;br /&gt;
Agradecemos pela sua colaboração e estamos ansiosos para fornecer a melhor experiência possível durante sua fase de testes.&lt;br /&gt;
&lt;br /&gt;
Atenciosamente, SETIS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAT ==&lt;br /&gt;
&lt;br /&gt;
=== Informações ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Site Oficial:&#039;&#039;&#039; https://portal.fazenda.sp.gov.br/servicos/sat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Navegação dos Arquivos do Site&#039;&#039;&#039; (Procure pelas versões mais atualizadas na sessão de download do site oficial)&lt;br /&gt;
* &#039;&#039;&#039;Manual Orientacao SAT&#039;&#039;&#039; - arquivo geral com as orientações sobre como gerar a impressão do cupom, códigos de barras, tamanho, informações necessárias, qrcode, etc.&lt;br /&gt;
* &#039;&#039;&#039;Guia para Geração do QRCode&#039;&#039;&#039; - arquivo com as orientações para gerar o qrcode do cupom fiscal.&lt;br /&gt;
* &#039;&#039;&#039;Especificação de Requisitos do SAT&#039;&#039;&#039; - arquivo com as especificações para o desenvolvedor, como layout XML e outras informações técnicas.&lt;br /&gt;
&lt;br /&gt;
== Arquitetura ==&lt;br /&gt;
&lt;br /&gt;
O aplicativo apresenta a arquitetura dividia conforme o diagrama abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVArquitetura.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== PDVStarter == &lt;br /&gt;
&lt;br /&gt;
O PDVStarter é a classe inicial da aplicação, a classe que contém o método main(). Ela faz apenas algumas verificações mínimas e necessárias para o funcionamento, como definições do ambiente java, e logo seguida inicializa o &#039;&#039;&#039;PDVUI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== PDVUI ===&lt;br /&gt;
&lt;br /&gt;
PDVUI é a responsável pela Interface Gráfica da aplicação. A interface é montada toda com o JavaFX, por isso o método chamado no PDVUI para inicia-lo é o &#039;&#039;launch()&#039;&#039;. Ao iniciar, o JavaFX chamará o método &#039;&#039;start(Stage stage)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
O PDVUI é o responsável por montar as telas e a interface gráfica para o usuário, porém como todo o controle da aplicação é feita através do PDVApp o PDVUI lê os estados do PDVApp para saber que tela montar, que controles exibir, etc. O PDVUI é atualizado através de eventos emitidos pelo PDVApp.&lt;br /&gt;
&lt;br /&gt;
No PDVUI apenas as lógicas de UI são colocadas, como alguma validação de entradas do usuário, formatação e layout de tela, algumas questões de segurança para exibir ou esconder os componentes de tela, etc.&lt;br /&gt;
&lt;br /&gt;
==== PDVScreenInterface ====&lt;br /&gt;
&lt;br /&gt;
A classe PDVUI é a classe de controle geral da interface. Mas a cada estado do PDVState, a tela montada é &amp;quot;sub-controlada&amp;quot; pelas implementações de PDVScreenInterface. Em outras palavras, os únicos componentes que a PDVUI tem como filhas são as implementações dessa interface.&lt;br /&gt;
&lt;br /&gt;
Essas implementações montam uma tela para cada fase do sistema. Por exemplo, ao iniciar a aplicação é utilizada a &amp;quot;StartScreen&amp;quot;, que monta a tela para exibir as informações de inicialização e instalação, além da tela de Log-In. Após o login, o usuário é direcionado para a tela administrativa, montado pela &amp;quot;AdminScreen&amp;quot;. Caso o usuário entre no modo de vendas, toda a tela de venda ao consumidor (responsável por exibir as fotos de produtos ao fundo) é gerenciada pela &amp;quot;SaleScreen&amp;quot; e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Em geral, a PVDUI troca essa &amp;quot;Screen&amp;quot; para estado do PDVState. Dentro de cada estado do PDVState, seus substados são verificados e controlados por cada Screen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== BISPDVFrame ====&lt;br /&gt;
&lt;br /&gt;
Além das Screens que montam a &amp;quot;tela&amp;quot; da aplicação em cada estado, há as janelas chamadas de &amp;quot;Frames&amp;quot;. Esses frames são janelas modais que são colocadas por cima da Screen para indagar o usuário para realizar alguma função.&lt;br /&gt;
&lt;br /&gt;
Exemplos de Frames são as telas de configurações de Servidor ou do Sistema de Emissão do Cupom Fiscal, que aparecem por cima da AdminScreen. Ou a tela de identificação do cliente (CPF/Nota Paulista), que aparece por cima da SaleScreen ao começar uma nova venda.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PDVApp ==&lt;br /&gt;
&lt;br /&gt;
Esta classe Singleton é responsável pela inteligência da aplicação. Através desta classe são realizadas todas as as ações de vendas, configurações, validações, segurança etc. Assim como uma camada &amp;quot;CRUD&amp;quot;, esta classe faz a ligação entre as partes do sistema (CFSystem, Impressoras, TEF, Banco de Dados, etc.) e a interface do usuário (PDVUI).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Qualquer comando que o PDVUI receba do usuário, deve ser passado e tratado dentro do PDVApp, sincronizado se for o caso. O PDVApp processa e valida o comando.&lt;br /&gt;
&lt;br /&gt;
Abaixo o mapa completo dos estados e &amp;quot;sub-estados&amp;quot; que o PDVApp pode assumir:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVFullStateMap.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== PDVState ===&lt;br /&gt;
&lt;br /&gt;
O PDVApp pode ser considerado uma máquina de estados se analisar os passos que ele segue, e que ele guia o usuário. O controle do passo em que o PDVApp está é feito através do atributo PDVState dentro do próprio PDVApp.&lt;br /&gt;
&lt;br /&gt;
Assim que aplicação é iniciada, este estado é inicializado com o valor &amp;quot;START&amp;quot;, que implica que aplicação está iniciando. Em seguida ela seguirá o fluxo conforme a imagem abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVPDVState.png|center]]&lt;br /&gt;
&lt;br /&gt;
==== PDVStateSales ====&lt;br /&gt;
&lt;br /&gt;
Estes estatus servem como sub-status quando o PDVState está em SALES. Estes estados tem a função de definir em que passo da venda o PDVApp está no momento.&lt;br /&gt;
&lt;br /&gt;
Quando o PDVState entrar no estado &amp;quot;SALES&amp;quot;, o PDVStateSales deve iniciar no valor &amp;quot;NONE&amp;quot;. Assim como para que o PDVState possa sair do estado &amp;quot;SALES&amp;quot;, é obrigatório que o PDVStateSales tenha o valor &amp;quot;NONE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{nota|Recuperação de Desligamento|Em caso de recuperação de desligamento incorreto, o sistema pode entrar no modo PDVState &amp;quot;SALES&amp;quot; e o PDVStateSales já ter um valor carregado diferente. Que tenha sido persistido e recuperado junto com o CheckoutDat}}&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVPDVStateSales.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;NONE&#039;&#039;&#039; - Este estado indica que embora o PDVApp esteja no estado de venda, no momento não há nenhuma venda ocorrendo. Toda vez que o PDVState entrar em &#039;&#039;&#039;Selling&#039;&#039;&#039;, o PDVStateSales inicia neste estado. Assim como, para que o PDVState saia do estado &#039;&#039;&#039;Selling&#039;&#039;&#039;, é necessário que o PDVStateSales já tenha retornado para o NONE.&lt;br /&gt;
*: Apenas no caso de recuperação de desligamento incorreto o sistema o PDVState pode entrar em Selling, e já encontrar o PDVStateSale em um estado diferente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_SELLING&#039;&#039;&#039; - Este estado indica que há uma venda ocorrendo neste momento, e que a venda está efetivamente no estado de &amp;quot;venda&amp;quot;. Isto é, indica que a venda está no processo de registrar os itens que estão sendo vendidos ao consumidor.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_PAYMENT&#039;&#039;&#039; - Após o término do estado anterior, quando todos os itens já estão registrados para venda, passamos para o estado de planejamento dos pagamentos. Neste passo indicamos para o sistema como os pagamentos serão realizados. Só conseguimos passar para o passo seguinte depois de informar pagamentos suficientes para quitar o total dos produtos vendidos no passo anterior.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_FINALIZATION&#039;&#039;&#039; - Após informar os produtos e as formas de pagamento, o sistema entra neste passo para finalizar toda a venda. Neste passo o sistema processa toda a informação fornecida nos passos anteriores (itens e pagamentos), e executa tudo o que for necessário. Por exemplo, pagamentos com TEF, Tiquetes e outras operações que envolvam sistemas externos serão notificados e ativados no processamento deste passo.&lt;br /&gt;
*: Ao entrar neste passo o usuário não terá mais autonomia para retornar aos passos anteriores. A única condição que permitirá que o usuário volte ao passo anterior será a ocorrência de algum erro durante o processamento E QUE permita esse retrocesso ao passo anterior.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SALE_SHOW&#039;&#039;&#039; - Ao terminar o processamento de finalização da venda, o sistema para neste passo. Neste passo o cupom e as informações continuam carregadas no PDVApp mas já estão todas processadas, salvas e finalizadas. Este passo tem apenas a finalidade de permitir que informações sejam exibidas ao usuário pelo UI. Assim que o usuário as confirmar, o sistema descarrega das variáveis esta venda e volta para o passo &#039;&#039;&#039;NONE&#039;&#039;&#039;, preparando-se para outra venda ou outra operação.&lt;br /&gt;
&lt;br /&gt;
=== PDVApp Listeners ===&lt;br /&gt;
&lt;br /&gt;
==== PDVSaleEventListener ====&lt;br /&gt;
&lt;br /&gt;
Este listener oferece notificações dos eventos relacionados a operação de venda ao consumidor. Como por exemplo, &amp;quot;Nova venda iniciada&amp;quot; (OPENCUPOM), &amp;quot;Última Venda Cancelada&amp;quot; (CALCELLASTCFX), &amp;quot;Venda atual cancelada&amp;quot; (CANCELHALFCFX), &amp;quot;Item Vendido/Registrado&amp;quot; (ITEMSOLD), e assim por diante....&lt;br /&gt;
&lt;br /&gt;
==== PDVStateChangeListener ====&lt;br /&gt;
&lt;br /&gt;
Este listener é acionado a cada alteração no valor do PDVState.&lt;br /&gt;
&lt;br /&gt;
== StartCheck ==&lt;br /&gt;
&lt;br /&gt;
StartCheck é a rotina de inicialização que o PDVApp executa logo após a aplicação ser iniciada, antes que o usuário possa realizar qualquer interação com a aplicação. A rotina do StartCheck segue os passos conforme o Fluxograma abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVStartCheck.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INITING&#039;&#039;&#039; - é apenas o primeiro estado, o estado inicial de quando a aplicação é carregada. Não há nenhuma execução neste estado, apenas é passado para o próximo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB&#039;&#039;&#039; - Este passo é responsável por verificar o banco de dados local. Verifica sua existência e tentativa de conexão. Caso ele não exista, é criado. Caso não seja possível conectar, lança erro avisando o usuário que provavelmente há outra instância da aplicação rodando.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_LOCALDB_VERSION&#039;&#039;&#039; - Complementar a tarefa anterior, neste passo o sistema verifica a versão do banco de dados atual. Caso a aplicação tenha sido atualizada este passo executará os comandos necessários para atualizar o banco antes que o resto da aplicação tente acessa-lo. Caso a atualização tenha algum problema a aplicação é encerrada para evitar que o uso dos dados de forma incorreta danifiquem os dados.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039; - Este passo é essencial para a configuração da aplicação. Antes que o usuário possa utilizar a aplicação é necessário que alguma configurações sejam definidas, como por exemplo endereço do servidor, e periféricos pertinentes ao caixa. Caso a verificação perceba que alguma configuração inicial é necessária o StartCheck será interrompido e o sistema entrará no estado &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;. &lt;br /&gt;
*: Ao entrar neste estado o PDVUI detecta e exibirá o Wizard de configuração para o usuário. Uma vez que o Wizard seja finalizado ele envia ao PDVApp o comando para tentar o &#039;&#039;&#039;CHECKING_INSTALLATION&#039;&#039;&#039; novamente. E em caso de sucesso, seguirá para o próximo passo.&lt;br /&gt;
*: Note que a maior parte das configurações, principalmente as que são iguais para todos os caixas, é definida pelo servidor e sincronizada para todos os caixas. Não há como altera-las diretamente na aplicação.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;INSTALLATION_OK&#039;&#039;&#039; - Neste passo não há processamento, é apenas um passo indicativo de que a instalação está OK e que pode continuar. Um estado &amp;quot;contrário&amp;quot; ao &#039;&#039;&#039;INSTALLATION_NEEDED&#039;&#039;&#039;, fazendo que o StartCheck continue sua rotina.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CHECKING_SERVER_ID&#039;&#039;&#039; - Durante a primeira inicialização/instalação da aplicação ela se registrará no servidor recebendo um ID único para identificação deste terminal deste ponto em diante. Servindo para rastrear tudo o que acontece em cada caixa/terminal de atendimento.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OK&#039;&#039;&#039; - Este é o passo final, que indica para as outras rotinas de que o StartCheck finalizou com sucesso é que o PDVApp está pronto para seguir para o próximo passo.&lt;br /&gt;
&lt;br /&gt;
== CFSystem ==&lt;br /&gt;
&lt;br /&gt;
O CFSystem (Sistema de Cupom Fiscal) é o nome dado para o encapsulamento dos diferentes sistemas de emissão de cupom fiscal - SAT, ECF, NFCe, etc. - suportados atualmente ou que venham a existir no futuro. Separando o controle da emissão do cupom fiscal das rotinas do sistema permite que o mesmo app seja reaproveitado para todas as tecnologias existes com pouca ou nenhuma adaptação.&lt;br /&gt;
&lt;br /&gt;
Esse encapsulamento funciona porque embora independente de como a tecnologia da emissão funcione a rotina de venda é sempre a mesma de forma geral: &amp;quot;Inicia a Venda - Registra Produtos - Executa Descontos e Totalizações - Recebe Pagamentos - Finaliza Venda&amp;quot;. A cada passo da venda o PDVApp chamará os métodos da interface do CFSystem para notificar os acontecimentos da venda. Devendo o CFSystem traduzir e organizar o funcionamento para cada tecnologia.&lt;br /&gt;
&lt;br /&gt;
O CFSystem é uma interface que permite as implementações das distintas tecnologias. Assim, cada implementação do CFSystem representa um equipamento e modelo de emissão diferentes. Por exemplo, a implementação para suporte do ECF Daruma é uma classe &amp;quot;CFSystemECFDaruma&amp;quot; que implementa a CFSystem.&lt;br /&gt;
&lt;br /&gt;
O CFSystem também apresenta os métodos para impressão de relatórios gerenciais e outros documentos não fiscais.&lt;br /&gt;
&lt;br /&gt;
=== CFSystemFactory ===&lt;br /&gt;
&lt;br /&gt;
Esta classe permite que a implementação correta do CFSystem seja retornada de acordo com os parâmetros de configuração passados. Seguindo o pattern &amp;quot;Factory&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Cupom Fiscal / PDVCupomVO ==&lt;br /&gt;
&lt;br /&gt;
Independente do sistema de emissão do cupom fiscal, o cupom fiscal é representado no sistema pelo PDVCupomVO. Para cada tipo de cupom fiscal (emitido por sistemas diferentes) o objeto apresentará um conjunto de atributos obrigatórios.&lt;br /&gt;
&lt;br /&gt;
=== Ciclo de Vida do Cupom Fiscal ===&lt;br /&gt;
&lt;br /&gt;
O cupom fiscal segue um ciclo de vida básico representado pela enumeration PDVCUPOMSTATUS, conforme o diagrama abaixo:&lt;br /&gt;
&lt;br /&gt;
[[File:BISPDVCupomStatus.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Estados Adicionais|Alguns sistemas de emissão, como o NFCe, apresentam mais estados por conta do controle de transmissão e emissão. Esses estados adicionais serão tratados no capítulo próprio do sistema. Vale a pena verifica se esses estados devem continuar utilizando a mesma variável ou se deve ter um conjunto de estados a parte dentro do VO, para não interferir no funcionamento do PDVApp, uma vez que o sistema de emissão é abstraído pela interface CFSystem.}}&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BIS&amp;diff=1658</id>
		<title>BIS</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BIS&amp;diff=1658"/>
		<updated>2025-11-19T21:30:04Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* BIS 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esta página contém a documentação do Sistema BIS em formato Wiki. O sistema é montado em cima do framework RFW, sua documentação pode ser encontrada em https://wiki.rodrigogml.eng.br/.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Implementações em Andamento =&lt;br /&gt;
Sessão dedicada ao registro das implementações em andamento, decisões e pendências.&lt;br /&gt;
&lt;br /&gt;
== Reorganização do Código ==&lt;br /&gt;
&lt;br /&gt;
=== Organização das Classes Utilitárias ===&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Leia sempre o comentário de cada classe utilitária antes de migrar um método para garantir o padrão da classe, além de buscar por outros métodos que possam já existir.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Todos os métodos utilitários que possam ser genéricos devem ser migrados para o projeto RFW.&lt;br /&gt;
:* Os métodos que não necessitam de bibliotecas externas devem ir para classes RU* adequadas do projeto RFW.Kernel, já os métodos com dependências de bibliotecas externas devem ser avaliados e talvez criados projetos específicos de acordo com suas finalidades.&lt;br /&gt;
* As classes utilitárias &#039;&#039;&#039;RUDV&#039;&#039;&#039; e &#039;&#039;&#039;RUDocValidation&#039;&#039;&#039; estão migrando seu conteúdo para o novo formato dentro da classe &#039;&#039;&#039;RUValueValidation&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;RUTypes&#039;&#039;&#039; - Essa classe passou a concentrar todos os métodos de tratamento de tipos e objetos de tipos do Java. Formatação, conversão, validação, etc.. Simplificando encontrar métodos de conversões que antes estavam espalhados em classes diferentes, por exemplo um conversor de String para BigDecimal estaria na classe de qual tipo?&lt;br /&gt;
&lt;br /&gt;
== RFW.Base ==&lt;br /&gt;
* Este projeto foi o primeiro do RFW antes da reestruturação das bibliotecas, e deve ser extinto, migrando seu conteúdo para os demais projetos do RFW.&lt;br /&gt;
* Todo o conteúdo do seu bundle foi jogado dentro do bundle do RFW.Kernel, que deve ser revisado depois de finalizar a migração.&lt;br /&gt;
&lt;br /&gt;
= BIS 10 =&lt;br /&gt;
&lt;br /&gt;
Bem vindo ao wiki de documentação do BIS v10. Aqui devem registramos toda a documentação de desenvolvimento do sistema. Documentos comuns ao desenvolvimento são requisitos, planejamento de arquiteturas, manuais de boas práticas em equipe, manuais de componentes, regras de desenvolvimento e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Use os tópicos abaixo para navegar na documentação do BIS e conhecer sobre o desenvolvimento da aplicação.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Ambiente e outros Procedimentos&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| BISKernel&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Modulos&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Tópicos relacionados ao conhecimento geral do projeto, sobre arquitetura, concepção, tecnologias usadas, etc. Leia e informe-se antes de proceder para o desenvolvimento.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Aqui estão os registros da implementação do BISKernel. Os requisitos, as funcionalidades e manual de como usa-los, etc.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Aqui está a documentação da implementação dos módulos do sistema.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:33%&amp;quot;|&lt;br /&gt;
* Instalação&lt;br /&gt;
** [[Ambiente Desenvolvimento e Produção]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Registro e Definições do BIS10&lt;br /&gt;
** [[Eventos do BIS10]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:33%&amp;quot;|&lt;br /&gt;
* &#039;&#039;&#039;Serviços do Kernel&#039;&#039;&#039;&lt;br /&gt;
** [[BISLogger]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Módulos do Kernel&#039;&#039;&#039;&lt;br /&gt;
** [[Person]] - Módulo de Cadastro de Pessoas (Físicas ou Jurídicas centradlizado do Sistema)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:33%&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Módulo de Item&#039;&#039;&#039;&lt;br /&gt;
** [[Itens]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Módulo Fiscal&#039;&#039;&#039;&lt;br /&gt;
** [[TaxRules]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= BIS 2 =&lt;br /&gt;
&lt;br /&gt;
Use os tópicos abaixo para navegar na documentação do BIS e conhecer sobre o desenvolvimento da aplicação.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Desenvolvendo o BISERP&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| BISKernel&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| BISModules&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Tópicos relacionados ao conhecimento geral do projeto, sobre arquitetura, concepção, tecnologias usadas, etc. Leia e informe-se antes de proceder para o desenvolvimento.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Aqui estão os registros da implementação do BISKernel. Os requisitos, os modulos oferecidos e manual de como usa-los, etc.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Aqui está a documentação da implementação do Plugin BISModules. O BISModules tem a função de oferecer os módulos comerciais com as funcionalidades de um ERP para pequenos comércios com o foco principal em padarias.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:33%&amp;quot;|&lt;br /&gt;
* [[Arquitetura do BIS]]&lt;br /&gt;
* [[Uso das Exceções]]&lt;br /&gt;
* Organização do Projeto&lt;br /&gt;
** [[Formatação e Escrita de Código]]&lt;br /&gt;
** Layers &amp;amp; Camadas&lt;br /&gt;
*** Camada de Negócio ([[CRUD]])&lt;br /&gt;
*** [[Fachada do CRUD]]&lt;br /&gt;
* Versionamento e Release&lt;br /&gt;
** [[Definindo Número de Versão]]&lt;br /&gt;
** [[Procedimento de Merge]]&lt;br /&gt;
** [[Procedimento de Release]]&lt;br /&gt;
* Instalação&lt;br /&gt;
** [[Preparação do Servidor do Cliente]]&lt;br /&gt;
** [[Ambiente Desenvolvimento e Produção]]&lt;br /&gt;
** [[Pay&amp;amp;Go]]&lt;br /&gt;
** [[MGV Toledo]]&lt;br /&gt;
* Outras Informações&lt;br /&gt;
** [[Portas TCP/IP]] - Relação de portas usadas pelo BIS e sistemas integrados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Solução de Problemas]]&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:34%&amp;quot;|&lt;br /&gt;
* &#039;&#039;&#039;Estruturas, Patterns e Design&#039;&#039;&#039;&lt;br /&gt;
** Estrutura de Dados e Entidades&lt;br /&gt;
*** [[BISVO]] - Entidade&lt;br /&gt;
*** [[BISVO_]] - MetaDados Object&lt;br /&gt;
*** [[BISMeta Annotations]] - Sistema de Annotations para MetaDados dos VOs&lt;br /&gt;
*** [[Tipo de Relacionamento das Entidades]]&lt;br /&gt;
** Persistência de Dados&lt;br /&gt;
*** [[BISDAO Legacy]] - DAO JPA&lt;br /&gt;
**** [[Mapeamentos JPA]]&lt;br /&gt;
*** [[BISMO]] - MatchObject&lt;br /&gt;
*** [[BISOrderBy]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Modulos do BISKernel&#039;&#039;&#039;&lt;br /&gt;
** [[BISLogger]]&lt;br /&gt;
** [[BISMail]]&lt;br /&gt;
** [[BISSecurity]] - Acesso e segurança de usuários&lt;br /&gt;
** BISSocket - Página alterada com o conteúdo do BIS10 - conteúdo anterior está em [[FWSocket]]&lt;br /&gt;
** [[BISTask]] - Definição de Tarefa usada por outros modulos&lt;br /&gt;
** BISValidator - Modulo de validação automatizada dos VOs. (A página do BIS2 foi perdida sendo alterada para o BIS10 e depois para o RFW)&lt;br /&gt;
** [[BISRecursiveClone]] - Módulo de Clone Recursivo dos objetos.&lt;br /&gt;
** [[BundleManager]] - Modulo de Internacionalização Integrada (i18N).&lt;br /&gt;
** [[CertCenter]] - Central de Certificados&lt;br /&gt;
** [[CSVGenerator]] - Gerador de arquivos CSV a partir dos VOs.&lt;br /&gt;
** [[EventDispatcher-v2]]&lt;br /&gt;
** [[Location]] - Informações de endereços e localidades&lt;br /&gt;
** [[MeasureRuler]] - Régua de conversão de medidas.&lt;br /&gt;
** [[ReportMaker]] - Sistema de geração de relatórios em PDF.&lt;br /&gt;
** [[Person]] - Cadastro Centralizado de Pessoas Físicas e Jurídicas&lt;br /&gt;
** [[PluginManager]]&lt;br /&gt;
** [[Scheduler - BISv2]] - Modulo de Agendamento de Tarefas&lt;br /&gt;
** [[SystemProperties]] - Modulo de variáveis de sistema&lt;br /&gt;
*** [[Criando um Plugin]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Interface do Usuário - Vaadin (UI)&#039;&#039;&#039;&lt;br /&gt;
** [[Camada de Apresentação - Vaadin]]&lt;br /&gt;
** [[Padrão Visual]]&lt;br /&gt;
** Plugin da Camada de Apresentação&lt;br /&gt;
*** [[VaadinPluginManager]]&lt;br /&gt;
*** [[VaadinPlugin]]&lt;br /&gt;
** Estrutura &amp;amp; Design&lt;br /&gt;
*** [[BISUI]]&lt;br /&gt;
** Componentes da UI&lt;br /&gt;
*** Janelas&lt;br /&gt;
**** [[BISWindow]]&lt;br /&gt;
***** [[BISListWindow]]&lt;br /&gt;
****** [[BISListAndManagerWindow]]&lt;br /&gt;
***** [[BISDialog]]&lt;br /&gt;
****** [[BISConfirmCancelDialog]]&lt;br /&gt;
*** Componentes Gráficos&lt;br /&gt;
**** [[BISAssociativeDateRange]]&lt;br /&gt;
**** [[BISPercentualBarComponent]]&lt;br /&gt;
** Componentes dos Modulos do Core&lt;br /&gt;
*** [[PersonComponent]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anexos&#039;&#039;&#039;&lt;br /&gt;
** [[Relação de Eventos do BISKernel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:33%&amp;quot;|&lt;br /&gt;
* [[Apresentação do BISModules]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Módulos do BISModules&#039;&#039;&#039;&lt;br /&gt;
** [[CashFlow]]&lt;br /&gt;
** [[Terminal]]&lt;br /&gt;
** [[BISModulesSocket]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anexos&#039;&#039;&#039;&lt;br /&gt;
** [[Relação de Eventos do BISModules]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Módulo Item ==&lt;br /&gt;
&lt;br /&gt;
O [[Módulo Item]] é o módulo responsável por manter o cadastro de produtos do sistema, organizando-os em categorias, tipos de itens, grupos, etc.. Também é o responsável por manter inventários (estoques) e outras informações relacionadas aos itens (produtos/serviços) do sistema.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Módulo PDV ==&lt;br /&gt;
&lt;br /&gt;
O [[Módulo PDV]] é o módulo da Aplicação responsável por controlar e realizar as vendas para consumidores. O que inclui aplicações de Checkout e Terminais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BISPDV ===&lt;br /&gt;
&lt;br /&gt;
O [[BISPDV]] é a aplicação desktop utilizada no checkout para atender o consumidor, com controle de fichas, emissão de cupom fiscal, etc. Ele opera independentemente do servidor, mas sincroniza suas informações bidirecionalmente com ele.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Módulo Fiscal ==&lt;br /&gt;
&lt;br /&gt;
O [[Módulo Fiscal]] é responsável por gerenciar a parte fiscal da empresa, como o gerenciamento de documentos fiscais (notas e cupons).&lt;br /&gt;
&lt;br /&gt;
= BIS - Automation Eco System =&lt;br /&gt;
&lt;br /&gt;
Utilizando a nomenclarura BIS, o sistema tem alguns módulos (aplicações) mais &#039;independentes&#039;, que embora se comuniquem com o sistema do BIS (tanto BIS2 quando BIS10), têm o potencial de se comunicar com outros sistemas e funcionar isoladamente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Inicialmente esse projeto está sendo feito com a intenção de criar um ambiente para o sistema de vendas que não seja completamente dependente dos sistemas BIS2 e BIS10.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BISHUB ==&lt;br /&gt;
&lt;br /&gt;
O módulo &#039;&#039;&#039;BISHUB&#039;&#039;&#039; é o concentrador de funções. Ele será o responsável por comunicar com outros sistemas e fornecer o suporte e comunicação para os outros sistemas que completam o sistema de vendas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Overview e Documentação&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Funcionalidades e Clases Principais&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:50%&amp;quot;|&lt;br /&gt;
* Documentação do Sistema&lt;br /&gt;
** [[BISHUB API Functions]] - Relação de funções disponibilizadas pela API&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Guias de Referência&lt;br /&gt;
** [[Certificado para BISHUB API Server]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:50%&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Documentação Possivelmente Desatualizada =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BISFramework == &lt;br /&gt;
&lt;br /&gt;
=== BISFW.Main ===&lt;br /&gt;
&lt;br /&gt;
O BISFW Main é o módulo principal do FrameWork do BIS. onde estão os itens mais básicos e que menos dependem de bibliotecas externas. Preferencialmente nenhuma, mas podem incluir algumas libs que sejam enxutas e não pesem na distribuição da aplicação final com excesso de pacotes que nunca serão utilizados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Design e Estrutura do FrameWork&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Funcionalidades&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Tópicos relacionados à estrutura e design patters do FrameWork.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Classe de funcionalidades e Serviços que o FrameWork oferece.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:50%&amp;quot;|&lt;br /&gt;
* [[Introdução ao BISFramework]]&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:50%&amp;quot;|&lt;br /&gt;
* [[FWMail]]&lt;br /&gt;
* [[FWReport]] - Herdado do BIS2 (antigo BISReport), permite a confecção de relatórios em PDF.&lt;br /&gt;
* [[FWSocket]] - Modulo de Conexão Server/Client por TCP&lt;br /&gt;
* [[JobMonitor]] - Processamento em Background&lt;br /&gt;
* [[Markdown]] - Linguagem de Marcação&lt;br /&gt;
* [[Scheduler]] - Agendador de Tarefas&lt;br /&gt;
* [[SessionManager]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== BISFW.Vaadin ===&lt;br /&gt;
&lt;br /&gt;
O BISFW Vaadin é o módulo do FrameWork responsável pela otimização da criação da UI com base no Framework Vaadin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Design e Estrutura do FrameWork&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Tópicos relacionados à estrutura e design patters do FrameWork.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:100%&amp;quot;|&lt;br /&gt;
* [[Introdução ao UIFactory]]&lt;br /&gt;
* Componentes da Interface&lt;br /&gt;
** [[Grid]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== BISFW.AWS ===&lt;br /&gt;
&lt;br /&gt;
Extensão do BISFW que agrega suporte para as funcionalidades de serviços oferecidos pelo AWS da Amazon.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Funcionalidades&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Funcionalidades Oferecidas.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:100%&amp;quot;|&lt;br /&gt;
* [[FWS3]] - Manipulação do S3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== BIS 10 ==&lt;br /&gt;
&lt;br /&gt;
Bem vindo ao wiki de documentação do BIS v10. Aqui devem registramos toda a documentação de desenvolvimento do sistema. Documentos comuns ao desenvolvimento são requisitos, planejamento de arquiteturas, manuais de boas práticas em equipe, manuais de componentes, regras de desenvolvimento e assim por diante.&lt;br /&gt;
&lt;br /&gt;
Use os tópicos abaixo para navegar na documentação do BIS e conhecer sobre o desenvolvimento da aplicação.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Ambiente e outros Procedimentos&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| BISKernel&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Modulos&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Tópicos relacionados ao conhecimento geral do projeto, sobre arquitetura, concepção, tecnologias usadas, etc. Leia e informe-se antes de proceder para o desenvolvimento.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Aqui estão os registros da implementação do BISKernel. Os requisitos, as funcionalidades e manual de como usa-los, etc.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Aqui está a documentação da implementação dos módulos do sistema.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:33%&amp;quot;|&lt;br /&gt;
* Registro e Definições do BIS10&lt;br /&gt;
** [[Portas do Servidor BIS10]]&lt;br /&gt;
&lt;br /&gt;
* [[Solução de Problemas]]&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:33%&amp;quot;|&lt;br /&gt;
* &#039;&#039;&#039;Requisitos e Visão Geral do Sistema&#039;&#039;&#039;&lt;br /&gt;
** [[Arquitetura do BIS]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;=== Itens Abaixo precisam de Revisão desde a criação do RFW.Kernel ===&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Serviços do Kernel&#039;&#039;&#039;&lt;br /&gt;
** [[BISMail]] - Sistema de Envio de E-mails&lt;br /&gt;
** [[BISNotification]] - Disparo de Notificações do Sistema&lt;br /&gt;
** [[BISSocket]] - Fachada por Socket&lt;br /&gt;
** [[CheckupDoctor]] - Chekup do sistema&lt;br /&gt;
** [[FileVO]] - Sistema de Arquivos&lt;br /&gt;
** [[Properties]] - Propriedades do Sistema&lt;br /&gt;
** [[BISSecurity]] - Acesso e segurança de usuários&lt;br /&gt;
** [[AutoReport]] - Relatórios Dinâmicos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;UI - BISVaadin&#039;&#039;&#039;&lt;br /&gt;
** [[Teclas de Atalho]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ThinSync&#039;&#039;&#039;&lt;br /&gt;
** [[Definições e Informações]]&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:33%&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Item&#039;&#039;&#039;&lt;br /&gt;
** [[Itens]]&lt;br /&gt;
** [[Balanças]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Fiscal&#039;&#039;&#039;&lt;br /&gt;
** [[LockDate]]&lt;br /&gt;
** [[NF]]&lt;br /&gt;
** [[SPED]]&lt;br /&gt;
** &#039;&#039;&#039;PDV&#039;&#039;&#039;&lt;br /&gt;
*** [[Cupom Fiscal]]&lt;br /&gt;
** [[COP]] - Classificação da Operação&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Fluxo de Caixa&#039;&#039;&#039;&lt;br /&gt;
** [[Contas Financeiras]] (Caixas)&lt;br /&gt;
** [[Contas à Pagar e Receber]]&lt;br /&gt;
** [[Lançamentos Financeiros]] (StatementVO)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Migration Tools&#039;&#039;&#039;&lt;br /&gt;
** [[MigrateBIS2To10]] - Ferramenta de migração dos dados do BIS2 para o BIS10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Bibliotecas e Projetos Auxiliares ==&lt;br /&gt;
Aqui está a definição de projetos auxiliares e bibliotecas que acrescentam funções ou serviços especiais ao BIS. Mas não costumam ser serviços muito comuns para fazerem parte permanente do BISKernel e pode ser utilizada por mais de um plugin, módulo ou aplicação externa por isso também não fica &#039;embutido&#039; em um plugin ou outro.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Projeto&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Descrição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:20%&amp;quot;|&lt;br /&gt;
&#039;&#039;&#039;[[BISTest]]&#039;&#039;&#039;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;Projeto para armazenar os casos de testes do sistema. No mesmo projeto ficarão concentrados os casos de testes de todos os plugins.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tutoriais, Ajudas e Relatos de Desenvolvimento ==&lt;br /&gt;
Aqui estão alguns tópicos de ajuda para os desenvolvedores. Tutoriais e registros de como foram feitas algumas tarefas de desenvolvimento do BIS. Os registros dessa seção em geral não estão associados à um único plugin, caso contrário devem ser registrados junto com a documentação do plugin.&lt;br /&gt;
Esses tópicos tem sempre a intenção de ajudar a lembrar ou orientar o desenvolvedor à realizar a mesma tarefa ou dar manutenção no futuro.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Tópico&lt;br /&gt;
!scope=&amp;quot;col&amp;quot;| Descrição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:20%&amp;quot;|&lt;br /&gt;
&#039;&#039;&#039;[[XSD To Java Objects]]&#039;&#039;&#039;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;Orienta como utilizar o Eclipse para transformar o XSD de um WebService em objetos java para integração.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:20%&amp;quot;|&lt;br /&gt;
&#039;&#039;&#039;[[Criando KeyStore]]&#039;&#039;&#039;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;Mostra passo a passo como criar uma KeyStore do java para armazenar certificados (com ou sem a chave privada). Os certificados de uma keystore podem ser usados em qualquer parte da aplicação para operações que utilizam criptografia. Mesmo certificados só com a chave pública podem ser colocadas em uma keystore para definir os certificados raiz confiáveis. Este tutorial explica como criar a keystore por comandos do KeyTool.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:20%&amp;quot;|&lt;br /&gt;
&#039;&#039;&#039;[[Axis2 WebService Client]]&#039;&#039;&#039;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;Ensina como usar o Eclipse com Axis 2 para gerar um cliente para acesso à um webservice.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:20%&amp;quot;|&lt;br /&gt;
&#039;&#039;&#039;[[MySQL To DerbyDB]]&#039;&#039;&#039;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;Auxilia a migrar comandos SQL e tipos de dados das colunas do MySQL para o DerbyDB.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:20%&amp;quot;|&lt;br /&gt;
&#039;&#039;&#039;[[Especificação de Guias e Boletos]]&#039;&#039;&#039;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;Junta todas as informações relacionadas numeração de guias de impostos, boletos, contas de concessionárias, etc. encontradas durante o desenvolvimento. Um guia de referência e consulta para manutenções futuras.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; width:20%&amp;quot;|&lt;br /&gt;
&#039;&#039;&#039;[[Procedimentos do SAT]]&#039;&#039;&#039;&lt;br /&gt;
| &amp;lt;p align=&amp;quot;justify&amp;quot; style=&amp;quot;margin:10px;&amp;quot;&amp;gt;Documentação e procedimentos relacionados ao funcionamento do equipamento SAT.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Editando o Wiki ==&lt;br /&gt;
&lt;br /&gt;
Para editar o wiki, consulte a [[https://www.mediawiki.org/wiki/Help:Formatting Ajuda de Formatação]] do wiki.&lt;br /&gt;
&lt;br /&gt;
= HOG Invest =&lt;br /&gt;
Parte temporária para armazenar a documentação do Projeto [[HOG Invest]], até que ganhe sua própria página.&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=Item-v2&amp;diff=1657</id>
		<title>Item-v2</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=Item-v2&amp;diff=1657"/>
		<updated>2025-11-19T21:26:43Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: Rodrigogml moveu Item-v2 para Módulo Item&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECIONAMENTO [[Módulo Item]]&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1656</id>
		<title>Módulo Item</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Item&amp;diff=1656"/>
		<updated>2025-11-19T21:26:43Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: Rodrigogml moveu Item-v2 para Módulo Item&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo &#039;&#039;&#039;Item&#039;&#039;&#039; é o módulo responsável por cadastrar os itens de consumo, produtos de revenda, fabricação própria para venda ou consumo, etc. Este módulo oferecerá um cadastro com controle de preços, markups, custos, entre outras funcionalidades que servirão de suporte para diversos outros módulos, como PDV, Controle de Estoques, Base de Custos para Planilhas de Cálculos, etc.&lt;br /&gt;
&lt;br /&gt;
Para oferecer todo o conceito o módulo é dividido nos seguintes cadastros:&lt;br /&gt;
&lt;br /&gt;
= Categoria do Item =&lt;br /&gt;
&lt;br /&gt;
A categoria do item tem a finalidade de organizar e agrupar os itens de acordo com suas categorias. Mutias vezes a categoria é o corredor em que as mercadorias são agrupadas, como &amp;quot;Bazar&amp;quot;, &amp;quot;Açougue&amp;quot;, &amp;quot;Produtos de Limpeza&amp;quot;, etc. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Estrutura Hierárquica:&#039;&#039;&#039; As categorias são uma estrutura hierárquica, isto é, permite que uma categoria seja adiciona dentro da outra.&lt;br /&gt;
** &#039;&#039;&#039;Nomes Únicos &#039;por Pai&#039;:&#039;&#039;&#039; Os nomes das categorias são únicos dentro do mesmo pai. Em outras palavras, os nomes das categorias só podem se repetir se estiverem em pontos diferentes da estrutura hierárquica.&lt;br /&gt;
** &#039;&#039;&#039;Permite Itens:&#039;&#039;&#039; Esta opção define se os itens podem ser alocados nesta categoria ou não. Quando a opção estiver desmarcada nenhum código de item deverá ser definido nesta categoria. Esta função permite que um determinado tipo de item possa ser alocado nesta categoria, mas força que os itens tenham que ser alocados nas subcategorias.&lt;br /&gt;
** &#039;&#039;&#039;Congelamento de Preços:&#039;&#039;&#039; Este atributo define se os preços dos itens nesta categoria devem permanecer congelados quando forem editados ou houver uma entrada de NFe.&lt;br /&gt;
** &#039;&#039;&#039;Arredondamento de Preços:&#039;&#039;&#039; Permite definir uma regra de arredondamento dos preços de venda de todos os itens que estão nesta categoria. Uma vez definida, nenhum item deverá ter um preço diferente do arredondamento definido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Validar a estrutura de uso por Itens e Tipo de Itens quando a categoria pai for alterada.&#039;&#039;&#039; - A categoria pai de uma categoria não pode ser alterada se algum item estiver associado à ela ou à alguma subcategoria enquanto que o seu tipo de item aponta para a categoria pai. Em outras palavras, caso ao alterar a categoria de posição na hierarquia se não invalidará as condições do tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Hierarquia Cíclica.&#039;&#039;&#039; - Garantir que durante a atualização uma categoria não passa a apontar &amp;quot;como pai&amp;quot; uma categoria que está abaixo dela na hierarquia, criando um relacionamento cíclico.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se temos exatamente 1 ItemCategoryCompanyVO por Empresa&#039;&#039;&#039; - Validar se o temos exatamente 1 definição de dados por empresa. Não devemos ter nem duplicadas, nem faltando. (BUG: 270)&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Categoria de Item Sendo Usado Por Código do Item, Tipo do Item ou outra Categoria de Item&#039;&#039;&#039; - Antes de excluir uma categoria é preciso confirmar se ela não está em uso por outro objeto. Ela pode estar em uso por um código de item (verificar se o Item está ativo), ser referenciada pelo Tipo de Item (também verificar se o mesmo está ativo) ou ser pai de outra categoria (que também precisa verificar se ainda esta ativa). Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Markup, Congelamento de Preços e Arredondamento de Preços são Obrigatórios quando a Categoria permite que itens sejam adicionados.&#039;&#039;&#039; - Validar se estão preenchidos quando a categoria permitir itens, validar se estão nulos quando a categoria não permitir itens. Quando a categoria não permitir itens, o campo MarkUp Mínimo também deve ser nulo.&lt;br /&gt;
&lt;br /&gt;
= Tipo do Item =&lt;br /&gt;
&lt;br /&gt;
O tipo do item tem a finalidade de agrupar todos os itens de um mesmo tipo. Entende-se por tipo de produto &amp;quot;o que o produto é&amp;quot;, por exemplo: Refrigerante, Água, Suco, Pasta de Dente, Pão de Queijo, etc. Não faz parte do tipo a marca, embalagem, quantidades etc. Marca, quantidade, códigos, preços, etc. são parte do cadastro do Iten e não do tipo.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo do Item:&#039;&#039;&#039; O nome do tipo de item é usado para identificar o cadastro. Deve ser único.&lt;br /&gt;
** &#039;&#039;&#039;Prefixo:&#039;&#039;&#039; O prefixo é um &amp;quot;começo&amp;quot; da descrição, que será usada em todos os itens desse mesmo tipo. Ao forçar que todos os itens comecem com o mesmo prefixo ajuda na organização do cadastro do banco de dados.&lt;br /&gt;
** &#039;&#039;&#039;Descrição de Exemplo: &#039;&#039;&#039; Cada tipo de item deve ter um espaço para orientar o usuário sobre quais as informações importantes para aquele tipo de produto, além de definir a ordem em que devem aparecer.&lt;br /&gt;
** &#039;&#039;&#039;Associação com Aliquota ICMS:&#039;&#039;&#039; No tipo do item devemos definir qual a alíquota de tributação do ICMS que deverá ser utilizada em todos os itens desse tipo. Centralizando e simplificando as configurações.&lt;br /&gt;
** &#039;&#039;&#039;Associação com As categorias:&#039;&#039;&#039; Cada tipo de item deve associar no mínimo uma categoria de itens. Cada item deste tipo deverá associar seus códigos nessas categorias ou suas subcategorias. O tipo de item pode permitir associação com mais de um &amp;quot;nó&amp;quot; da hierarquia da categoria. Permitindo assim que itens do mesmo tipo possam ser lançados em categorias diferentes. Como por exemplo um refrigerante com um código lançado na categoria de &amp;quot;Geladeiras/Loja&amp;quot; e outro código em &amp;quot;Restaurante/SelfService&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Categoria em Uso por Itens continua Disponível&#039;&#039;&#039; - Quando um tipo de item é alterado, é preciso validar se os itens desse tipo atualmente cadastrados não ficarão inválidos caso a categoria não esteja mais associada ao tipo de item. Ou seja, quando um item associado a esse tipo de item já estiver utilizando determinada categoria ela não pode ser excluída do tipo de item. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Alteração do Prefixo reflete nos itens existentes&#039;&#039;&#039; - Caso o prefixo seja alterado, todos os itens deste tipo de item devem ter seu nome atualizado de acordo com o novo prefixo. &amp;lt;u&amp;gt;&#039;&#039;Somente Atualização&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Verifica Definições de Impostos para cada empresa&#039;&#039;&#039; - Verifica a definição dos impostos para cada empresa existente.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Tipo e Alíquota no ECF igual à Alíquota Efetiva&#039;&#039;&#039; - Verifica se o tipo do ICMS definido no tipo de item e a alíquota efetiva do do cálculo é coerente com os valores cadastrados no objeto ICMSVO, usado no momento de venda do ECF.&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Natureza da Receita e Tabela são obrigatórios para os CSTs 02, 03, 04, 05, 06, 07, 08 e 09&#039;&#039;&#039; - Para todos esses CSTs, os campos de Natureza da Receita e Tabela ser validado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Verificar se a tabela é valida para o CST de Saída informado&#039;&#039;&#039; - Quando a tabela é informada, ela deve ser coerente com o código do CST de saída informado.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Verificar se o Natureza é válida para a Tabela informada&#039;&#039;&#039; - Ao informar um código da Natureza da Receita o BIS deve verificar se o código da Receita é válido para a tabela sendo usada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Tipo de Item Sendo Usado no Momento&#039;&#039;&#039; - Antes de excluir o tipo de item é preciso verificar se ele não está em uso no momento. Lembrando que essa validação não pode ser feita pelo BISValidator uma vez que o Item tem o &amp;quot;estado&amp;quot; apagado, e não é excluído fisicamente do banco de dados.&lt;br /&gt;
&lt;br /&gt;
= ICMS =&lt;br /&gt;
&lt;br /&gt;
O objeto ICMS é a definição das alíquotas de ICMS utilizadas pelos Itens/Tipo de Itens. As alíquotas devem ser cadastradas conforme as alíquotas que a empresa utiliza.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tipo de Alíquota&#039;&#039;&#039; - As alíquotas podem ser de 3 tipos diferentes: Isento, Substituição e Tributada.&lt;br /&gt;
** &#039;&#039;&#039;Alíquota&#039;&#039;&#039; - A alíquota é a percentagem usado para calcular o valor do tributo. A alíquota quando definida é um valor positivo.&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - As alíquotas devem ter um nome que facilite a identificação da alíquota para o usuário. Este nome deve ser único.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Definição Obrigatória da Alíquota quando o tipo for Tributado&#039;&#039;&#039; - A definição da alíquota é obrigatória sempre que o tipo for Tributada.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Não definição da Alíquota para os tipos Isento e Substituição.&#039;&#039;&#039; - Para os tipos Isento e Substituição o valor da alíquota devem estar nulos.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Em uso por algum tipo de item&#039;&#039;&#039; - durante a tentativa de exclusão, verificar se o ICMS não está em uso atualmente por algum Tipo de Item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ItemCodeGroup =&lt;br /&gt;
&lt;br /&gt;
O Grupo de Código de Item tem a finalidade de agrupar diferentes códigos de itens e fazer com que SEMPRE tenham o mesmo preço de venda. Independente de custo, categorias markups, arredondamentos, etc. Uma vez que um preço de venda de um item for alterado, os demais vão segui-lo fielmente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Nome&#039;&#039;&#039; - Tudo grupo de código deve ter um nome para facilitar a identificação dos itens que fazem parte do grupo.&lt;br /&gt;
** &#039;&#039;&#039;Lista de Còdigos&#039;&#039;&#039; - Dentro de um mesmo grupo podem ser associados 0+ códigos de itens. Códigos de um mesmo item podem fazer parte do mesmo grupo.&lt;br /&gt;
** &#039;&#039;&#039;Sempre o mesmo preço de venda&#039;&#039;&#039; - Independente das diferentes configurações que um código de item pode ter dentro do mesmo grupo, como diferentes categorias, MarkUps, Custos, definições de arredondamento, package ratios, etc.. O preço de venda de todos os itens do grupo devem ter exatamente o mesmo valor. Mesmo que para isso tenha que desrespeitar qualquer outra regra do sistema (como arredondamento, ou cálculo de package, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Validações Extra:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Códigos de Itens já associados a outros grupos&#039;&#039;&#039; - Durante a inserção ou atualização, um grupo não deve permitir que um código de item já associado à outro grupo seja associado a este. Em outras palavras, um código de item não pode estar associado em mais de um grupo ao mesmo tempo.&lt;br /&gt;
&lt;br /&gt;
= Item = &lt;br /&gt;
&lt;br /&gt;
A entidade Item representa um produto qualquer da empresa. Esse produto por ser um insumo, uma matéria prima ou um produto de venda (ou revenda).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Requisitos:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Fixação do prefixo da descrição de acordo com o tipo do Item&#039;&#039;&#039; - Todo item deve ser de algum &#039;&#039;Tipo de Item&#039;&#039;. Uma vez que o tipo de item esteja definido, a descrição do item obrigatoriamente deve começar com o valor do &#039;&#039;Prefixo&#039;&#039; definido no &#039;&#039;Tipo de Item&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Obrigatoriedade da Marca ou da Descrição&#039;&#039;&#039; - Todo item deve ter preenchidos no mínimo um dos campos &#039;&#039;Marca&#039;&#039; ou &#039;&#039;Descrição&#039;&#039;. Mesmo para produtos de fabricação própria, é recomendável definir a marca da empresa por questões de organização dos itens. Caso nenhum dos dois seja preenchido a descrição pode acabar sendo apenas o &#039;&#039;Prefixo&#039;&#039; do &#039;&#039;Tipo de Item&#039;&#039;. Para Itens &amp;quot;genéricos&amp;quot;, cuja marca não importa, pois em cada momento uma marca diferente é comprada ou usada, a marca não é necessária, mas uma descrição sim.&lt;br /&gt;
** &#039;&#039;&#039;Dimensão e Unidade de Medida Padrão&#039;&#039;&#039; - Todo item tem uma dimensão (Massa, Unidades, Volume, Cumprimento, etc.) e uma unidade de medida (Kg, Unidades, Litros, Metros, etc.) a que se refere o item. Essa unidade ajuda identifica a unidade de quantização padrão desse item. A unidade em que por padrão esse item é comprado, vendido e movimentado. Outras unidades diferentes para movimentar o mesmo item podem ser definidas em códigos diferentes.&lt;br /&gt;
** &#039;&#039;&#039;Custo&#039;&#039;&#039; - Todo Item tem um custo único padrão. Esse custo é sempre o mesmo, independente da empresa.&lt;br /&gt;
** &#039;&#039;&#039;Códigos dos Itens:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Múltiplos Códigos&#039;&#039;&#039; - Cada item pode ter mais que um código definido, ou seja, uma lista de códigos. Códigos são a maneira definir um modo quantidade, preço de venda, pacote, etc. de um determinado Item. Normalmente tem uma identificação única (e normalmente numérica, embora não obrigatória) para ser referenciada em terminais, notas, códigos de barras, etc. No entanto a identificação única não deve ser obrigatória. Um item pode ter um código para definir uma determinada quantidade de movimentação de entrada ou saída, ou simplesmente para definir uma nova unidade de medida. Por exemplo, produtos identificados hora por Kilos hora por Unidades.&lt;br /&gt;
*** &#039;&#039;&#039;Categoria do Item&#039;&#039;&#039; - De acordo com o &#039;&#039;Tipo de Item&#039;&#039; definido no Item, cada código do item deverá ser alocado em uma das categorias definidas no &#039;&#039;Tipo de Item&#039;&#039;. Apesar de ser o mesmo código, cada um pode gerar venda em uma categoria diferente, ou utilizar o MarkUp diferentes de acordo com o definido em cada categoria.&lt;br /&gt;
* &#039;&#039;&#039;Validações Extras:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[ve0001] Validar requisito de Obrigatoriedade entre Marca e Descrição&#039;&#039;&#039; - Um dos campos deve sempre ser preenchido.&lt;br /&gt;
** &#039;&#039;&#039;[ve0002] Validar inconsistência entre Fabricação do Produto e Origem do Item&#039;&#039;&#039; - Se o produto for de fabricação própria, ele não pode ter uma das opções de importado definida em Origem do Item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0003] Validar finalidade do item&#039;&#039;&#039; - Todo item deve ter no mínimo 1 finalidade definida em seu cadastro.&lt;br /&gt;
** &#039;&#039;&#039;[ve0004] Preenchimento completo dos pesos e volumes das embalagens&#039;&#039;&#039; - Se algum campo for preenchido, ele deve ser preenchido por completo! Por exemplo, se o &amp;quot;Peso Drenado&amp;quot; for definido, obrigatoriamente sua unidade de medida deve ser preenchida, o mesmo para o caso contrário: se a unidade for definida, a quantidade também deverá ser!&lt;br /&gt;
** &#039;&#039;&#039;[ve0005] Não permite que um Item tenha dois códigos iguais definidos&#039;&#039;&#039; - Validar se o código sendo inserido/alterado não tem definido duas vezes o mesmo código.&lt;br /&gt;
** &#039;&#039;&#039;[ve0006] Os códigos de item só podem ser associados às categorias definidas no tipo de item&#039;&#039;&#039; - Validar se a categoria enviada no ItemCodeVO é uma das categorias disponibilizadas no ItemTypeVO associado ao ItemVO. Os códigos ficam limitados a usarem apenas as categorias permitidas de acordo com o tipo de item.&lt;br /&gt;
** &#039;&#039;&#039;[ve0007] Validar se a Categoria do Item permite a associação dos itens&#039;&#039;&#039; - Os códigos de itens não podem ser associados às categorias que não permitem a associação de itens.&lt;br /&gt;
** &#039;&#039;&#039;[ve0008] Validar Finalidade do Item&#039;&#039;&#039; - O campo de finalidade não pode ter alguns alguns valores de acordo os valores definidos nos outros campos, conforme as seguintes regras:&lt;br /&gt;
*** &#039;&#039;&#039;Revenda:&#039;&#039;&#039; Não pode ser definido quando o produto for de &#039;&#039;&#039;Fabricação Própria&#039;&#039;&#039;.&lt;br /&gt;
*** &#039;&#039;&#039;Produto Acabado:&#039;&#039;&#039; Não pode ser definido quando o produto for &#039;&#039;&#039;Produzido por Terceiros&#039;&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;[ve0009] Valida Item Próprio em Tipo de Substituição&#039;&#039;&#039; - Valida se o Item é de produção própria e está em um tipo de item com a tributação de ICMS definida como Substituição Tributária.&lt;br /&gt;
** &#039;&#039;&#039;[ve0010] Descrição do Item&#039;&#039;&#039; - Valida se a descrição do item é única entre os itens ativos no momento.&lt;br /&gt;
** &#039;&#039;&#039;[ve0011] Itens de Revenda não podem ser Descartáveis&#039;&#039;&#039; - Valida se o item tiver o propósito como revenda, não permite que seja do tipo descartável.&lt;br /&gt;
&lt;br /&gt;
== Definição do Preço de Venda ==&lt;br /&gt;
&lt;br /&gt;
Há vários fatores sobre a lógica de calcular definir um novo preço de venda. Como as políticas de arredondamento, congelamento de preço, replicação do preço para outros códigos do mesmo grupo, a movimentação de novos preços para histórico, etc.&lt;br /&gt;
&lt;br /&gt;
A ordem das operações lógicas a serem aplicadas sobre o ItemPriceVO devem ser conforme a ordem dos métodos listados abaixo. Cada método executa a operação a partir de um determinado ponto. Isso permite que diferentes eventos que causam a alteração do preço de venda possam acionar o ciclo a partir de diferentes pontos.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Define um Novo preço de Venda para um Código&#039;&#039;&#039; - O início do processo. Quando um novo preço de venda deve ser definido em um código de item. Este passo utiliza o valor recebido as as definições do próprio ItemCode para realizar toda a sequência lógica do preço de venda.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Definition()&#039;&#039;&#039; - Método responsável por carregar as informações do ItemCodeVO e iniciar o processo definição do novo preço de venda do código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicar Regras de Arredondamento&#039;&#039;&#039; - Dependendo das configurações da Categoria do Item definida no Código do Item, o preço precisará ser arredondado para respeitar essas políticas.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_RoundApply()&#039;&#039;&#039; - Este método recebe o valor do novo preço e a política de arredondamento para aplicar as regras de arredondamento. Uma vez aplicado os arredondamentos o valor será passado para o próximo método da cadeia (o &#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;) para a efetivação em todos os grupos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Aplicação da Política|Para centralizar o código de aplicação da política, a efetiva aplicação do arredondamento fica na classe utilitária &#039;&#039;&#039;ItemUtils&#039;&#039;&#039; no método &#039;&#039;&#039;applyRoundPricePolicy()&#039;&#039;&#039;. Podendo ser acessado de qualquer ponto, como classes da UI.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Disseminação do Preço de Venda pelo Grupo&#039;&#039;&#039; - Caso o &#039;&#039;ItemCode&#039;&#039; cujo preço de venda esteja sendo alterado faça parte de um grupo, este preço de venda deverá ser disseminado para todos os &#039;&#039;ItemCode&#039;&#039; do Grupo.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_GroupDisseminate()&#039;&#039;&#039; - Avalia se o &#039;&#039;ItemCode&#039;&#039; cujo preço deve ser alterado faz parte de um grupo. Caso faça ele pesquisa todos os itens do grupo e chama o método &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; todos os envolvidos. Este método não faz qualquer processamento no valor, apenas verifica os códigos envolvidos no grupo e aplica o valor, congelado ou não conforme informado via parâmetros). O valor será aplicado a todos do grupo conforme recebido, &amp;quot;passando por cima&amp;quot; das configurações de arredondamento e políticas de congelamento de cada código.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Aplicação do Preço de Venda ao Objeto&#039;&#039;&#039; - Caso haja real alteração no ItemPriceVO uma cópia deve ser convertida para o ItemPriceHistoryVO e persistida. Por fim atualizar o ItemPriceVO na base de dados.&lt;br /&gt;
*: &#039;&#039;&#039;updateItemPrice_Apply()&#039;&#039;&#039; - Método responsável por atualizar as definições sobre o preço de venda (ItemPriceVO) de um &#039;&#039;Código de Item&#039;&#039;. Este método recebe o novo valor, se o preço estará congelado, e outros atributos para identificação do ItemPriceVO correto (dependendo da assinatura). De acordo com os valores passados, este método avalia se haverá alteração das informações atuais, cria um novo objeto para o histórico de preços (ItemPriceHistoryVO) e salva os dados atuais. Em seguida faz as alterações necessárias ao ItemPriceVO e já o persiste no banco.&lt;br /&gt;
*: &#039;&#039;&#039;Este é (e deve continuar sendo) o único método que fará a atualização do ItemPriceVO no banco de dados!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eventos de Alteração do Preço de Venda ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cadastro/Alteração de Itens&#039;&#039;&#039; - Quando um item é cadastrado ou alterado ele tem definições de códigos e consequentemente de preços de vendas. Neste caso avaliamos as seguintes condições para cada código:&lt;br /&gt;
** &#039;&#039;&#039;Não tem um grupo associado&#039;&#039;&#039; - Se não tem um grupo adicionado, temos que definir e processar o preço completamente. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Tem um grupo associado:&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos definir novos valores para o código e para o grupo&#039;&#039;&#039; - Se devemos associar novos valores para este novo código e para o grupo em que ele vai entrar, processamos o valor deste código completamente, e como a associação ao grupo é feita antes da definição dos preços, a lógica do updateItemPrice fará a disseminação deste valor nos outros códigos do grupo quando chegar no passo &#039;&#039;_GroupDisseminate()&#039;&#039;. Chama o &#039;&#039;&#039;_Definition()&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;Devemos copiar o valor atual sendo praticado no grupo&#039;&#039;&#039; - Neste caso vamos buscar o valor de qualquer código do grupo (afinal devem ser todos iguais) e copiamos seus valores. Tanto o valor praticado, quanto um eventual valor que esteja congelado. Chama o &#039;&#039;&#039;_Apply()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Descongelar o Preço de Venda&#039;&#039;&#039; - Descongelar significa efetivar o preço que está congelado como o preço praticado para venda. Para evitar qualquer reprocessamento no valor, mas ainda assim garantir que o novo valor efetivo de venda será definido em todos os códigos do mesmo grupo este método chama o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Descartar Preço Congelado&#039;&#039;&#039; - Quando não queremos que o preço congelado entre em vigor podemos simplesmente descartar o preço congelado, e manter o código com o mesmo preço que já tinha. Neste caso queremos que todos os códigos do mesmo grupo descartem seu preço congelado e que continuem mantendo o preço já praticado. Para evitar o processamento dos valores mas ainda realizar a operação em todos os códigos do grupo chamamos o &#039;&#039;&#039;_GroupDisseminate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:updateItemPriceFlow.png|frame|center|Diagrama do fluxo da lógica de alteração do preço de venda de um Código de Item. E entrada dos eventos que causam essas alterações.]]&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1655</id>
		<title>BISModulesSocket</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=BISModulesSocket&amp;diff=1655"/>
		<updated>2025-11-18T15:22:20Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* syncPDVCupomVOList */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
O BISModulesSocket é como uma pequena biblioteca que facilita a comunicação entre terminais (aplicações externas ao servidor de aplicações) e o BISCore e BISModules. Desenvolvido apenas com Java e Sockets (implementado em cima do [[BISSocket]]), pode ser usado para realizar chamadas e comunicar com o sistema sem a necessidade de utilizar bibliotecas RMI/JNDI ou outras mais complexas de integração.&lt;br /&gt;
&lt;br /&gt;
== Funcionamento ==&lt;br /&gt;
O lado servidor será &amp;quot;levantado&amp;quot; junto com o plugin. A partir deste momento o servidor já estará escutando a porta e aguardado conexão dos terminais.&lt;br /&gt;
&lt;br /&gt;
A utilização é simples:&lt;br /&gt;
# Cria uma instância do BISModulesSocketClient, passe no construtor o host e a porta do servidor BISERP para que o cliente conecte-se;&lt;br /&gt;
# Chama os métodos passando os atributos desejados e aguarde pela resposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protocolo entre BISModulesSocketClient e BISModulesSocketServer ==&lt;br /&gt;
&lt;br /&gt;
Abaixo estão listados os comandos utilizados atualmente pelas duas classes para abstrair a comunicação. Para utilizar as classes não é necessário se familiarizar com o protocolo, apenas para manutenção e implementação das mesmas.&lt;br /&gt;
&lt;br /&gt;
{{stop|Chamada Pela Fachada|Quando o BISModulesSocketServer faz o repasse da chamada dos métodos na parte do Core (do BIS ou dos Plugins), deve sempre chamar a fachada de acesso. Para que o servidor de aplicações instancie as transações e o Interceptor da fachada possa fazer seu trabalho.&lt;br /&gt;
Uma chamada direta ao CRUD pode funcionar em alguns casos, mas com certeza desabilitará o [[BISLogger]], as transações dos EJBs e outros serviços oferecidos pelo servidor de aplicação.}}&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Serviço do BISModulesSocket ===&lt;br /&gt;
&lt;br /&gt;
==== serverTime ====&lt;br /&gt;
Recupera o horário do Servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Número qualquer para identificar a requisição. O mesmo valor é retornado na resposta.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SERVERTIME&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_TIME&lt;br /&gt;
|&amp;lt;Long&amp;gt; System.currentTimeMillis() do servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SERVERTIME_REQID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Exatamente mesmo valor recebido na requisição, mesmo que null.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISCore ===&lt;br /&gt;
&lt;br /&gt;
==== getProperty ====&lt;br /&gt;
Busca no servidor uma propriedade do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|GETPROPERTY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_PROPERTY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Propriedade a ser recuperada no servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_GETPROPERTY_VALUE&lt;br /&gt;
|String - Valor da propriedade do sistema, null caso a propriedade tenha o valor nulo ou não tenha sido encontrado.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_GETPROPERTY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== hasPermissionKey ====&lt;br /&gt;
Envia para o servidor a autenticação de um usuário e uma chave de segurança para saber se o usuário tem acesso para a chave passada. Note que, seguindo a funcionalidade do Kernel, o método lança exception caso a autenticação falhe, caso o usuário não tenha autorização o retorno será false.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|HASPERMISSIONKEY&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_ACCESSKEY&lt;br /&gt;
|&amp;lt;String&amp;gt; - Chave de acesso para questionar.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_HASPERMISSIONKEY_RESPONSE&lt;br /&gt;
|Boolean - True caso o usuário tenha acesso a chave, false caso contrário.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_HASPERMISSIONKEY&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== postBISLog ====&lt;br /&gt;
Envia para o servidor um registro de LOG para ser salvo. Como não há como ter um controle de sincronia de objeto (um ID local como nos objetos do PDV), casa post gerará um objeto novo no servidor. Por isso é preciso controlar os posts pelo lado do cliente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|POSTBISLOG&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_POSTBISLOG_BISLOGOBJ&lt;br /&gt;
|&amp;lt;BISLogVO&amp;gt; - Objeto completo com o registro de erro pronto para ser cadastrado no sistema.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_POSTBISLOG&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== notifyActiveSupport ====&lt;br /&gt;
Este método força o envio de uma mensage para o sistema de suporte ativo do BISERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|NOTIFYACTIVESUPPORT&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_NOTIFYACTIVESUPPORT_MSG&lt;br /&gt;
|&amp;lt;String&amp;gt; - Mensagem a ser enviada para o suporte.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_NOTIFYACTIVESUPPORT&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findBISCertificateList ====&lt;br /&gt;
Busca uma lista de certificados do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_MO&lt;br /&gt;
|&amp;lt;BISCertificateMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELISTLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDBISCERTIFICATELIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDBISCERTIFICATELIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;BISCertificateVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findCompanyList ====&lt;br /&gt;
Busca uma lista de empresas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_MO&lt;br /&gt;
|&amp;lt;CompanyMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDCOMPANYLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDCOMPANYLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;CompanyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findUserList ====&lt;br /&gt;
Busca uma lista de usuários do sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_MO&lt;br /&gt;
|&amp;lt;UserMO&amp;gt; - MO para filtrar os dados&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; - Objeto para organizar a lista retornada&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_ATTRIBUTES&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Array de propriedades à serem populadas&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDUSERLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDUSERLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;UserVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== createNewTokenToUser ====&lt;br /&gt;
Solicita ao servidor que gere um novo token para o usuário passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requsição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_USER&lt;br /&gt;
|&amp;lt;String&amp;gt; - Login do usuário&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_PASS&lt;br /&gt;
|&amp;lt;String&amp;gt; - Senha do usuário&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CREATENEWTOKENTOUSER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CREATENEWTOKENTOUSER_TOKEN&lt;br /&gt;
|&amp;lt;String&amp;gt; - Token recém criado para o usuário.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos de Integração com o BISModules ===&lt;br /&gt;
&lt;br /&gt;
==== registerTerminal ====&lt;br /&gt;
Faz o registro do terminal no servidor do BIS. Necessário para que o BIS reconheça esse terminal e possa gerencia-lo adequadamente, como sincronizar dados, conhecer status, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_UNIQUEID&lt;br /&gt;
|&amp;lt;String&amp;gt; - ID do terminal. String gerada que deve ser única par o terminal. Normalmente usado o macaddress da máquina por já ser uma númeração única.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_REGISTERTERMINAL&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_REGISTERTERMINAL_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID Gerado pelo servidor que passará a identificar o terminal no servidor&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVItemListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os itens mais novos que esta data. Se for nulo, retornamos todos os itens.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVITEMLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVItemVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPropertiesListToSync ====&lt;br /&gt;
&lt;br /&gt;
Solicita do módulo PDV uma lista das propriedades de configuração para o aplicativo BISPDV definidas para uma determinada empresa. Esta lista terá trará todas as propriedades com o prefixo &amp;quot;br.com.biserp.bismodules.pdv.pdvapp.centralconfig&amp;quot; e no sufixo o ID da empresa separado por um &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPROPERTIESLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no terminal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVITEMLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPROPERTIESLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PropertyVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findFiscalIBPTRatiosListToSync ====&lt;br /&gt;
Solicita do módulo Fiscal uma lista dos ratios fornecida pelo IBPT usada para calcular o total de imposto aproximado pago no cupom. Esta lista terá apenas os objetos alterados a partir da data passada. Método usado para sincronizar novos objetos nos terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; - ID da empresa usada no temrinal&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; - Última data sincronizada. Usada para retornar apenas os objetos mais novos que esta data. Se for nulo, retornamos todos os objetos.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDFISCALIBPTRATIOSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDFISCALIBPTRATIOSLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;FiscalIBPTRatioVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findPDVPaymentListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de itens. Esta lista terá apenas os itens alterados a partir da data passada. Método usado para sincronizar novos itens no terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVPAYMENTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVPAYMENTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVPaymentVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVContractListToSync ====&lt;br /&gt;
Solicita do módulo PDV uma lista de contratos (convênios) para venda no caixa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVCONTRACTLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVCONTRACTLISTTOSYNC_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVContractVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVTokenList ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_MO&lt;br /&gt;
|&amp;lt;PDVTokenMO&amp;gt; MO para filtrar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ORDERBY&lt;br /&gt;
|&amp;lt;BISOrderBy&amp;gt; para organizar a lista&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_ATTRIBUTE&lt;br /&gt;
|&amp;lt;String[]&amp;gt; Atributos que devem ser populados nos objetos da lista.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVTOKENLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVTOKENLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; - Lista com os objetos solicitados&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lockPDVToken ====&lt;br /&gt;
Solicita do módulo PDV uma lista dos tokens de sistema filtrados de acordo com o MO passado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser bloqueado&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_LOCKPDVTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_LOCKPDVTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; - Token bloqueado para edição&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== saveAndUnlockToken ====&lt;br /&gt;
Solicita do módulo PDV que salva uma comanda e a deixe desbloqueada para edição por outros terminais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SAVEANDUNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SAVEANDUNLOCKTOKEN_OBJ&lt;br /&gt;
|&amp;lt;PDVTokenVO&amp;gt; Objeto representando o token a ser salvo e desbloqueado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SAVEANDUNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== unlockToken ====&lt;br /&gt;
Solicita do módulo PDV que desbloqueie uma comanda da edição.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|UNLOCKTOKEN&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_UNLOCKTOKEN_TOKEN&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do token a ser desbloqueado da edição.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_UNLOCKTOKEN&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clearTokens ====&lt;br /&gt;
Solicita do módulo PDV que limpe e desbloqueie as comandas informadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|CLEARTOKENS&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_CLEARTOKENS_TOKENS&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVTokenVO&amp;gt;&amp;gt; Coleção de comandas a serem limpas e desbloqueadas.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_CLEARTOKENS&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCheckoutVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCheckoutVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCHECKOUTVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCheckoutVO&amp;gt;&amp;gt; Coleção de checkouts para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCHECKOUTVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syncPDVCupomVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos PDVCupomVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCPDVCUPOMVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCPDVCUPOMVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;PDVCupomVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCPDVCUPOMVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== syncDocFiscalVOList ====&lt;br /&gt;
Envia para o servidor uma lista de objetos DocFiscalVO para ser salvo. Esses objetos normalmente são criados nas aplicações de PDV e são salvos no servidor para ficarem centralizados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|SYNCDOCFISCALVOLIST&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_SERVERID&lt;br /&gt;
|&amp;lt;Long&amp;gt; Identificador do terminal - gerado quando a estação se resgistrou no servidor.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_SYNCDOCFISCALVOLIST_LIST&lt;br /&gt;
|&amp;lt;ArrayList&amp;lt;DocFiscalVO&amp;gt;&amp;gt; Coleção de cupons para serem sincronizados com o servidor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_SYNCDOCFISCALVOLIST&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findPDVNFCeLastDocumentNumber ====&lt;br /&gt;
Solicita ao servidor que retorne o número do documento do último cupom emitido para uma determinada empresa e série da documento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_COMPANYID&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID da empresa.&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCSERIAL&lt;br /&gt;
|&amp;lt;Integer&amp;gt; Número da série do documento desejado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDPDVNFCELASTDOCUMENTNUMBER&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDPDVNFCELASTDOCUMENTNUMBER_DOCNUMBER&lt;br /&gt;
|&amp;lt;Long&amp;gt; Número do último documento emitido para a empresa e na série solicitada.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== findLocationCountryListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Países alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCOUNTRYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCOUNTRYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCountryVO&amp;gt; Retorna uma lista com todos os LocationCountryVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationStateListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Estados alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_IDCOUNTRY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do País que se deseja os estados.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de países para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONSTATELISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONSTATELISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationStateVO&amp;gt; Retorna uma lista com todos os LocationStateVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationCityListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_IDSTATE&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de estados para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONCITYLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONCITYLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationCityVO&amp;gt; Retorna uma lista com todos os LocationCityVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== findLocationAddressListToSync ====&lt;br /&gt;
Solicita ao servidor que retorne o cadastro de Municípios alterados recentemente para sincronização com outros sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_IDCITY&lt;br /&gt;
|&amp;lt;Long&amp;gt; ID do Estado que se deseja os municípios.&lt;br /&gt;
&#039;&#039;&#039;Obrigamos o filtro de cidade para evitar que o excesso de dados em memória atrapalhe o funcionamento do BIS.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_LASTSYNCDATE&lt;br /&gt;
|&amp;lt;Date&amp;gt; Data da última sincronização.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_FINDLOCATIONADDRESSLISTTOSYNC&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_FINDLOCATIONADDRESSLISTTOSYNC_SYNCLIST&lt;br /&gt;
|List&amp;lt;LocationAddressVO&amp;gt; Retorna uma lista com todos os LocationAddressVO cuja data de última alteração seja maior que a data recebida.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== importSATXML ====&lt;br /&gt;
&lt;br /&gt;
Solicita ao servidor que importe um arquivo de XML do SAT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Requisição&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|IMPORTSATXML&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_IMPORTSATXML_XML&lt;br /&gt;
|&amp;lt;String&amp;gt; Conteúdo do arquivo XML a ser importado.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%;&amp;quot;&lt;br /&gt;
!scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Retorno&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Propriedade&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot;|Valor&lt;br /&gt;
|-&lt;br /&gt;
|PROPERTY_COMMAND&lt;br /&gt;
|OK_IMPORTSATXML&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1654</id>
		<title>Módulo Fiscal</title>
		<link rel="alternate" type="text/html" href="http://wiki.biserp.com.br/index.php?title=M%C3%B3dulo_Fiscal&amp;diff=1654"/>
		<updated>2025-11-16T16:38:06Z</updated>

		<summary type="html">&lt;p&gt;Rodrigogml: /* Requisitos e Implementação */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O módulo Fiscal do BIS tem a finalidade de gerenciar e dar suporte para o tratamento de documentos fiscais, como NFe e NFCe&amp;lt;ref&amp;gt;O suporte a PAF-ECF deve ser completamente removido do sistema, o suporta a SAT continuará por algum tempo por questões de reigstro legais, devendo ser removido depois do prazo legal de guarda desses documentos.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O módulo Fiscal pode ser utilizado por outros módulos para gerar ou obter informações desses documentos, por exemplo, o módulo de compras pode usar o módulo fiscal para obter dados da NFe sem que tenha que conhecer sobre XML da NFe, assim como o módulo de vendas, ou de PDV pode solicitar a emissão de um cupom ou NFe sem ter de conhecer a integração com o SEFAZ ou trabalhar com os certificados digitais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografia e Referências =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RFW.SEFAZ:&#039;&#039;&#039; https://wiki.rodrigogml.eng.br/index.php?title=P%C3%A1gina_principal#RFW_-_Sefaz&lt;br /&gt;
:* Projeto utilizado como base para comunicação com a SEFAZ, abstraíndo toda a comunicação e muita implementação relacionada a SEFAZ. A documentação sobre a SEFAZ deve ser feita apenas no projeto RFW.SEFAZ, aqui devem ser feitas apenas a documentação relacionada ao BIS e como ele trata os documentos internamente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Requisitos e Implementação =&lt;br /&gt;
&lt;br /&gt;
O novo módulo fiscal, sendo implementado a partir da migração do SAT para o NFCe utiliza o &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; como base para a comunicação com a SEFAZ e os objetos oferecidos &amp;lt;code&amp;gt;SEFAZ*VO&amp;lt;/code&amp;gt; para armazenar os dados dos documentos fiscais. Por ser uma representação do XML da SEFAZ, esses objetos se assemelham em estrutura e formato de dados ao próprio XML do documento, com excessão de algumas otimizações para persistir no banco de dados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esses VOs do RFW.SEFAZ vêm com o schema padrão &amp;lt;code&amp;gt;_RFW.SEFA&amp;lt;/code&amp;gt; e tabelas com o prefixo &amp;lt;code&amp;gt;sefaz_&amp;lt;/code&amp;gt;. Os mesmos nomes de tabela sugeridos pelo módulo são utilizadas no BIS, já o Schema é corrigido através de um &amp;lt;code&amp;gt;DAOResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Uma vez que os VOs oferecidos por &amp;lt;code&amp;gt;RFW.SEFAZ&amp;lt;/code&amp;gt; não podem ser alterados para inclusão de outros atirbutos e relacionamentos que atendam a lógica de funcionamento do ERP, uma estrutura &#039;paralela&#039; foi desenvolvida para atender as necessidades de negócio, deixando os objetos ofercidos pelo módulo estritamente responsáveis por armazenas os documentos, eventos e resultado de comunicações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Convenções importantes adotadas sobre os documentos fiscais:&lt;br /&gt;
* Todo documento fiscal do BIS será representado pelo &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt;. Este objeto representará todo e qualquer documento fiscal, servindo de raiz para todas as derivações de documento fiscais existentes. Este VO além de ter as informações principais do documento fiscal (comuns a qualquer documento emitido), e atributos de controle (incluindo subobjetos) pode ter a referência para o &amp;lt;code&amp;gt;SEFAZNFeVO&amp;lt;/code&amp;gt; ou para o objeto/arquivo do SAT/ECF ou qualquer outro documento fiscal a ser implementado no futuro.&lt;br /&gt;
* &amp;lt;code&amp;gt;DocFiscal&amp;lt;/code&amp;gt; concentrará todos os objetos relacionados ao documento fiscal, por exemplo, além de objetos de sua definição, pode conter objetos relacionado a entrada do documento no sistema, ou a lista de eventos e histórico do documento, outros objetos/documentos relacionados (como carta de correção, nota de cancelamento, etc.), vínculos entre o item do documentos e do cadastro do sistema em documentos emitidos, etc.&lt;br /&gt;
* Alguns relacionamentos do DocFiscal poderão ser Composição, outros Associação, conforme o caso e estratégia de implementação.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= !!!!!!DOCUMENTAÇÃO AGUARDANDO REVISÃO!!!!!! =&lt;br /&gt;
&lt;br /&gt;
== Gerenciamento de NFe ==&lt;br /&gt;
&lt;br /&gt;
Um dos documentos fiscais gerenciado pelo módulo são as Notas Fiscais eletrônicas (NFe) recebidas de fornecedores, notas de compras. Tendo assim uma tela onde é possível enviar para o sistema arquivos .XML de notas para cadastra-las no sistema. Essa nota ficará armazenada no sistema por tempo indeterminado, e pode ser encontrada e visualizada sempre que necessário. O arquivamento feito no BIS pode ser utilizado para fins de arquivamento pelo prazo legal.&lt;br /&gt;
&lt;br /&gt;
=== Importação de NFe a partir E-mail === &lt;br /&gt;
Na tela de configurações do módulo deverá ser possível configurar se deseja que o módulo busque por NFe nos e-mails recebidos. A principio o módulo não fará distinção entre caixas de e-mail, se selecionado ele buscará em todas. No futuro pode-se estudar a funcionalidade, se necessário, de especificar as caixas de e-mail que quer que o sistema verifica a existência de NFes ou não.&lt;br /&gt;
&lt;br /&gt;
=== Entrada de Custos a partir de NFe ===&lt;br /&gt;
Uma vez que as notas estiverem no sistema, o sistema será capaz de abrir e dar entrada dos custos dessas notas. A partir de qualquer nota que já esteja no sistema, o usuário poderá seleciona-la e forçar o sistema a dar entrada dessa NFe. A partir de critérios explicados mais a baixo o sistema mapeará os itens da NFe com os itens do sistema e deixará a entrada sugerida cadastrada no sistema. A partir de outra tela (de gerenciamento de entradas de custos) o usuário poderá confirmar, negar ou alterar as entradas sugeridas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter nas configurações do módulo dois campo em porcentagem. Neles o usuário poderá configurar qual a alteração mínima que um preço de venda deve ter para que o sistema sugira autera-lo. Caso o usuário dê a entrada do item e informe que não deve alterar o preço de venda, apenas o custo é alterado para questões de histórico custo deste item.&lt;br /&gt;
&lt;br /&gt;
Nesta tela (de gerenciamento de entrada de custos) devem ser exibidos uma lista de todas as entradas realizadas, as com alterações sugeridas, com alterações negadas e as que não foram mapeadas. Abaixo os botões com as opções:&lt;br /&gt;
* &amp;lt;b&amp;gt;Confirmar Mapeados&amp;lt;/b&amp;gt; - tentará confirmar a entrada de todos os itens que estão pendentes e já foram mapeados. Os itens que não foram mapeados não serão confirmados.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir Não Mapeados&amp;lt;/b&amp;gt; - Excluí todos os itens que não estão mapeados a nenhum item.&lt;br /&gt;
* &amp;lt;b&amp;gt;Excluir&amp;lt;/b&amp;gt; - Exclui os itens selecionados.&lt;br /&gt;
&lt;br /&gt;
O sistema deve ter uma opção nas configurações que informe se o BIS deve efetuar entrada de notas das notas que chegarem automaticamente por e-mail.&lt;br /&gt;
&lt;br /&gt;
{{nota|Alerta de alteração de custo|O sistema deve deixar o preço do item em modo de alerta, e alertar o usuário quando a alteração do preço for muito grande. Para definir o que é &amp;quot;muito grande&amp;quot; deve-se ter essa configuração na tela de configurações do módulo.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mapeamento dos Itens da NFe e os Itens do Sistema ===&lt;br /&gt;
Para tentar mapear os itens da NFe e do sistema o BIS usará as seguintes técnicas na ordem abaixo para sugerir o item certo:&lt;br /&gt;
&lt;br /&gt;
{{stop|Busca sempre pelo Emissor da NFe|Quando utilizamos a busca de histórico para associar um item da nota ao item do sistema, levamos sempre em consideração o emissor da nota. Pois para mesmo produto e diferentes emissores (fornecedores) as quantidades e consequentemente os valores calculados tendem a serem diferentes.}}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico por Descrição da NFe e Unidade Comercial&amp;lt;/b&amp;gt; - Busca no histórico se há entrada de nota com a mesma descrição e unidade comercial. Leva em consideração ambos os argumentos pois o mesmo fornecedor pode usar a mesma descrição do item, mas vender uma caixa e/ou um fardo o que troca a quantidade de venda, e consequentemente o divisor do sistema.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca no histórico pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - Busca no histórico de entrada de notas se há alguma entrada do mesmo emissor da nota e mesmo código EAN escrito na nota. Se tiver um histórico verificamos qual foi o item associado na última entrada e utilizamos o mesmo divisor.&lt;br /&gt;
# &amp;lt;b&amp;gt;Busca pelo EAN Comercial (caso disponível na NFe)&amp;lt;/b&amp;gt; - e tenta mapear no item do sistema.&lt;br /&gt;
&lt;br /&gt;
== Dependência com Outros Módulos == &lt;br /&gt;
* [[BISModules Item|Item]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notas e Referências =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
</feed>