Archive for category Sviluppo

Currency e globalize

Proge, il semi-quasi-gestionale in ruby on rails che sto cercando di scrivere, deve ovviamente gestire dei campi monetari; basta pensare all’ammontare di una fattura, o alla registrazione in contabilità di un movimento. Dato che sto usando il plugin globalize per l’i18n dell’applicazione (anche se al massimo, la userò solo io :-) ), ho pensato di avere il campo monetario localizzato a sua volta.

La documentazione mi ha un po’ tratto in inganno, percui lascio un paio di appunti sul blog a futura memoria e sperando che possano essere d’aiuto anche a altri.

Quello che volevo fare era avere un campo “price” salvato sul database come integer (sul perché è un male gestire queste cose con un float, c’è parecchia documentazione in giro) e che potesse essere gestito con la localizzazione.

Nel modello dell’oggetto, chiamiamolo nell’esempio “prodotto”, la documentazione dice di aggiungere:

composed_of :price, :class_name => “Globalize::Currency”, :mapping => [ %w(price cents) ]

Quando in una view farò <%= @product.price %> questo mi verrà visualizzato opportunamente localizzato.

E fin qua è facile. Il problema era che non capivo come salvare quel campo, lasciando libero l’utente di inserire un valore nel campo price seguendo le convenzioni della locale impostata. Insomma, se sono italiano, voglio essere libero di inserire 6,52 per esperimere 6 euro e 52 centesimi, e inserire 7.64 per inserire 7 dollari e 64 centesimi se sono americano: il controller dovrà salvare rispettivamente 652 e 764 nel database.

Nella view del classico _form.rhtml avrò l’ancora più classico:



<%= text_field 'pp', 'price' %>

Mentre nel controller, avrò:

@product.price = Currency.parse(@params[:pp][:price]).cents

In pratica devo fare il parsing del valore passato nel form, tramite la funzione della classe Currency e dovrò poi prendere l’attributo cents; dalla documentazione questo non era chiaro, sembrava che parse avrebbe fatto tutto, invece leggendo il codice ho capito dove stava l’inghippo.

Ah, infine, affinché il parse funzioni con qualsiasi locale bisogna patchare globalize con questa patch, altrimenti lui capisce solo valute americane.

, ,

No Comments

Proge, globalize

Oggi ho aggiunto a Proge, il “gestionale” di cui parlavo alcuni giorni fa che sto sviluppando con Ruby On Rails, il supporto per l’internazionalizzazione. In realtà non ho fatto molto, dato che come al solito in Ruby On Rails è sufficiente installare un plugin e iniziarlo a usarlo. Giusto mentre lo stavo usando, è uscito un articolo in italiano a tal proposito su therubymine.com.

Proge comincia a avere la sua consistenza e gestisce ad oggi (più o meno correttamente :-) ):

  • clienti/fornitori
  • prodotti e servizi
  • registrazione fatture attive e passive
  • categorie (di prodotti, servizi o altro)
  • progetti e ticketing system con priorità
  • movimentazione merci, carico, scarico, trasferimenti
  • lotti/partite di merci, in acquisto e vendita
  • magazzini/porti, vettori e altro utile alla movimentazione merci

Il tutto senza aver scritto quasi una riga di codice. Dico quasi, perché la situazione di magazzino non sono riuscito a farla senza.

Pur avendo detto che magazzini has_many :lotti, :through quantità, non sono riuscito a fare qualcosa tipo Magazzino.quantità.sum(:group quantità) e ho dovuto farmi un find_by_sql a mano. Amen.

,

No Comments