Commit ff983ac4 by Maria Agustina

casi terminado cobranzas

1 parent ff31cd4e
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
'wizard/interes_negociado.xml', 'wizard/interes_negociado.xml',
'wizard/validar_nd.xml', 'wizard/validar_nd.xml',
'wizard/pago_deuda_wizzard.xml', 'wizard/pago_deuda_wizzard.xml',
'wizard/confirmar_cancelacion_wizzard_vista.xml',
'views/menu.xml', 'views/menu.xml',
], ],
# only loaded in demonstration mode # only loaded in demonstration mode
......
...@@ -57,6 +57,31 @@ class vnt_cobros(models.Model): ...@@ -57,6 +57,31 @@ class vnt_cobros(models.Model):
compute="_compute_co_modo_elegido", compute="_compute_co_modo_elegido",
) )
co_facturas = fields.Many2many(
string='Facturas',
comodel_name='asw.comprobante',
ondelete='restrict',
)
co_notasdeb = fields.Many2many(
string='Notas Débito',
comodel_name='asw.comprobante',
ondelete='restrict',
)
co_recibos = fields.Many2many(
string='Recibos de Cobro',
comodel_name='asw.comprobante',
ondelete='restrict',
)
co_usuario_cancelacion = fields.Many2one(
string=u'Cancelado por',
comodel_name='res.users',
ondelete='set null',
copy=False
)
def seleccionar_todo(self): def seleccionar_todo(self):
for lin in self.co_lin_deuda: for lin in self.co_lin_deuda:
lin.ld_select = True lin.ld_select = True
...@@ -98,9 +123,12 @@ class vnt_cobros(models.Model): ...@@ -98,9 +123,12 @@ class vnt_cobros(models.Model):
self.co_deucarg = True self.co_deucarg = True
#recupero comprobantes de venta, adeudados, con el cliente seleccionado #recupero comprobantes de venta, adeudados, con el cliente seleccionado
comp_venta_adeud = self.env['asw.comprobante'].search([('comp_talonario.tal_menu','=','fac'),('comp_tipo_comp','=','e'),('comp_estado', '=', 'a'),('comp_cliente', '=', self.co_cliente.id)]) comp_venta_adeud = self.env['asw.comprobante'].search([('comp_talonario.tal_menu','=','fac'),('comp_tipo_comp','=','e'),('comp_estado', '=', 'a'),('comp_cliente', '=', self.co_cliente.id)])
lista = []
if comp_venta_adeud: if comp_venta_adeud:
for comp in comp_venta_adeud: for comp in comp_venta_adeud:
nva_linea = self.env['vnt.linea_deuda'].create({'ld_factura': comp.id, 'ld_cobros': self.id}) nva_linea = self.env['vnt.linea_deuda'].create({'ld_factura': comp.id, 'ld_cobros': self.id})
lista.append(comp.id)
self.co_facturas = lista
else: else:
raise UserError("No hay deudas registradas del cliente seleccionado") raise UserError("No hay deudas registradas del cliente seleccionado")
...@@ -124,6 +152,7 @@ class vnt_cobros(models.Model): ...@@ -124,6 +152,7 @@ class vnt_cobros(models.Model):
self.co_estado = 'a' self.co_estado = 'a'
def procesar_notas(self): def procesar_notas(self):
lista = []
for li in self.co_lin_deuda: for li in self.co_lin_deuda:
if li.ld_select: if li.ld_select:
#obtener total. si hay interes se hace nota de debito #obtener total. si hay interes se hace nota de debito
...@@ -138,6 +167,8 @@ class vnt_cobros(models.Model): ...@@ -138,6 +167,8 @@ class vnt_cobros(models.Model):
tal_letra = tal_original.tal_letra tal_letra = tal_original.tal_letra
tal_pto = tal_original.tal_pto_vta tal_pto = tal_original.tal_pto_vta
talonario = self.env['asw.talonario'].search([('tal_pto_vta','=',tal_pto),('tal_letra','=', tal_letra),('tal_codigo','=','NDEB')]) talonario = self.env['asw.talonario'].search([('tal_pto_vta','=',tal_pto),('tal_letra','=', tal_letra),('tal_codigo','=','NDEB')])
if talonario:
referencia = 'Nota de débito del comprobante : ' + fac.comp_talonario.tal_codigo + "/" +fac.comp_nro_letras referencia = 'Nota de débito del comprobante : ' + fac.comp_talonario.tal_codigo + "/" +fac.comp_nro_letras
nota_debito = self.generar_comprobante( nota_debito = self.generar_comprobante(
...@@ -160,6 +191,10 @@ class vnt_cobros(models.Model): ...@@ -160,6 +191,10 @@ class vnt_cobros(models.Model):
}) })
#asociar nd a linea deuda tb #asociar nd a linea deuda tb
li.ld_nd = nota_debito.id li.ld_nd = nota_debito.id
lista.append(nota_debito.id)
else:
raise UserError('No existe talonario para la Nota de Débito correspondiente. Créelo o diríjase a soporte para que lo haga, y vuelva a este menú')
self.co_notasdeb = lista
self.co_estado = 'pr' self.co_estado = 'pr'
...@@ -186,80 +221,38 @@ class vnt_cobros(models.Model): ...@@ -186,80 +221,38 @@ class vnt_cobros(models.Model):
'target': 'new', 'target': 'new',
} }
# #paga factura original
# fac_id = li.ld_factura.id
# fac = self.env['asw.comprobante'].search([('id', '=', fac_id)])
# fac.comp_estado = 'p'
# #obtener total. si hay interes se hace nota de debito
# total_int = li.ld_interes
# if (total_int != 0.0):
# #crear notas de debito
# tal_original = fac.comp_talonario
# tal_letra = tal_original.tal_letra
# tal_pto = tal_original.tal_pto_vta
# referencia = 'Nota de débito del comprobante : ' + fac.comp_talonario.tal_codigo + "/" +fac.comp_nro_letras
# #crear talonario con mismo pto de venta y letra
# tipo_comprobante = self.env['asw.tipo_comprobante'].search([('tc_descripcion', '=', 'NOTA DE DEBITO A')])
# talonario_nvo = self.env['asw.talonario'].create({
# 'tal_pto_vta': tal_pto,
# 'tal_letra': tal_letra,
# 'tal_codigo': "NDEB"+ tal_original.tal_codigo + str(self.id),
# 'tal_descripcion': "NDEB-" + tal_original.tal_descripcion + str(self.id),
# 'tal_tipo': tal_original.tal_tipo,
# 'tal_menu': tal_original.tal_menu,
# })
# talonario_nvo.tal_tpc_id = tipo_comprobante.id
# contra_comprobante = self.generar_comprobante(
# talonario = talonario_nvo,
# cliente = fac.comp_cliente,
# total = total_int,
# referencia = referencia,
# comp_estado = fac.comp_estado,
# comp_nro_letras = fac.comp_nro_letras,
# comp_moneda = fac.comp_moneda.id,
# comp_nota_credito = fac.id,
# )
# contra_comprobante.comp_fecha_validacion = datetime.today()
# #crear lineas nd
# linea_comp = self.env['asw.linea_comprobante'].create({
# 'lcp_descripcion_producto': referencia,
# 'lcp_comprobante': contra_comprobante.id,
# 'lcp_importe': total_int
# })
# # contra_comprobante.comp_linea_facturas = (4,linea_comp.id)
# #asociar nd a factura original
# fac.write({
# 'comp_nota_credito' : contra_comprobante.id
# })
# #asociar nd a linea deuda tb
# li.ld_nd = contra_comprobante.id
# self.co_estado = 'p'
def cancelar(self): def cancelar(self):
self.co_estado = 'c' lista = []
#y marcar comprobantes como adeudados de nuevo lista_f = []
#cancelar notas de debito
for li in self.co_lin_deuda: for li in self.co_lin_deuda:
if li.ld_select: if li.ld_select:
fac_id = li.ld_factura.id #lista tiene todas las nd
fac = self.env['asw.comprobante'].search([('id', '=', fac_id)]) lista.append(li.ld_nd.id)
fac.comp_estado = 'a' lista_f.append(li.ld_factura.id)
if li.ld_nd:
nd_id = li.ld_nd.id datos = {'cc_cliente': self.co_cliente.id,
nd = self.env['asw.comprobante'].search([('id', '=', nd_id)]) 'cc_total': self.co_total,
nd.comp_fecha_cancelacion = datetime.today() 'cc_cobro': self.id}
nvo_w = self.env['vnt.confirmar_cancelacion'].create(datos)
nvo_w.cc_notas = lista
nvo_w.cc_facturas = lista_f
return {
'type': 'ir.actions.act_window',
'res_model': 'vnt.confirmar_cancelacion',
'view_mode': 'form',
'view_type': 'form',
'res_id': nvo_w.id,
'target': 'new',
}
def cancelar_cobro(self):
self.co_estado = 'c'
self.co_usuario_cancelacion = self.env.uid
#cancelar recibo
recibo = self.co_recibos.filtered(lambda t: t.comp_talonario.tal_menu == 'rec')
recibo.comp_fecha_cancelacion = datetime.today()
#hay que crear NC
def cobrar_todo(self): def cobrar_todo(self):
for lin in self.co_lin_deuda: for lin in self.co_lin_deuda:
......
...@@ -16,4 +16,10 @@ class asw_comprobante(models.Model): ...@@ -16,4 +16,10 @@ class asw_comprobante(models.Model):
"type": "ir.actions.do_nothing", "type": "ir.actions.do_nothing",
} }
def cancelarNotaD(self):
self.cancelar()
return {
"type": "ir.actions.do_nothing",
}
...@@ -149,6 +149,9 @@ class vnt_linea_deuda(models.Model): ...@@ -149,6 +149,9 @@ 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 pagar_facturas(self):
self.ld_factura.comp_fecha_validacion = fields.Datetime.now()
return (True)
# def cobrar_todo(self): # def cobrar_todo(self):
# self.ld_cobro = 'todo' # self.ld_cobro = 'todo'
......
...@@ -21,9 +21,9 @@ ...@@ -21,9 +21,9 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree> <tree>
<field name="co_cliente" /> <field name="co_cliente" />
<field name="co_total_deuda" sum="Total Deuda Facturas"/> <field name="co_total_deuda"/>
<field name="co_total_interes" sum="Total Interés"/> <field name="co_total_interes" />
<field name="co_total" sum="Total"/> <field name="co_total" />
</tree> </tree>
</field> </field>
</record> </record>
...@@ -49,15 +49,18 @@ ...@@ -49,15 +49,18 @@
<field name="co_estado" widget="statusbar"/> <field name="co_estado" widget="statusbar"/>
<field invisible="1" name="co_deucarg" /> <field invisible="1" name="co_deucarg" />
</header> </header>
<group>
<field name="co_usuario_cancelacion" attrs="{'invisible':[('co_estado','not in',['c'])]}"/>
</group>
<group col="2" string="Cliente y resumen"> <group col="2" string="Cliente y resumen">
<field colspan="1" nolabel="1" name="co_cliente" attrs="{ 'readonly' : [('co_deucarg','=',True)]}" /> <field colspan="1" nolabel="1" name="co_cliente" attrs="{ 'readonly' : [('co_deucarg','=',True),('co_estado','in',['p','c','pr'])]}" />
<div colspan="1"></div> <div colspan="1"></div>
<field colspan="1" nolabel="1" name="co_resumen" attrs="{ 'readonly' : [('co_deucarg','=',True)]}" /> <field colspan="1" nolabel="1" name="co_resumen" attrs="{ 'readonly' : [('co_deucarg','=',True),('co_estado','in',['p','c'])]}" />
</group> </group>
<notebook colspan="4"> <notebook colspan="4">
<page string="Deudas"> <page string="Deudas">
<field name="co_modo_elegido" /> <field name="co_modo_elegido" />
<button type="object" class="btn btn-info" style="margin:5px;" name="seleccionar_todo" string="Seleccionar todo" attrs="{'invisible':[('co_estado','in',['a','p','pr','c']),('co_modo_elegido','=',True)]}" /> <button type="object" class="btn btn-info" style="margin:5px;" name="seleccionar_todo" string="Seleccionar todo" attrs="{'invisible':[('co_estado','in',['a','p','pr','c']),('co_modo_elegido','=',True)], 'readonly':[('co_estado','in',['p','c'])]}" />
<button type="object" class="btn btn-primary" style="margin:5px;" name="cobrar_todo" string="Cobrar Todo" attrs="{'invisible':[('co_modo_elegido','=',True)]}" /> <button type="object" class="btn btn-primary" style="margin:5px;" name="cobrar_todo" string="Cobrar Todo" attrs="{'invisible':[('co_modo_elegido','=',True)]}" />
<button type="object" class="btn btn-primary" style="margin:5px;" name="cobrar_negociado" string="Cobro Negociado" attrs="{'invisible':[('co_modo_elegido','=',True)]}" /> <button type="object" class="btn btn-primary" style="margin:5px;" name="cobrar_negociado" string="Cobro Negociado" attrs="{'invisible':[('co_modo_elegido','=',True)]}" />
<button type="object" class="btn btn-primary" style="margin:5px;" name="interes_perdido" string="Interés Perdido" attrs="{'invisible':[('co_modo_elegido','=',True)]}" /> <button type="object" class="btn btn-primary" style="margin:5px;" name="interes_perdido" string="Interés Perdido" attrs="{'invisible':[('co_modo_elegido','=',True)]}" />
...@@ -80,8 +83,12 @@ ...@@ -80,8 +83,12 @@
</tree> </tree>
</field> </field>
</page> </page>
<page string="Comprobantes">
<field name="co_facturas" readonly="1" />
</page>
</notebook> </notebook>
<group name='total' class="oe_subtotal_footer oe_right"> <group name='total' class="oe_subtotal_footer oe_right" attrs="{'invisible':[('co_estado','in',['p','c'])]}">
<field name="co_total_deuda" readonly="1" /> <field name="co_total_deuda" readonly="1" />
<field name="co_total_interes" readonly="1" /> <field name="co_total_interes" readonly="1" />
<field name="co_total" readonly="1" /> <field name="co_total" readonly="1" />
......
from . import interes_negociado from . import interes_negociado
from . import validar_nd from . import validar_nd
from . import pago_deuda_wizzard from . import pago_deuda_wizzard
from . import confirmar_cancelacion_wizzard
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import UserError
from datetime import datetime
class vnt_confirmar_cancelacion(models.TransientModel):
_name = 'vnt.confirmar_cancelacion'
_description = 'Confirmar Cancelación'
_inherit = ['asw.generador_comprobante', 'asw.action.manager']
cc_notas = fields.Many2many(
string=u"Nota Débito",
comodel_name='asw.comprobante',
)
cc_facturas = fields.Many2many(
string=u"Facturas Originales",
comodel_name='asw.comprobante',
)
cc_cobro = fields.Many2one(
string='Cobro',
comodel_name='vnt.cobros',
)
def cancelar(self):
self.chequear_cancelacion_notas()
self.cancelar_facturas()
self.crear_notacred()
self.cc_cobro.cancelar_cobro()
def cancelar_facturas(self):
for fac in self.cc_facturas:
fac.comp_estado = 'a'
def chequear_cancelacion_notas(self):
for nota in self.cc_notas:
if nota.comp_fecha_cancelacion == False:
raise UserError("Todas las notas deben ser canceladas para continuar con la cancelación")
def crear_notacred(self):
comprobante = self.cc_cobro.co_recibos.filtered(lambda t: t.comp_talonario.tal_menu == 'rec')
referencia = 'Reintegro del comprobante : ' + comprobante.comp_talonario.tal_codigo + "/" +comprobante.comp_nro_letras
talonario = self.env['asw.talonario'].search([('tal_pto_vta','=',comprobante.comp_talonario.tal_pto_vta),('tal_letra','=', comprobante.comp_talonario.tal_letra),('tal_codigo','=','NCRED')])
if talonario:
contra_comprobante = self.generar_comprobante(
talonario = talonario,
cliente = comprobante.comp_cliente,
total = comprobante.comp_total,
referencia = referencia,
comp_estado = comprobante.comp_estado,
comp_nro_letras = comprobante.comp_nro_letras,
comp_subtotal = comprobante.comp_subtotal,
comp_moneda = comprobante.comp_moneda.id,
comp_nota_credito = comprobante.id
)
contra_comprobante.comp_fecha = datetime.today()
contra_comprobante.duplicar_lineas(comprobante)
comprobante.write({
'comp_nota_credito' : contra_comprobante.id
})
else:
raise UserError('No existe talonario para la Nota de Crédito correspondiente. Créelo o diríjase a soporte para que lo haga, y vuelva a este menú')
\ No newline at end of file \ No newline at end of file
<odoo>
<data>
<record id="vnt_confirmar_cancelacion" model="ir.ui.view">
<field name="name">Confirmar Cancelación</field>
<field name="model">vnt.confirmar_cancelacion</field>
<field name="arch" type="xml">
<form>
<group>
<field name="cc_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="cancelarNotaD" string="Cancelar" type="object" class="oe_highlight"/>
</tree>
</field>
</group>
<footer>
<p>La cancelación de las Notas de Débito debe realizarse de esta manera debido a las limitaciones generadas por el sistema de AFIP</p>
<p>Si pulsa Confirmar Cancelación se procederá a cancelar el Recibo de Cobro y a modificar las Facturas originales a Adeudadas</p>
<button name="cancelar" string="Confirmar Cancelación" type="object" class="oe_highlight"/>
</footer>
</form>
</field>
</record>
<act_window id="vnt_confirmar_cancelacion_wizard_action"
name="Confirmar Cancelación"
src_model="vnt.confirmar_cancelacion"
res_model="vnt.confirmar_cancelacion"
view_mode="form"
target="new"
multi="True"/>
</data>
</odoo>
\ No newline at end of file \ No newline at end of file
...@@ -24,6 +24,7 @@ class asw_pago_deuda_wizzard(models.TransientModel): ...@@ -24,6 +24,7 @@ class asw_pago_deuda_wizzard(models.TransientModel):
@api.multi @api.multi
def generar_recibo(self): def generar_recibo(self):
lista = []
self.chequear_montos() self.chequear_montos()
self.armar_recibo() self.armar_recibo()
self.validar_afectar(self.pcw_recibo) self.validar_afectar(self.pcw_recibo)
...@@ -32,6 +33,11 @@ class asw_pago_deuda_wizzard(models.TransientModel): ...@@ -32,6 +33,11 @@ class asw_pago_deuda_wizzard(models.TransientModel):
self.pcw_recibo.comp_estado = 'p' self.pcw_recibo.comp_estado = 'p'
self.pcw_cobro_deu.co_estado = 'p' self.pcw_cobro_deu.co_estado = 'p'
lista.append(self.pcw_recibo.id)
self.pcw_cobro_deu.co_recibos = lista
for lin in self.pcw_cobro_deu.co_lin_deuda:
lin.pagar_facturas()
accion = self.get_action_navega('asw_recibos_list_action', self.pcw_recibo.id) accion = self.get_action_navega('asw_recibos_list_action', self.pcw_recibo.id)
return accion return accion
......
...@@ -27,6 +27,9 @@ class vnt_validar_nd(models.TransientModel): ...@@ -27,6 +27,9 @@ class vnt_validar_nd(models.TransientModel):
#metodo para abrir wizard pago #metodo para abrir wizard pago
def cobrar_todo(self): def cobrar_todo(self):
for lin in self.vnd_notas:
if lin.comp_fecha_validacion == False:
raise UserError("Todas las notas deben ser validadas para continuar con el cobro")
datos = {'pcw_cliente': self.vnd_cliente.id, datos = {'pcw_cliente': self.vnd_cliente.id,
'pcw_totalcobrar': self.vnd_total, 'pcw_totalcobrar': self.vnd_total,
'pcw_cobro_deu': self.vnd_cobro.id} 'pcw_cobro_deu': self.vnd_cobro.id}
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!