Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gerar Danfe a partir do Xml da nota #121

Closed
fincatto opened this issue Apr 14, 2016 · 127 comments
Closed

Gerar Danfe a partir do Xml da nota #121

fincatto opened this issue Apr 14, 2016 · 127 comments
Assignees
Labels

Comments

@fincatto
Copy link
Member

Dado um XML, gerar um Danfe padronizado.

@klutzer
Copy link
Contributor

klutzer commented Apr 15, 2016

Eu tenho um jrxml (Jasper/iReport) da DANFe, que modifiquei de um outro projeto, porém não está atualizado, mas pode ser útil pelo menos para não começar o layout do zero.. Interessa?

@clarelspies
Copy link
Contributor

Será que o ideal não seria gerar uma página em html/css com elemento page para gerar a impressão?

@klutzer
Copy link
Contributor

klutzer commented Apr 15, 2016

Vocês que sabem, mas acredito que um PDF seria tranquilo e teria boa parte do layout pronto.. é uma ideia..

@fincatto
Copy link
Member Author

Ajuda sim Érico, muito obrigado!
Quanto ao layout html, podemos fazer "exportadores" distintos em que o
usuário solicita o tipo que ele deseja, mas, por hora, precisamos do PDF.

On Fri, Apr 15, 2016 at 2:29 PM, Érico Knapp Lutzer <
notifications@github.com> wrote:

Vocês que sabem, mas acredito que um PDF seria tranquilo e teria boa parte
do layout pronto.. é uma ideia..


You are receiving this because you authored the thread.
Reply to this email directly or view it on GitHub
#121 (comment)

@klutzer
Copy link
Contributor

klutzer commented Apr 15, 2016

danfe.pdf

Este é o PDF que ele gera no outro projeto (descontinuado)

@klutzer
Copy link
Contributor

klutzer commented Apr 15, 2016

#122

@waldandrade
Copy link

Bom dia Pessoal ... a biblioteca já está gerando DANFE?

@fincatto
Copy link
Member Author

fincatto commented May 3, 2016

Ainda não conseguimos algum desenvolvedor pra fazer a feature.
Se tiver interesse, seria ótimo!
[]s

On Tue, May 3, 2016 at 11:27 AM, waldandrade notifications@github.com
wrote:

Bom dia Pessoal ... a biblioteca já está gerando DANFE?


You are receiving this because you authored the thread.
Reply to this email directly or view it on GitHub
#121 (comment)

@waldandrade
Copy link

hummm rapaz ... eu tenho mais que interesse, tenho necessidade ...
kkkkkk

Preciso apenas de instruções de como trabalhar com o repositório de vocês. Não creio que seja só sair dando commit kkkkkk

@waldandrade
Copy link

Existe alguma coisa contra apenas integrar a biblioteca a outra biblioteca já existente?

@waldandrade
Copy link

@tsinterative
Copy link

Olá pessoal, vou colaborar com o projeto, eu tenho um ERP que gera a NFe com o DANFE atualizado da versão 3.10, meu sistema era em java mas toda a lógica de emissão da NFe estava em uma dll compilada no Delphi 7, lá eu usava o componente da ACBr pra gerar a nota. O sistema funciona, mas eu perco a vantagem da multiplataforma. O meu DANFE tem uma label que traz os dados do meu sistema, então alteram pra incluir a personalização de vocês, ele funciona baseado no conteúdo do xml.

Vou deixar aqui minha classe do emissor de NFe pra servir de referencia no uso do DANFE, qualquer dúvida me procurem, assim que possível vou testar o projeto no meu sistema e submeto algumas coisas pra colaborar.

`package system.core.nfe;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.scene.Cursor;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.commons.mail.DefaultAuthenticator;
import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.HtmlEmail;
import org.controlsfx.dialog.Dialog.Actions;
import org.w3c.dom.Document;

import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRXmlDataSource;
import net.sf.jasperreports.view.JasperViewer;

import br.inf.portalfiscal.nfe.schema.consstatserv.TRetConsStatServ;
import system.core.SystemController;
import application.controller.MainController;
import application.entities.DoctoFiscal;
import application.helpers.Configurations;
import application.model.DoctoFiscalDAO;
import application.model.ServidorModel;

public class EmissorNFe extends SystemController{

private String pathNFe;

static{
    Runtime.getRuntime().load(new File("resources/EmissorNFe.dll").getAbsolutePath());
}

private native boolean PreparaAmbiente(Object[] configs);
private native TRetConsStatServ StatusWebService();
private native boolean GerarNFe(int iNrDoctoFiscal);
private native boolean CancelarNFe(int iNrDoctoFiscal);


private boolean setConfig(){

    ServidorModel server = Configurations.getDefaultServer();

    Object[] params = {
            server.getHostname(),                              // IP 
            server.getDatabase(),                              // Instancia
            toString(MainController.loggedEnterprise.getId()), // Empresa Ativa
    };

    return PreparaAmbiente(params);

}

public void assinaXML(){



}

public TRetConsStatServ ConsultaStatusServico(){

    TRetConsStatServ status = new TRetConsStatServ();

    //Inicializa/ Verifica configurações
    boolean isConfigured = setConfig();

    //Executa a consulta do Status;
    if (isConfigured)
        status = StatusWebService();

    //devolve o resultado
    return status;
}

public boolean geraNFe(DoctoFiscal doctoFiscal) throws Exception{

    /*-- prepara o ambiente para geração da NFe --*/
    boolean isConfigured = setConfig();

    //Executa a consulta do Status;
    if (!isConfigured)
        return false;

    mensagemUsuario("Gerando NFe...");

    return GerarNFe(doctoFiscal.getId());

}

public boolean cancelaNFe(DoctoFiscal doctoFiscal) throws Exception{

    /*-- prepara o ambiente para geração da NFe --*/
    boolean isConfigured = setConfig();

    //Executa a consulta do Status;
    if (!isConfigured)
        return false;

    mensagemUsuario("Cancelando NFe...");

    return CancelarNFe(doctoFiscal.getId());

}

public void geraPDF(final DoctoFiscal doctoFiscal) throws Exception{

    mensagemUsuario("Gerando PDF...");

    Task<Object> task = new Task<Object>(){

        @Override
        protected Object call() throws Exception {

            //Muda o cursor
            MainController.primaryStage.getScene().setCursor(Cursor.WAIT);

            //Executa tarefa
            String pathNFe = (MainController.configAmbiente.getTipoAmbienteNFe() == 0) ? MainController.configAmbiente.getPathNFeHom() : MainController.configAmbiente.getPathNFeProd();

            pathNFe = pathNFe + "/EMP" + zeroEsquerda(MainController.loggedEnterprise.getId(),3) + "/PDF/";

            OutputStream out = new FileOutputStream(pathNFe + doctoFiscal.getChaveNFe() + ".pdf");

            JasperPrint relatorio = geraDanfe(doctoFiscal);
            JasperExportManager.exportReportToPdfStream(relatorio, out); 

            //Depois que a Thread encerrar executa ações na interface
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    try {

                        mensagemUsuario("");
                        sendNFeMail(doctoFiscal);

                    } catch (Exception e) {

                            new Throwable(e);
                    }
                }
            });

            //Retorna para o cursor default
            MainController.primaryStage.getScene().setCursor(Cursor.DEFAULT);

            return null;
        }

    };

    Thread th = new Thread(task);
    th.setDaemon(true);
    th.start();     

}

private JasperPrint geraDanfe(DoctoFiscal doctoFiscal) throws Exception{

    InputStream imgInputStream = null;

    byte[] bLogo = MainController.loggedEnterprise.getLogo();

    if (bLogo != null){
        imgInputStream = new ByteArrayInputStream(bLogo);           
    }

    Document doc = getXml(doctoFiscal.getxMLNFe());

    Map<String, Object> param = getFaturas(doc); 
    param.put("Logo", imgInputStream);

    JasperPrint danfe = null;

    try{
        JRXmlDataSource ds = new JRXmlDataSource(doc,  
                    "/nfeProc/NFe/infNFe/det");  

        JasperReport report = JasperCompileManager
                    .compileReport(getClass().getResourceAsStream("/application/view/danfeR.jrxml"));

        danfe = JasperFillManager.fillReport(report, param, ds);
    }catch(Exception e){
        throw e;
    }

    return danfe;
}

public void imprimeDanfe(DoctoFiscal doctoFiscal) throws Exception{

    if (!doctoFiscal.getxMLNFe().isEmpty()){

        previewDanfe(doctoFiscal);

        if (doctoFiscal.getDataImpressao() == null){

            doctoFiscal.setDataImpressao(new Date());
            doctoFiscal.setUsuarioImpr(MainController.loggedUser);

            new DoctoFiscalDAO().save(doctoFiscal);
        }
    }

}

private Document getXml(String xml) {    
    try {    
        /**  
         * Gera um objeto DOM do xml  
         */    
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();    
        DocumentBuilder docBuilder = dbf.newDocumentBuilder();    
        return docBuilder.parse(new ByteArrayInputStream(xml.getBytes()));    
    } catch (Exception e) {    
        mensagemErro("Erro ao formatar a string em xml.");    
        return null;    
    }    
} 

private Map<String, Object> getFaturas(Document doc) {    
    Map<String, Object> map = new HashMap<String, Object>();    

    for (int i = 0; i < doc.getElementsByTagName("dup").getLength(); i++) {    
        /**  
         * Seta uma duplicata  
         */    
        org.w3c.dom.Node dup = doc.getElementsByTagName("dup").item(i);    

        /**  
         * Seta o numero  
         */    
        org.w3c.dom.Node nDoc = dup.getChildNodes().item(0);    
        String numero = nDoc.getFirstChild().getNodeValue();    
        map.put("FAT_NUMERO" + (i + 1), numero);  

        /**  
         * Seta a data  
         */    
        org.w3c.dom.Node nData = dup.getChildNodes().item(1);    
        String data = nData.getFirstChild().getNodeValue();    

        try {    
            map.put("FAT_VENCIMENTO" + (i + 1), new SimpleDateFormat("yyyy-MM-dd").parse(data));    
        } catch (Exception e) {    
            map.put("FAT_VENCIMENTO" + (i + 1), null);    

        }    

        /**  
         * Seta o valor  
         */    
        org.w3c.dom.Node nValor = dup.getChildNodes().item(2);    
        String valor = nValor.getFirstChild().getNodeValue();    
        map.put("FAT_VALOR" + (i + 1), Double.parseDouble(valor));    
    }   

    return map;    
}    

private void previewDanfe(final DoctoFiscal doctoFiscal) {  

    mensagemUsuario("Gerando preview...");

    Task<Object> task = new Task<Object>(){

        @Override
        protected Object call() throws Exception {

            //Muda o cursor
            MainController.primaryStage.getScene().setCursor(Cursor.WAIT);

            //Executa tarefa

            try{

                JasperPrint relat = geraDanfe(doctoFiscal);
                JasperViewer.viewReport(relat, false);

            } catch (Exception e){
                exceptionMessage(e.getCause());
            }
            //Depois que a Thread encerrar executa ações na interface
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    try {

                        mensagemUsuario("");

                    } catch (Exception e) {

                            new Throwable(e);
                    }
                }
            });

            //Retorna para o cursor default
            MainController.primaryStage.getScene().setCursor(Cursor.DEFAULT);

            return null;
        }

    };

    Thread th = new Thread(task);
    th.setDaemon(true);
    th.start();     

}  

public void sendNFeMail(DoctoFiscal doctoFiscal) throws Exception {

    if (!doctoFiscal.getTerceiro().isEnviaNfeEmail()){
        mensagemInfo("O terceiro não está configurado para receber a NFe por email.");
        return;
    }

    if (mensagemConfirmacao("Gostaria de enviar a NFe por email?") != Actions.YES)
        return;

    HtmlEmail email = new HtmlEmail();
    email.setHostName(MainController.configAmbiente.getServidorSMTP());
    email.setSmtpPort(MainController.configAmbiente.getPortaSMTP());
    email.setAuthenticator(new DefaultAuthenticator(MainController.configAmbiente.getEmail(), MainController.configAmbiente.getSenhaEmail()));
    email.setStartTLSRequired(MainController.configAmbiente.isUsaSSL());
    email.setStartTLSEnabled(MainController.configAmbiente.isUsaSSL());
    email.setFrom(MainController.configAmbiente.getEmail(), MainController.loggedEnterprise.getDescricao());
    email.setSubject("Entrega da NFe nº " + doctoFiscal.getNumeroDocto());

    String emails = "";

    email.addTo(doctoFiscal.getTerceiro().getEmailPrincipal(), doctoFiscal.getTerceiro().getRazaoSocial());
    emails += doctoFiscal.getTerceiro().getEmailPrincipal();


    if (doctoFiscal.getTerceiro().getEmailCopia() != null){
        if (!doctoFiscal.getTerceiro().getEmailCopia().trim().equals("")){
            email.addCc(doctoFiscal.getTerceiro().getEmailCopia(), doctoFiscal.getTerceiro().getRazaoSocial());
            emails += ", " + doctoFiscal.getTerceiro().getEmailCopia();
        }
    }

    //Mensagem no formato HTML
    String msgHtml = "<html>";
    msgHtml       += "    <head>";
    msgHtml       += "    </head>";
    msgHtml       += "    <body>";
    msgHtml       += "        <p>" + doctoFiscal.getTerceiro().getRazaoSocial() + "</p>";
    msgHtml       += "        <p>Entrega da NFe nº " + doctoFiscal.getNumeroDocto() + " com a chave " + doctoFiscal.getChaveNFe() + ".</p>" ;
    msgHtml       += "        <p>Veja o XML em anexo, ou fa&ccedil;a a consulta de autenticidade no portal nacional da NF-e <www.nfe.fazenda.gov.br/portal> ou no site da Sefaz.</p></br>";
    msgHtml       += "        <p><http://www.tsinterative.com.br></p>";
    msgHtml       += "        <p>Conhe&ccedil;a o Sistema de Gest&atilde;o Empresarial que integra sua empresa e seus parceiros de neg&oacute;cios com simplicidade.</p>";
    msgHtml       += "        <p>O BlueWind Enterprise <http://www.tsinterative.com.br> &eacute; um sistema f&aacute;cil de usar que atende totalmente as necessidades das empresas com baixo custo.</p>";
    msgHtml       += "        <p>Ligue para a TS Interative e tenha maiores informa&ccedil;&otilde;es (11) 4052-9002/ (11) 95287-1588 ou acesse o site da TS Interative.</p>";
    msgHtml       += "    </body>";
    msgHtml       += "</html>";

    email.setHtmlMsg(msgHtml);

    String pathNFe = (MainController.configAmbiente.getTipoAmbienteNFe() == 0) ? MainController.configAmbiente.getPathNFeHom() : MainController.configAmbiente.getPathNFeProd();
    pathNFe = pathNFe + "EMP" + zeroEsquerda(MainController.loggedEnterprise.getId(),3) ;

    EmailAttachment attachment = new EmailAttachment();

    //XML
    String CaminhoXML = pathNFe + "/Envio e Resposta/" + doctoFiscal.getArquivoXML();

    File xml = new File(CaminhoXML); 

    if (!xml.exists()){
        mensagemAlerta(CaminhoXML + " parace ser um caminho inválido, a mensagem não pode ser enviada.");
        return;
    }

    attachment = new EmailAttachment();
    attachment.setPath(CaminhoXML);
    attachment.setDisposition(EmailAttachment.ATTACHMENT);
    email.attach(attachment);

    //PDF
    String CaminhoPDF = pathNFe + "/PDF/" + doctoFiscal.getChaveNFe() + ".pdf";

    File pdf = new File(CaminhoPDF); 

    if (!pdf.exists()){

        if (mensagemConfirmacao(CaminhoPDF + " parace ser um caminho inválido, Deseja enviar apenas o XML. Confirma ?") != Actions.YES)
            return;

    }else{
        attachment = new EmailAttachment();
        attachment.setPath(CaminhoPDF);
        attachment.setDisposition(EmailAttachment.ATTACHMENT);
        email.attach(attachment);
    }

    email.send();

    mensagemInfo("Email enviado com sucesso para " + emails);

}


public void sendNFeCancMail(DoctoFiscal doctoFiscal) throws Exception {

    if (!doctoFiscal.getTerceiro().isEnviaNfeEmail()){
        mensagemInfo("O terceiro não está configurado para receber a NFe por email.");
        return;
    }

    if (mensagemConfirmacao("Desejar enviar o protocolo de cancelmanto da NFe por e-mail?") != Actions.YES)
        return;

    HtmlEmail email = new HtmlEmail();
    email.setHostName(MainController.configAmbiente.getServidorSMTP());
    email.setSmtpPort(MainController.configAmbiente.getPortaSMTP());
    email.setAuthenticator(new DefaultAuthenticator(MainController.configAmbiente.getEmail(), MainController.configAmbiente.getSenhaEmail()));
    email.setStartTLSRequired(MainController.configAmbiente.isUsaSSL());
    email.setStartTLSEnabled(MainController.configAmbiente.isUsaSSL());
    email.setFrom(MainController.configAmbiente.getEmail(), MainController.loggedEnterprise.getDescricao());
    email.setSubject("Protocolo de Cancelamento da NFe nº " + doctoFiscal.getNumeroDocto());

    String emails = "";

    email.addTo(doctoFiscal.getTerceiro().getEmailPrincipal(), doctoFiscal.getTerceiro().getRazaoSocial());
    emails += doctoFiscal.getTerceiro().getEmailPrincipal();


    if (doctoFiscal.getTerceiro().getEmailCopia() != null){
        if (!doctoFiscal.getTerceiro().getEmailCopia().trim().equals("")){
            email.addCc(doctoFiscal.getTerceiro().getEmailCopia(), doctoFiscal.getTerceiro().getRazaoSocial());
            emails += ", " + doctoFiscal.getTerceiro().getEmailCopia();
        }
    }

    //Mensagem no formato HTML
    String msgHtml = "<html>";
    msgHtml       += "    <head>";
    msgHtml       += "    </head>";
    msgHtml       += "    <body>";
    msgHtml       += "        <p>" + doctoFiscal.getTerceiro().getRazaoSocial() + "</p>";
    msgHtml       += "        <p>Protocolo de Cancelamento da NFe nº " + doctoFiscal.getNumeroDocto() + " com a chave " + doctoFiscal.getChaveNFe() + ".</p>" ;
    msgHtml       += "        <p>Veja o XML em anexo, ou fa&ccedil;a a consulta de autenticidade no portal nacional da NF-e <www.nfe.fazenda.gov.br/portal> ou no site da Sefaz.</p></br>";
    msgHtml       += "        <p><http://www.tsinterative.com.br></p>";
    msgHtml       += "        <p>Conhe&ccedil;a o Sistema de Gest&atilde;o Empresarial que integra sua empresa e seus parceiros de neg&oacute;cios com simplicidade.</p>";
    msgHtml       += "        <p>O BlueWind Enterprise <http://www.tsinterative.com.br> &eacute; um sistema f&aacute;cil de usar que atende totalmente as necessidades das empresas com baixo custo.</p>";
    msgHtml       += "        <p>Ligue para a TS Interative e tenha maiores informa&ccedil;&otilde;es (11) 4052-9002/ (11) 95287-1588 ou acesse o site da TS Interative.</p>";
    msgHtml       += "    </body>";
    msgHtml       += "</html>";

    email.setHtmlMsg(msgHtml);

    String pathNFe = (MainController.configAmbiente.getTipoAmbienteNFe() == 0) ? MainController.configAmbiente.getPathNFeHom() : MainController.configAmbiente.getPathNFeProd();
    pathNFe = pathNFe + "EMP" + zeroEsquerda(MainController.loggedEnterprise.getId(),3) ;

    EmailAttachment attachment = new EmailAttachment();

    //XML
    String CaminhoXML = pathNFe + "/NFeCan/" + doctoFiscal.getChaveNFe() + "-can.xml";

    File xml = new File(CaminhoXML); 

    if (!xml.exists()){
        mensagemAlerta(CaminhoXML + " parace ser um caminho inválido, a mensagem não pode ser enviada.");
        return;
    }

    attachment = new EmailAttachment();
    attachment.setPath(CaminhoXML);
    attachment.setDisposition(EmailAttachment.ATTACHMENT);
    email.attach(attachment);

    //PDF
    String CaminhoPDF = pathNFe + "/PDF/" + doctoFiscal.getChaveNFe() + ".pdf";

    File pdf = new File(CaminhoPDF); 

    if (!pdf.exists()){

        if (mensagemConfirmacao(CaminhoPDF + " parace ser um caminho inválido, Deseja enviar apenas o XML. Confirma ?") != Actions.YES)
            return;

    }else{
        attachment = new EmailAttachment();
        attachment.setPath(CaminhoPDF);
        attachment.setDisposition(EmailAttachment.ATTACHMENT);
        email.attach(attachment);
    }

    email.send();

    mensagemInfo("Email enviado com sucesso para " + emails);

}

}
`

danfeR.jrxml.zip

@felipewmartins
Copy link
Contributor

Olá pessoal,
Essa issue foi finalizada?

@fincatto
Copy link
Member Author

Ainda não.

On Tue, May 17, 2016 at 9:48 PM, Felipe Martins notifications@github.com
wrote:

Olá pessoal,
Essa issue foi finalizada?


You are receiving this because you authored the thread.
Reply to this email directly or view it on GitHub
#121 (comment)

@felipewmartins
Copy link
Contributor

👍 Eu gostaria de trabalhar nela @fincatto :)

@fincatto fincatto assigned flppsilva and unassigned flppsilva May 18, 2016
@fincatto
Copy link
Member Author

Ótimo @felipewmartins, fique a vontade!
Nossa política de código é ter o menor acoplamento possível e usar o mínimo de dependências externas possíveis também.Também gostamos de ter uma boa cobertura de testes.
Se precisar de ajuda ou tiver alguma dúvida, estamos a disposição.
Att,
Diego

@felipewmartins
Copy link
Contributor

Bacana @fincatto !
Eu pensei em montar um layout padrão a partir da documentação da receita, utilizando o Ireport. O que você acha dessa abordagem?

@fincatto
Copy link
Member Author

Parece interessante!
Tenho pouca experiência com PDF, então o @flppsilva está encarregado deste.
Nossa única preocupação é adicionar o mínimo de dependência possível e testes.
Mas acho que o caminho é esse mesmo!

@klutzer
Copy link
Contributor

klutzer commented May 23, 2016

Lembrando que já existe um modelo da DANF-e no pacote de resources do projeto (criado com iReport). Talvez daria pra partir dele..

Abraço!

@felipewmartins
Copy link
Contributor

Sim @klutzer estou aproveitando ele
😄
Abraço!

@felipewmartins
Copy link
Contributor

Pessoal,
Não estou conseguindo colocar a fonte Courier New na geração do pdf do danfe. Pelo que li na documentação ela é o padrão a ser utilizado. Alguém tem alguma dica sobre como carregar essa fonte diretamente na compilação do jasper?

@flppsilva
Copy link
Contributor

A fonte não aparece no teu editor? Ou quando tu executa ele troca pra outra?
Talvez pra essa fonte tenhas que adicionar mais essa dependência:
http://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports-fonts/6.0.0

@felipewmartins
Copy link
Contributor

@flppsilva Ela aparece sim. O problema é no momento em que o danfe é exportado para PDF. Eu até havia inserido essa dependência, mas notei que ela só contem fontes DejaVu.

@flppsilva
Copy link
Contributor

flppsilva commented May 30, 2016

Então deve ser teu sistema operacional que não contém a fonte. Se for linux tens que instalar o pacote de fontes da microsoft.

@felipewmartins
Copy link
Contributor

Vou fazer o teste no windows, para ver se o problema é esse mesmo.

@tsinterative
Copy link

@felipewmartins pra fonte ser utilizada na compilação precisa incluir ela dentro do jar do jasperreports-fonts

@klutzer
Copy link
Contributor

klutzer commented Sep 1, 2016

Na verdade se vc olhar a classe NFDanfeReport que criei ela já exporta o PDF pra byte, o único detalhe é que coloquei o método que gera o JasperPrint como public, pq eu o utilizo e esse simples fato dele estar como public me permite enviar a impressão direto pra impressora, sendo que se eu fosse abrir o PDF o processo seria bem burocrático para o usuário (no caso específico do meu sistema).. Então não é uma funcionalidade a menos, mas sim a mais, que não afeta quem quer o PDF gerado, e em byte[]

@klutzer
Copy link
Contributor

klutzer commented Sep 1, 2016

Quanto ao modelo acredito não ser problema, porém como no meu caso mando direto pra impressora, se não tiver aqueles espaçamentos do lado e embaixo, o spooler do windows corta algumas informações.. Quem quiser fazer o teste é só instalar qualquer impressora não fiscal como uma impressora normal do windows e mandar uma impressão diretamente nela

@rafaelTartigrado
Copy link
Contributor

#223

@klutzer Ajustamos o layout para evitar os cortes do spooler do windows.

@higomatos
Copy link
Contributor

@klutzer, como o espaçamento inferior tem um parâmetro que adiciona ou não ao relatório nós simplesmente não utilizamos e não alteramos. No espaçamento das laterais nós testamos a impressão do PDF na Bematech MP-100S TH e imprimiu normalmente.

Se houver algum corte mandando direto pra impressora sem ser através do PDF temos que analisar o que motiva o corte. Faz um teste e reporta aqui.

@klutzer
Copy link
Contributor

klutzer commented Sep 2, 2016

Vou fazer alguns testes aqui sim, inclusive com as bibliotecas atualizadas..

@higomatos você conseguiria fazer um teste mandando a impressão diretamente nesta impressora que você testou com o PDF e ficou ok? Abaixo um exemplo do código:

NFDanfeReport danfe = new NFDanfeReport(xml);
JasperPrint print = danfe.createJasperPrintNFe(...);
JasperPrintManager.printReport(print, true);

@RamonKenedy
Copy link
Contributor

RamonKenedy commented Sep 2, 2016

Boa tarde!
Gostaria de saber qual o comando que vcs utilizam para gerar o build do projeto com as dependências do Maven, pois com "clean compile install" não esta funcionando. Queria fazer alguns testes com essas novas funcionalidades de imprimir o Danfe da NFe e NFCe. Obrigado!

@fincatto
Copy link
Member Author

fincatto commented Sep 2, 2016

Clean package
On Fri, Sep 2, 2016 at 5:49 PM RamonKenedy notifications@github.com wrote:

Boa tarde!
Gostaria de saber qual o comando que vcs utilizam para gerar o build do
projeto com as dependências do Maven, pois com "clean compile install" não
esta funcionando. Queira fazer alguns testes com essas novas
funcionalidades de imprimir o Danfe da NFe e NFCe. Obrigado!


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
#121 (comment), or mute
the thread
https://github.com/notifications/unsubscribe-auth/AADj8ILm6DXdEfMIg-LS5_tYb1x43L98ks5qmIvRgaJpZM4IHxbz
.

@RamonKenedy
Copy link
Contributor

@fincatto
Muito Obrigado!
E parabéns pelo projeto, está me ajudando muito!

@klutzer
Copy link
Contributor

klutzer commented Oct 5, 2016

@higomatos Fiz os testes aqui imprimindo direto do sistema desktop, com as bibliotecas atualizadas do Jasper e continua cortando.. porém o corte é pequeno e da pra notar que está "sobrando" um espaço no início, acredito que seria apenas diminuir a margem da esquerda, segue uma foto abaixo:
whatsapp image 2016-10-05 at 13 29 04

@higomatos
Copy link
Contributor

@klutzer infelizmente o tempo está curto e não deu pra executar os testes que você pediu, mas estamos lembrando, e voltaremos em breve para compatibilizar esta impressão.

@klutzer
Copy link
Contributor

klutzer commented Oct 5, 2016

Ótimo, aguardo os testes

Detalhe, fiz o teste aqui gerando o PDF e então imprimindo ele externamente e não tem este corte..
Parece que isso também não está relacionado com a forma de impressão do jasper (que eu postei acima), pois testei a impressão do PDF utilizando a biblioteca PDFBox e saiu cortado do mesmo jeito que a foto que mandei acima..

Conclusão: se mandar a impressão direto pelo código java (via JasperPrintManager, PDFBox ou PrinterJob nativo), a impressão sai cortada como na foto acima. Se salvar o PDF através do método gerarDanfeNFCe(...) e imprimi-lo por fora (utilizando algum visualizador de PDF da própria máquina), a impressão sai ok, sem os cortes.
Lembrando que o método gerarDanfeNFCe(...) utiliza o mesmo JasperPrint criado pelo método createJasperPrintNFCe(...), então o problema não está na geração do mesmo, e sim na impressão apenas.

@rafaelTartigrado
Copy link
Contributor

#250

@margelperetto
Copy link
Contributor

@rafaelTartigrado qual era o segredo? hehe funcionou perfeitamente a impressão direta da danfe da NFCE após a sua alteração

@fincatto
Copy link
Member Author

Boa noite pessoal. Como anda este branch? Viável para fazermos merge pro master?

@margelperetto
Copy link
Contributor

Estou usando em produção faz uns dias. Tive apenas que fazer alguns ajustes na DANFE da NFCE:

  • O local onde era para aparecer os dados de endereço do destinatário esta listando os dados do endereço do próprio emitente
  • Conforme quebra a linha, as informações do destinatário "somem" (resolvi isso movendo as informações para o page footer do relatório).
  • Inclui o valor total dos tributos ao final, de maneira fixa (conversando com o higomatos acabei percebendo que não era a melhor coisa a se fazer)

@estevamdf2
Copy link

Pessoal quero tirar um dúvida. Na classe de teste NFDanfeReportTest há o método deveGerarDanfeNFeAPartirDoXML() ao final dele há uma chamada para gerarDanfeNFe(). Ao final desta chamada ele gera o pdf da notaFiscal.
Qual é o caminho onde é salvo o pdf ?

@estevamdf2
Copy link

Consegui fazer o uso da funcionalidade aqui. Uso a lib em um projeto web. Criei um método e chamei o método gerarDanfeNFe(null).

Ficou assim

byte[] dadosDanfe;

NFDanfeReport danfe = new NFDanfeReport(notaProcessada);
         dadosDanfe = danfe.gerarDanfeNFe(null);

HttpServletResponseWrapper response = (HttpServletResponseWrapper) FacesContext
	.getCurrentInstance().getExternalContext().getResponse();
        response.setContentType("application/pdf");
	response.setHeader("Content-Disposition", "attachment; filename=relatorio.pdf");
	response.setContentLength(dadosDanfe.length);

ServletOutputStream servletOutputStream = response.getOutputStream();
	servletOutputStream.write(dadosDanfe);
	servletOutputStream.flush();
        servletOutputStream.close();
FacesContext.getCurrentInstance().responseComplete();

Em meu front end usamos primefaces. Para que ele faça o download do arquivo é necessário inserir o commandButton com os seguintes parâmetros

<p:commandButton ajax="false" immediate="true" id="button" value="Gerar Danfe" action="#{myBean.metodoDanfe()}" />

Se não for incluído os parâmetros ajax="false" immediate="true" ao final da chamada o arquivo com a danfe não será exibida.

@ghost
Copy link

ghost commented Jan 25, 2017

Essa feature já está pronta? Se sim quando irá pro maven?

@higomatos
Copy link
Contributor

@FabianoFSantos, a feature funciona, não considera que está totalmente pronta pra ir pro master e maven.

Pelo que recordo ela está despadronizada, quando vc utiliza para NF-e precisa passar um xml (o que considero correto), já no caso do NFC-e ela trabalha com objetos (em desacordo com a issue).

@klutzer
Copy link
Contributor

klutzer commented Jan 27, 2017

@FabianoFSantos Você pode aproveitar e adaptar o layout jrxml da NFC-e para trabalhar com xml ao invés de objetos e fazer o PR, para possibilitar que esta feature vá para master

@clarelspies
Copy link
Contributor

@higomatos abri o jrxml no JasperStudio, mas não consigo compilar. Pode me explicar como faz pra adicionar as classes ao jasper para usar em desenvolvimento?

Estou fazendo isto pois notei que não há versão da nota com aviso de que ela esta cancelada! Acredito que não tem ninguém trabalhando nisto, certo?

@higomatos
Copy link
Contributor

@clarel a ideia é não utilizar classes no jasper pois o objetivo é imprimir a partir do XML.

Realmente não há uma versão para nota cancelada.

Para conhecimento a impressão dos documentos fiscais deverá ser retirada para um projeto independente no lançamento da versão 3.0 pois muitas pessoas não utilizam este projeto pra imprimir e o número de dependências é grande pros relatórios.

@walterportugal
Copy link
Contributor

walterportugal commented Feb 22, 2017 via email

@clarelspies
Copy link
Contributor

@higomatos estranho, não consigo compilar! vou verificar melhor.

Sobre a impressão acredito que poderia fazer neste branch o cancelamento assim como foi feito a danfe da nota, depois alguém se responsabilizaria para a criação do novo projeto. Pois não gostaria de ficar sem a impressão da nota cancelada apenas porque ainda não esta em outro projeto separado, e não tenho experiência o suficiente para iniciar este outro projeto.

Acredito que seria apenas passar juntamente com a impressão da danfe, além da nota processada o retorno do cancelamento (que é o que deve ser armazenado), caso este segundo parametro seja null imprime a nota normalmente, do contrário adiciona o que o @walterportugal comentou! Me parece o correto, pois o cancelamento AINDA faz parte da impressão/DANFE

E posteriormente eu ainda poderia adicionar a impressão da CTE, e lembrando: Alguém depois na versão 3.0 se responsabilizaria em colocar tudo isto em um projeto separado.

Atenciosamente, Clarel

@clarelspies
Copy link
Contributor

Em produção não é possível enviar a nota neste branch: Rejeição, cálculo da assinatura.
Em homologação da tudo certo!

@rbmurussi
Copy link

Não estou conseguindo definir os dados no danfeR3.jasper ele aparece tudo "null" o que estou fazendo de errado?
```
File file = new File("C:\data\nfe\NFe52170737259223000340550010003683811111013070.xml");
JRXmlDataSource xml = new JRXmlDataSource(file);
try(InputStream in = NFeConfig.class.getResourceAsStream("..\..\..\danfe\danfeR3.jasper")) {
JasperPrint print = JasperFillManager.fillReport(in, null, xml);
JasperViewer viewer = new JasperViewer(print, false);
viewer.setVisible(true);
}

@rbmurussi
Copy link

rbmurussi commented Jul 22, 2017

Consegui fazer funcionar com o seguinte modo:

File file = new File("C:\\data\\nfe\\NFe52170737259223000340550010003683811111013070.xml");
Document document = JRXmlUtils.parse(file);
Map params = new HashMap();
params.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, document);
params.put(JRXPathQueryExecuterFactory.XML_DATE_PATTERN, "yyyy-MM-dd");
params.put(JRXPathQueryExecuterFactory.XML_NUMBER_PATTERN, "#,##0.##");
params.put(JRXPathQueryExecuterFactory.XML_LOCALE, Locale.ENGLISH);
params.put(JRParameter.REPORT_LOCALE, Locale.US);
try (InputStream in = NFeConfig.class.getResourceAsStream("..\\..\\..\\danfe\\danfeR3.jasper")) {
	JasperPrint print = JasperFillManager.fillReport(in,params);
	JasperViewer viewer = new JasperViewer(print, false);
	viewer.setVisible(true);
}

@rbmurussi
Copy link

Para gerar a DANFE NFCe:

NotaParser parser = new NotaParser();
NFNotaProcessada proc = parser.notaProcessadaParaObjeto(file);
ArrayList<NFNotaProcessada> list = new ArrayList<NFNotaProcessada>();
list.add(proc);
Map<String, Object> params = new HashMap<String, Object>();
//params.put("PAGAMENTOS", value);
params.put("SUBREL", NFeConfig.class.getResourceAsStream("..\\..\\..\\danfe\\DANFE_NFCE_ITENS.jasper"));//java.io.InputStream
params.put("SUBREL_PAGAMENTOS", NFeConfig.class.getResourceAsStream("..\\..\\..\\danfe\\DANFE_NFCE_PAGAMENTOS.jasper"));//java.io.InputStream
//params.put("URL_CONSULTA", value);//java.lang.String
//params.put("QR_CODE", value);//java.awt.Image
//params.put("CHAVE_ACESSO_FORMATADA", value);//java.lang.String
//params.put("INFORMACOES_COMPLEMENTARES", value);//java.lang.String
params.put("MOSTRAR_MSG_FINALIZACAO", true);//java.lang.Boolean
JRBeanCollectionDataSource bean = new JRBeanCollectionDataSource(list);
try (InputStream in = NFeConfig.class.getResourceAsStream("..\\..\\..\\danfe\\DANFE_NFCE.jasper")) {
	JasperPrint print = JasperFillManager.fillReport(in, params, bean);
	JasperViewer viewer = new JasperViewer(print, false);
	viewer.setVisible(true);
}

@fincatto fincatto closed this as completed Nov 7, 2017
@rlanhellas
Copy link

Alguém pode me dizer como faz para gerar a DANFE ? Não encontrei na documentação.

Obrigado

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests