============================================================
 DIAMANTE - CONCENTRADOR NFC-e  |  INSTALACAO NO CLIENTE
============================================================

Esse servico substitui o antigo "Diamante Concentrador NFCe.exe" (WinForms,
que precisava de usuario logado e ficava no tray). Ele faz a MESMA coisa:
varre a tabela nf_saida procurando NFC-e (modelo 65, serie < 300) com
status_sefaz = 1 e transmite cada uma para a SEFAZ pelo ACBrLib.

A diferenca: roda como SERVICO do Windows (sobe sozinho, sem ninguem logado)
e atende VARIAS EMPRESAS no mesmo servidor, cada uma com seu proprio banco e
seu proprio certificado digital. As empresas sao processadas UMA DE CADA VEZ,
de proposito: o ACBrLib guarda o certificado em estado global, entao rodar em
paralelo transmitiria nota com o certificado da empresa errada.

O projeto WinForms antigo (NFCECONCENTRADOR) continua existindo e funcionando
normalmente -- a migracao pode ser feita cliente a cliente.

------------------------------------------------------------
 ATENCAO AO COPIAR O INSTALAR-SERVICO.bat PRO CLIENTE
------------------------------------------------------------
Copie o arquivo .bat DIRETO (pendrive, rede, RDP) -- NUNCA cole o conteudo
via WhatsApp/e-mail/chat e salve como .bat por la. Esses apps costumam trocar
a codificacao/quebra de linha do arquivo, e o Windows passa a nao reconhecer
comandos do .bat (ex.: reporta "arquivo nao encontrado" mesmo com o .exe
presente na pasta). Se isso acontecer: teste "cmd /c if exist NOME.exe (echo
SIM) else (echo NAO)" pra confirmar que o arquivo existe de verdade, e recrie
o .bat direto no cliente (Bloco de Notas, salvar como ANSI, nao UTF-8).

------------------------------------------------------------
 ANTES DE COMECAR - tenha em maos
------------------------------------------------------------
 [ ] .NET Framework 4.8 instalado no servidor do cliente -- o
     ConcentradorNFCe.Service.exe e o instalador do proprio .bat (sc create)
     DEPENDEM disso; sem o runtime o executavel simplesmente nao roda (e pode
     dar erro confuso, tipo o .bat parecer nao achar o .exe). Verifique em:
     Painel de Controle > Programas > Ativar ou desativar recursos do Windows
     > ".NET Framework 4.8 Advanced Services", ou baixe o instalador em
     https://dotnet.microsoft.com/download/dotnet-framework/net48
 [ ] Connection string do banco de CADA empresa (SQL Server)
 [ ] empresa_id de cada empresa
 [ ] Certificado digital A1 e configuracao do ACBr ja feitos no ERP, POR
     EMPRESA (o servico reaproveita a MESMA config do ACBr usada pelo
     Retaguarda: campo acbr_numero_certificado da configuracao_sistema, mais
     IdToken/Token/UF da tabela empresa).
 [ ] As DLLs nativas do ACBr (ACBrNFe32.dll e as que ela carrega) e a pasta
     Schemas\NFe\ precisam estar NESTA MESMA PASTA do
     ConcentradorNFCe.Service.exe -- o servico e x86 obrigatoriamente por
     causa dessas DLLs.

 [ ] *** DEPENDENCIAS NATIVAS DO ACBr (x86) *** -- ERRO COMUM: se faltar
     qualquer uma destas, a transmissao estoura "XmlNode nao pode ser nulo"
     no CarregarINI (o ACBr nativo nao consegue montar o XML), MESMO numa
     NFC-e simples de 1 item. Copie TODAS estas DLLs para a MESMA PASTA do
     ConcentradorNFCe.Service.exe (vem do pacote ACBrLibNFe-Windows-1.5.0.xxx,
     subpasta dep\, versao x86 -- OU simplesmente copie da pasta do Retaguarda
     que ja transmite, que tem o conjunto completo):
        - libcrypto-1_1.dll   (OpenSSL)
        - libssl-1_1.dll      (OpenSSL)
        - libxml2.dll         (LibXml2)
        - libxslt.dll         (LibXml2)
        - libexslt.dll        (LibXml2)
        - libiconv.dll        (LibXml2)
     Dica p/ conferir o que falta: rode no PowerShell
        Compare-Object (gci "C:\Diamante\Retaguarda" -File|% Name) `
                       (gci "<pasta_do_servico>" -File|% Name) |
          ? SideIndicator -eq '<=' | % InputObject
     e copie as DLLs nativas que aparecerem.

IMPORTANTE sobre certificado A3: nao funciona em servico (exige PIN
interativo). Use A1.

------------------------------------------------------------
 CERTIFICADO: 2 modos -- REPOSITORIO (padrao) ou ARQUIVO (.pfx)
------------------------------------------------------------
O parametro <certificado_modo> escolhe como o servico usa o certificado:

  repositorio  (PADRAO) = comportamento ANTIGO. Usa o certificado configurado no
                ERP (repositorio do Windows, pela serie). Quem ja roda assim NAO
                muda nada -- pode nem mexer no config. Os campos cert_* sao ignorados.

  arquivo      = usa o .pfx em ARQUIVO (campos cert_* abaixo). Independe de conta e
                de repositorio do Windows. Bom quando o servico roda como LocalSystem
                ou uma conta que nao enxerga o certificado do usuario (erro
                "Certificado Serie X nao encontrado").

Pode ser GLOBAL (Config/certificado_modo) e/ou por EMPRESA (o da empresa vence).

QUANDO USAR ARQUIVO:
 1) Exporte o A1 para .pfx COM a chave privada + senha (certmgr.msc -> Pessoal ->
    o certificado -> Exportar -> "Sim, exportar a chave privada" -> .PFX -> senha).
    Salve na pasta do servico, ex.: pessanha.pfx.
 2) De LEITURA no .pfx a conta que roda o servico.
 3) No config.xml, marque o modo e preencha os campos:

    <certificado_modo>repositorio</certificado_modo>   <!-- padrao global -->
    ...
    <Empresa>
      <empresa_id>2</empresa_id>
      <connection_string></connection_string>
      <certificado_modo>arquivo</certificado_modo>       <!-- so esta empresa por arquivo -->
      <cert_arquivo_pfx>C:\Diamante\Retaguarda\diamante_svc_concentrador\pessanha.pfx</cert_arquivo_pfx>
      <cert_senha>SENHA_DO_PFX</cert_senha>
      <cert_cript>cryOpenSSL</cert_cript>      <!-- le o .pfx direto, sem repositorio -->
      <cert_httplib>httpOpenSSL</cert_httplib>  <!-- opcional; se der erro de SSL na transmissao -->
    </Empresa>

 - Da pra MISTURAR: umas empresas por repositorio, outras por arquivo.
 - O modo arquivo vale SO no servico; a configuracao_sistema no banco NAO muda,
   entao o certificado/CryptLib do PDV/NFCE/Retaguarda continua exatamente igual.
 - O modo arquivo com cryOpenSSL/httpOpenSSL precisa das DLLs OpenSSL na pasta
   (libcrypto-1_1.dll / libssl-1_1.dll) -- as mesmas ja listadas nas dependencias.

============================================================
 INSTALACAO NO SERVIDOR DO CLIENTE
============================================================

1) Copie a pasta do servico (bin\Release, ou bin\Debug em teste) para o
   servidor, por exemplo:
     C:\DiamanteConcentradorNFCe\
   Coloque o INSTALAR-SERVICO.bat e este LEIAME na MESMA pasta do
   ConcentradorNFCe.Service.exe -- e confirme que as DLLs nativas do ACBr e a
   pasta Schemas tambem estao la (copie da pasta do Retaguarda se precisar).

2) Aponte o banco padrao: edite ConcentradorNFCe.Service.exe.config
   -> connection string chave "a" = banco do cliente.

3) Gere o config: rode o INSTALAR-SERVICO.bat, opcao [1] (roda em console).
   Na 1a vez ele cria o config.xml nesta pasta com um exemplo de 1 empresa.
   Feche com CTRL+C.

4) Edite o config: opcao [2] do bat (abre o config.xml no Bloco de Notas).

   Formato (multi-empresa; cada <Empresa> pode ter banco proprio ou usar o
   banco padrao do App.config, deixando <connection_string> vazio):

     <Config>
       <tipo_conexao>1</tipo_conexao>
       <intervalo_segundos>15</intervalo_segundos>
       <Empresas>
         <TodasDoBancoPadrao>false</TodasDoBancoPadrao>
         <Empresa>
           <empresa_id>1</empresa_id>
           <connection_string></connection_string>
         </Empresa>
         <Empresa>
           <empresa_id>1</empresa_id>
           <connection_string>Data Source=SRV;Initial Catalog=diamante_loja2;User ID=sa;Password=xxx;Connect Timeout=45;Encrypt=False;TrustServerCertificate=False</connection_string>
         </Empresa>
       </Empresas>
     </Config>

   MODO AUTOMATICO (recomendado quando as empresas estao TODAS no mesmo banco):
   coloque <TodasDoBancoPadrao>true</TodasDoBancoPadrao> e NAO precisa listar
   empresa por empresa. A cada ciclo o servico consulta a tabela empresa do
   banco padrao (ISNULL(inativa,'N') <> 'S') e processa todas as ativas. Se o
   cliente cadastrar uma loja nova, ela entra sozinha no proximo ciclo -- sem
   mexer no config.xml nem reiniciar o servico.

   Os dois modos convivem: com TodasDoBancoPadrao = true voce ainda pode listar
   <Empresa> com connection_string PROPRIA (empresas de OUTROS bancos). Uma
   empresa listada sem connection_string nao e duplicada -- vale a listada.

   IMPORTANTE:
   - intervalo_segundos = intervalo entre CICLOS. Padrao 15, minimo 5. Cada
     ciclo varre TODAS as empresas em sequencia.
   - empresa_id pode repetir entre bancos diferentes (cada connection_string
     aponta pra um banco com sua propria tabela empresa).
   - Em cada ciclo o servico processa ate 100 notas por empresa, em lotes de
     10, pra uma empresa com fila grande nao segurar as outras.
   - O config.xml antigo do NFCECONCENTRADOR (com <empresa_id> solto, sem a
     secao <Empresas>) tambem e aceito, e tratado como uma empresa so.

5) Teste: opcao [1] do bat. Deve aparecer a razao social e o CNPJ de CADA
   empresa configurada, e as notas sendo transmitidas com o cStat de retorno.

6) Instale como servico do Windows para subir sozinho:
   Feche o bat e reabra com BOTAO DIREITO > "Executar como administrador".
   Opcao [3] (instalar) -> ele cria e inicia o servico
   "DiamanteConcentradorNFCeService".

   Depois, para gerenciar: opcoes [4] iniciar, [5] parar, [6] status,
   [7] desinstalar.

7) Se o cliente usava o WinForms antigo, PARE/DESINSTALE o
   "Diamante Concentrador NFCe.exe" (tire do Iniciar/agendador) para os dois
   nao transmitirem a mesma nota.

============================================================
 LOGS
============================================================
Toda acao do menu (instalar/iniciar/parar/desinstalar) grava a saida do
comando "sc" e o codigo de saida em:
     Logs\instalar-servico.log
Abra pela opcao [8] do menu se a instalacao falhar.

O PROPRIO servico grava:
 - Logs\log_AAAA-MM-DD.txt      -> ciclo a ciclo: empresa, CNPJ, nota
                                   transmitida, cStat, erros.
 - Logs\mensagens_AAAA-MM-DD.txt -> as mensagens que no WinForms apareceriam
                                   como caixa de dialogo. Como servico nao tem
                                   tela, elas caem aqui em vez de travar o
                                   processo. VALE A PENA OLHAR quando algo
                                   "parece ter passado" mas nao autorizou.
 - log_dia\LogFechaVenda-*.txt   -> log detalhado do proprio TransmissaoACBr
                                   (mesmo do Retaguarda/PDV).

============================================================
 PROBLEMAS COMUNS
============================================================
 - Servico nao inicia / para sozinho logo depois de "Running":
     confira Logs\log_AAAA-MM-DD.txt (erro de connection string, ACBr nao
     conseguiu carregar as DLLs, ou config.xml ausente/invalido).

 - "certificado nao configurado nos dados da empresa X. Empresa ignorada.":
     o campo acbr_numero_certificado da configuracao_sistema daquela empresa
     esta vazio. Configure pelo Retaguarda. O servico PULA a empresa e segue
     com as demais -- nao para o servico inteiro.

 - "NOTA DENEGADA (cStat 301)":
     no WinForms antigo isso FECHAVA o aplicativo. Aqui so interrompe aquela
     empresa naquele ciclo; as outras empresas continuam e no proximo ciclo
     ele tenta de novo. Resolva a denegacao (situacao cadastral do
     destinatario) no ERP.

 - "nota X voltou no lote sem mudar de status":
     protecao contra retransmissao. A nota foi processada mas o status_sefaz
     nao mudou (falha silenciosa dentro do ACBr). Olhe o
     log_dia\LogFechaVenda-*.txt daquela data pra ver o motivo real.

 - Duas empresas transmitindo com o certificado errado:
     nao deveria acontecer (processamento e sequencial), mas se ocorrer NAO
     tente rodar duas instancias do servico na mesma pasta -- suba uma
     instancia por pasta, com config.xml separado.

Documentacao completa no repositorio: CHANGELOG.md.
