Commit c3c5d655 by Juan

Merge branch 'juan2022' into 'master'

Juan2022

See merge request !2
2 parents 8af13e73 a8461f78
......@@ -15,6 +15,7 @@
Se Agrega generacion manual para notas de credito y notas
de debito
Se agrega soporte a gastos mobil
Se agrega cobro Avanzado
""",
'author': 'HGT',
......@@ -39,14 +40,16 @@
'security/permisos.xml',
'wizard/vista_prod_pfinal.xml',
'wizard/vista_corregir_nro_tal.xml',
'wizard/vista_generar_nota.xml',
'views/referencias.xml',
'views/gastosmobil.xml',
'views/comprobante.xml',
'views/referencia_compra.xml',
'views/menu_compras.xml',
'wizard/vista_cobro_discriminado.xml',
],
# only loaded in demonstration mode
'demo': [
'demo/demo.xml',
],
}
\ No newline at end of file
}
......@@ -3,4 +3,5 @@
from . import comprobante
from . import referencias
from . import referencia_compra
from . import gastosmobil
\ No newline at end of file
from . import gastosmobil
from . import currency
\ No newline at end of file
......@@ -2,7 +2,7 @@
from odoo import models, fields, api, exceptions
from .qr import qrfiscal
from odoo.exceptions import UserError, ValidationError, Warning, RedirectWarning
import base64
import base64, datetime
class asw_comprobante(models.Model):
_inherit = 'asw.comprobante'
......@@ -137,4 +137,31 @@ class asw_comprobante(models.Model):
'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
# -*- 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
......@@ -6,9 +6,14 @@
</record>
<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')"/>
</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>
</odoo>
\ No newline at end of file
......@@ -9,6 +9,7 @@
<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="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 expr="//group[1]" position="after">
<group string="Referencias" col="2">
......@@ -32,6 +33,8 @@
<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="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>
</data>
</field>
......@@ -44,7 +47,7 @@
<field name="arch" type="xml">
<data>
<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_ptv" />
<field name="referencia_orig_numero" />
......@@ -74,4 +77,4 @@
</record>
</data>
</odoo>
\ 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
......@@ -2,6 +2,6 @@
<data>
<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="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>
</odoo>
\ No newline at end of file
</odoo>
from . import prod_pfinal
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
<?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
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!