Skip to content

Instantly share code, notes, and snippets.

@lucastex
Created April 29, 2011 22:01
Show Gist options
  • Save lucastex/949115 to your computer and use it in GitHub Desktop.
Save lucastex/949115 to your computer and use it in GitHub Desktop.
Possível maneira de se criar boletos com o plugin do Grails-Stella
def boleto = new BoletoBuilder()
boleto.build(100.00, "itau") {
datas {
vencimento xxx
documento xxx
processamento xxx
}
cedente {
nome xxx
agencia xxx, x
conta xxx, x
convenio xxx
carteira xxx
nossoNumero xxx, x
operacao xxx
}
sacado {
nome xxx
cpf xxx
cnpj xxx
endereco xxx
bairo xxx
cep xxx
cidade xxx, xx
}
documento xxx
pagamento local1, local2
instrucoes linha1, linha2, linha3
informacoes info1, info2, info3, info4, info5
}
boleto.render "PNG", response
//boleto.render "PDF", response
@lucastex
Copy link
Author

lucastex commented May 2, 2011

haha :)

Depois eu vim rever isso mesmo, e parece melhor mesmo fazer algo diferenciado cara. Só esbarramos aí em como chamar né...
Ontem fiquei pensando e realmente a maneira mais bonita é essa aí que tb cogitei:

instrucoes {
    "efetuar o pagamento bla bla bla"
    "pagamento referente a parcela 3"
    "não receber apos o dia 12/12"
}

Só que internamente na closure, quando a gente escreve

linha "nao receber depois do dia 10"

Na real é a invocação do metodo 'linha' passando como parametro a string 'nao receber depois do dia 10', então eu acabo tendo que ter o nome do método e depois o parametro.
Existe uma possibilidade de se implementar o "method missing" em uma classe e quando a string for chamada daquele jeito

instrucoes {
   "nao receber depois do dia 10"
}

O method missing é chamado achando que o metodo "nao receber depois do dia 10" foi chamado, aí dá pra pegar o nome e armazenar. Nessa abordagem a unica problematica é que é uma chamada de método sem parametros, e aí, quando não tem parametro, pra não confundir com acesso a variavel, tem que colocar parenteses, o que deixaria então como unica possibilidade mais proxima disso o seguinte:

instrucoes {
   "nao receber depois do dia 10"()
}

E aí? :)

@lucastex
Copy link
Author

lucastex commented May 2, 2011

Fiz um teste aqui... Dessa maneira funcionaria


    t.teste {
        "hey hey hey"()
        "ha ha ha"()
        "he he he"()
    }

Mas não sei, esses () não me agradam, igual ao 'linha' sendo chamado antes... :/

@fcy
Copy link

fcy commented May 2, 2011

Ai realmente não fica legal. O parenteses acabou com a graça da coisa, melhor ter o "linha" na frente que o parenteses no final.

E se:

instrucoes [
    "linha1",
    "linha2",
    "linha3"
]

@lucastex
Copy link
Author

lucastex commented May 2, 2011

Aí voltamos a chamada de um método só, igual em cima, só que lá usava vargars e esse recebe um array :)
Esse aí é o mesmo que

instrucoes ["linha1", "linha2", "linha3"]

Tenho medo do pessoal mais novo confundir, pq vem no datas, cedente, sacado, tudo com { e } e depois chega noas instrucoes com [ e ] né...
Mas não tou vendo mtas outras alternativas diferentes dessa aí tb... :(

@fcy
Copy link

fcy commented May 2, 2011

Humm a preocupação com a consistência é importante mesmo, ficaria confuso a primeira vista e a pessoa iria errar sem querer pra depois lembrar que nesse caso é colchetes no lugar de chaves.

No caso original poderia escrever assim?

instrucoes
   linha1,
   linha2,
   linha3

@lucastex
Copy link
Author

lucastex commented May 2, 2011

Não, o primeiro parâmetro tem que estar junto a chamada do metodo... Assim tem como:

instrucoes linha1,
           linha2,
           linha3

@fcy
Copy link

fcy commented May 2, 2011

Então acho que resolve. Não tinha pensando nisso. Vai ficar bom tanto pra colocar tudo numa linha só quanto pra quem precisar colocar textos maiores.

Só colocar exemplos na documentação com essa identação.

@lucastex
Copy link
Author

lucastex commented May 2, 2011

é, tem que ser :)

@lucastex
Copy link
Author

lucastex commented May 2, 2011

Felipe, ficou assim:


        def boleto = new BoletoBuilder(1500, "itau")
        boleto.build {
            datas {
                vencimento (new Date() + 5)
                documento new Date()
                processamento new Date()
            }
            cedente {
                cedente       "Loja de ferramentas"
                agencia       1001, 'x'
                conta         1002,  3
                convenio      10
                carteira      20
                operacao      30
                nossoNumero   15000, 1
            }
            sacado {
                nome          "Nome do cliente"
                cpf           "000.000.000-00"
                endereco      "Rua sem nome, 1200 - apto 1001"
                bairro         "Centro"
                cep           "00000-000"
                cidade        "São Paulo", "SP"
            }
            aceite false
            documento numero: "12345", especie: "XXX"
            moeda valor: 1, quantidade: 1500

            pagamento  "Pagar até o vencimento", 
                       "Não receber após a data de vencimento"

            instrucoes "Não cobrar juros antes do vencimento", 
                       "Pagamento referente ao uso do sistema",
                       "Mensalidade de julho",
                       "Código do cliente: 12345"

            informacoes "Caro cliente, não se esqueca de pagar esta conta",
                        "Lembre-se que após 20 dias, seu acesso ao sistema irá ser restringido",
                        "e após 60 dias, seu sistema será totalmente desligado"           
        }

        def bytes = boleto.pdf()

        response.setContentType("application/pdf")
        response.outputStream << bytes

@fcy
Copy link

fcy commented May 2, 2011

Maneiro.

Só mais uma coisa, da pra omitir o .build do começo e ficar boleto { direto? :)

boleto {
....
}

@lucastex
Copy link
Author

lucastex commented May 2, 2011

Tem que chamar o método build do objeto builder, o metodo pode ter outro nome, mas mesmo assim fica obj.methodo.
Não queria injetar esse metodo automaticamente nos controllers por achar que pra esse caso acaba ficando demais... diferente de um e-mail

mail { 
   ...
}

Acho que o boleto é muito negócio pra estuprar os controllers e injetar isso a força via MOP :)

Tem outra coisa tb, o BoletoBuilder guarda estado (o boleto), pra poder chamar o .pdf() dps e o .png() sem ter que reconstruir o boleto denovo, :)

@fcy
Copy link

fcy commented May 2, 2011

Ah ta. Foi mais uma super preocupação com aparência hehehe

Ta maneiro assim.

@lucastex
Copy link
Author

lucastex commented May 2, 2011

:) valeu pela ajuda!

@lucastex
Copy link
Author

lucastex commented May 2, 2011

@fcy
Copy link

fcy commented May 2, 2011

Isso me faz ter vontade de ter um Groovy for iOS :)

@lucastex
Copy link
Author

lucastex commented May 2, 2011

haha :)

@marcotulioaraujo
Copy link

Poxa estava procurando aqui uma coisa parecida com isso.
Uma pergunta funciona com as versoes atuais do GRAILS?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment