-
-
Save lucastex/949115 to your computer and use it in GitHub Desktop.
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 |
Essa idéia parece boa, mas da pra ficar mais mais simples sem escrever "linha":
instrucoes {
"efetuar o pagamento bla bla bla"
"pagamento referente a parcela 3"
"não receber apos o dia 12/12"
}
ou pensando mais longe, algo assim usando multiline string:
instrucoes """
efetuar o pagamento bla bla bla
pagamento referente a parcela 3
não receber apos o dia 12/12
"""
E a idéia original é boa pra quando a string das linhas vem do banco ou de um propriedade qualquer:
instrucoes obj.linha1, obj.linha2, obj.linha3
Acho que atrapalhei mais que ajudei :P
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í? :)
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... :/
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"
]
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... :(
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
Não, o primeiro parâmetro tem que estar junto a chamada do metodo... Assim tem como:
instrucoes linha1,
linha2,
linha3
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.
é, tem que ser :)
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
Maneiro.
Só mais uma coisa, da pra omitir o .build do começo e ficar boleto { direto? :)
boleto {
....
}
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, :)
Ah ta. Foi mais uma super preocupação com aparência hehehe
Ta maneiro assim.
:) valeu pela ajuda!
Tou finalizando já. Tá aqui o src: https://github.com/blanq/grails-stella/blob/master/src/groovy/br/com/caelum/grails/stella/builder/BoletoBuilder.groovy
Isso me faz ter vontade de ter um Groovy for iOS :)
haha :)
Poxa estava procurando aqui uma coisa parecida com isso.
Uma pergunta funciona com as versoes atuais do GRAILS?
Legal, concordo que uma linha com todas as informações (várias frases, ao inves de palavras), pode complicar...
Como fazer então? Talvez assim:
Ou então como? A idéia é sempre manter a legibilidade e mais que isso, manter as informações de uma forma que a estrutura seja bem auto-explicativa, claro :)