diff --git a/report/impound_report.xml b/report/impound_report.xml index 01c9dfd06cd678f95f8099fc6465c901df7d3894..36984b8a3bd5b38ed747189c83db6ea5a37341f7 100644 --- a/report/impound_report.xml +++ b/report/impound_report.xml @@ -446,7 +446,7 @@ </t> <t t-if="cash_lines"> <t t-foreach="cash_lines" t-as="line"> - <table> + <table width="100%" height="100%"> <thead> <tr> <th><h4><strong>RAFAELA ALIMENTOS</strong></h4></th> @@ -471,7 +471,19 @@ <h4 class="text-right">Total a pagar: <t t-esc="line['amount']" t-options='{"widget": "float", "precision": 2}'/></h4> </div> </td> - </tr> + </tr> + <tr style="border-style:hidden;padding:0px;"> + <td> + <div > + <p class="float-left mt8">RecibÃ/mos de RAFAELA ALIMENTOS S.A. en pago de la liquidacion precedente a mi/nuestra<br/> + conformidad la suma de pesos <strong><t t-esc="total_written_cash"/></strong><br/> + </p> + </div> + <div class="float-right"> + <p>Recibà duplicado de la presente liquidacÃon</p> + </div> + </td> + </tr> <tr> <td> <table width="50%" height="50%"> diff --git a/wizard/__init__.py b/wizard/__init__.py index 178ab84b3945014bbe9e2990db2d3ce74ef81dc0..b5625c7738f3c5130415bbff332bc289099699ef 100644 --- a/wizard/__init__.py +++ b/wizard/__init__.py @@ -1 +1,2 @@ -from . import impound_notes \ No newline at end of file +from . import impound_notes +from . import number_letters diff --git a/wizard/impound_notes.py b/wizard/impound_notes.py index dc31f95e8c0e122e5b978af68c502c9a01cbf0c4..e7027e8fa1c9c814ebc492299b2048efc3fcdd94 100644 --- a/wizard/impound_notes.py +++ b/wizard/impound_notes.py @@ -1,7 +1,7 @@ from odoo import models, fields, _, api from odoo.exceptions import ValidationError from datetime import date - +from .number_letters import number_to_letter, number_to_coin class ImpoundNotesReportWizard(models.TransientModel): _name = 'impound.notes.report.wizard' @@ -179,6 +179,8 @@ class ImpoundNotesReportWizard(models.TransientModel): total_amount += amount cash_lines.append(vals) + total_written_cash = number_to_coin(round(cash_total, 2)) + data = { 'form': self.read()[0], 'impound_selected_date': self.impound_selected_date, @@ -193,7 +195,8 @@ class ImpoundNotesReportWizard(models.TransientModel): 'web_transfer_lines': web_transfer_lines, 'no_web_transfer_total': round(no_web_transfer_total, 2), 'no_web_transfer_lines': no_web_transfer_lines, - 'cash_total': cash_total, + 'cash_total': round(cash_total, 2), + 'total_written_cash': total_written_cash.upper(), 'cash_lines': cash_lines, } diff --git a/wizard/number_letters.py b/wizard/number_letters.py new file mode 100644 index 0000000000000000000000000000000000000000..1ed4b6833a55daa99ac40494b9ac3c1f835f9289 --- /dev/null +++ b/wizard/number_letters.py @@ -0,0 +1,175 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + + +MONEDA_SINGULAR = 'PESO' +MONEDA_PLURAL = 'PESOS' + +CENTIMOS_SINGULAR = 'CENTAVO' +CENTIMOS_PLURAL = 'CENTAVOS' + +MAX_NUMERO = 999999999999 + +UNIDADES = ( + 'cero', + 'uno', + 'dos', + 'tres', + 'cuatro', + 'cinco', + 'seis', + 'siete', + 'ocho', + 'nueve' +) + +DECENAS = ( + 'diez', + 'once', + 'doce', + 'trece', + 'catorce', + 'quince', + 'dieciseis', + 'diecisiete', + 'dieciocho', + 'diecinueve' +) + +DIEZ_DIEZ = ( + 'cero', + 'diez', + 'veinte', + 'treinta', + 'cuarenta', + 'cincuenta', + 'sesenta', + 'setenta', + 'ochenta', + 'noventa' +) + +CIENTOS = ( + '_', + 'ciento', + 'doscientos', + 'trescientos', + 'cuatroscientos', + 'quinientos', + 'seiscientos', + 'setecientos', + 'ochocientos', + 'novecientos' +) + +def number_to_letter(number): + integer_number = int(number) + if integer_number > MAX_NUMERO: + raise OverflowError('Número demasiado alto') + if integer_number < 0: + return 'menos %s' % number_to_letter(abs(number)) + letras_decimal = '' + parte_decimal = int(round((abs(number) - abs(integer_number)) * 100)) + if parte_decimal > 9: + letras_decimal = 'punto %s' % number_to_letter(parte_decimal) + elif parte_decimal > 0: + letras_decimal = 'punto cero %s' % number_to_letter(parte_decimal) + if integer_number <= 99: + resultado = leer_decenas(integer_number) + elif integer_number <= 999: + resultado = leer_centenas(integer_number) + elif integer_number <= 999999: + resultado = leer_miles(integer_number) + elif integer_number <= 999999999: + resultado = leer_millones(integer_number) + else: + resultado = leer_millardos(integer_number) + resultado = resultado.replace('uno mil', 'un mil') + resultado = resultado.strip() + resultado = resultado.replace(' _ ', ' ') + resultado = resultado.replace(' ', ' ') + if parte_decimal > 0: + resultado = '%s %s' % (resultado, letras_decimal) + return resultado + +def number_to_coin(number): + integer_number = int(number) + parte_decimal = int(round((abs(number) - abs(integer_number)) * 100)) + centimos = '' + if parte_decimal == 1: + centimos = CENTIMOS_SINGULAR + else: + centimos = CENTIMOS_PLURAL + moneda = '' + if integer_number == 1: + moneda = MONEDA_SINGULAR + else: + moneda = MONEDA_PLURAL + letras = number_to_letter(integer_number) + letras = letras.replace('uno', 'un') + letras_decimal = 'con %s %s' % (number_to_letter(parte_decimal).replace('uno', 'un'), centimos) + letras = '%s %s %s' % (letras, moneda, letras_decimal) + return letras + +def leer_decenas(number): + if number < 10: + return UNIDADES[number] + decena, unidad = divmod(number, 10) + if number <= 19: + resultado = DECENAS[unidad] + elif number <= 29: + resultado = 'veinti%s' % UNIDADES[unidad] + else: + resultado = DIEZ_DIEZ[decena] + if unidad > 0: + resultado = '%s y %s' % (resultado, UNIDADES[unidad]) + return resultado + +def leer_centenas(number): + centena, decena = divmod(number, 100) + if number == 0: + resultado = 'cien' + else: + resultado = CIENTOS[centena] + if decena > 0: + resultado = '%s %s' % (resultado, leer_decenas(decena)) + return resultado + +def leer_miles(number): + millar, centena = divmod(number, 1000) + resultado = '' + if (millar == 1): + resultado = '' + if (millar >= 2) and (millar <= 9): + resultado = UNIDADES[millar] + elif (millar >= 10) and (millar <= 99): + resultado = leer_decenas(millar) + elif (millar >= 100) and (millar <= 999): + resultado = leer_centenas(millar) + resultado = '%s mil' % resultado + if centena > 0: + resultado = '%s %s' % (resultado, leer_centenas(centena)) + return resultado + +def leer_millones(number): + millon, millar = divmod(number, 1000000) + resultado = '' + if (millon == 1): + resultado = ' un millon ' + if (millon >= 2) and (millon <= 9): + resultado = UNIDADES[millon] + elif (millon >= 10) and (millon <= 99): + resultado = leer_decenas(millon) + elif (millon >= 100) and (millon <= 999): + resultado = leer_centenas(millon) + if millon > 1: + resultado = '%s millones' % resultado + if (millar > 0) and (millar <= 999): + resultado = '%s %s' % (resultado, leer_centenas(millar)) + elif (millar >= 1000) and (millar <= 999999): + resultado = '%s %s' % (resultado, leer_miles(millar)) + return resultado + +def leer_millardos(number): + millardo, millon = divmod(number, 1000000) + return '%s millones %s' % (leer_miles(millardo), leer_millones(millon))