normativeJsonDanfe method

  1. @override
String normativeJsonDanfe(
  1. Danfe? danfe, {
  2. bool mostrarMoeda = true,
  3. String customFont = 'RobotoMonoRegular',
})
override

Gera uma representação normativa em formato JSON do DANFE.

Parâmetros:

  • danfe: Objeto Danfe contendo os dados do documento fiscal.
  • mostrarMoeda (opcional): Um bool que define se o símbolo da moeda será exibido. O valor padrão é true.

Retorno:

  • Uma String contendo o JSON gerado a partir dos dados do DANFE.

Implementation

@override
String normativeJsonDanfe(
  Danfe? danfe, {
  bool mostrarMoeda = true,
  String customFont = 'RobotoMonoRegular',
}) {
  String moeda = (mostrarMoeda == true) ? 'R\$' : '';
  fontName = customFont;
  final helper = JsonPrinterHelper(fontName: customFont);

  List<Map> danfeJson = [];

  danfeJson.add(
    helper.prepareLine(
      aligment: 1,
      bold: true,
      fontSize: 18,
      italic: false,
      content: danfe?.dados?.emit?.xFant ?? (danfe?.dados?.emit?.xNome ?? ''),
    ),
  );
  danfeJson.add(
    helper.prepareLine(
      aligment: 1,
      bold: false,
      fontSize: 14,
      italic: false,
      content:
          'CNPJ - ${DanfeUtils.formatCNPJ(danfe?.dados?.emit?.cnpj ?? '')}',
    ),
  );
  final String uf = danfe?.dados?.emit?.enderEmit?.uF == null
      ? ''
      : ' - ${danfe!.dados!.emit!.enderEmit!.uF}';
  danfeJson.add(
    helper.prepareLine(
      aligment: 1,
      bold: false,
      fontSize: 14,
      italic: false,
      content: DanfeUtils.removeAcentos(
        '${danfe?.dados?.emit?.enderEmit?.xLgr ?? ''},${danfe?.dados?.emit?.enderEmit?.nro ?? ''} ${danfe?.dados?.emit?.enderEmit?.xBairro ?? ''}$uf',
      ),
    ),
  );
  danfeJson.add(
    helper.prepareLine(
      aligment: 1,
      bold: false,
      fontSize: 14,
      italic: false,
      content:
          'CEP: ${DanfeUtils.formatCep(danfe?.dados?.emit?.enderEmit?.cEP ?? '')}',
    ),
  );
  danfeJson.add(helper.divider());
  if ((danfe?.tipo ?? TipoDocumento.CFe) == TipoDocumento.CFe) {
    danfeJson.add(
      helper.prepareLine(
        aligment: 1,
        bold: true,
        fontSize: 14,
        italic: false,
        content: ('Nota Fiscal Eletronica - SAT '),
      ),
    );
  } else if ((danfe?.tipo ?? TipoDocumento.NFCe) == TipoDocumento.NFCe) {
    danfeJson.add(
      helper.prepareLine(
        aligment: 1,
        bold: true,
        fontSize: 14,
        italic: false,
        content: ('Nota Fiscal Eletronica - NFC-E '),
      ),
    );
  } else {
    danfeJson.add(
      helper.prepareLine(
        aligment: 1,
        bold: true,
        fontSize: 14,
        italic: false,
        content: ('Nota Fiscal Eletronica - NFe '),
      ),
    );
  }
  danfeJson.add(
    helper.prepareLine(
      aligment: 0,
      bold: false,
      fontSize: 14,
      italic: false,
      content:
          "CPF/CNPJ do consumidor: ${danfe?.dados?.dest?.cpf ?? danfe?.dados?.dest?.cnpj ?? ''}",
    ),
  );
  if (danfe?.dados?.dest?.xNome != '' && danfe?.dados?.dest?.xNome != null) {
    danfeJson.add(
      helper.prepareLine(
        aligment: 0,
        bold: false,
        fontSize: 14,
        italic: false,
        content: "Nome: ${danfe?.dados?.dest?.xNome ?? ''}",
      ),
    );
  }
  danfeJson.add(
    helper.prepareLine(
      aligment: 0,
      bold: false,
      fontSize: 14,
      italic: false,
      content: ("Nota: ${danfe?.dados?.ide?.nNF ?? ''}"),
    ),
  );
  danfeJson.add(
    helper.prepareLine(
      aligment: 0,
      bold: false,
      fontSize: 14,
      italic: false,
      content:
          ('Data: ${DanfeUtils.formatDate(danfe?.dados?.ide?.dataEmissao ?? '')}'),
    ),
  );
  if (danfe?.dados?.ide?.dhSaiEnt != null) {
    danfeJson.add(
      helper.prepareLine(
        aligment: 0,
        bold: false,
        fontSize: 14,
        italic: false,
        content:
            ('Data E/S: ${DanfeUtils.formatDate(danfe?.dados?.ide?.dhSaiEnt ?? '')}'),
      ),
    );
  }
  danfeJson.add(helper.divider());

  danfeJson.add(
    helper.createColumnItems(paperSize: paperSize, det: danfe?.dados?.det),
  );

  danfeJson.add(helper.divider());

  danfeJson.add(
    helper.createColumn(
      paperSize: paperSize,
      rows: [
        helper.createRow(
          row: {'text': 'QTD de itens', 'alignment': 0},
          paperSize: paperSize,
        ),
        helper.createRow(
          row: {
            'text': DanfeUtils.formatNumber(
              danfe?.dados?.det?.length.toString() ?? '',
            ),
            'alignment': 2,
          },
          paperSize: paperSize,
        ),
      ],
    ),
  );

  danfeJson.add(
    helper.createColumn(
      paperSize: paperSize,
      rows: [
        helper.createRow(
          row: {'text': 'SUBTOTAL', 'alignment': 0, 'bold': true},
          paperSize: paperSize,
        ),
        helper.createRow(
          row: {
            'text': DanfeUtils.formatMoneyMilhar(
              danfe?.dados?.total?.valorTotal ?? '',
              modeda: 'pt_BR',
              simbolo: moeda,
            ),
            'alignment': 2,
            'bold': true,
          },
          paperSize: paperSize,
        ),
      ],
    ),
  );

  if ((danfe?.dados?.total?.valorFrete ?? '0.00') != '0.00') {
    danfeJson.add(
      helper.createColumn(
        paperSize: paperSize,
        rows: [
          helper.createRow(
            row: {'text': 'FRETE', 'alignment': 0},
            paperSize: paperSize,
          ),
          helper.createRow(
            row: {
              'text': DanfeUtils.formatMoneyMilhar(
                danfe?.dados?.total?.valorFrete ?? '',
                modeda: 'pt_BR',
                simbolo: moeda,
              ),
              'alignment': 2,
            },
            paperSize: paperSize,
          ),
        ],
      ),
    );
  }

  if ((danfe?.dados?.total?.desconto ?? '0.00') != '0.00') {
    danfeJson.add(
      helper.createColumn(
        paperSize: paperSize,
        rows: [
          helper.createRow(
            row: {'text': 'Desconto', 'alignment': 0},
            paperSize: paperSize,
          ),
          helper.createRow(
            row: {
              'text': DanfeUtils.formatMoneyMilhar(
                danfe?.dados?.total?.desconto ?? '',
                modeda: 'pt_BR',
                simbolo: moeda,
              ),
              'alignment': 2,
            },
            paperSize: paperSize,
          ),
        ],
      ),
    );
  }

  if ((danfe?.dados?.total?.acrescimo ?? '0.00') != '0.00') {
    danfeJson.add(
      helper.createColumn(
        paperSize: paperSize,
        rows: [
          helper.createRow(
            row: {'text': 'Acréscimo', 'alignment': 0},
            paperSize: paperSize,
          ),
          helper.createRow(
            row: {
              'text': DanfeUtils.formatMoneyMilhar(
                danfe?.dados?.total?.acrescimo ?? '',
                modeda: 'pt_BR',
                simbolo: moeda,
              ),
              'alignment': 2,
            },
            paperSize: paperSize,
          ),
        ],
      ),
    );
  }
  if ((danfe?.dados?.pgto?.vTroco ?? '0.00') != '0.00') {
    danfeJson.add(
      helper.createColumn(
        paperSize: paperSize,
        rows: [
          helper.createRow(
            row: {'text': 'Troco', 'alignment': 0},
            paperSize: paperSize,
          ),
          helper.createRow(
            row: {
              'text': DanfeUtils.formatMoneyMilhar(
                danfe?.dados?.pgto?.vTroco ?? '',
                modeda: 'pt_BR',
                simbolo: moeda,
              ),
              'alignment': 2,
            },
            paperSize: paperSize,
          ),
        ],
      ),
    );
  }

  danfeJson.add(
    helper.createColumn(
      paperSize: paperSize,
      rows: [
        helper.createRow(
          row: {'text': 'Total', 'alignment': 0, 'bold': true},
          paperSize: paperSize,
        ),
        helper.createRow(
          row: {
            'text': DanfeUtils.formatMoneyMilhar(
              danfe?.dados?.total?.valorPago ?? '0.00',
              modeda: 'pt_BR',
              simbolo: moeda,
            ),
            'alignment': 2,
            'bold': true,
          },
          paperSize: paperSize,
        ),
      ],
    ),
  );

  danfeJson.add(helper.divider());

  if (danfe?.dados?.pgto != null) {
    danfeJson.add(
      helper.createColumn(
        paperSize: paperSize,
        rows: [
          helper.createRow(
            row: {
              'text': 'Formas de pagamento',
              'alignment': 0,
              'bold': true,
            },
            paperSize: paperSize,
          ),
          helper.createRow(
            row: {'text': 'Valor pago', 'alignment': 2, 'bold': true},
            paperSize: paperSize,
          ),
        ],
      ),
    );

    for (MP pagamento in danfe!.dados!.pgto!.formas!) {
      danfeJson.add(
        helper.createColumn(
          paperSize: paperSize,
          rows: [
            helper.createRow(
              row: {
                'text': DanfeUtils.removeAcentos(pagamento.cMP ?? ''),
                'alignment': 0,
              },
              paperSize: paperSize,
            ),
            helper.createRow(
              row: {
                'text': DanfeUtils.formatMoneyMilhar(
                  pagamento.vMP ?? '',
                  modeda: 'pt_BR',
                  simbolo: moeda,
                ),
                'alignment': 2,
              },
              paperSize: paperSize,
            ),
          ],
        ),
      );
    }
    danfeJson.add(helper.divider());
  }

  if (danfe?.dados?.total?.valotTotalTributos != null) {
    if (danfe!.dados!.total!.valotTotalTributos != '0.00') {
      danfeJson.add(
        helper.createColumn(
          paperSize: paperSize,
          rows: [
            helper.createRow(
              row: {'text': 'Tributos totais incidentes:', 'alignment': 0},
              paperSize: paperSize,
            ),
            helper.createRow(
              row: {
                'text': DanfeUtils.formatMoneyMilhar(
                  danfe.dados!.total!.valotTotalTributos ?? '',
                  modeda: 'pt_BR',
                  simbolo: moeda,
                ),
                'alignment': 2,
              },
              paperSize: paperSize,
            ),
          ],
        ),
      );
      danfeJson.add(helper.prepareJump(1));
    }
  }

  if (danfe?.dados?.transp != null) {
    if (danfe?.dados?.transp?.transporta?.xNome != null) {
      danfeJson.add(
        helper.prepareLine(
          aligment: 1,
          bold: true,
          content: 'TRANSPORTADORA',
        ),
      );
      danfeJson.add(
        helper.prepareLine(
          aligment: 1,
          content: DanfeUtils.removeAcentos(
            danfe?.dados?.transp?.transporta?.xNome ?? '',
          ),
        ),
      );
      danfeJson.add(
        helper.prepareLine(
          aligment: 1,
          content: DanfeUtils.removeAcentos(
            danfe?.dados?.transp?.transporta?.xEnder ?? '',
          ),
        ),
      );
      danfeJson.add(
        helper.prepareLine(
          aligment: 1,
          content: DanfeUtils.removeAcentos(
            '${danfe?.dados?.transp?.transporta?.xMun ?? ''} ${danfe?.dados?.transp?.transporta?.uf ?? ''}',
          ),
        ),
      );
      danfeJson.add(helper.divider());
    }
  }

  if (danfe?.dados?.cobr != null) {
    danfeJson.add(
      helper.prepareLine(
        aligment: 1,
        bold: true,
        content: 'COBRANCA',
      ),
    );
    danfeJson.add(
      helper.prepareLine(
        aligment: 1,
        content: "Fatura: ${danfe?.dados?.cobr?.fat?.nFat ?? ''}",
      ),
    );
    danfeJson.add(
      helper.prepareLine(
        aligment: 1,
        content:
            "Valor Original: ${DanfeUtils.formatMoneyMilhar(danfe?.dados?.cobr?.fat?.vOrig ?? '', modeda: 'pt_BR', simbolo: moeda)}",
      ),
    );
    danfeJson.add(
      helper.prepareLine(
        aligment: 1,
        content:
            "Valor Liquido: ${DanfeUtils.formatMoneyMilhar(danfe?.dados?.cobr?.fat?.vLiq ?? '', modeda: 'pt_BR', simbolo: moeda)}",
      ),
    );
    danfeJson.add(helper.divider());
    for (var duplicata in danfe?.dados?.cobr?.dup ?? []) {
      danfeJson.add(
        helper.prepareLine(
          aligment: 1,
          content: "Duplicata: ${duplicata.nDup ?? ''}",
        ),
      );
      danfeJson.add(
        helper.prepareLine(
          aligment: 1,
          content:
              "Vencimento: ${DanfeUtils.formatDate(duplicata.dVenc ?? '', dateOnly: true)}",
        ),
      );
      danfeJson.add(
        helper.prepareLine(
          aligment: 1,
          content:
              "Valor: ${DanfeUtils.formatMoneyMilhar(duplicata.vDup ?? '', modeda: 'pt_BR', simbolo: moeda)}",
        ),
      );
      danfeJson.add(helper.divider());
    }
  }

  danfeJson.add(
    helper.prepareLine(content: 'CHAVE DE ACESSO DA NOTA FISCAL'),
  );
  danfeJson.add(
    helper.prepareLine(
      fontSize: 14,
      bold: true,
      content: DanfeUtils.splitByLength(
        danfe?.dados?.chaveNota ?? '',
        4,
        ' ',
      ),
    ),
  );
  danfeJson.add(
    helper.prepareQrcode(
      content: danfe?.qrcodePrinter ?? '',
      size: 160,
      level: 'L',
    ),
  );

  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');
    danfeJson.add(helper.prepareLine(content: 'Nota $nnf Serie $serie '));
  }

  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');

    danfeJson.add(helper.prepareLine(content: 'Nota $nnf Serie $serie '));
  }

  if (danfe?.protNFe != null) {
    danfeJson.add(
      helper.prepareLine(
        content: 'Protocolo: ${danfe?.protNFe?.infProt?.nProt ?? ''} ',
      ),
    );

    DateTime dateTime = DateTime.parse(
      danfe?.protNFe?.infProt?.dhRecbto ?? DateTime.now().toIso8601String(),
    );
    String formattedDate =
        "${dateTime.day.toString().padLeft(2, '0')}/${dateTime.month.toString().padLeft(2, '0')}/${dateTime.year} ${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')}:${dateTime.second.toString().padLeft(2, '0')}";
    danfeJson.add(helper.prepareLine(content: 'Data: $formattedDate '));
  }

  if (danfe?.dados?.infAdic?.infCpl != null) {
    danfeJson.add(
      helper.prepareLine(
        content: danfe!.dados!.infAdic!.infCpl ?? '',
        fontSize: 14,
      ),
    );
  }
  return json.encode(danfeJson);
}