POS - Number To Words In Ticket (Spanish)
Code snippetName: POS - Number to words in Ticket (Spanish)
|
El siguiente script permite mediante el uso de dos atributos en los productos obtener la cantidad con letra del total final e incluirlo en cualquier parte del ticket.
1. Crear nuevo recurso de tipo texto llamado "Importe.Letra" y agregar el siguiente código.
private static String[] _grupos = { "", "millon","billon","trillon" }; private static String[] _unidades = { "","un","dos","tres","cuatro","cinco","seis","siete","ocho","nueve" }; private static String[] _decena1 = { "","once","doce","trece","catorce","quince","dieciseis","diecisiete","dieciocho","diecinueve" }; private static String[] _decenas = { "","diez","veinte","treinta","cuarenta","cincuenta","sesenta","setenta","ochenta","noventa"}; private static String[] _centenas = { "","cien","doscientos","trescientos","cuatrocientos","quinientos","seiscientos","setecientos","ochocientos","novecientos"}; public static String millarATexto( int n ) { if (n == 0) return ""; int centenas = n / 100; n = n % 100; int decenas = n / 10; int unidades = n % 10; String sufijo = ""; if ( decenas == 0 && unidades != 0 ) sufijo = _unidades[unidades]; if ( decenas == 1 && unidades != 0 ) sufijo = _decena1[unidades]; if ( decenas == 2 && unidades != 0 ) sufijo = "veinti"+_unidades[unidades]; if ( unidades == 0) sufijo = _decenas[decenas]; if ( decenas > 2 && unidades != 0) sufijo = _decenas[decenas] + " y " + _unidades[unidades]; if (centenas != 1) return _centenas[centenas] + " " + sufijo; if ( unidades == 0 && decenas == 0) return "cien"; return "ciento "+sufijo; } public static String numeroACastellano( long n ){ String resultado = ""; int grupo = 0; while ( n != 0 && grupo < _grupos.length ) { long fragmento = n % 1000000; int millarAlto = (int) (fragmento / 1000); int millarBajo = (int) (fragmento % 1000); n = n / 1000000; String nombreGrupo = _grupos[grupo]; if (fragmento > 1 && grupo > 0) nombreGrupo += "es"; if ((millarAlto != 0) || (millarBajo != 0)) { if (millarAlto > 1) resultado = millarATexto(millarAlto) + " mil " + millarATexto(millarBajo) + " " + nombreGrupo + " " + resultado; if (millarAlto == 0) resultado = millarATexto(millarBajo) + " " + nombreGrupo + " "+ resultado; if (millarAlto == 1) resultado = "mil " + millarATexto(millarBajo) + " " + nombreGrupo + " " + resultado; } grupo++; } return resultado; } numero = ticket.getTotal(); numero = Math.round(numero*Math.pow(10,2))/Math.pow(10,2); numero_entero=(int)numero; numero_decimal=(int)((numero*100)-(numero_entero*100)); line = ticket.getLine(0); if (numero_decimal==0){ value = "(".concat(numeroACastellano(numero_entero)).concat("00/100 M.N.)"); } else{ value = "(".concat(numeroACastellano(numero_entero)).concat(Integer.toString(numero_decimal)).concat("/100 M.N.)"); } if (value.length()>36){ line.setProperty("importe", "(".concat(numeroACastellano(numero_entero))); if (numero_decimal==0){ line.setProperty("importe2","00/100 M.N.)"); } else{ line.setProperty("importe2", Integer.toString(numero_decimal).concat("/100 M.N.)")); } } else{ line.setProperty("importe", value); line.setProperty("importe2", ""); }
2. Editar el recurso "Ticket.Buttons" agregando la siguiente línea (evento) después de la etiqueta "<configuration>" :
<event key="ticket.close" code="Importe.Letra"/>
3. Editar el recurso "Printer.Ticket" agregando las siguientes líneas donde se requiera imprimir la cantidad con letra:
<line> <text align="left" length="36">${ticket.getLine(0).getProperty("importe")}</text> </line> <line> <text align="left" length="36">${ticket.getLine(0).getProperty("importe2")}</text> </line>
4. Salir y reiniciar la aplicación.
Nota:
La longitud de texto en el script está limitada a 36 caracteres, si la cantidad con letra sobrepasa esta longitud la trunca en 2 líneas.
Ésto se puede modificar al final del script en la siguiente línea
if (value.length()>36)
cambiar el 36 por el número de caracteres que se necesite.