View source | Discuss this page | Page history | Printable version   

POS - Number To Words In Ticket (Spanish)

Code snippet

Name: POS - Number to words in Ticket (Spanish)
Version: POS 2.30
Author: Macumbero and Zil__



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.

Retrieved from "http://wiki.openbravo.com/wiki/POS_-_Number_To_Words_In_Ticket_(Spanish)"

This page has been accessed 14,418 times. This page was last modified on 19 April 2010, at 22:05. Content is available under Creative Commons Attribution-ShareAlike 2.5 Spain License.