bufferNfse method

Future<List<int>> bufferNfse(
  1. Nfse? nfse, {
  2. bool mostrarMoeda = true,
})

Gera o buffer de dados para impressão da NFSe em formato ESC/POS.

nfse - Dados da NFSe que serão processados para impressão. mostrarMoeda - Define se o símbolo da moeda deve ser exibido. Valor padrão é true.

Retorna uma lista de bytes que representa os comandos de impressão.

Implementation

Future<List<int>> bufferNfse(
  Nfse? nfse, {
  bool mostrarMoeda = true,
}) async {
  String moeda = (mostrarMoeda == true) ? r'R$' : '';
  final profile = await CapabilityProfile.load();
  final generator = Generator(paperSize, profile);
  List<int> bytes = [];

  // Cabeçalho - Dados do Emitente
  bytes += generator.rawBytes([27, 97, 49]); // Centralizado
  if (nfse?.emit != null) {
    bytes += generator.text(
      DanfeUtils.removeAcentos(nfse!.emit!.xNome ?? ''),
      styles: const PosStyles(align: PosAlign.center, bold: true),
    );

    bytes += generator.text(
      'CNPJ - ${DanfeUtils.formatCNPJ(nfse.emit!.cnpj ?? '')}',
      styles: const PosStyles(align: PosAlign.center),
    );

    if (nfse.emit!.enderNac != null) {
      final endereco = nfse.emit!.enderNac!;
      final String uf = endereco.uf == null ? '' : ' - ${endereco.uf}';

      bytes += generator.text(
        DanfeUtils.removeAcentos(
          '${endereco.xLgr ?? ''},${endereco.nro ?? ''} ${endereco.xBairro ?? ''}$uf',
        ),
        styles: const PosStyles(align: PosAlign.center),
      );

      if (endereco.cep != null) {
        bytes += generator.text(
          'CEP: ${DanfeUtils.formatCep(endereco.cep ?? '')}',
          styles: const PosStyles(align: PosAlign.center),
        );
      }
    }

    if (nfse.emit!.fone != null) {
      bytes += generator.text(
        'Fone: ${nfse.emit!.fone}',
        styles: const PosStyles(align: PosAlign.center),
      );
    }

    if (nfse.emit!.email != null) {
      bytes += generator.text(
        'Email: ${nfse.emit!.email}',
        styles: const PosStyles(align: PosAlign.center),
      );
    }
  }

  bytes += generator.rawBytes([27, 97, 48]); // Alinhamento à esquerda
  bytes += generator.hr();
  bytes += generator.rawBytes([27, 97, 49]); // Centralizado

  // Título do documento
  bytes += generator.text(
    'NFSe - Nota Fiscal de Servico Eletronica',
    styles: const PosStyles(
      align: PosAlign.center,
      bold: true,
      height: PosTextSize.size1,
      width: PosTextSize.size1,
    ),
  );

  bytes += generator.text(
    'NACIONAL',
    styles: const PosStyles(align: PosAlign.center),
  );

  bytes += generator.rawBytes([27, 97, 48]); // Alinhamento à esquerda
  bytes += generator.hr();

  // Número da NFSe
  if (nfse?.nNFSe != null) {
    bytes += generator.text(
      'Numero NFSe: ${nfse!.nNFSe}',
      styles: const PosStyles(align: PosAlign.left, bold: true),
    );
  }

  // Data e hora de processamento
  if (nfse?.dhProc != null) {
    bytes += generator.text(
      'Data Processamento: ${DanfeUtils.formatDate(nfse!.dhProc!, dateOnly: false)}',
      styles: const PosStyles(align: PosAlign.left),
    );
  }

  // Ambiente de geração
  if (nfse?.ambGer != null) {
    final ambiente = nfse!.ambGer == '1' ? 'Producao' : 'Homologacao';
    bytes += generator.text(
      'Ambiente: $ambiente',
      styles: const PosStyles(align: PosAlign.left),
    );
  }

  // Status
  if (nfse?.cStat != null && nfse?.xLocIncid != null) {
    bytes += generator.text(
      'Status: ${nfse!.cStat} - ${DanfeUtils.removeAcentos(nfse.xLocIncid!)}',
      styles: const PosStyles(align: PosAlign.left),
    );
  }

  bytes += generator.hr();

  // Dados do Prestador
  if (nfse?.infDPS?.prest != null) {
    bytes += generator.rawBytes([27, 97, 49]); // Centralizado
    bytes += generator.text(
      'DADOS DO PRESTADOR',
      styles: const PosStyles(align: PosAlign.center, bold: true),
    );
    bytes += generator.rawBytes([27, 97, 48]); // Alinhamento à esquerda

    final prestador = nfse!.infDPS!.prest!;

    bytes += generator.text(
      'CNPJ: ${DanfeUtils.formatCNPJ(prestador.cnpj ?? '')}',
      styles: const PosStyles(align: PosAlign.left),
    );

    bytes += generator.hr();
  }

  // Dados do Tomador
  if (nfse?.infDPS?.tomador != null) {
    bytes += generator.rawBytes([27, 97, 49]); // Centralizado
    bytes += generator.text(
      'DADOS DO TOMADOR',
      styles: const PosStyles(align: PosAlign.center, bold: true),
    );
    bytes += generator.rawBytes([27, 97, 48]); // Alinhamento à esquerda

    final tomador = nfse!.infDPS!.tomador!;

    if (tomador.cnpj != null) {
      bytes += generator.text(
        'CNPJ: ${DanfeUtils.formatCNPJ(tomador.cnpj!)}',
        styles: const PosStyles(align: PosAlign.left),
      );
    } else if (tomador.cpf != null) {
      bytes += generator.text(
        'CPF: ${DanfeUtils.formatCPF(tomador.cpf!)}',
        styles: const PosStyles(align: PosAlign.left),
      );
    }

    if (tomador.xNome != null) {
      bytes += generator.text(
        DanfeUtils.removeAcentos('Nome: ${tomador.xNome}'),
        styles: const PosStyles(align: PosAlign.left),
      );
    }

    if (tomador.endereco != null) {
      final endereco = tomador.endereco!;
      bytes += generator.text(
        DanfeUtils.removeAcentos(
          'Endereco: ${endereco.xLgr ?? ''}, ${endereco.nro ?? ''}',
        ),
        styles: const PosStyles(align: PosAlign.left),
      );

      if (endereco.xBairro != null) {
        bytes += generator.text(
          DanfeUtils.removeAcentos('Bairro: ${endereco.xBairro}'),
          styles: const PosStyles(align: PosAlign.left),
        );
      }

      if (endereco.cMun != null && endereco.uf != null) {
        bytes += generator.text(
          '${endereco.cMun} - ${endereco.uf}',
          styles: const PosStyles(align: PosAlign.left),
        );
      }

      if (endereco.cep != null) {
        bytes += generator.text(
          'CEP: ${DanfeUtils.formatCep(endereco.cep!)}',
          styles: const PosStyles(align: PosAlign.left),
        );
      }
    }

    bytes += generator.hr();
  }

  // Dados do Serviço
  if (nfse?.infDPS?.serv?.cServ != null) {
    bytes += generator.rawBytes([27, 97, 49]); // Centralizado
    bytes += generator.text(
      'DADOS DO SERVICO',
      styles: const PosStyles(align: PosAlign.center, bold: true),
    );
    bytes += generator.rawBytes([27, 97, 48]); // Alinhamento à esquerda

    final cServ = nfse!.infDPS!.serv!.cServ!;

    if (cServ.xDescServ != null) {
      bytes += generator.text(
        DanfeUtils.removeAcentos('Descricao: ${cServ.xDescServ}'),
        styles: const PosStyles(align: PosAlign.left),
      );
    }

    if (cServ.cTribNac != null) {
      bytes += generator.text(
        'Codigo Trib. Nacional: ${cServ.cTribNac}',
        styles: const PosStyles(align: PosAlign.left),
      );
    }

    if (cServ.cTribMun != null) {
      bytes += generator.text(
        'Codigo Trib. Municipal: ${cServ.cTribMun}',
        styles: const PosStyles(align: PosAlign.left),
      );
    }

    if (cServ.cNBS != null) {
      bytes += generator.text(
        'CNBS: ${cServ.cNBS}',
        styles: const PosStyles(align: PosAlign.left),
      );
    }

    bytes += generator.hr();
  }

  // Valores
  if (nfse?.infDPS?.valores?.vServPrest != null) {
    bytes += generator.rawBytes([27, 97, 49]); // Centralizado
    bytes += generator.text(
      'VALORES',
      styles: const PosStyles(align: PosAlign.center, bold: true),
    );
    bytes += generator.rawBytes([27, 97, 48]); // Alinhamento à esquerda

    final vServPrest = nfse!.infDPS!.valores!.vServPrest!;

    if (vServPrest.vServ != null) {
      bytes += generator.row([
        PosColumn(
          text: 'Valor Servicos:',
          width: 6,
          styles: const PosStyles(align: PosAlign.left),
        ),
        PosColumn(
          text: DanfeUtils.formatMoneyMilhar(
            vServPrest.vServ!,
            modeda: 'pt_BR',
            simbolo: moeda,
          ),
          width: 6,
          styles: const PosStyles(align: PosAlign.right),
        ),
      ]);
    }

    if (vServPrest.vDed != null && vServPrest.vDed != '0.00') {
      bytes += generator.row([
        PosColumn(
          text: 'Deducoes:',
          width: 6,
          styles: const PosStyles(align: PosAlign.left),
        ),
        PosColumn(
          text: DanfeUtils.formatMoneyMilhar(
            vServPrest.vDed!,
            modeda: 'pt_BR',
            simbolo: moeda,
          ),
          width: 6,
          styles: const PosStyles(align: PosAlign.right),
        ),
      ]);
    }

    if (vServPrest.vBC != null) {
      bytes += generator.row([
        PosColumn(
          text: 'Base Calculo:',
          width: 6,
          styles: const PosStyles(align: PosAlign.left, bold: true),
        ),
        PosColumn(
          text: DanfeUtils.formatMoneyMilhar(
            vServPrest.vBC!,
            modeda: 'pt_BR',
            simbolo: moeda,
          ),
          width: 6,
          styles: const PosStyles(align: PosAlign.right, bold: true),
        ),
      ]);
    }

    bytes += generator.hr();
  }

  // Tributos
  if (nfse?.infDPS?.valores?.trib?.totTrib != null) {
    final totTrib = nfse!.infDPS?.valores?.trib?.totTrib;
    final tribMun = nfse.infDPS?.valores?.trib?.tribMun;

    bytes += generator.rawBytes([27, 97, 49]); // Centralizado
    bytes += generator.text(
      'TRIBUTOS',
      styles: const PosStyles(align: PosAlign.center, bold: true),
    );
    bytes += generator.rawBytes([27, 97, 48]); // Alinhamento à esquerda

    if (tribMun?.pAliq != null) {
      bytes += generator.row([
        PosColumn(
          text: 'Percentual da aliquota:',
          width: 6,
          styles: const PosStyles(align: PosAlign.left),
        ),
        PosColumn(
          text:
              '${DanfeUtils.formatMoneyMilhar(
                tribMun!.pAliq!,
                modeda: 'pt_BR',
                simbolo: '',
              )}%',
          width: 6,
          styles: const PosStyles(align: PosAlign.right),
        ),
      ]);
    }

    if (totTrib?.vTotTrib != null) {
      bytes += generator.row([
        PosColumn(
          text: 'Total Tributos:',
          width: 6,
          styles: const PosStyles(align: PosAlign.left),
        ),
        PosColumn(
          text: DanfeUtils.formatMoneyMilhar(
            totTrib!.vTotTrib!,
            modeda: 'pt_BR',
            simbolo: moeda,
          ),
          width: 6,
          styles: const PosStyles(align: PosAlign.right),
        ),
      ]);
    }

    bytes += generator.hr();
  }

  // Rodapé com informações adicionais
  if (nfse?.verAplic != null) {
    bytes += generator.rawBytes([27, 97, 49]); // Centralizado
    bytes += generator.text(
      'Versao: ${nfse!.verAplic}',
      styles: const PosStyles(align: PosAlign.center),
    );
  }

  bytes += generator.feed(1);
  bytes += generator.cut();
  bytes += generator.reset();

  return bytes;
}