Commit 47efdbea by Maria Agustina

1427 casi terminada

1 parent 30a0bc8d
...@@ -29,11 +29,13 @@ ...@@ -29,11 +29,13 @@
# always loaded # always loaded
'data': [ 'data': [
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'datos_xml/producto.xml',
'views/cobros.xml', 'views/cobros.xml',
'views/intereses.xml', 'views/intereses.xml',
'wizard/interes_negociado.xml', 'wizard/interes_negociado.xml',
'wizard/validar_nd.xml',
'wizard/pago_cliente_wizzard.xml',
'views/menu.xml', 'views/menu.xml',
], ],
# only loaded in demonstration mode # only loaded in demonstration mode
'demo': [ 'demo': [
......
<odoo>
<data noupdate='1'>
<!-- <record id="asw_producto_saldo_inicial" model="asw.producto">
<field name='prod_descripcion'>Saldo inicial</field>
<field name='pro_puede_ser_comprado'>True</field>
<field name='pro_puede_ser_vendido'>True</field>
<field name='es_servicio'>False</field>
</record> -->
<record id="asw_producto_interes_default" model="asw.producto">
<field name='prod_descripcion'>INTERES</field>
<field name='pro_puede_ser_comprado'>True</field>
<field name='pro_puede_ser_vendido'>True</field>
</record>
</data>
</odoo>
\ No newline at end of file \ No newline at end of file
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from odoo import models, fields, api, exceptions from odoo import models, fields, api, exceptions
from odoo.exceptions import UserError, ValidationError from odoo.exceptions import UserError, ValidationError
from datetime import datetime
import odoo.addons.decimal_precision as dp import odoo.addons.decimal_precision as dp
import math import math
...@@ -9,4 +10,10 @@ import os ...@@ -9,4 +10,10 @@ import os
class asw_comprobante(models.Model): class asw_comprobante(models.Model):
_inherit = 'asw.comprobante' _inherit = 'asw.comprobante'
def validarNotaD(self):
self.comp_fecha_validacion = datetime.today()
return {
"type": "ir.actions.do_nothing",
}
...@@ -33,7 +33,7 @@ class vnt_interes(models.Model): ...@@ -33,7 +33,7 @@ class vnt_interes(models.Model):
) )
int_tasa_anual = fields.Float( int_tasa_anual = fields.Float(
string=u'Tasa Anual', string=u'Tasa Anual (%)',
) )
@api.onchange('int_todos') @api.onchange('int_todos')
......
...@@ -28,6 +28,11 @@ class vnt_linea_deuda(models.Model): ...@@ -28,6 +28,11 @@ class vnt_linea_deuda(models.Model):
compute="_compute_ld_total", compute="_compute_ld_total",
) )
ld_comp_adeudado = fields.Float(
string=u'Total Adeudado Factura',
compute="_compute_ld_total_adeudado",
)
ld_select = fields.Boolean( ld_select = fields.Boolean(
string="Seleccionar", string="Seleccionar",
...@@ -73,6 +78,11 @@ class vnt_linea_deuda(models.Model): ...@@ -73,6 +78,11 @@ class vnt_linea_deuda(models.Model):
record.ld_total = record.ld_factura.comp_total record.ld_total = record.ld_factura.comp_total
@api.depends('ld_factura') @api.depends('ld_factura')
def _compute_ld_total_adeudado(self):
for record in self:
record.ld_comp_adeudado = record.ld_factura.comp_adeudado
@api.depends('ld_factura')
def _compute_ld_interes(self): def _compute_ld_interes(self):
for record in self: for record in self:
dias_mes = record.number_of_days_in_month(datetime.now().year, datetime.now().month) dias_mes = record.number_of_days_in_month(datetime.now().year, datetime.now().month)
...@@ -80,27 +90,47 @@ class vnt_linea_deuda(models.Model): ...@@ -80,27 +90,47 @@ class vnt_linea_deuda(models.Model):
fmt = '%Y-%m-%d' fmt = '%Y-%m-%d'
d1= datetime.strptime(record.ld_fecha_vto, fmt) d1= datetime.strptime(record.ld_fecha_vto, fmt)
d2= datetime.strptime(record.ld_fecha_calculo, fmt) d2= datetime.strptime(record.ld_fecha_calculo, fmt)
if d2>d1: if d2>d1:
dias_pasados= (d2 - d1).days dias_pasados= (d2 - d1).days
cliente_id = record.ld_factura.comp_cliente.id cliente_id = record.ld_factura.comp_cliente.id
config_int = self.env['vnt.interes'].search([('int_cliente', '=', cliente_id)], limit=1) config_int = self.env['vnt.interes'].search([('int_cliente', '=', cliente_id)], limit=1)
tasa_an = config_int.int_tasa_anual if not config_int:
raise UserError("No hay configuración de interés para el cliente seleccionado")
tasa_an = (config_int.int_tasa_anual * record.ld_total)/100
tasa_diaria = tasa_an/dias_anio tasa_diaria = tasa_an/dias_anio
if config_int.int_ritmo == 'mensual': if config_int.int_ritmo == 'mensual':
tasa_mensual = tasa_diaria * dias_mes #en d2 tengo la fecha de hoy y en d1 la del vto, resto los meses y agrego el q paso desde el vto
cociente = dias_pasados // dias_mes meses_pasados = d2.month - d1.month + 12*(d2.year - d1.year)
cociente =+ 1; meses_pasados = meses_pasados + 1
int_calculado = cociente * tasa_mensual anio = d1.year
#calculo del intres
calc_int = 0
for i in range (meses_pasados):
mes= d1.month
mes = mes + i
if (mes % 12 == 0):
mes = 12
else:
mes = mes % 12
calc_int = calc_int + (tasa_diaria * record.number_of_days_in_month(anio, mes))
if (mes == 12):
anio = anio + 1
int_calculado = calc_int
if config_int.int_ritmo == 'quincenal': if config_int.int_ritmo == 'quincenal':
tasa_quincenal = tasa_diaria * 15 tasa_quincenal = tasa_diaria * 15
cociente = dias_pasados // 15 cociente = dias_pasados // 15
cociente =+ 1; cociente = cociente + 1
int_calculado = cociente * tasa_quincenal int_calculado = cociente * tasa_quincenal
if config_int.int_ritmo == 'semanal': if config_int.int_ritmo == 'semanal':
tasa_semanal = tasa_diaria * 7 tasa_semanal = tasa_diaria * 7
cociente = dias_pasados // 7 cociente = dias_pasados // 7
cociente =+ 1; cociente = cociente + 1
int_calculado = cociente * tasa_semanal int_calculado = cociente * tasa_semanal
if config_int.int_ritmo == 'diaria': if config_int.int_ritmo == 'diaria':
int_calculado = dias_pasados * tasa_diaria int_calculado = dias_pasados * tasa_diaria
else: else:
...@@ -119,26 +149,26 @@ class vnt_linea_deuda(models.Model): ...@@ -119,26 +149,26 @@ class vnt_linea_deuda(models.Model):
suma += self.number_of_days_in_month(anio, m) suma += self.number_of_days_in_month(anio, m)
return suma return suma
def cobrar_todo(self): # def cobrar_todo(self):
self.ld_cobro = 'todo' # self.ld_cobro = 'todo'
def cobrar_negociado(self): # def cobrar_negociado(self):
self.ld_cobro = 'negociado' # self.ld_cobro = 'negociado'
#abrir wizard con in_ld self id # #abrir wizard con in_ld self id
datos = {'in_ld': self.id} # datos = {'in_ld': self.id}
nvo_w = self.env['vnt.interes_negociado'].create(datos) # nvo_w = self.env['vnt.interes_negociado'].create(datos)
return { # return {
'type': 'ir.actions.act_window', # 'type': 'ir.actions.act_window',
'res_model': 'vnt.interes_negociado', # 'res_model': 'vnt.interes_negociado',
'view_mode': 'form', # 'view_mode': 'form',
'view_type': 'form', # 'view_type': 'form',
'res_id': nvo_w.id, # 'res_id': nvo_w.id,
'target': 'new', # 'target': 'new',
} # }
def interes_perdido(self): # def interes_perdido(self):
self.ld_cobro = 'perdido' # self.ld_cobro = 'perdido'
self.ld_interes = 0 # self.ld_interes = 0
......
...@@ -40,9 +40,10 @@ ...@@ -40,9 +40,10 @@
<!--<sheet>--> <!--<sheet>-->
<header> <header>
<button type="object" class="oe_highlight" name="traer_ld" string="Cargar Deudas" attrs="{ 'invisible' : ['|',('co_deucarg','=',True),('co_cliente','=',False)]}" /> <button type="object" class="oe_highlight" name="traer_ld" string="Cargar Deudas" attrs="{ 'invisible' : ['|',('co_deucarg','=',True),('co_cliente','=',False)]}" />
<button name="procesar" string="Procesar" type="object" class='btn btn-primary' attrs="{'invisible':[('co_estado','in',['a','p','c'])]}"/> <button name="procesar_deuda" string="Confirmar Deuda" type="object" class='btn btn-primary' attrs="{'invisible':['|',('co_estado','in',['p','a','pr','c']),('co_deucarg','=',False)]}" />
<button name="pagar_deuda" string="Pagar" type="object" class='btn btn-primary' attrs="{'invisible':[('co_estado','in',['b','p','c'])]}"/> <button name="procesar_notas" string="Procesar Cobro" type="object" class='btn btn-primary' attrs="{'invisible':[('co_estado','in',['pr','b','p','c'])]}"/>
<button name="cancelar" string="Cancelar" type="object" class='btn btn-primary' attrs="{'invisible':[('co_estado','in',['b','a','c'])]}"/> <button name="pagar_deuda" string="Cobrar Todo" type="object" class='btn btn-primary' attrs="{'invisible':[('co_estado','in',['b','a','p','c'])]}"/>
<button name="cancelar" string="Cancelar" type="object" class='btn btn-primary' attrs="{'invisible':[('co_estado','in',['b','a','c','pr'])]}"/>
<button name="volver_borrador" string="Volver a Borrador" type="object" class='btn btn-primary' attrs="{'invisible':[('co_estado','in',['b','p','c'])]}"/> <button name="volver_borrador" string="Volver a Borrador" type="object" class='btn btn-primary' attrs="{'invisible':[('co_estado','in',['b','p','c'])]}"/>
<field name="co_estado" widget="statusbar"/> <field name="co_estado" widget="statusbar"/>
...@@ -55,12 +56,16 @@ ...@@ -55,12 +56,16 @@
</group> </group>
<notebook colspan="4"> <notebook colspan="4">
<page string="Deudas"> <page string="Deudas">
<button type="object" class="btn btn-primary" style="margin:5px;" name="cobrar_todo" string="Cobrar Todo" attrs="{'invisible':[('co_estado','in',['a','p','c'])]}" />
<button type="object" class="btn btn-primary" style="margin:5px;" name="cobrar_negociado" string="Cobro Negociado" attrs="{'invisible':[('co_estado','in',['a','p','c'])]}" />
<button type="object" class="btn btn-primary" style="margin:5px;" name="interes_perdido" string="Interés Perdido" attrs="{'invisible':[('co_estado','in',['a','p','c'])]}" />
<field nolabel="1" name="co_lin_deuda"> <field nolabel="1" name="co_lin_deuda">
<tree create="0" edit="1" editable="1"> <tree create="0" edit="1" editable="1">
<field name="ld_factura" readonly="1" /> <field name="ld_factura" readonly="1" />
<field name="ld_fecha_vto" readonly="1" /> <field name="ld_fecha_vto" readonly="1" />
<field name="ld_estado" readonly="1" /> <field name="ld_estado" readonly="1" />
<field name="ld_total" readonly="1"/> <field name="ld_total" readonly="1"/>
<field name="ld_comp_adeudado" readonly="1"/>
<field name="ld_interes" readonly="1"/> <field name="ld_interes" readonly="1"/>
<field name="ld_fecha_calculo" readonly="1"/> <field name="ld_fecha_calculo" readonly="1"/>
<field name="ld_co_estado" invisible="1"/> <field name="ld_co_estado" invisible="1"/>
...@@ -68,9 +73,6 @@ ...@@ -68,9 +73,6 @@
<field name="ld_estado" editable="0" readonly="1" /> <field name="ld_estado" editable="0" readonly="1" />
<field name="ld_total" readonly="1" /> --> <field name="ld_total" readonly="1" /> -->
<field name="ld_cobro" readonly="1"/> <field name="ld_cobro" readonly="1"/>
<button type="object" class="btn btn-primary" name="cobrar_todo" string="Cobrar Todo" attrs="{'invisible':[('ld_co_estado','in',['a','p','c'])]}" />
<button type="object" class="btn btn-primary" name="cobrar_negociado" string="Cobro Negociado" attrs="{'invisible':[('ld_co_estado','in',['a','p','c'])]}" />
<button type="object" class="btn btn-primary" name="interes_perdido" string="Interés Perdido" attrs="{'invisible':[('ld_co_estado','in',['a','p','c'])]}" />
<field name="ld_select" attrs="{'readonly':[('ld_co_estado','in',['a','p','c'])]}"/> <field name="ld_select" attrs="{'readonly':[('ld_co_estado','in',['a','p','c'])]}"/>
<field name="ld_nd" readonly="1" attrs="{'invisible':[('ld_co_estado','in',['a','b','c'])]}"/> <field name="ld_nd" readonly="1" attrs="{'invisible':[('ld_co_estado','in',['a','b','c'])]}"/>
</tree> </tree>
......
from . import interes_negociado from . import interes_negociado
from . import validar_nd
from . import pago_cliente_wizzard
No preview for this file type
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from odoo import models, fields, api from odoo import models, fields, api
from odoo.exceptions import UserError
class vnt_interes_negociado(models.TransientModel): class vnt_interes_negociado(models.TransientModel):
_name = 'vnt.interes_negociado' _name = 'vnt.interes_negociado'
...@@ -9,11 +10,65 @@ class vnt_interes_negociado(models.TransientModel): ...@@ -9,11 +10,65 @@ class vnt_interes_negociado(models.TransientModel):
string=u'Interés Negociado', string=u'Interés Negociado',
) )
#viejo, cdo era una sola linea
in_ld = fields.Many2one( in_ld = fields.Many2one(
string='Linea de deuda', string='Linea de deuda',
comodel_name='vnt.linea_deuda', comodel_name='vnt.linea_deuda',
) )
in_ld2 = fields.Many2many(
string=u"Línea Deuda",
comodel_name='vnt.linea_deuda',
)
in_tipo_int = fields.Selection(
string = 'Tipo de negociación',
selection = [
('monto', 'Monto Interés Negociado'),
('porcentaje', 'Porcentaje Interés Negociado'),
],
store = True,
)
in_intotal = fields.Float(
string=u"Total Interés",
readonly=True,
)
in_deutotal = fields.Float(
string=u"Total Deuda",
readonly=True,
)
in_cant_comp = fields.Integer(
string=u"Cant. de Comprobantes",
readonly=True,
)
in_tottot = fields.Float(
string=u"Total",
readonly=True,
)
@api.depends('in_tipo_int')
def aceptar_in(self): def aceptar_in(self):
linea = self.in_ld
linea.write({'ld_interes': self.in_interes})
\ No newline at end of file \ No newline at end of file
if (self.in_tipo_int not in ['monto','porcentaje']):
raise UserError('Debe elegir un tipo de negociación')
if (self.in_interes == 0.0):
raise UserError('Debe introducir un monto o porcentaje. Si decide cancelar el interés debe pulsar el botón "Interés perdido" en la página anterior')
lineas = self.in_ld2
cant_lin = len(self.in_ld2)
if cant_lin != 0:
nvo_monto = self.in_interes/cant_lin
else:
raise UserError('No hay líneas de deuda seleccionadas')
if (self.in_tipo_int == 'monto'):
for lin in self.in_ld2:
lin.write({'ld_interes': nvo_monto})
lin.ld_cobro = 'negociado'
if (self.in_tipo_int == 'porcentaje'):
for lin in self.in_ld2:
nvo_monto = (lin.ld_interes * self.in_interes)/100
lin.write({'ld_interes': nvo_monto})
lin.ld_cobro = 'negociado'
return (True)
...@@ -5,11 +5,20 @@ ...@@ -5,11 +5,20 @@
<field name="model">vnt.interes_negociado</field> <field name="model">vnt.interes_negociado</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form> <form>
<group string="Subtotal">
<field name="in_cant_comp" />
<field name="in_deutotal" />
<field name="in_intotal" />
<field name="in_tottot" />
</group>
<group col="4" string="Ingresar el interés negociado"> <group col="4" string="Ingresar el interés negociado">
<field name="in_tipo_int" />
<field name="in_interes" /> <field name="in_interes" />
</group> </group>
<footer> <footer>
<p>La opción Porcentaje aplicará el porcentaje a todas las líneas de deuda seleccionadas</p>
<p>La opción Monto distribuirá el monto elegido entre las líneas de deuda seleccionadas</p>
<button name="aceptar_in" string="Aceptar" type="object" class="oe_highlight"/> <button name="aceptar_in" string="Aceptar" type="object" class="oe_highlight"/>
<button special="cancel" string="Cancel"/> <button special="cancel" string="Cancel"/>
</footer> </footer>
......
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import UserError
class asw_pago_cliente_wizzard(models.TransientModel):
_inherit = 'asw.pago_cliente_wizzard'
pcw_totalcobrar = fields.Float(
string="Total a Cobrar",
readonly=True,
)
pcw_cliente = fields.Many2one(
string='Cliente',
comodel_name='asw.cliente',
readonly=True,
)
pcw_cobro_deu = fields.Many2one(
string='Cobro',
comodel_name='vnt.cobros',
)
@api.multi
def generar_recibo(self):
self.chequear_montos()
self.armar_recibo()
self.validar_afectar(self.pcw_recibo)
self.pcw_recibo.eliminar_valores_cero()
self.pcw_recibo.comp_estado = 'p'
self.pcw_cobro_deu.co_estado = 'p'
accion = self.get_action_navega('asw_recibos_list_action', self.pcw_recibo.id)
return accion
def chequear_montos(self):
if self.pcw_totalcobrar > self.pcw_total:
raise UserError("El monto adeudado aún no fue saldado")
<odoo>
<data>
<record id="asw_pago_cliente_wizzard_inherit_form" model="ir.ui.view">
<field name="name">Cobro a Cliente</field>
<field name="model">asw.pago_cliente_wizzard</field>
<field name="inherit_id" ref="asw_tpv.asw_pago_cliente_wizzard_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='pcw_cli_razon_social']" position="before">
<group>
<field name="pcw_totalcobrar"/>
</group>
</xpath>
</field>
</record>
</data>
</odoo>
\ No newline at end of file \ No newline at end of file
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import UserError
class vnt_validar_nd(models.TransientModel):
_name = 'vnt.validar_nd'
_description = 'Validar Notas de Débito'
vnd_notas = fields.Many2many(
string=u"Nota Débito",
comodel_name='asw.comprobante',
)
vnd_total = fields.Float(
string="Total",
)
vnd_cliente = fields.Many2one(
string='Cliente',
comodel_name='asw.cliente',
)
vnd_cobro = fields.Many2one(
string='Cobro',
comodel_name='vnt.cobros',
)
#metodo para abrir wizard pago
def cobrar_todo(self):
datos = {'pcw_cliente': self.vnd_cliente.id,
'pcw_totalcobrar': self.vnd_total,
'pcw_cobro_deu': self.vnd_cobro.id}
wizard = self.env['asw.pago_cliente_wizzard'].create(datos)
return {
'type': 'ir.actions.act_window',
'res_model': 'asw.pago_cliente_wizzard',
'view_mode': 'form',
'view_type': 'form',
'res_id': wizard.id,
'target': 'new',
}
<odoo>
<data>
<record id="vnt_validar_nd_wizard_form" model="ir.ui.view">
<field name="name">Validar Notas Débito</field>
<field name="model">vnt.validar_nd</field>
<field name="arch" type="xml">
<form>
<group>
<field name="vnd_notas" nolabel="1">
<tree create="0" edit="1" editable="1">
<field name="name"/>
<field name="comp_talonario"/>
<field name="comp_nro"/>
<field name="comp_pto_vta"/>
<field name="comp_cliente"/>
<field name="comp_estado"/>
<button name="validarNotaD" string="Validar" type="object" class="oe_highlight"/>
</tree>
</field>
</group>
<footer>
<p>La validación de las Notas de Débito debe realizarse de esta manera debido a las limitaciones generadas por el sistema de AFIP</p>
<p>Una vez que las notas están validadas sólo pueden cancelarse manualmente, no desde este menú</p>
<button name="cobrar_todo" string="Pasar a Cobro" type="object" class="oe_highlight"/>
</footer>
</form>
</field>
</record>
<act_window id="vnt_validar_nd_wizard_action"
name="Validar Notas Débito"
src_model="vnt.validar_nd"
res_model="vnt.validar_nd"
view_mode="form"
target="new"
multi="True"/>
</data>
</odoo>
\ No newline at end of file \ No newline at end of file
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!