<commit_before>#!/usr/bin/env python
# coding: utf8
# Colmena Labs - Soluciones Tecnológicas
# debianitram (at) gmail.com

from gluon.dal import Field
from gluon.validators import IS_NOT_EMPTY, IS_NOT_IN_DB, IS_IN_SET, IS_IN_DB
from gluon.html import TABLE, THEAD, TBODY, TR, TH, TD, SPAN, I, URL, H4, H5
from gluon.html import STRONG, TAG, HR, CENTER, STYLE, INPUT, TAG, SCRIPT, A
from objeto_base import objbase
from decimal import Decimal

class prestamo(objbase):

    def __init__(self, container):
        super(prestamo, self).__init__(container)
        self.tipo_credito = {1: 'diario', 7: 'semanal', 30: 'mensual'}
        self.estado = {1: 'vigente', 2: 'finalizado', 3: 'cancelado'}
        
    def define_tables(self):
        db = self.container.db
        auth = self.container.auth
        
        db.define_table(self.name_table,
            Field('cliente_id', db.cliente),
            Field('fecha', 'date'),
            Field('monto', 'decimal(6, 2)'),
            Field('concepto', 
                  'reference %s' % self.container.concepto_prestamo.name_table),
            Field('tipo_credito', 'list:string'),
            Field('cuotas', 'integer'),
            Field('interes', 'integer'),
            Field('monto_total', 'decimal(6, 2)',
                  compute=lambda r: self.monto_total(r['monto'], r['interes'])),
            Field('observacion', 'text'),
            Field('estado', 'list:string', default=1),
            auth.signature,
            format='%(id)s:%(cliente_id)s->%(fecha)s',
            common_filter=lambda q: db[self.name_table].is_active == True
            )

        # Configuraciones
        self.labels(db[self.name_table])
        self.readables_writables(db[self.name_table])
        self.requires(db[self.name_table])
        self.represent(db[self.name_table])

    # Configuraciones.
    def labels(self, dbconf):
        dbconf.id.label = 'ID'
        dbconf.cliente_id.label = 'Cliente'
        dbconf.fecha.label = 'Fecha emisión'
        dbconf.monto.label = 'Importe ($)'
        dbconf.tipo_credito.label = 'Tipo de Crédito'
        dbconf.interes.label = '% interés'
        dbconf.monto_total.label = 'Importe Financiado ($)'
        dbconf.observacion.label = 'Observaciones'

    def readables_writables(self, dbconf):
        dbconf.id.readable = dbconf.id.writable = False
        # dbconf.cont_cuotas.readable = dbconf.cont_cuotas.writable = False
        dbconf.estado.readable = dbconf.estado.writable = False

    def requires(self, dbconf):
        concepto = self.container.concepto_prestamo
        dbconf.fecha.requires = dbconf.monto.requires = IS_NOT_EMPTY()
        dbconf.cuotas.requires = IS_NOT_EMPTY()
        dbconf.interes.requires = IS_NOT_EMPTY()
        dbconf.tipo_credito.requires = IS_IN_SET(self.tipo_credito)
        setconcepto = concepto.search('id', 'greater', get_set=True)
        dbconf.concepto.requires = IS_IN_DB(setconcepto,
                                            dbconf._db[concepto.name_table].id,
                                            '%(nombre)s')
        dbconf.estado.requires = IS_IN_SET(self.estado)

    def represent(self, dbconf):
        dbconf.tipo_credito.represent = lambda v: self.tipo_credito[int(v[0])]
        dbconf.estado.represent = lambda v: self.estado[int(v[0])]

    # Controles.
    def monto_total(self, monto, interes):
        # Monto sumado el porcentaje de interes.
        return Decimal(monto) + (int(interes) * Decimal(monto) / 100)

    def valor_cuota(self, monto_total, cuota):
        return Decimal(monto_total) / int(cuota)

    def deudas(self, cliente_id):
        dbprestamo = self.container.db[self.name_table]
        query = dbprestamo.cliente_id == cliente_id
        query &= dbprestamo.estado == 1

        f = self.getFields('id', 'fecha', 'concepto', 'monto', \
                           'cuotas', 'interes', 'monto_total')
        return self.container.db(query).select(*f, 
                                                orderby=~dbprestamo.created_on)

    def resumen_deudas(self, cliente_id):
        # Datos para el comportamiento AJAX
        cmd = "ajax('%s', ['%s'], '%s');"
        cmd_cancel = "ajax('%s', ['%s'], ':eval');"
        target = 'detalle_prestamo'
        cancel = 'cancelar_prestamo'
        ######################################

        fields = self.getFields('id', 'fecha', 'concepto', 'monto', \
                                'cuotas', 'interes', 'monto_total')
        
        thead = THEAD(TR(*[TH(f.label) for f in fields]))
        table = TABLE(thead, _class='table table-striped table-bordered')
        tbody = TBODY()

        rows = self.deudas(cliente_id)

        if not rows:
            return H4('No presenta deudas', _class='alert alert-success')

        for row in self.deudas(cliente_id):
            tbody.append(TR(TD(row.id),
                            TD(row.fecha),
                            TD(row.concepto.nombre),
                            TD(row.monto),
                            TD(row.cuotas),
                            TD(row.interes),
                            TD(row.monto_total),
                            TD(CENTER(
                                SPAN(I(_class='icon-zoom-in'), ' detalle',
                                    _id=row.id,
                                    _title='Ver detalle del prestamos',
                                    _class='btn btn-mini',
                                    _onclick=cmd % (URL(target,
                                                        vars=dict(pid=row.id),
                                                        user_signature=True),
                                                    None,
                                                    target)
                                    ))),
                            TD(CENTER(
                                SPAN(I(_class='icon-remove'), ' cancelar',
                                    _id='cancel %s' % row.id,
                                    _title='Cancelar el prestamo',
                                    _class='btn btn-mini',
                                    _onclick='cancelar(%s);' % row.id)<commit_msg>prestamos.py<commit_after>#!/usr/bin/env python
# coding: utf8
# Colmena Labs - Soluciones Tecnológicas
# debianitram (at) gmail.com

from gluon.dal import Field
from gluon.validators import IS_NOT_EMPTY, IS_NOT_IN_DB, IS_IN_SET, IS_IN_DB
from gluon.html import TABLE, THEAD, TBODY, TR, TH, TD, SPAN, I, URL, H4, H5
from gluon.html import STRONG, TAG, HR, CENTER, STYLE, INPUT, TAG, SCRIPT, A
from objeto_base import objbase
from decimal import Decimal

class prestamo(objbase):

    def __init__(self, container):
        super(prestamo, self).__init__(container)
        self.tipo_credito = {1: 'diario', 7: 'semanal', 30: 'mensual'}
        self.estado = {1: 'vigente', 2: 'finalizado', 3: 'cancelado'}
        
    def define_tables(self):
        db = self.container.db
        auth = self.container.auth
        
        db.define_table(self.name_table,
            Field('cliente_id', db.cliente),
            Field('fecha', 'date'),
            Field('monto', 'decimal(9, 2)'),
            Field('concepto', 
                  'reference %s' % self.container.concepto_prestamo.name_table),
            Field('tipo_credito', 'list:string'),
            Field('cuotas', 'integer'),
            Field('interes', 'integer'),
            Field('monto_total', 'decimal(9, 2)',
                  compute=lambda r: self.monto_total(r['monto'], r['interes'])),
            Field('observacion', 'text'),
            Field('estado', 'list:string', default=1),
            auth.signature,
            format='%(id)s:%(cliente_id)s->%(fecha)s',
            common_filter=lambda q: db[self.name_table].is_active == True
            )

        # Configuraciones
        self.labels(db[self.name_table])
        self.readables_writables(db[self.name_table])
        self.requires(db[self.name_table])
        self.represent(db[self.name_table])

    # Configuraciones.
    def labels(self, dbconf):
        dbconf.id.label = 'ID'
        dbconf.cliente_id.label = 'Cliente'
        dbconf.fecha.label = 'Fecha emisión'
        dbconf.monto.label = 'Importe ($)'
        dbconf.tipo_credito.label = 'Tipo de Crédito'
        dbconf.interes.label = '% interés'
        dbconf.monto_total.label = 'Importe Financiado ($)'
        dbconf.observacion.label = 'Observaciones'

    def readables_writables(self, dbconf):
        dbconf.id.readable = dbconf.id.writable = False
        # dbconf.cont_cuotas.readable = dbconf.cont_cuotas.writable = False
        dbconf.estado.readable = dbconf.estado.writable = False

    def requires(self, dbconf):
        concepto = self.container.concepto_prestamo
        dbconf.fecha.requires = dbconf.monto.requires = IS_NOT_EMPTY()
        dbconf.cuotas.requires = IS_NOT_EMPTY()
        dbconf.interes.requires = IS_NOT_EMPTY()
        dbconf.tipo_credito.requires = IS_IN_SET(self.tipo_credito)
        setconcepto = concepto.search('id', 'greater', get_set=True)
        dbconf.concepto.requires = IS_IN_DB(setconcepto,
                                            dbconf._db[concepto.name_table].id,
                                            '%(nombre)s')
        dbconf.estado.requires = IS_IN_SET(self.estado)

    def represent(self, dbconf):
        dbconf.tipo_credito.represent = lambda v: self.tipo_credito[int(v[0])]
        dbconf.estado.represent = lambda v: self.estado[int(v[0])]

    # Controles.
    def monto_total(self, monto, interes):
        # Monto sumado el porcentaje de interes.
        return Decimal(monto) + (int(interes) * Decimal(monto) / 100)

    def valor_cuota(self, monto_total, cuota):
        return Decimal(monto_total) / int(cuota)

    def deudas(self, cliente_id):
        dbprestamo = self.container.db[self.name_table]
        query = dbprestamo.cliente_id == cliente_id
        query &= dbprestamo.estado == 1

        f = self.getFields('id', 'fecha', 'concepto', 'monto', \
                           'cuotas', 'interes', 'monto_total')
        return self.container.db(query).select(*f, 
                                                orderby=~dbprestamo.created_on)

    def resumen_deudas(self, cliente_id):
        # Datos para el comportamiento AJAX
        cmd = "ajax('%s', ['%s'], '%s');"
        cmd_cancel = "ajax('%s', ['%s'], ':eval');"
        target = 'detalle_prestamo'
        cancel = 'cancelar_prestamo'
        ######################################

        fields = self.getFields('id', 'fecha', 'concepto', 'monto', \
                                'cuotas', 'interes', 'monto_total')
        
        thead = THEAD(TR(*[TH(f.label) for f in fields]))
        table = TABLE(thead, _class='table table-striped table-bordered')
        tbody = TBODY()

        rows = self.deudas(cliente_id)

        if not rows:
            return H4('No presenta deudas', _class='alert alert-success')

        for row in rows:
            tbody.append(TR(TD(row.id),
                            TD(row.fecha),
                            TD(row.concepto.nombre),
                            TD(row.monto),
                            TD(row.cuotas),
                            TD(row.interes),
                            TD(row.monto_total),
                            TD(CENTER(
                                SPAN(I(_class='icon-zoom-in'), ' detalle',
                                    _id=row.id,
                                    _title='Ver detalle del prestamos',
                                    _class='btn btn-mini',
                                    _onclick=cmd % (URL(target,
                                                        vars=dict(pid=row.id),
                                                        user_signature=True),
                                                    None,
                                                    target)
                                    ))),
                            TD(CENTER(
                                SPAN(I(_class='icon-remove'), ' cancelar',
                                    _id='cancel %s' % row.id,
                                    _title='Cancelar el prestamo',
                                    _class='btn btn-mini',
                                    _onclick='cancelar(%s);' % row.id)
{'fraction_non_alphanumeric': 0.12615235322658905, 'fraction_numerical': 0.0035581432961345623, 'mean_word_length': 1.6809017992629525, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 46, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1734470', 'n_tokens_mistral': 3850, 'n_tokens_neox': 3660, 'n_words': 663}