14.0 [ADD] add branch 14.0

This commit is contained in:
Juan Pablo Arcos Merchan 2021-11-20 09:10:39 -05:00
parent 4cd0beea5c
commit e5e10cbe65
11 changed files with 2662 additions and 0 deletions

4
tabla_nomina/__init__.py Normal file
View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from . import controllers
from . import models

36
tabla_nomina/__manifest__.py Executable file
View File

@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
{
'name': "tabla_nomina",
'summary': """
Short (1 phrase/line) summary of the module's purpose, used as
subtitle on modules listing or apps.openerp.com""",
'description': """
Long description of module's purpose
""",
'author': "My Company",
'website': "http://www.yourcompany.com",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/14.0/odoo/addons/base/data/ir_module_category_data.xml
# for the full list
'category': 'Uncategorized',
'version': '0.1',
# any module necessary for this one to work correctly
'depends': ['base','om_hr_payroll'],
# always loaded
'data': [
'security/ir.model.access.csv',
'data/data.xml',
'views/views.xml',
'views/templates.xml',
],
# only loaded in demonstration mode
'demo': [
'demo/demo.xml',
],
}

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import controllers

View File

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# from odoo import http
# class TablaNomina(http.Controller):
# @http.route('/tabla_nomina/tabla_nomina/', auth='public')
# def index(self, **kw):
# return "Hello, world"
# @http.route('/tabla_nomina/tabla_nomina/objects/', auth='public')
# def list(self, **kw):
# return http.request.render('tabla_nomina.listing', {
# 'root': '/tabla_nomina/tabla_nomina',
# 'objects': http.request.env['tabla_nomina.tabla_nomina'].search([]),
# })
# @http.route('/tabla_nomina/tabla_nomina/objects/<model("tabla_nomina.tabla_nomina"):obj>/', auth='public')
# def object(self, obj, **kw):
# return http.request.render('tabla_nomina.object', {
# 'object': obj
# })

1711
tabla_nomina/data/data.xml Executable file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,30 @@
<odoo>
<data>
<!--
<record id="object0" model="tabla_nomina.tabla_nomina">
<field name="name">Object 0</field>
<field name="value">0</field>
</record>
<record id="object1" model="tabla_nomina.tabla_nomina">
<field name="name">Object 1</field>
<field name="value">10</field>
</record>
<record id="object2" model="tabla_nomina.tabla_nomina">
<field name="name">Object 2</field>
<field name="value">20</field>
</record>
<record id="object3" model="tabla_nomina.tabla_nomina">
<field name="name">Object 3</field>
<field name="value">30</field>
</record>
<record id="object4" model="tabla_nomina.tabla_nomina">
<field name="name">Object 4</field>
<field name="value">40</field>
</record>
-->
</data>
</odoo>

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models

536
tabla_nomina/models/models.py Executable file
View File

@ -0,0 +1,536 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, modules, api,_
import os
import requests
import json
from odoo.exceptions import AccessError, UserError, RedirectWarning, ValidationError, Warning
from datetime import datetime, timedelta
from datetime import time as datetime_time
class tabla_nomina(models.Model):
_name = 'tabla_nomina.tabla_nomina'
_description = 'tabla_nomina.tabla_nomina'
# _inherit = 'mail.message'
name = fields.Char('Nombre')
fecha_pago = fields.Date("Fecha de Pago")
xml = fields.Text("XML")
transaccionID = fields.Char("transaccionID")
impreso = fields.Boolean("Impreso")
prefijo = fields.Char("Prefijo")
consecutivo = fields.Char("consecutivo")
paisgeneracion = fields.Char("Pais de generacion")
departamentoestado = fields.Char("Departamento")
municipiociudad = fields.Char("Ciudad")
Idioma = fields.Char("Idioma",default="es")
version = fields.Char("Version",default="")
ambiente = fields.Selection([
('1', 'Produccion'),
('2', 'Pruebas'),
], string='Ambiente',default="1")
tipoXML = fields.Char("Tipo XML",default="102")
Algoritmo = fields.Char("Algoritmo",default="CUNE-384")
PeriodoNomina = fields.Selection([
('1', 'Semanal'),
('2', 'Decenal'),
('3', 'Catorcenal'),
('4', 'Quincenal'),
('5', 'Mensual'),
], string='Periodo Nomina')
TipoMoneda = fields.Char('TipoMoneda', default="COP")
##EMPLEADOR
RazonSocial = fields.Char('RazonSocial')
PrimerApellido = fields.Char('PrimerApellido')
SegundoApellido = fields.Char('SegundoApellido')
PrimerNombre = fields.Char('PrimerNombre')
OtrosNombres = fields.Char('OtrosNombres')
NIT = fields.Char('NIT')
DV = fields.Char('DV')
PaisEmpleador = fields.Char('Pais')
MunicipioCiudadEmpleador = fields.Char('MunicipioCiudad')
DepartamentoEstadoEmpleador = fields.Char('DepartamentoEstado')
DireccionEmpleador = fields.Char('Direccion')
tipocontrato = fields.Selection([
('1', 'Termino Fijo'),
('2', 'Termino Indefinido'),
('3', 'Obra o Labor'),
('4', 'Aprendizaje'),
('5', 'Practicas'),
], string='Tipo de contrato')
id_plataforma = fields.Char('id_plataforma')
password = fields.Char('password')
mp_id = fields.One2many('tabla_nomina.line','mp_id', ondelete='cascade')
class line_nomina(models.Model):
_name = 'tabla_nomina.line'
_description = 'tabla_nomina.line'
name = fields.Char('Nombre')
categoria = fields.Char('Categoria')
codigo = fields.Char('Codigo')
dias = fields.Boolean('Son dias?')
horas = fields.Boolean('Son horas?')
porcentaje = fields.Boolean('Es porcentaje?')
subcategoria = fields.Char('Sub Categoria')
obligatorio = fields.Boolean('Obligatorio')
detalle = fields.Char('Detalle')
mensaje = fields.Char('Mensaje')
campo_tecnico = fields.Char('Campo tecnico')
titulo = fields.Char('Titulo')
link = fields.Char('Link')
mp_id = fields.Many2one('tabla_nomina.tabla_nomina', string='Campos',ondelete='restrict', index=True)
class nomina_input_lines(models.Model):
_name = 'hr.salary.rule'
_inherit = 'hr.salary.rule'
porcentaje = fields.Integer("Porcentaje")
class nomina_electronica(models.Model):
_name = 'hr.payslip'
_inherit = 'hr.payslip'
fecha_pago = fields.Date("Fecha de Pago")
xml = fields.Text("XML")
transaccionID = fields.Char("transaccionID")
estado = fields.Selection([
('No_generada', 'No_generada'),
('Generada_correctamente', 'Generada_correctamente'),
('Generada_con_errores', 'Generada_con_errores'),
], string='Estado',default="No_generada")
prefijo = fields.Char("Prefijo")
consecutivo = fields.Char("consecutivo")
paisgeneracion = fields.Char("Pais de generacion")
departamentoestado = fields.Char("Departamento")
municipiociudad = fields.Char("Ciudad")
Idioma = fields.Char("Idioma",default="es")
version = fields.Char("Version",default="")
ambiente = fields.Selection([
('1', 'Produccion'),
('2', 'Pruebas'),
], string='Ambiente',default="1")
tipoXML = fields.Char("Tipo XML",default="102")
Algoritmo = fields.Char("Algoritmo",default="CUNE-384")
PeriodoNomina = fields.Selection([
('1', 'Semanal'),
('2', 'Decenal'),
('3', 'Catorcenal'),
('4', 'Quincenal'),
('5', 'Mensual'),
], string='Periodo Nomina')
TipoMoneda = fields.Char('TipoMoneda', default="COP")
Notas = fields.Char('Notas')
##EMPLEADOR
RazonSocial = fields.Char('RazonSocial')
PrimerApellido = fields.Char('PrimerApellido')
SegundoApellido = fields.Char('SegundoApellido')
PrimerNombre = fields.Char('PrimerNombre')
OtrosNombres = fields.Char('OtrosNombres')
NIT = fields.Char('NIT')
DV = fields.Char('DV')
PaisEmpleador = fields.Char('Pais')
MunicipioCiudadEmpleador = fields.Char('MunicipioCiudad')
DepartamentoEstadoEmpleador = fields.Char('DepartamentoEstado')
DireccionEmpleador = fields.Char('Direccion')
tipocontrato = fields.Selection([
('1', 'Termino Fijo'),
('2', 'Termino Indefinido'),
('3', 'Obra o Labor'),
('4', 'Aprendizaje'),
('5', 'Practicas'),
], string='Tipo de contrato')
FechaGen = fields.Char('Fecha Generacion')
HoraGen = fields.Char('Hora Generacion')
id_plataforma = fields.Char('id_plataforma')
password = fields.Char('password')
# PeriodoNomina = fields.Char('Periodo Nomina')
# TipoMoneda = fields.Char('TipoMoneda', default="COP")
# Notas = fields.Char('Notas')
@api.onchange('employee_id')
def on_change_employee(self):
for record in self:
valores = self.env['tabla_nomina.tabla_nomina'].search([('name', '=', 'Nómina electrónica')])
if valores:
self.prefijo = valores.prefijo
self.consecutivo = valores.consecutivo
self.paisgeneracion = valores.paisgeneracion
self.departamentoestado = valores.departamentoestado
self.municipiociudad = valores.municipiociudad
self.Idioma = valores.Idioma
self.ambiente = valores.ambiente
self.tipoXML = valores.tipoXML
self.PeriodoNomina = valores.PeriodoNomina
##Empleador
self.RazonSocial = valores.RazonSocial
self.PrimerApellido = valores.PrimerApellido
self.SegundoApellido = valores.SegundoApellido
self.PrimerNombre = valores.PrimerNombre
self.OtrosNombres = valores.OtrosNombres
self.NIT = valores.NIT
self.DV = valores.DV
self.PaisEmpleador = valores.PaisEmpleador
self.MunicipioCiudadEmpleador = valores.MunicipioCiudadEmpleador
self.DepartamentoEstadoEmpleador = valores.DepartamentoEstadoEmpleador
self.DireccionEmpleador = valores.DireccionEmpleador
self.id_plataforma = valores.id_plataforma
self.password = valores.password
def action_cfdi_generate(self):
urlini = "https://odoo15.navegasoft.com/admonclientes/status/"
headers = {'content-type': 'application/json'}
send = {"id_plataforma":self.id_plataforma,"transaccionID":self.transaccionID,"prefix":self.prefijo,"number":self.consecutivo}
result = requests.post(urlini,headers=headers,data = json.dumps(send))
#resultado = json.loads(result.text)
#print(result.text)
if result.status_code == 200:
resultado = json.loads(result.text)
if "documentBase64" in resultado:
final = resultado["documentBase64"]
return self.env['wk.wizard.message'].genrated_message('Documento impreso', 'listos')
else:
if "error" in resultado:
final = resultado["error"]
final_error = json.loads(json.dumps(final))
data = final_error["data"]
data_final = data['message']
final_data = json.loads(json.dumps(data_final))
archivo = final_data['code']
return self.env['wk.wizard.message'].genrated_message(data_final,"Los datos no estan correctos" ,"https://navegasoft.com")
else:
final = json.loads(json.dumps(resultado))
final2 = final['result']
final_data = json.loads(json.dumps(eval(final2)))
#archivo = final_data['code']
module_path = modules.get_module_path('tabla_nomina')
model = "facturas"
if '\\' in module_path:
src_path = '\\static\\'
src_model_path = "{0}{1}\\".format('\\static', model)
else:
src_path = '/static/'
src_model_path = "{0}{1}/".format('/static/', model)
# if "model" folder does not exists create it
os.chdir("{0}{1}".format(module_path, src_path))
if not os.path.exists(model):
os.makedirs(model)
extension = ".pdf"
#file_path = "{0}{1}".format(module_path + src_model_path + str(name), extension)
file_path = "{0}{1}".format(module_path + src_model_path + str(self.number), extension)
if not (os.path.exists(file_path)):
size =1
if size == 0:
os.remove(file_path)
raise UserError(_('imprimible se esta preparando intenta de nuevo, Factura preparandose.'))
else:
import base64
image_64_encode = base64.b64decode(final_data['documentBase64'])
i64 = base64.b64encode(image_64_encode)
att_id = self.env['ir.attachment'].create({
'name': self.number+extension,
'type': 'binary',
'datas': i64,
'datas_fname': self.number+extension,
'res_model': 'hr.payslip',
'res_id': self.id,
})
if att_id:
self.write({"impreso":True})
return self.env['wk.wizard.message'].genrated_message("Ve a attachment","Factura impresa" ,"https://navegasoft.com")
else:
raise UserError(_('Ve a attachment, Factura ya impresa.'))
final = resultado["error"]
final_error = json.loads(json.dumps(final))
data = final_error["data"]
data_final = data['message']
else:
raise Warning(result)
def envio_directo(self):
import time
now2 = datetime.now()
current_time = now2.strftime("%H:%M:%S")
numeracion = self.env['ir.sequence'].sudo().search([('code', '=', 'salary.slip')])
lon_prefix = len(numeracion.prefix)
long_total = len(self.number)
number = self.number[lon_prefix:long_total]
self.prefijo = numeracion.prefix
self.consecutivo = number
self.FechaGen = str(now2.date())
self.HoraGen = str(current_time)
urlini = "https://odoo15.navegasoft.com/admonclientes/objects/"
valores = self.env['tabla_nomina.tabla_nomina'].search([('name', '=', 'Nómina electrónica')])
response2={}
valores_lineas = valores.mp_id
send = {}
for linea in valores_lineas:
if linea.codigo:
if linea.dias == True:
for lineacomprobante in self.worked_days_line_ids:
if linea.codigo == lineacomprobante.code:
if lineacomprobante.number_of_days > 0.0:
send[linea.name] = lineacomprobante.number_of_days
elif linea.horas == True:
for lineacomprobante in self.worked_days_line_ids:
if linea.codigo == lineacomprobante.code:
if lineacomprobante.number_of_hours > 0.0:
send[linea.name] = lineacomprobante.number_of_hours
elif linea.porcentaje == True:
reglas = self.env['hr.salary.rule'].search([('code','=',linea.codigo)])
for regla in reglas:
if regla.porcentaje:
send[linea.name] = regla.porcentaje
else:
for lineacomprobante in self.line_ids:
if linea.codigo == lineacomprobante.code:
if lineacomprobante.amount != 0.00:
send[linea.name] = lineacomprobante.amount
elif linea.campo_tecnico:
#buscar en el comprobante el codigo
try:
if eval(linea.campo_tecnico):
send[linea.name] = eval(linea.campo_tecnico)
except SyntaxError:
return self.env['wk.wizard.message'].genrated_message("El campo tecnico no existe"+linea.campo_tecnico,"Error en el campo"+linea.name,"https://navegasoft.com")
#pass
# if linea.name == "DepartamentoEstado":
# print(linea.name)
# print(linea.campo_tecnico)
# print(eval(linea.campo_tecnico))
# else:
# send[linea.name] = None
headers = {'content-type': 'application/json'}
result = requests.post(urlini,headers=headers,data = json.dumps(send))
if result.status_code == 200:
resultado = json.loads(result.text)
if "result" in resultado:
final = resultado["result"]
if "error" in final:
final_error = json.loads(final)
final_text = final_error['error']
return self.env['wk.wizard.message'].genrated_message("2 "+final_text['mensaje'], final_text['titulo'],final_text['link'])
else:
return self.env['wk.wizard.message'].genrated_message('3 No hemos recibido una respuesta satisfactoria vuelve a enviarlo', 'Reenviar')
else:
if "error" in resultado:
final = resultado["error"]
final_error = json.loads(json.dumps(final))
data = final_error["data"]
data_final = data['message']
self.write({"impreso":False,"transactionID":self.transaccionID,"estado":"Generada_correctamente"})
return self.env['wk.wizard.message'].genrated_message("1 "+data_final,"Los datos no estan correctos" ,"https://navegasoft.com")
else:
raise Warning(result)
return self.env['wk.wizard.message'].genrated_message('Existen problemas de coneccion debes reportarlo con navegasoft', 'Servidor')
class nomina_hr_contract(models.Model):
_name = 'hr.contract'
_inherit = 'hr.contract'
tipo_contrato = fields.Selection([
('1', 'Término Fijo'),
('2', 'Término Indefinido'),
('3', 'Obra o Labor'),
('4', 'Aprendizaje'),
('5', 'Practicas'),
], string='Tipo Contrato')
tipo_trabajador = fields.Selection([
('1', 'Dependiente'),
('2', 'Servicio domestico'),
('3', 'Independiente'),
('4', 'Madre comunitaria'),
('12', 'Aprendices del Sena en etapa lectiva'),
('16', 'Independiente agremiado o asociado'),
('18', 'Funcionarios públicos sin tope máximo de ibc'),
('19', 'Aprendices del SENA en etapa productiva'),
('20', 'Estudiantes (régimen especial ley 789 de 2002)'),
('21', 'Estudiantes de postgrado en salud'),
('22', 'Profesor de establecimiento particular'),
('23', 'Estudiantes aportes solo riesgos laborales'),
('30', 'Dependiente entidades o universidades públicas con régimen especial en salud'),
('31', 'Cooperados o pre cooperativas de trabajo asociado'),
('32', 'Cotizante miembro de la carrera diplomática o consular de un país extranjero o funcionario de organismo multilateral'),
('33', 'Beneficiario del fondo de solidaridad pensional'),
('34', 'Concejal municipal o distrital o edil de junta administrativa local que percibe honorarios amparado por póliza de salud'),
('35', 'Concejal municipal o distrital que percibe honorarios no amparado con póliza de salud'),
('36', 'Concejal municipal o distrital que percibe honorarios no amparado con póliza de salud beneficiario del fondo de solidaridad pensional'),
('40', 'Beneficiario upc adicional'),
('41', 'Beneficiario sin ingresos con pago por tercero'),
('42', 'Cotizante pago solo salud articulo 2 ley 1250 de 2008 (independientes de bajos ingresos)'),
('43', 'Cotizante voluntario a pensiones con pago por tercero'),
('44', 'Cotizante dependiente de empleo de emergencia con duración mayor o igual a un mes'),
('45', 'Cotizante dependiente de empleo de emergencia con duración menor a un mes'),
('47', 'Trabajador dependiente de entidad beneficiaria del sistema general de participaciones - aportes patronales'),
('51', 'Trabajador de tiempo parcial'),
('52', 'Beneficiario del mecanismo de protección al cesante'),
('53', 'Afiliado participe'),
('54', 'Pre pensionado de entidad en liquidación.'),
('55', 'Afiliado participe - dependiente'),
('56', 'Pre pensionado con aporte voluntario a salud'),
('57', 'Independiente voluntario al sistema de riesgos laborales'),
('58', 'Estudiantes de prácticas laborales en el sector público'),
('59', 'Independiente con contrato de prestación de servicios superior a 1 mes'),
('61', 'Beneficiario programa de reincorporación'),
], string='Tipo Trabajador')
sub_tipo_trabajador = fields.Selection([
('00', 'No Aplica'),
('1', 'Dependiente pensionado por vejez activo'),
('2', 'Independiente pensionado por vejez activo'),
('3', 'Cotizante no obligado a cotizar a pensión por edad'),
('4', 'Cotizante con requisitos cumplidos para pensión'),
('12', 'Cotizante a quien se le ha reconocido indemnización sustitutiva o devolución de saldos'),
('16', 'Cotizante perteneciente a un régimen de exceptuado de pensiones a entidades autorizadas para recibir aportes exclusivamente de un grupo de sus propios'),
('18', 'Cotizante pensionado con mesada superior a 25 smlmv'),
('19', 'Residente en el exterior afiliado voluntario al sistema general de pensiones y/o afiliado'),
('20', 'Conductores del servicio público de transporte terrestre automotor individual de pasajeros en vehículos taxi decreto 1047 de 2014'),
('21', 'Conductores servicio taxi no aporte pensión dec. 1047'),
], string='Subtipo de Trabajador')
AltoRiegoPension = fields.Selection([
('NO', 'NO'),
('SI', 'SI'),
], string='Alto Riego Pension',default='NO')
SalarioIntegral = fields.Selection([
('NO', 'NO'),
('SI', 'SI'),
], string='Salario Integral',default='NO')
banco = fields.Char("Banco")
tipo_cuenta = fields.Char("Tipo cuenta")
numero_cuenta = fields.Char("Numero de cuenta")
metodo_pago = fields.Selection([
('1', 'Instrumento no definido'),
('2', 'Crédito ACH'),
('3', 'Débito ACH'),
('4', 'Reversión débito de demanda ACH'),
('5', 'Reversión crédito de demanda ACH'),
('6', 'Crédito de demanda ACH'),
('7', 'Débito de demanda ACH'),
('8', 'Mantener'),
('9', 'Clearing Nacional o Regional'),
('10', 'Efectivo'),
('11', 'Reversión Crédito Ahorro'),
('12', 'Reversión Débito Ahorro'),
('13', 'Crédito Ahorro'),
('14', 'Débito Ahorro'),
('15', 'Bookentry Crédito'),
('16', 'Bookentry Débito'),
('17', 'Concentración de la demanda en efectivo Desembolso Crédito (CCD)'),
('18', 'Concentración de la demanda en efectivo Desembolso (CCD) débito'),
('19', 'Crédito Pago negocio corporativo (CTP)'),
('20', 'Cheque'),
('21', 'Proyecto bancario'),
('22', 'Proyecto bancario certificado'),
('23', 'Cheque bancario'),
('24', 'Nota cambiaria esperando aceptación'),
('25', 'Cheque certificado'),
('26', 'Cheque Local'),
('27', 'Débito Pago Negocio Corporativo (CTP)'),
('28', 'Crédito Negocio Intercambio Corporativo (CTX)'),
('29', 'Débito Negocio Intercambio Corporativo (CTX)'),
('30', 'Transferencia Crédito'),
('31', 'Transferencia Débito'),
('32', 'Concentración Efectivo / Desembolso Crédito plus (CCD+)'),
('33', 'Concentración Efectivo / Desembolso Débito plus (CCD+)'),
('34', 'Pago y depósito pre acordado (PPD)'),
('35', 'Concentración efectivo ahorros / Desembolso Crédito (CCD)'),
('36', 'Concentración efectivo ahorros / Desembolso Crédito (CCD)'),
('37', 'Pago Negocio Corporativo Ahorros Crédito (CTP)'),
('38', 'Pago Negocio Corporativo Ahorros Débito (CTP)'),
('39', 'Crédito Negocio Intercambio Corporativo (CTX)'),
('40', 'Débito Negocio Intercambio Corporativo (CTX)'),
('41', 'Concentración efectivo/Desembolso Crédito plus (CCD+)'),
('42', 'Consignación bancaria'),
('43', 'Concentración efectivo / Desembolso Débito plus (CCD+)'),
('44', 'Nota cambiaria'),
('45', 'Transferencia Crédito Bancario'),
('46', 'Transferencia Débito Interbancario'),
('47', 'Transferencia Débito Bancaria'),
('48', 'Tarjeta Crédito'),
('49', 'Tarjeta Débito'),
('50', 'Postgiro'),
('51', 'Telex estándar bancario francés'),
('52', 'Pago comercial urgente'),
('53', 'Pago Tesorería Urgente'),
('60', 'Nota promisoria'),
('61', 'Nota promisoria firmada por el acreedor'),
('62', 'Nota promisoria firmada por el acreedor, avalada por el banco'),
('63', 'Nota promisoria firmada por el acreedor, avalada por un tercero'),
('64', 'Nota promisoria firmada por el banco'),
('65', 'Nota promisoria firmada por un banco avalada por otro banco'),
('66', 'Nota promisoria firmada'),
('67', 'Nota promisoria firmada por un tercero avalada por un banco'),
('70', 'Retiro de nota por el por el acreedor'),
('71', 'Bonos'),
('72', 'Vales'),
('74', 'Retiro de nota por el por el acreedor sobre un banco'),
('75', 'Retiro de nota por el acreedor, avalada por otro banco'),
('76', 'Retiro de nota por el acreedor, sobre un banco avalada por un tercero'),
('77', 'Retiro de una nota por el acreedor sobre un tercero'),
('78', 'Retiro de una nota por el acreedor sobre un tercero avalada por un banco'),
('91', 'Nota bancaria transferible'),
('92', 'Cheque local trasferible'),
('93', 'Giro referenciado'),
('94', 'Giro urgente'),
('95', 'Giro formato abierto'),
('96', 'Método de pago solicitado no usado'),
('97', 'Clearing entre partners'),
('ZZZ', 'Acuerdo mutuo'),
], string='Metodo de pago',default='10')
#raise Warning(final["error"])
#print()
# for nombre in numeracion:
# print(nombre)
# print(result.message)
# print(result.messageError)
# clause_final = [('name', '=', 'primer')]
# valores = self.env['tabla_nomina.tabla_nomina'].search(clause_final)
# fields = self.env['tabla_nomina.tabla_nomina'].fields_get()
# #
# totalDays =100
# numero =1
# send = {}
# for k, v in fields.items():
# numero = numero + 1
# if numero < 6:
# print("nuevo valor")
# print(k)
# print(valores[k])
# if valores[k]:
# if not k == "name":
# send[k] = exec(valores[k])
# print(exec(valores[k]))

View File

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_tabla_nomina_tabla_nomina,tabla_nomina.tabla_nomina,model_tabla_nomina_tabla_nomina,base.group_user,1,1,1,1
access_tabla_nomina_tabla_nomina_line,tabla_nomina.line,model_tabla_nomina_line,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_tabla_nomina_tabla_nomina tabla_nomina.tabla_nomina model_tabla_nomina_tabla_nomina base.group_user 1 1 1 1
3 access_tabla_nomina_tabla_nomina_line tabla_nomina.line model_tabla_nomina_line base.group_user 1 1 1 1

View File

@ -0,0 +1,24 @@
<odoo>
<data>
<!--
<template id="listing">
<ul>
<li t-foreach="objects" t-as="object">
<a t-attf-href="#{ root }/objects/#{ object.id }">
<t t-esc="object.display_name"/>
</a>
</li>
</ul>
</template>
<template id="object">
<h1><t t-esc="object.display_name"/></h1>
<dl>
<t t-foreach="object._fields" t-as="field">
<dt><t t-esc="field"/></dt>
<dd><t t-esc="object[field]"/></dd>
</t>
</dl>
</template>
-->
</data>
</odoo>

291
tabla_nomina/views/views.xml Executable file
View File

@ -0,0 +1,291 @@
<odoo>
<data>
<!-- explicit list view definition -->
<record model="ir.ui.view" id="tabla_nomina.form">
<field name="name">Documentos electronicos</field>
<field name="model">tabla_nomina.tabla_nomina</field>
<field name="arch" type="xml">
<form>
<group>
<group string="Datos Por defecto">
<field name="name"/>
<!-- <field name="prefijo"/>
<field name="consecutivo"/> -->
<field name="paisgeneracion"/>
<field name="departamentoestado"/>
<field name="municipiociudad"/>
<field name="Idioma"/>
<field name="version"/>
<field name="ambiente"/>
<field name="tipoXML"/>
<field name="Algoritmo"/>
<field name="TipoMoneda"/>
<field name="PeriodoNomina"/>
</group>
<group string="Empleador">
<field name="RazonSocial"/>
<field name="PrimerApellido"/>
<field name="SegundoApellido"/>
<field name="PrimerNombre"/>
<field name="OtrosNombres"/>
<field name="NIT"/>
<field name="DV"/>
<field name="PaisEmpleador"/>
<field name="MunicipioCiudadEmpleador"/>
<field name="DepartamentoEstadoEmpleador"/>
<field name="DireccionEmpleador"/>
<field name="id_plataforma"/>
<field name="password"/>
</group>
</group>
<group>
<field name="mp_id" string="Campos">
<tree>
<field name="name"/>
<field name="categoria"/>
<field name="subcategoria"/>
<field name="obligatorio"/>
<field name="detalle"/>
</tree>
</field>
</group>
<!-- <button name="add_data" type="object" string="llenar default datos" /> -->
</form>
</field>
</record>
<!--
<record model="ir.ui.view" id="tabla_nomina.form">
<field name="name">Documentos Configuracion</field>
<field name="model">tabla_nomina.tabla_nomina</field>
<field name="arch" type="xml">
<form>
<group>
<field name="name"/>
</group>
<group>
<field name="mp_id" string="Campos">
<tree>
<field name="name"/>
<field name="categoria"/>
<field name="subcategoria"/>
<field name="obligatorio"/>
<field name="detalle"/>
</tree>
</field>
</group>
</form>
</field>
</record> -->
<record model="ir.ui.view" id="tabla_nomina.list">
<field name="name">Listado documentos</field>
<field name="model">tabla_nomina.tabla_nomina</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
</tree>
</field>
</record>
<!-- <record model="ir.ui.view" id="tabla_nomina.list">
<field name="name">Listado documentos configuracion</field>
<field name="model">tabla_nomina.configuracion</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
</tree>
</field>
</record> -->
<!-- actions opening views on models -->
<record model="ir.actions.act_window" id="tabla_nomina.action_window">
<field name="name">Listado Documentos</field>
<field name="res_model">tabla_nomina.tabla_nomina</field>
<field name="view_mode">tree,form</field>
</record>
<!-- <record model="ir.actions.act_window" id="tabla_nomina.configuracion">
<field name="name">Configuracion Documentos</field>
<field name="res_model">tabla_nomina.tabla_nomina</field>
<field name="view_mode">tree,form</field>
</record> -->
<!-- server action to the one above -->
<!-- <record model="ir.actions.server" id="tabla_nomina.action_server">
<field name="name">tabla_nomina server</field>
<field name="model_id" ref="model_tabla_nomina_tabla_nomina"/>
<field name="state">code</field>
<field name="code">
action = {
"type": "ir.actions.act_window",
"view_mode": "tree,form",
"res_model": model._name,
}
</field>
</record> -->
<!-- Top menu item -->
<menuitem name="Documentos electronicos" id="tabla_nomina.menu_root"/>
<!-- menu categories -->
<menuitem name="Listado" id="tabla_nomina.menu_1" parent="tabla_nomina.menu_root"/>
<!-- <menuitem name="Configuracion" id="tabla_nomina.menu_2" parent="tabla_nomina.menu_root"/> -->
<!-- actions -->
<menuitem name="List" id="tabla_nomina.menu_1_list" parent="tabla_nomina.menu_1"
action="tabla_nomina.action_window"/>
<!-- <menuitem name="Server to list" id="tabla_nomina" parent="tabla_nomina.menu_2"
action="tabla_nomina.configuracion"/> -->
<record id="nomina_electronica_button" model="ir.ui.view">
<field name="name">nomina_electronica</field>
<field name="model">hr.payslip</field>
<field name="inherit_id" ref="om_hr_payroll.view_hr_payslip_form"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='action_payslip_cancel']" position="after">
<!-- states="draft,open" -->
<button name="envio_directo" type="object" string="Generar Documento electrónico" groups="account.group_account_invoice" attrs="{'invisible':['|',('estado','in',('generada_correctamente')),('state','in',('draft'))]}"/>
<button name="action_cfdi_generate" type="object" string="Imprimir" groups="account.group_account_invoice" attrs="{'invisible':['|',('estado','in',('No_generada','generada_con_errores')),('state','in',('draft'))]}"/>
</xpath>
<xpath expr="//field[@name='number']" position="after">
<!-- states="draft,open" attrs="{'invisible':['|',('estado_factura','in',('factura_correcta')),('state','in',('draft','open'))]}" -->
<field name="fecha_pago" />
</xpath>
<!-- <xpath expr="//field[@name='input_line_ids']" position="replace">
<field name="input_line_ids" colspan="5" nolabel="1">
<tree string="Input Data" editable="bottom">
<field name="name"/>
<field name="code"/>
<field name="cantidad"/>
<field name="amount"/>
<field name="contract_id"/>
<field name="sequence" invisible="True"/>
</tree>
<form string="Payslip Line">
<group col="5">
<field name="name"/>
<field name="code"/>
<field name="cantidad"/>
<field name="sequence"/>
<field name="amount"/>
<field name="contract_id"/>
</group>
</form>
</field>
</xpath> -->
<xpath expr="//page[4]" position="after">
<page string="Nomina electronica">
<group cols="2">
<group string="Datos Entrada">
<field name="prefijo"/>
<field name="consecutivo"/>
<field name="paisgeneracion"/>
<field name="departamentoestado"/>
<field name="municipiociudad"/>
<field name="Idioma"/>
<field name="ambiente"/>
<field name="tipoXML"/>
<field name="FechaGen"/>
<field name="HoraGen"/>
<field name="PeriodoNomina"/>
<field name="TipoMoneda"/>
<field name="Notas"/>
</group>
<group>
<!-- empleador -->
<field name="RazonSocial"/>
<field name="PrimerApellido"/>
<field name="SegundoApellido"/>
<field name="PrimerNombre"/>
<field name="OtrosNombres"/>
<field name="NIT"/>
<field name="DV"/>
<field name="PaisEmpleador"/>
<field name="MunicipioCiudadEmpleador"/>
<field name="DepartamentoEstadoEmpleador"/>
<field name="DireccionEmpleador"/>
<field name="id_plataforma"/>
<field name="password"/>
</group>
</group>
<group string="Datos resultado">
<field name="estado"/>
<field name="transaccionID"/>
</group>
<!-- <div colspan="4">
<field name="note" placeholder="Add an internal note..."/>
</div> -->
</page>
<page string="XML">
<div colspan="4">
<field name="xml" placeholder="Al generar el documento se crea este..."/>
</div>
</page>
</xpath>
</field>
</record>
<!-- <record id="nomina_rule_category" model="ir.ui.view">
<field name="name">nomina_rule_category</field>
<field name="model">hr.salary.rule.category</field>
<field name="inherit_id" ref="hr_payroll.hr_salary_rule_category_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='parent_id']" position="after">
</xpath>
</field>
</record> -->
<record id="nomina_hr_contract" model="ir.ui.view">
<field name="name">nomina_hr_contract</field>
<field name="model">hr.contract</field>
<field name="inherit_id" ref="hr_contract.hr_contract_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='resource_calendar_id']" position="after">
<group>
<field name="tipo_contrato"/>
<field name="tipo_trabajador"/>
<field name="sub_tipo_trabajador"/>
<field name="AltoRiegoPension"/>
<field name="metodo_pago"/>
<!-- <field name="banco"/> -->
<field name="tipo_cuenta"/>
<!-- <field name="numero_cuenta"/> -->
</group>
</xpath>
</field>
</record>
<record id="nomina_rule_salary" model="ir.ui.view">
<field name="name">nomina_rule_salary</field>
<field name="model">hr.salary.rule</field>
<field name="inherit_id" ref="om_hr_payroll.hr_salary_rule_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='appears_on_payslip']" position="after">
<field name="porcentaje"/>
<!-- <field name="tipo_devengado"/>
<field name="tipo_deduccion"/> -->
</xpath>
</field>
</record>
</data>
</odoo>