bufferNfse method
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;
}