bufferDanfe method

  1. @override
Future<List<int>> bufferDanfe(
  1. Danfe? danfe, {
  2. bool mostrarMoeda = true,
})
override

Gera o buffer de dados para impressão do DANFE em formato ESC/POS.

danfe - Dados do DANFE 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

@override
Future<List<int>> bufferDanfe(
  Danfe? danfe, {
  bool mostrarMoeda = true,
}) async {
  String moeda = (mostrarMoeda == true) ? r'R$' : '';
  final profile = await CapabilityProfile.load();
  final generator = Generator(paperSize, profile);
  List<int> bytes = [];
  // Print image
  bytes += generator.rawBytes([27, 97, 49]);
  bytes += generator.text(
    DanfeUtils.removeAcentos(
      danfe?.dados?.emit?.xFant ?? (danfe?.dados?.emit?.xNome ?? ''),
    ),
    styles: const PosStyles(align: PosAlign.center, bold: true),
  );
  final String uf = danfe?.dados?.emit?.enderEmit?.uF == null ? '' : ' - ${danfe!.dados!.emit!.enderEmit!.uF}';
  bytes += generator.text(
    ('CNPJ - ${DanfeUtils.formatCNPJ(danfe?.dados?.emit?.cnpj ?? '')}'),
    styles: const PosStyles(align: PosAlign.center),
  );
  bytes += generator.text(
    DanfeUtils.removeAcentos(
      '${danfe?.dados?.emit?.enderEmit?.xLgr ?? ''},${danfe?.dados?.emit?.enderEmit?.nro ?? ''} ${danfe?.dados?.emit?.enderEmit?.xBairro ?? ''}$uf',
    ),
    styles: const PosStyles(align: PosAlign.center),
  );
  bytes += generator.text(
    'CEP: ${DanfeUtils.formatCep(danfe?.dados?.emit?.enderEmit?.cEP ?? '')}',
    styles: const PosStyles(align: PosAlign.center),
  );
  bytes += generator.rawBytes([27, 97, 48]);
  bytes += generator.hr();
  bytes += generator.rawBytes([27, 97, 49]);
  if ((danfe?.tipo ?? TipoDocumento.CFe) == TipoDocumento.CFe) {
    bytes += generator.text(
      'Nota Fiscal Eletronica - SAT ',
      styles: const PosStyles(
        align: PosAlign.center,
        bold: true,
        height: PosTextSize.size1,
        width: PosTextSize.size1,
      ),
    );
  } else if ((danfe?.tipo ?? TipoDocumento.NFCe) == TipoDocumento.NFCe) {
    bytes += generator.text(
      'Nota Fiscal Eletronica - NFC-E ',
      styles: const PosStyles(
        align: PosAlign.center,
        bold: true,
        height: PosTextSize.size1,
        width: PosTextSize.size1,
      ),
    );
  } else {
    bytes += generator.text(
      'Nota Fiscal Eletronica - NFe ',
      styles: const PosStyles(
        align: PosAlign.center,
        bold: true,
        height: PosTextSize.size1,
        width: PosTextSize.size1,
      ),
    );
  }
  bytes += generator.rawBytes([27, 97, 48]);
  var documentoConsumidor = (danfe?.dados?.dest?.cpf != null) ? DanfeUtils.formatCPF(danfe?.dados?.dest?.cpf ?? '') : DanfeUtils.formatCNPJ(danfe?.dados?.dest?.cnpj ?? '');
  bytes += generator.text(
    "CPF/CNPJ do consumidor: $documentoConsumidor",
    styles: const PosStyles(align: PosAlign.left),
  );
  if (danfe?.dados?.dest?.xNome != '' || danfe?.dados?.dest?.xNome != null) {
    bytes += generator.text(
      "Nome: ${danfe?.dados?.dest?.xNome ?? ''}",
      styles: const PosStyles(align: PosAlign.left),
    );
  }
  bytes += generator.text(
    "Nota: ${danfe?.dados?.ide?.nNF ?? ''}",
    styles: const PosStyles(align: PosAlign.left),
  );
  bytes += generator.text(
    'Data: ${DanfeUtils.formatDate(danfe?.dados?.ide?.dataEmissao ?? '')}',
    styles: const PosStyles(align: PosAlign.center),
  );
  if (danfe?.dados?.ide?.dhSaiEnt != null) {
    bytes += generator.text(
      'Data E/S: ${DanfeUtils.formatDate(danfe?.dados?.ide?.dhSaiEnt ?? '')}',
      styles: const PosStyles(align: PosAlign.center),
    );
  }

  bytes += generator.hr();

  if (paperSize == PaperSize.mm58) {
    bytes += generator.row([
      PosColumn(
        text: 'DESCRICAO',
        width: 7,
        styles: const PosStyles(align: PosAlign.left, bold: true),
      ),
      PosColumn(
        text: 'QTD',
        width: 2,
        styles: const PosStyles(align: PosAlign.right, bold: true),
      ),
      PosColumn(
        text: 'VLTOT',
        width: 3,
        styles: const PosStyles(align: PosAlign.right, bold: true),
      ),
    ]);
  } else {
    bytes += generator.row([
      PosColumn(
        text: 'DESCRICAO',
        width: 5,
        styles: const PosStyles(align: PosAlign.left, bold: true),
      ),
      PosColumn(
        text: 'QTD',
        width: 1,
        styles: const PosStyles(align: PosAlign.right, bold: true),
      ),
      PosColumn(
        text: 'VLUN',
        width: 3,
        styles: const PosStyles(align: PosAlign.right, bold: true),
      ),
      PosColumn(
        text: 'VLTOT',
        width: 3,
        styles: const PosStyles(align: PosAlign.right, bold: true),
      ),
    ]);
  }
  if (danfe?.dados?.det != null) {
    for (Det det in danfe!.dados!.det!) {
      if (paperSize == PaperSize.mm58) {
        bytes += generator.row([
          PosColumn(
            text: det.prod?.xProd ?? '',
            width: 7,
            styles: const PosStyles(
              align: PosAlign.left,
              width: PosTextSize.size1,
            ),
          ),
          PosColumn(
            text: DanfeUtils.formatNumber(det.prod?.qCom ?? ''),
            width: 2,
            styles: const PosStyles(align: PosAlign.right),
          ),
          PosColumn(
            text: DanfeUtils.formatMoneyMilhar(
              det.prod?.vProd ?? '',
              modeda: 'pt_BR',
              simbolo: moeda,
            ),
            width: 3,
            styles: const PosStyles(align: PosAlign.right),
          ),
        ]);
      } else {
        bytes += generator.row([
          PosColumn(
            text: det.prod?.xProd ?? '',
            width: 5,
            styles: const PosStyles(align: PosAlign.left),
          ),
          PosColumn(
            text: DanfeUtils.formatNumber(det.prod?.qCom ?? ''),
            width: 1,
            styles: const PosStyles(align: PosAlign.right),
          ),
          PosColumn(
            text: DanfeUtils.formatMoneyMilhar(
              det.prod?.vUnCom ?? '',
              modeda: 'pt_BR',
              simbolo: moeda,
            ),
            width: 3,
            styles: const PosStyles(align: PosAlign.right),
          ),
          PosColumn(
            text: DanfeUtils.formatMoneyMilhar(
              det.prod?.vProd ?? '',
              modeda: 'pt_BR',
              simbolo: moeda,
            ),
            width: 3,
            styles: const PosStyles(align: PosAlign.right),
          ),
        ]);
      }
    }
  }
  bytes += generator.hr();
  bytes += generator.row([
    PosColumn(
      text: 'QTD DE ITENS',
      width: 6,
      styles: const PosStyles(align: PosAlign.left),
    ),
    PosColumn(
      text: DanfeUtils.formatNumber(
        danfe?.dados?.det?.length.toString() ?? '',
      ),
      width: 6,
      styles: const PosStyles(
        align: PosAlign.right,
        height: PosTextSize.size1,
        width: PosTextSize.size1,
      ),
    ),
  ]);
  bytes += generator.row([
    PosColumn(
      text: 'SUBTOTAL',
      width: 6,
      styles: const PosStyles(bold: true, align: PosAlign.left),
    ),
    PosColumn(
      text: DanfeUtils.formatMoneyMilhar(
        danfe?.dados?.total?.valorTotal ?? '',
        modeda: 'pt_BR',
        simbolo: moeda,
      ),
      width: 6,
      styles: const PosStyles(align: PosAlign.right, bold: true),
    ),
  ]);

  if ((danfe?.dados?.total?.valorFrete ?? '0.00') != '0.00') {
    bytes += generator.row([
      PosColumn(
        text: 'FRETE',
        width: 6,
        styles: const PosStyles(align: PosAlign.left),
      ),
      PosColumn(
        text: DanfeUtils.formatMoneyMilhar(
          danfe?.dados?.total?.valorFrete ?? '',
          modeda: 'pt_BR',
          simbolo: moeda,
        ),
        width: 6,
        styles: const PosStyles(align: PosAlign.right),
      ),
    ]);
  }

  if ((danfe?.dados?.total?.desconto ?? '0.00') != '0.00') {
    bytes += generator.row([
      PosColumn(
        text: 'DESCONTO',
        width: 6,
        styles: const PosStyles(align: PosAlign.left),
      ),
      PosColumn(
        text: DanfeUtils.formatMoneyMilhar(
          danfe?.dados?.total?.desconto ?? '',
          modeda: 'pt_BR',
          simbolo: moeda,
        ),
        width: 6,
        styles: const PosStyles(align: PosAlign.right),
      ),
    ]);
  }

  if ((danfe?.dados?.total?.acrescimo ?? '0.00') != '0.00') {
    bytes += generator.row([
      PosColumn(text: 'ACRESCIMO', width: 6, styles: const PosStyles()),
      PosColumn(
        text: DanfeUtils.formatMoneyMilhar(
          danfe?.dados?.total?.acrescimo ?? '',
          modeda: 'pt_BR',
          simbolo: moeda,
        ),
        width: 6,
        styles: const PosStyles(align: PosAlign.right),
      ),
    ]);
  }
  if ((danfe?.dados?.pgto?.vTroco ?? '0.00') != '0.00') {
    bytes += generator.row([
      PosColumn(
        text: 'TROCO',
        width: 6,
        styles: const PosStyles(align: PosAlign.left),
      ),
      PosColumn(
        text: DanfeUtils.formatMoneyMilhar(
          danfe?.dados?.pgto?.vTroco ?? '',
          modeda: 'pt_BR',
          simbolo: moeda,
        ),
        width: 6,
        styles: const PosStyles(align: PosAlign.right),
      ),
    ]);
  }

  bytes += generator.row([
    PosColumn(
      text: 'TOTAL',
      width: 6,
      styles: const PosStyles(bold: true, align: PosAlign.left),
    ),
    PosColumn(
      text: DanfeUtils.formatMoneyMilhar(
        danfe?.dados?.total?.valorPago ?? '0.00',
        modeda: 'pt_BR',
        simbolo: moeda,
      ),
      width: 6,
      styles: const PosStyles(align: PosAlign.right, bold: true),
    ),
  ]);
  bytes += generator.hr();
  if (danfe?.dados?.pgto != null) {
    bytes += generator.row([
      PosColumn(
        text: 'FORMAS DE PAGAMENTO',
        width: 6,
        styles: const PosStyles(bold: true),
      ),
      PosColumn(
        text: 'VALOR PAGO',
        width: 6,
        styles: const PosStyles(align: PosAlign.right, bold: true),
      ),
    ]);
    for (MP pagamento in danfe!.dados!.pgto!.formas!) {
      bytes += generator.row([
        PosColumn(
          text: DanfeUtils.removeAcentos(pagamento.cMP ?? ''),
          width: 6,
          styles: const PosStyles(align: PosAlign.left),
        ),
        PosColumn(
          text: DanfeUtils.formatMoneyMilhar(
            pagamento.vMP ?? '',
            modeda: 'pt_BR',
            simbolo: moeda,
          ),
          width: 6,
          styles: const PosStyles(align: PosAlign.right),
        ),
      ]);
    }
    bytes += generator.hr();
  }

  if (danfe?.dados?.transp != null) {
    if (danfe?.dados?.transp?.transporta?.xNome != null) {
      bytes += generator.rawBytes([27, 97, 49]);
      bytes += generator.text(
        'TRANSPORTADORA',
        styles: const PosStyles(align: PosAlign.center, bold: true),
      );

      bytes += generator.text(DanfeUtils.removeAcentos((danfe?.dados?.transp?.transporta?.xNome ?? '')));
      bytes += generator.text(DanfeUtils.removeAcentos((danfe?.dados?.transp?.transporta?.xEnder ?? '')));
      bytes += generator.text(
        DanfeUtils.removeAcentos('${danfe?.dados?.transp?.transporta?.xMun ?? ''} ${danfe?.dados?.transp?.transporta?.uf ?? ''}'),
      );
      bytes += generator.rawBytes([27, 97, 48]);

      bytes += generator.hr();
    }
  }

  if (danfe?.dados?.cobr != null) {
    bytes += generator.rawBytes([27, 97, 49]);
    bytes += generator.text(
      'COBRANCA',
      styles: const PosStyles(align: PosAlign.center, bold: true),
    );

    bytes += generator.text("Fatura: ${danfe?.dados?.cobr?.fat?.nFat ?? ''}");
    bytes += generator.text(
      "Valor Original: ${DanfeUtils.formatMoneyMilhar(danfe?.dados?.cobr?.fat?.vOrig ?? '', modeda: 'pt_BR', simbolo: moeda)}",
      styles: const PosStyles(align: PosAlign.center),
    );
    bytes += generator.text(
      "Valor Liquido: ${DanfeUtils.formatMoneyMilhar(danfe?.dados?.cobr?.fat?.vLiq ?? '', modeda: 'pt_BR', simbolo: moeda)}",
      styles: const PosStyles(align: PosAlign.center),
    );
    bytes += generator.hr();
    for (var duplicata in danfe?.dados?.cobr?.dup ?? []) {
      bytes += generator.text("Duplicata: ${duplicata.nDup ?? ''}");
      bytes += generator.text(
        "Vencimento: ${DanfeUtils.formatDate(duplicata.dVenc ?? '', dateOnly: true)}",
      );
      bytes += generator.text("Valor: ${duplicata.nDup ?? ''}");

      bytes += generator.hr();
    }
    bytes += generator.rawBytes([27, 97, 48]);
  }

  bytes += generator.rawBytes([27, 97, 49]);
  bytes += generator.text(
    'CHAVE DE ACESSO DA NOTA FISCAL',
    styles: const PosStyles(align: PosAlign.center),
  );
  bytes += generator.text(
    DanfeUtils.splitByLength(danfe?.dados?.chaveNota ?? '', 4, ' '),
    styles: const PosStyles(align: PosAlign.center, bold: true),
  );
  if ((danfe?.tipo ?? TipoDocumento.NFCe) != TipoDocumento.NFe) {
    bytes += generator.rawBytes([27, 97, 49]);
    bytes += generator.qrcode(
      danfe?.qrcodePrinter ?? '',
      size: QRSize.size4,
      cor: QRCorrection.M,
    );

    bytes += generator.rawBytes([27, 97, 48]);
  }
  bytes += generator.feed(1);

  if (danfe?.dados?.ide?.serie != null) {
    final serie = (danfe?.dados?.ide?.serie ?? '0').padLeft(3, '0');
    final nnf = (danfe?.dados?.ide?.nNF ?? '0').padLeft(9, '0');
    bytes += generator.rawBytes([27, 97, 49]);

    bytes += generator.text(
      'Nota $nnf Serie $serie ',
      styles: const PosStyles(align: PosAlign.center, bold: true),
    );
    bytes += generator.rawBytes([27, 97, 48]);

    bytes += generator.feed(1);
  }

  if (danfe?.dados?.ide?.nserieSAT != null) {
    final serie = (danfe?.dados?.ide?.nserieSAT ?? '0').padLeft(3, '0');
    final nnf = (danfe?.dados?.ide?.nNF ?? '0').padLeft(9, '0');
    bytes += generator.rawBytes([27, 97, 49]);
    bytes += generator.text(
      'Nota $nnf Serie $serie',
      styles: const PosStyles(align: PosAlign.center, bold: true),
    );
    bytes += generator.rawBytes([27, 97, 48]);

    bytes += generator.feed(1);
  }

  if (danfe?.protNFe != null) {
    bytes += generator.row([
      PosColumn(
        text: 'Protocolo: ',
        width: 6,
        styles: const PosStyles(bold: true),
      ),
      PosColumn(
        text: danfe?.protNFe?.infProt?.nProt ?? '',
        width: 6,
        styles: const PosStyles(align: PosAlign.right),
      ),
    ]);
    DateTime dateTime = DateTime.parse(
      danfe?.protNFe?.infProt?.dhRecbto ?? DateTime.now().toIso8601String(),
    );
    String formattedDate = "${dateTime.day}/${dateTime.month}/${dateTime.year} ${dateTime.hour}:${dateTime.minute}:${dateTime.second}";

    bytes += generator.row([
      PosColumn(
        text: 'Data: ',
        width: 6,
        styles: const PosStyles(bold: true),
      ),
      PosColumn(
        text: formattedDate,
        width: 6,
        styles: const PosStyles(align: PosAlign.right),
      ),
    ]);
    bytes += generator.feed(1);
  }

  if (danfe?.dados?.infAdic?.infCpl != null) {
    bytes += generator.text(
      danfe!.dados!.infAdic!.infCpl ?? ' ',
      styles: const PosStyles(align: PosAlign.center),
    );
  }

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

  return bytes;
}