Commit c3c5d655 by Juan

Merge branch 'juan2022' into 'master'

Juan2022

See merge request !2
2 parents 8af13e73 a8461f78
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
Se Agrega generacion manual para notas de credito y notas Se Agrega generacion manual para notas de credito y notas
de debito de debito
Se agrega soporte a gastos mobil Se agrega soporte a gastos mobil
Se agrega cobro Avanzado
""", """,
'author': 'HGT', 'author': 'HGT',
...@@ -39,14 +40,16 @@ ...@@ -39,14 +40,16 @@
'security/permisos.xml', 'security/permisos.xml',
'wizard/vista_prod_pfinal.xml', 'wizard/vista_prod_pfinal.xml',
'wizard/vista_corregir_nro_tal.xml', 'wizard/vista_corregir_nro_tal.xml',
'wizard/vista_generar_nota.xml',
'views/referencias.xml', 'views/referencias.xml',
'views/gastosmobil.xml', 'views/gastosmobil.xml',
'views/comprobante.xml', 'views/comprobante.xml',
'views/referencia_compra.xml', 'views/referencia_compra.xml',
'views/menu_compras.xml', 'views/menu_compras.xml',
'wizard/vista_cobro_discriminado.xml',
], ],
# only loaded in demonstration mode # only loaded in demonstration mode
'demo': [ 'demo': [
'demo/demo.xml', 'demo/demo.xml',
], ],
}
\ No newline at end of file \ No newline at end of file
}
...@@ -3,4 +3,5 @@ ...@@ -3,4 +3,5 @@
from . import comprobante from . import comprobante
from . import referencias from . import referencias
from . import referencia_compra from . import referencia_compra
from . import gastosmobil
\ No newline at end of file \ No newline at end of file
from . import gastosmobil
from . import currency
\ No newline at end of file \ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
from odoo import models, fields, api, exceptions from odoo import models, fields, api, exceptions
from .qr import qrfiscal from .qr import qrfiscal
from odoo.exceptions import UserError, ValidationError, Warning, RedirectWarning from odoo.exceptions import UserError, ValidationError, Warning, RedirectWarning
import base64 import base64, datetime
class asw_comprobante(models.Model): class asw_comprobante(models.Model):
_inherit = 'asw.comprobante' _inherit = 'asw.comprobante'
...@@ -137,4 +137,31 @@ class asw_comprobante(models.Model): ...@@ -137,4 +137,31 @@ class asw_comprobante(models.Model):
'target': 'new', 'target': 'new',
} }
def generarNota(self):
datos = {'gn_comprobante': self.id}
nw = self.env['tpv.generar_nota'].create(datos)
return {
'name': "Generar Nota Débito/Crédito",
'type': 'ir.actions.act_window',
'res_model': 'tpv.generar_nota',
'view_mode': 'form',
'view_type': 'form',
'res_id': nw.id,
'target': 'new',
}
def CorrejirFacturaSinCAE(self):
if not self.env.user.has_group("tpv_correcciones.module_category_tpv_corrector_electronica_admin"):
raise Warning("No tenes permiso para correjir facturas")
if self.comp_talonario.tal_es_fe == False:
raise Warning("No es factura electronica, no puedo hacer nada")
if not self.afip_auth_code_due == False:
raise Warning("Esta factura ya fue Autorizada en AFIP, si no ves el CAE, por favor reporte a soporte")
estado_actual = self.comp_estado #guardo el estado por si fue abonada
self.comp_estado = "b" #la dejo en borrador
self.comp_fecha = datetime.datetime.now().strftime('%Y-%m-%d')
self.validar() #revalido en este punto si falla se cancela todo el proceso
self.comp_estado = estado_actual #le dejo el estado original
\ No newline at end of file \ No newline at end of file
# -*- coding: utf-8 -*-
from odoo import models, fields, api, exceptions
from .qr import qrfiscal
from odoo.exceptions import UserError, ValidationError, Warning, RedirectWarning
import base64, datetime
class res_currency(models.Model):
_inherit = 'res.currency'
codigo_afip = fields.Char(string='Codigo AFIP',
help="si se deja en blanco se toma pesos")
\ No newline at end of file \ No newline at end of file
...@@ -6,9 +6,14 @@ ...@@ -6,9 +6,14 @@
</record> </record>
<record model="res.groups" id="module_category_tpv_corrector_tal_admin"> <record model="res.groups" id="module_category_tpv_corrector_tal_admin">
<field name="name">Administrador</field> <field name="name">Puede ajustar talonario</field>
<field name="category_id" eval="ref('module_category_tpv_corrector_tal')"/> <field name="category_id" eval="ref('module_category_tpv_corrector_tal')"/>
</record> </record>
<record model="res.groups" id="module_category_tpv_corrector_electronica_admin">
<field name="name">Puede correjir facturas sin cae</field>
<field name="category_id" eval="ref('module_category_tpv_corrector_tal')"/>
</record>
</data> </data>
</odoo> </odoo>
\ No newline at end of file \ No newline at end of file
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
<xpath expr="//button[@name='validar']" position="before"> <xpath expr="//button[@name='validar']" position="before">
<button name="abrir_wizard_ppf" class='btn btn-success' string="+ Producto por precio final" type="object" attrs="{'invisible':[('comp_estado','!=','b')]}"/> <button name="abrir_wizard_ppf" class='btn btn-success' string="+ Producto por precio final" type="object" attrs="{'invisible':[('comp_estado','!=','b')]}"/>
<button name="recalcularTotal" class='btn btn-warning' string="Recalcular Monto" type="object" attrs="{'invisible':[('comp_estado','!=','b')]}"/> <button name="recalcularTotal" class='btn btn-warning' string="Recalcular Monto" type="object" attrs="{'invisible':[('comp_estado','!=','b')]}"/>
<button name="generarNota" class='btn btn-success' string="Generar Nota" type="object" attrs="{'invisible':[('comp_estado','in',['b','c','r'])]}"/>
</xpath> </xpath>
<xpath expr="//group[1]" position="after"> <xpath expr="//group[1]" position="after">
<group string="Referencias" col="2"> <group string="Referencias" col="2">
...@@ -32,6 +33,8 @@ ...@@ -32,6 +33,8 @@
<button name="recalcularTotal" class='btn btn-warning' string="Recalcular Monto" type="object" attrs="{'invisible':[('comp_estado','!=','b')]}"/> <button name="recalcularTotal" class='btn btn-warning' string="Recalcular Monto" type="object" attrs="{'invisible':[('comp_estado','!=','b')]}"/>
<button name="impresion_directa" class='btn btn-info' string="Impresion directa" type="object" attrs="{'invisible':[('comp_estado','=','b')]}"/> <button name="impresion_directa" class='btn btn-info' string="Impresion directa" type="object" attrs="{'invisible':[('comp_estado','=','b')]}"/>
<button name="abrir_wizard_cn" type="object" class="btn btn-info" string="Corregir núm. AFIP"/>> <button name="abrir_wizard_cn" type="object" class="btn btn-info" string="Corregir núm. AFIP"/>>
<button name="generarNota" class='btn btn-success' string="Generar Nota" type="object" attrs="{'invisible':[('comp_estado','in',['b','c','r'])]}"/>
</xpath> </xpath>
</data> </data>
</field> </field>
...@@ -44,7 +47,7 @@ ...@@ -44,7 +47,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<data> <data>
<xpath expr="//field[@name='afip_xml_response']" position="after"> <xpath expr="//field[@name='afip_xml_response']" position="after">
<!--<field name="qr" />--> <button name="CorrejirFacturaSinCAE" class="btn btn-warning" string="Correjir cae" type="object" colspam="2" />
<field name="referencia_orig_fact" /> <field name="referencia_orig_fact" />
<field name="referencia_orig_ptv" /> <field name="referencia_orig_ptv" />
<field name="referencia_orig_numero" /> <field name="referencia_orig_numero" />
...@@ -74,4 +77,4 @@ ...@@ -74,4 +77,4 @@
</record> </record>
</data> </data>
</odoo>
\ No newline at end of file \ No newline at end of file
</odoo>
<odoo>
<data>
<record id="view_form_inherit_comprobante_recibido_ui" model="ir.ui.view">
<field name="name">Moneda</field>
<field name="model">res.currency</field>
<field name="inherit_id" ref="asw_tpv.view_form_comprobante_recibido_ui"/>
<field name="arch" type="xml">
<data>
<xpath expr="//group[1]" position="after">
<group string="Referencias" col="2">
<!--<field name="referencia_corr" widget="many2many_tags" />-->
<field name="referencia_compras_corr" widget="many2many_tags" />
</group>
</xpath>
</data>
</field>
</record>
</data>
</odoo>
\ No newline at end of file \ No newline at end of file
...@@ -2,6 +2,6 @@ ...@@ -2,6 +2,6 @@
<data> <data>
<menuitem name="Referencias" sequence="90" id="asw_tpv_compras_referencias" parent="asw_tpv.asw_tpv_compras"/> <menuitem name="Referencias" sequence="90" id="asw_tpv_compras_referencias" parent="asw_tpv.asw_tpv_compras"/>
<menuitem name="Referencias de Compras" id="asw_tpv_compras_referencias_refcompras" parent="asw_tpv_compras_referencias" action="hgt_refcompra_list_action"/> <menuitem name="Referencias de Compras" id="asw_tpv_compras_referencias_refcompras" parent="asw_tpv_compras_referencias" action="hgt_refcompra_list_action"/>
<menuitem name="Configuracion Mobil" sequence="99" id="asw_tpv_gasto_mobil_config" parent="asw_tpv.asw_tpv_compras_gastos" action="hgt_gastos_mobil_list_action" groups="hgt_dispositivos.group_administrador_dispositivos"/> <!-- <menuitem name="Configuracion Mobil" sequence="99" id="asw_tpv_gasto_mobil_config" parent="asw_tpv.asw_tpv_compras_gastos" action="hgt_gastos_mobil_list_action" groups="hgt_dispositivos.group_administrador_dispositivos"/> -->
</data> </data>
</odoo>
\ No newline at end of file \ No newline at end of file
</odoo>
from . import prod_pfinal from . import prod_pfinal
from . import corregir_nro_tal from . import corregir_nro_tal
from . import generar_nota
from . import cobro_discriminado
# -*- coding: utf-8 -*-
###############################################################################
# License, author and contributors information in: #
# __manifest__.py file at the root folder of this module. #
###############################################################################
from odoo import models, fields, api, _
from odoo.exceptions import UserError, ValidationError, Warning
import datetime
class hgt_cobro_multiple(models.TransientModel):
_name = 'hgt.cobro_multiple'
_description = 'Cobro multiple avanzado'
_inherit = ['asw.action.manager']
# Informacion pago
pcw_cliente = fields.Many2one(
comodel_name='asw.cliente',
string='Cliente',
readonly=True,
compute='_compute_cliente',
)
caja_efectivo = fields.Many2one(
comodel_name='asw.caja',
string='Caja Efectivo',
)
caja_cheque = fields.Many2one(
comodel_name='asw.caja',
string='Caja Cheques',
)
nota = fields.Text(string='nota',readonly=True)
pcw_referencia = fields.Char(
string=u'Referencia',
)
pcw_efectivo = fields.Monetary(
string='Efectivo',
currency_field='cli_moneda_empresa'
)
pcw_retencion_recibida = fields.Monetary(
string='Retención',
currency_field='cli_moneda_empresa'
)
pcw_cli_razon_social = fields.Char(
string='Razon Social',
related='pcw_cliente.cli_razon_social'
)
# Currency field
cli_moneda_empresa = fields.Many2one(
string=u'Moneda del saldo',
comodel_name='res.currency',
ondelete='set null',
related='pcw_cliente.create_uid.company_id.currency_id',
)
# Formas de pago
pcw_che_recibidos = fields.Many2many(
comodel_name='asw.cheque',
relation='pago_cliente_chq_recibido',
column1='asw_cheque_id',
column2='asw_cliente_id',
string='Cheques Recibidos'
)
pcw_chq_emitidos = fields.Many2many(
comodel_name='asw.cheque',
relation='pago_cliente_chq_emitido',
column1='asw_cheque_id',
column2='asw_cliente_id',
string='Cheques Emitidos'
)
pcw_chq_resiv2 = fields.Many2many(
comodel_name='asw.cheque',
relation='pago_cliente_chq_emitido_nuevo123',
column1='asw_cheque_id',
column2='asw_cliente_id',
string='Cheques Emitidos'
)
pcw_transferencias_recibidas = fields.Many2many(
comodel_name='asw.valores',
relation='pago_cliente_transferencia_recibida',
column1='pago_cliente_id',
column2='asw_valores_id',
string='Transferencias Recibidas'
)
pcw_transferencias_emitidas = fields.Many2many(
comodel_name='asw.valores',
relation='pago_cliente_transferencia_emitida',
column1='pago_cliente_id',
column2='asw_valores_id',
string='Transferencias Emitidas'
)
#pcw_tarjetas = fields.Many2many(
# comodel_name='asw.valores',
# relation='pago_cliente_tarjeta',
# column1='pago_cliente_id',
# column2='asw_valores_id',
# string='Tarjetas'
#)
pcw_tarjetas = fields.Many2many(
comodel_name='asw.valores',
relation='hgt_pago_cliente_tarjeta',
column1='pago_cliente_id',
column2='asw_valores_id',
string='Tarjetas'
)
pcw_retenciones = fields.Many2many(
comodel_name='asw.valores',
relation='pago_cliente_retencion',
column1='pago_cliente_id',
column2='asw_valores_id',
string='Retenciones'
)
# Total de pago
pcw_total = fields.Monetary(
string='Total Recibido',
compute='_calcular_total',
currency_field='cli_moneda_empresa'
)
pcw_recibo = fields.Many2one(
string='Recibo',
comodel_name='asw.comprobante'
)
###########################################Validaciones y calculos ######################################
@api.depends('pcw_total')
def _compute_cliente(self):
if not len(self.pcw_cliente) == 0:
return(None)
context = self.env.context
active_ids = context.get('active_ids')
facturas = self.env['asw.comprobante'].search([('id', 'in', active_ids)])
idc = []
Texto = "Facturas que se abonaran:"
Total = 0
for factura in facturas:
if not factura.comp_cliente.id in idc:
idc.append(factura.comp_cliente.id)
if not factura.comp_adeudado > 0:
raise UserError(f"Factura {factura.display_name} ya esta pagada o valor nulo")
if factura.comp_estado in ["b","c"]:
raise UserError(f"Factura {factura.display_name} en estado invalido para cobrar")
#if (factura.comp_talonario.tal_tipo == "e"):
# raise UserError(f"El comprobante {factura.display_name} no es de venta")
Total = Total + factura.comp_adeudado
Texto = f"{Texto}\n{factura.display_name} {factura.comp_adeudado}"
if not len(idc) == 1:
raise UserError("Solo se puede cobrar a un cliente a la vez, cierre la ventana y seleccione de vuelta los comprobantes a operar")
Texto = f"{Texto}\nTotal {Total}".replace(".",",")
self.pcw_cliente = idc[0]
self.nota = Texto
@api.depends('pcw_efectivo', 'pcw_che_recibidos', 'pcw_transferencias_recibidas', 'pcw_tarjetas', 'pcw_chq_resiv2', 'pcw_transferencias_emitidas', 'pcw_retencion_recibida','pcw_retenciones')
def _calcular_total(self):
total = 0
for record in self.pcw_chq_resiv2:
total = total + record.che_monto
for record in self.pcw_transferencias_recibidas:
total = total + record.val_monto
for record in self.pcw_chq_emitidos:
total = total + record.che_monto
for record in self.pcw_transferencias_emitidas:
total = total + record.val_monto
for record in self.pcw_tarjetas:
total = total + record.val_monto
for record in self.pcw_retenciones:
total = total + record.val_monto
self.pcw_total = total + self.pcw_efectivo + self.pcw_retencion_recibida
################################# LOGICA DE PAGO #################
@api.multi
def pago_facturas_masivo(self):
context = self.env.context
active_ids = context.get('active_ids')
facturas = self.env['asw.comprobante'].search([('id', 'in', active_ids)],order="id asc")
if len(facturas) == 0:#no hay facturas seleccionadas
raise Warning("No se seleccionaron facturas")
resivo = self.CrearValidarResivoMultiple()
if self.pcw_total != resivo.comp_total:
raise Warning("Error al procesar el pago informar a soporte")
total = self.pcw_total
for factura in facturas:
if factura.comp_estado in ["c","b"]:
raise Warning(f"Factura {factura.display_name} esta cancelada o sin validar no se puede Cobrar")
if not factura.comp_adeudado > 0:
raise Warning(f"Factura {factura.display_name} en cero revisar")
if(not factura.comp_talonario.tal_genera_cta_cte):
raise Warning(f"Factura {factura.display_name} no mueve cuenta corriente no puedo manejarla")
total = self.LogicaFacturas(factura,resivo,total)
#obserbacion = f"""{obserbacion}\n{factura.display_name}"""
resivo.aumentar_numeracion_talonario()
resivo.comp_fecha_validacion = fields.Datetime.now()
resivo.generar_monto_adeudado()
resivo.validar_nro_comprobante()
self.ArmarObservaciones(facturas,resivo)
resivo.generar_monto_adeudado()#a prueba
return(resivo)
def ArmarObservaciones(self,facturas,resivo):
obserbacion = "\nFacturas Afectadas | Total | Saldo"
for factura in facturas:
obserbacion = f"""{obserbacion}\n{factura.display_name} | {factura.comp_total} | {factura.comp_adeudado}""".replace(".",",")
resivo.comp_observaciones = obserbacion
@api.multi
def generar_recibo(self):
resivo = self.pago_facturas_masivo()
self.ValoresEnCajas(resivo)
return {
'view_type': 'form',
'view_mode': 'form',
'res_model': 'asw.comprobante',
'type': 'ir.actions.act_window',
'target': 'self',
'res_id': resivo.id,
}
def LogicaFacturas(self,factura,resivo,total):
#print(f"factura {factura.display_name},adeudado {factura.comp_adeudado}, total {total}")
tmp = total
total = total - factura.comp_adeudado
if tmp >= 0.0:
self.MovimientoCuentaCorriente(factura,resivo,tmp)
#if total < 0.0:
# total = 0.0
return(total)
#Nombre heredado no me gusto pero bue....
def MovimientoCuentaCorriente(self,factura,resivo,total):
#Total = total
#diff = total - factura.comp_adeudado
movimiento = factura.comp_adeudado
if factura.comp_adeudado >= total: #diff < 0.0:
movimiento = total
#print( movimiento, factura.display_name)
if movimiento < 0.0:
raise Warning("debug")
cta_cte = self.env['asw.cta_cte'].create({
'cc_cliente' : resivo.comp_cliente.id,
'cc_comprobante' : resivo.id,
'cc_moneda' : resivo.comp_moneda.id,
'cc_monto' : movimiento
})
cta_cte.afectar(factura.id)
resivo.generar_monto_adeudado()
print()
def CrearValidarResivoMultiple(self,tipo="e"):
talonario = self.env['asw.talonario'].search([('tal_menu','=','rec'),('tal_tipo','=',tipo),('tal_mov_caja', '!=', 'sn')], limit=1)
self.pcw_recibo = self.env['asw.comprobante'].generar_comprobante(
talonario,
self.pcw_cliente,
self.pcw_total,
self.pcw_referencia
)
self.agregar_efectivo()
self.agregar_retencion()
self.agregar_cheques_recibidos()
self.agregar_transferencias_recibidas()
self.agregar_tarjetas()
self.pcw_recibo._onchange_comp_linea_facturas()
self.pcw_recibo.realizar_validaciones()
self.pcw_recibo._onchange_talonario()
return(self.pcw_recibo)
#################################################LOGICA CREACION RESIVO##################################################
def agregar_efectivo(self):
if self.pcw_efectivo != 0:
efectivo = self.env['asw.tipos_valores'].search([('tv_tipo', '=', 'ef')])
self.pcw_recibo.agregar_valor(self.pcw_efectivo, efectivo, self.env.user.turno.caja.id)
def agregar_retencion(self):
if(len(self.pcw_retenciones) != 0):
retencion = self.env['asw.tipos_valores'].search([('tv_tipo','=','rr')])
else:
return(None)#Si no hay alguna retencion
for linea in self.pcw_retenciones:
self.pcw_recibo.agregar_valor(linea.val_monto, retencion, self.env.user.turno.caja.id)
def agregar_cheques_recibidos(self):
if(len(self.pcw_chq_resiv2) > 0):
print("cszdfcvaszdcv")
cheque_recibido = self.env['asw.tipos_valores'].search([('tv_tipo', '=', 'chr')])
for cheque in self.pcw_chq_resiv2:
print(cheque, cheque_recibido, self.env.user.turno.caja.id)
self.pcw_recibo.agregar_cheque(cheque, cheque_recibido, self.env.user.turno.caja.id)
def agregar_transferencias_recibidas(self):
transferencia_recibida = self.env['asw.tipos_valores'].search([('tv_tipo','=','trr')])
self.pcw_transferencias_recibidas.write({'val_comprobante' : self.pcw_recibo.id, 'val_tipo' : transferencia_recibida.id})
def agregar_tarjetas(self):
tarjeta_credito = self.env['asw.tipos_valores'].search([('tv_tipo','=','ta'),('tv_descripcion','ilike','credito')])
tarjeta_debito = self.env['asw.tipos_valores'].search([('tv_tipo','=','ta'),('tv_descripcion','ilike','débito')])
for record in self.pcw_tarjetas:
if(record.val_tipo.tv_descripcion == 'Tarjeta de Credito'):
record.write({'val_comprobante' : self.pcw_recibo.id, 'val_tipo' : tarjeta_credito.id})
if(record.val_tipo.tv_descripcion == 'Tarjeta de Débito'):
record.write({'val_comprobante' : self.pcw_recibo.id, 'val_tipo' : tarjeta_debito.id})
########################################LOGICA GESTION DE VALORES Y CAJAS ######################################################
def ValoresEnCajas(self,resivo):
#Clasifico el tipo de valor
efectivo = []
cheques = []
transferencias = []
tarjetas = []
for valor in resivo.comp_valores:
if valor.val_tipo.tv_tipo == "ef":
efectivo.append(valor)
if valor.val_tipo.tv_tipo == "chr":
cheques.append(valor)
if valor.val_tipo.tv_tipo == "trr":
transferencias.append(valor)
if valor.val_tipo.tv_tipo == "ta":
tarjetas.append(valor)
#Asocio segun el tipo de valor
self.MoverValores(efectivo, self.caja_efectivo.id)
self.MoverValores(cheques, self.caja_cheque.id)
self.MoverValores(transferencias)
self.MoverValores(tarjetas)
def MoverValores(self, valores, caja_destino_id=True):
"""mueve los valores de los recivos segun se configure"""
for valor in valores:
if caja_destino_id == True:
caja_destino_id = valor.valor_caja_id.id
if caja_destino_id == False:
raise Warning("No esta definida una de las cajas, todos los valores deven tener cajas asignadas")
valor.valor_caja_id.caja_valor_ids = [(3,valor.id,)]#elimino el valor de la caja actual
valor.valor_caja_id = caja_destino_id #cambio la caja en el valor
valor.valor_caja_id.caja_valor_ids = [(4,valor.id,)]#agrego el valor a la caja destino
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import UserError
from datetime import datetime
class tpv_generar_nota(models.TransientModel):
_name = 'tpv.generar_nota'
_description = 'Generar Nota'
_inherit = ['asw.generador_comprobante', 'asw.action.manager']
gn_comprobante = fields.Many2one(
string=u'Comprobante Original',
comodel_name='asw.comprobante',
)
def generar_notaCred(self):
comprobante = self.gn_comprobante
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','in',['NCAE','NCBE'])])#es variable mover a preferecias
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,
comprobante_caja_ids = comprobante.comprobante_caja_ids.id
)
contra_comprobante.write({
'referencia_orig_ptv': comprobante.comp_talonario.tal_pto_vta,
'referencia_orig_numero': comprobante.comp_nro,
'referencia_orig_letra': comprobante.comp_talonario.tal_letra,
'referencia_orig_fact': comprobante.id,
})
contra_comprobante.comp_fecha = datetime.today()
#linea de NCred
inter_prod = self.env['asw.producto'].search([('prod_descripcion','=','INTERES')])
linea_comp = self.env['asw.linea_comprobante'].create({
'lcp_producto': inter_prod.id,
'lcp_comprobante': contra_comprobante.id,
'lcp_precio': comprobante.comp_total,
'lcp_importe': comprobante.comp_total,
})
#contra_comprobante.validar()
#se agrega al recibo original
#comprobante.write({
# 'comp_nota_credito' : contra_comprobante.id
#})
return {
'name': "Nota de Crédito",
'type': 'ir.actions.act_window',
'res_model': 'asw.comprobante',
'view_mode': 'form',
'view_type': 'form',
'res_id': contra_comprobante.id,
'target': 'new',
}
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ú')
def generar_notaDeb(self):
comprobante = self.gn_comprobante
referencia = 'Nota de débito 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','in',['NDAN','NDBN','NDAE', 'NDBE'])])
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.write({
'referencia_orig_ptv': comprobante.comp_talonario.tal_pto_vta,
'referencia_orig_numero': comprobante.comp_nro,
'referencia_orig_letra': comprobante.comp_talonario.tal_letra,
'referencia_orig_fact': comprobante.id,
})
contra_comprobante.comp_fecha = datetime.today()
#linea de NDEB
inter_prod = self.env['asw.producto'].search([('prod_descripcion','=','INTERES')])
linea_comp = self.env['asw.linea_comprobante'].create({
'lcp_producto': inter_prod.id,
'lcp_comprobante': contra_comprobante.id,
'lcp_precio': comprobante.comp_total,
'lcp_importe': comprobante.comp_total,
})
#contra_comprobante.validar()
return {
'name': "Nota de Débito",
'type': 'ir.actions.act_window',
'res_model': 'asw.comprobante',
'view_mode': 'form',
'view_type': 'form',
'res_id': contra_comprobante.id,
'target': 'new',
}
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ú')
<odoo>
<data>
<record id="asw_pago_cliente_wizzard_form" model="ir.ui.view">
<field name="name">Pago cliente Avanzado</field>
<field name="model">hgt.cobro_multiple</field>
<field name="arch" type="xml">
<form>
<h4>Nota 1: Si el monto a cobrar no llega a cubrir totalmente el saldo de las facturas elegidas, saldará completamente de la más vieja a la más nueva quedando la última con un saldo parcial.</h4>
<h4>Nota 2: Si el cobro excede a las facturas elegidas, el excedente se destinará automáticamente a saldar (total o parcialmente) a la factura con saldos pendientes más antigua en existencia.</h4>
<h4>Nota 3: Si el cobro excede a las facturas elegidas y no existen facturas con saldos pendientes, por fuera de las elegidas, el excedente quedará a favor del cliente en la cuenta corriente y podrá ser imputado a la primer factura nueva de forma automática.</h4>
<field name="pcw_cli_razon_social" invisible='1'/>
<group col="2">
<group col="2" >
<field name="pcw_cliente" colspan='2' domain="[('cli_es_cliente','=', True )]"/>
<field name="pcw_referencia" />
<field name="pcw_efectivo" colspan='2'/>
<field name="caja_efectivo"/>
</group>
<group string="Detalles" >
<field name="nota" nolabel="1"/>
</group>
</group>
<group col="4">
<!-- <field name="pcw_retencion_recibida" colspan="2"/>-->
<notebook colspan="4">
<page string="Cheques Recibidos">
<group col="4">
<field name="caja_cheque" colspan='4'/>
<field name="pcw_chq_resiv2" colspan='4' nolabel='1' widget='one2many' context="{'default_val_razon_social' : pcw_cli_razon_social}">
<tree create="1" delete="1" edit="1" editable="bottom">
<field name="che_banco"/>
<field name="che_nro_cheque"/>
<field name="che_fecha_emision" required='1'/>
<field name="che_fecha_cobro" required='1'/>
<field name="che_fecha_vencimiento" required='1'/>
<field name="che_razon_social_emisor"/>
<field name="che_cuit_emisor"/>
<field name="che_monto"/>
</tree>
</field>
</group>
</page>
<page string="Transferencias Recibidas">
<group col="4">
<field name="pcw_transferencias_recibidas" colspan='4' nolabel='1' widget='one2many' >
<tree create="1" delete="1" edit="1" editable="bottom">
<field name="val_cuenta_bancaria"/>
<field name="val_fecha_emision"/>
<field name="valor_caja_id"/>
<field name="val_nro_pago"/>
<field name="val_monto" required='1'/>
</tree>
</field>
</group>
</page>
<page string="Tarjetas">
<group col="4">
<field name="pcw_tarjetas" colspan='4' nolabel='1' widget='one2many' >
<tree create="1" delete="1" edit="1" editable="bottom">
<field name="val_tipo" domain="[('tv_tipo','=', 'ta' )]" string='Tarjeta' options="{'no_create': True, 'no_create_edit':True}"/>
<field name="val_nro_pago"/>
<field name="valor_caja_id"/>
<field name="val_monto" required='1'/>
</tree>
</field>
</group>
</page>
<page string="Retenciones">
<group col="4">
<field name="pcw_retenciones" colspan='4' nolabel='1' widget='one2many' >
<tree create="1" delete="1" edit="1" editable="bottom">
<field name="val_tipo" domain="[('tv_tipo','=', 'rr' )]" string='Retencion' options="{'no_create': True, 'no_create_edit':True}"/>
<field name="val_nro_pago"/>
<field name="val_monto" required='1'/>
</tree>
</field>
</group>
</page>
</notebook>
<br/>
</group>
<group id='total' col='6'>
<field name="pcw_total" colspan='2'/>
</group>
<footer>
<button name="generar_recibo" string="Generar Recibo" type="object" class="oe_highlight btn-generar-recibo"/>
<button special="cancel" string="Cancel"/>
</footer>
</form>
</field>
</record>
<act_window id="hgt_cobro_masivo_avanzado_wizzard_action" name="Cobro masivo Avanzado" src_model="asw.comprobante" res_model="hgt.cobro_multiple" view_mode="form" target="new" multi="True"/>
</data>
</odoo>
\ No newline at end of file \ No newline at end of file
<?xml version='1.0' encoding='utf-8'?>
<odoo>
<data noupdate="0">
<record id="tpv_generar_nota_wizzard_view_form" model="ir.ui.view">
<field name="name">Generar Nota</field>
<field name="model">tpv.generar_nota</field>
<field name="arch" type="xml">
<form>
<group col='4'>
<h3> Elija qué desea generar
</h3>
</group>
<div style='text-align:center'>
<button type="object" style="margin:5px;" name="generar_notaDeb" string="Nota de Débito" class='btn btn-primary'/>
<button type="object" style="margin:5px;" name="generar_notaCred" string="Nota de Crédito" class='btn btn-primary'/>
</div>
<footer>
<button special='cancel' string="Cancelar"/>
</footer>
</form>
</field>
</record>
<!-- tpv.generar_nota action window -->
<record id="tpv_generar_nota_wizzard_action" model="ir.actions.act_window">
<field name="name">Generar Nota</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">tpv.generar_nota</field>
<field name="src_model">tpv.generar_nota</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="multi">True</field>
</record>
</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!