1
# -*- coding: utf-8 -*-
2
##############################################################################
4
# OpenERP, Open Source Management Solution
5
# Copyright (C) 2011 Vauxoo (<http://www.vauxoo.com>). All Rights Reserved
6
# hbto@vauxoo.com / humbertoarocha@gmail.com
8
# This program is free software: you can redistribute it and/or modify
9
# it under the terms of the GNU General Public License as published by
10
# the Free Software Foundation, either version 3 of the License, or
11
# (at your option) any later version.
13
# This program is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
# GNU General Public License for more details.
18
# You should have received a copy of the GNU General Public License
19
# along with this program. If not, see <http://www.gnu.org/licenses/>.
21
##############################################################################
23
from openerp.osv import osv, fields
29
from tools import config
30
from openerp.tools.translate import _
32
import decimal_precision as dp
35
class commission_payment(osv.Model):
37
OpenERP Model : commission_payment
40
_name = 'commission.payment'
41
_description = __doc__
44
'name': fields.char('Concepto de Comisiones', size=256, required=True, readonly=True, states={'draft': [('readonly', False)]}),
45
'bar_id': fields.many2one('baremo.book', 'Baremo', required=True, readonly=True, states={'draft': [('readonly', False)]}),
46
'date_start': fields.date('Desde', required=True, readonly=True, states={'draft': [('readonly', False)]}),
47
'date_stop': fields.date('Hasta', required=True, readonly=True, states={'draft': [('readonly', False)]}),
48
'total_comm': fields.float('Total a Pagar', digits_compute=dp.get_precision('Commission'), readonly=True, states={'write': [('readonly', False)]}),
49
'ret_notes': fields.text('Notas para las Retenciones', readonly=True, states={'draft': [('readonly', False)], 'open': [('readonly', False)]}),
50
'uninvoiced_ids': fields.one2many('commission.uninvoiced', 'commission_id', 'Transacciones sin Facturas', readonly=True, states={'write': [('readonly', False)]}),
51
'sale_noids': fields.one2many('commission.sale.noid', 'commission_id', 'Articulos sin asociacion', readonly=True, states={'write': [('readonly', False)]}),
52
'noprice_ids': fields.one2many('commission.noprice', 'commission_id', 'Productos sin precio de lista historico', readonly=True, states={'write': [('readonly', False)]}),
53
'comm_line_ids': fields.one2many('commission.lines', 'commission_id', 'Comision por productos', readonly=True, states={'write': [('readonly', False)]}),
54
'saleman_ids': fields.one2many('commission.saleman', 'commission_id', 'Total de Comisiones por Vendedor', readonly=True, states={'write': [('readonly', False)]}),
55
'user_ids': fields.many2many('res.users', 'commission_users', 'commission_id', 'user_id', 'Vendedores', required=True, readonly=True, states={'draft': [('readonly', False)]}),
56
'voucher_ids': fields.many2many('account.voucher', 'commission_account_voucher', 'commission_id', 'voucher_id', 'Vouchers', readonly=True, states={'draft': [('readonly', False)], 'open': [('readonly', False)], }),
57
'comm_voucher_ids': fields.one2many('commission.voucher', 'commission_id', 'Vouchers afectados en esta comision', readonly=True, states={'write': [('readonly', False)]}),
58
'comm_invoice_ids': fields.one2many('commission.invoice', 'commission_id', 'Facturas afectadas en esta comision', readonly=True, states={'write': [('readonly', False)]}),
59
'comm_retention_ids': fields.one2many('commission.retention', 'commission_id', 'Facturas con Problemas de Retencion', readonly=True, states={'write': [('readonly', False)]}),
60
'state': fields.selection([
62
('open', 'En Proceso'),
63
('decide', 'Decidir'),
64
('write', 'Escribiendo'),
66
('cancel', 'Cancelado')
67
], 'Estado', readonly=True),
70
'name': lambda *a: None,
71
'total_comm': lambda *a: 0.00,
72
'state': lambda *a: 'draft',
73
'ret_notes': lambda *a: 'Las Facturas que se mencionan ya tienen un pago registrado, pero presentan problemas con una o mas de las retenciones que se indican en el cuadro, se ha tratado bajo los medios existentes de identificar cuales son los porcentajes de retenciones pero no ha sido posible, para generar la comision sobre el pago de las mismas, es necesario el conocimiento de estos valores, por lo que le increpamos a que contacte a sus asociados para obtener esta informacion, su falta no afectara el calculo de la comision pero retardara su ejecucion. Si considera que ha habido un error por favor hable sobre el tema con el personal Administrativo y de Sistemas para determinar las causas del mismo y encontrar una solucion. De otra forma haga caso omiso de este mensaje y su contenido',
76
def prepare(self, cr, uid, ids, context=None):
78
Este metodo recorre los elementos de account_voucher y verifica al menos
79
tres (3) caracteristicas primordiales para continuar con los vouchers:
80
estas caracteristicas son:
81
- bank_rec_voucher: quiere decir que el voucher es de un deposito bancario
82
(aqui aun no se ha considerado el trato que se le da a los cheques devueltos).
83
- posted: quiere decir que el voucher ya se ha contabilizado,
84
condicion necesaria pero no suficiente.
85
- move_ids: si la longitud de estos es distinto de cero es porque este voucher es
86
por completo valido, es decir, realmente tiene asientos contables registrados.
88
Si estas tres (3) condiciones se cumplen entonces se puede proceder a realizar la revision
89
de las lineas de pago.
92
@param cr: cursor to database
93
@param uid: id of current user
94
@param ids: list of record ids to be process
95
@param context: context arguments, like lang, time zone
97
@return: return a result
100
self.write(cr, uid, ids, {
105
accounts = self.pool.get('account.account')
106
vouchers = self.pool.get('account.voucher')
107
payments = self.pool.get('account.voucher.line')
108
invoices = self.pool.get('account.invoice')
109
invoice_lines = self.pool.get('account.invoice.line')
110
prod_prices = self.pool.get('product.historic.price')
111
partner_ids = self.pool.get('res.partner')
113
#~ Elementos Internos
114
uninvoiced_pays = self.pool.get('commission.uninvoiced')
115
sale_noids = self.pool.get('commission.sale.noid')
116
noprice_ids = self.pool.get('commission.noprice')
117
comm_line_ids = self.pool.get('commission.lines')
118
saleman_ids = self.pool.get('commission.saleman')
119
#~ users_ids = self.pool.get ('commission.users')
120
comm_voucher_ids = self.pool.get('commission.voucher')
121
comm_invoice_ids = self.pool.get('commission.invoice')
122
comm_retention_ids = self.pool.get('commission.retention')
128
ret_iva_lines = self.pool.get('account.wh.iva.line')
130
ret_islr_lines = self.pool.get('islr.wh.doc.line')
132
ret_im_lines = self.pool.get('account.wh.munici.line')
134
# commissions = self.pool.get('commission.payment')
135
commissions = self.browse(cr, uid, ids, context=None)
137
for commission in commissions:
138
# Desvincular lineas existentes, si las hubiere
139
self._unlink(cr, uid, ids, context=None)
141
date_start = commission.date_start
142
date_stop = commission.date_stop
144
#~ Obtener la lista de asesores/vendedores a los cuales se les hara el calculo de comisiones
146
user_ids = [line.id for line in commission.user_ids]
148
#~ Obtener la lista de vouchers que se seleccionaron manualmente en el widget many2many
150
voucher_ids = [line.id for line in commission.voucher_ids]
152
#~ Aqui verificamos que si no hay ningun voucher nosotros nos encargaremos de hacer la lista
154
# En esta busqueda restringimos que el voucher se haya contabilizado y que
155
# sea un cobro bancario y este dentro de la fecha estipulada
156
voucher_ids = vouchers.search(cr, uid, [('state', '=', 'posted'), (
157
'type', '=', 'receipt'), ('date', '>=', date_start), ('date', '<=', date_stop)])
160
'voucher_ids': [(6, commission.id, voucher_ids)],
163
for vid in voucher_ids:
164
pay = vouchers.read(cr, uid, vid, [
165
'name', 'date', 'amount', 'line_cr_ids', 'move_ids'], context=None)
167
if pay['move_ids'] and pay['line_cr_ids']:
168
# Con la negacion de esta condicion se termina de realizar la revision de las lineas de pago que cumplen con las tres
169
# condiciones estipuladas inicialmente, ahora se debe
170
# proseguir con la revision de las lineas de pago
172
for pid in pay['line_cr_ids']:
173
payment_brw = payments.browse(
174
cr, uid, pid, context=None)
175
print 'payment_brw', payment_brw.id
176
pay_line_vendor = payment_brw.partner_id.user_id and payment_brw.partner_id.user_id.id or False
178
if pay_line_vendor in user_ids:
179
# Leer cada una de las lineas de los vouchers
180
pay_line = payments.read(cr, uid, pid, [
181
'name', 'invoice_id', 'amount', 'account_id', 'paid_comm'], context=None)
182
print 'pay_line ', pay_line
184
# Verificar si esta linea tiene factura y la
185
# comision del pago no se ha pagado
186
if pay_line['invoice_id'] and not pay_line['paid_comm']:
187
print 'ENTRO EN DOS (2)'
188
# Si esta aqui dentro es porque esta linea
189
# tiene una id valida de una factura.
190
inv_id = pay_line['invoice_id'][0]
191
inv = invoices.read(cr, uid, inv_id, [
192
'number', 'amount_untaxed', 'amount_total', 'invoice_line', 'date_invoice', 'partner_id'], context=None)
195
perc_IVA = round(((inv['amount_total'] / inv[
196
'amount_untaxed'])-1)*100, 0)
197
print 'perc_IVA: ', perc_IVA, '\n'
199
# Obtener el Valor de Porcentaje Retencion de
202
# Las maneras faciles son las dos primeras que el cliente no retenga y la factura sea solo de productos
203
# por lo que las retenciones de islr y im no aplican
204
# o que el cliente retenga el 100% (algo poco
205
# visto) y sea una factura de productos
210
if abs(inv['amount_total'] - pay_line['amount']) <= 1.0:
217
elif abs((inv['amount_untaxed']*(1+(perc_IVA/100)*(1-75.0/100))) - pay_line['amount']) <= 1.0:
224
elif ret_iva_lines.search(cr, uid, [('invoice_id', '=', inv_id)]):
225
lines_ret_iva = ret_iva_lines.search(
226
cr, uid, [('invoice_id', '=', inv_id)])
227
for line in lines_ret_iva:
228
perc_Ret_IVA = ret_iva_lines.browse(
229
cr, uid, line, context=None).wh_iva_rate
232
if no_ret_islr == True and ret_islr_lines.search(cr, uid, [('invoice_id', '=', inv_id)]):
233
lines_ret_islr = ret_islr_lines.search(
234
cr, uid, [('invoice_id', '=', inv_id)])
236
for line in lines_ret_islr:
237
perc_Ret_ISLR += ret_islr_lines.browse(
238
cr, uid, line, context=None).retencion_islr
241
if no_ret_im == True and ret_im_lines.search(cr, uid, [('invoice_id', '=', inv_id)]):
242
lines_ret_im = ret_im_lines.search(
243
cr, uid, [('invoice_id', '=', inv_id)])
245
for line in lines_ret_im:
246
perc_Ret_IM += ret_im_lines.browse(
247
cr, uid, line, context=None).wh_loc_rate
250
# Tratando de obtener la perc_Ret_IVA cuando se tiene el valor de impuesto municipal
251
# y considerando que el islr es cero, como en
252
# el caso de las empresas que solo cargan un
255
if no_ret_im == False and no_ret_iva == True:
256
for valor in [0, 75.0, 100.0]:
257
if abs((inv['amount_untaxed']*(1+(perc_IVA/100)*(1-valor/100.0)-(perc_Ret_IM/100.0))) - pay_line['amount']) <= 1.0:
261
# Tratando de obtener la perc_Ret_IVA cuando se tiene el valor de impuesto slr
262
# y considerando que el im es cero, como en el
263
# caso de las empresas que solo cargan el islr
266
if no_ret_islr == False and no_ret_iva == True:
267
for valor in [0, 75.0, 100.0]:
268
if abs((inv['amount_untaxed']*(1+(perc_IVA/100)*(1-valor/100.0)-(perc_Ret_ISLR/100.0))) - pay_line['amount']) <= 1.0:
272
# Tratando de obtener la perc_Ret_IVA cuando se
273
# tienen tanto el islr como el im
275
if no_ret_islr == False and no_ret_im == False and no_ret_iva == True:
276
for valor in [0, 75.0, 100.0]:
277
if abs((inv['amount_untaxed']*(1+(perc_IVA/100)*(1-valor/100.0)-(perc_Ret_IM/100.0)-(perc_Ret_ISLR/100.0))) - pay_line['amount']) <= 1.0:
281
# Tratando de obtener el islr cuando se tienen
282
# tanto el perc_Ret_IVA como el im
283
if no_ret_islr == True and no_ret_im == False and no_ret_iva == False:
284
for valor in [0, 2.0, 3.0, 5.0]:
285
if abs((inv['amount_untaxed']*(1+(perc_IVA/100)*(1-perc_Ret_IVA/100.0)-(perc_Ret_IM/100.0)-(valor/100.0))) - pay_line['amount']) <= 1.0:
286
perc_Ret_ISLR = valor
289
# Obtener el vendedor del partner
290
saleman = partner_ids.read(cr, uid, inv['partner_id'][
291
0], ['user_id'], context=None)['user_id']
292
print 'SALEMAN (4) ', saleman
293
# si ha sido posible calcular u obtener todas las retenciones por los medios convencionales
294
# entonces se puede proceder con el calculo de retencion de las lineas, de lo contrario se
295
# genera una bitacora para que se obtengan las retenciones faltantes para proceder nuevament
296
# con la preparacion de las comisiones.
298
if no_ret_islr == False and no_ret_im == False and no_ret_iva == False:
299
print 'DENTRO DEL CALCULO PARA LAS RETENCIONES'
300
# Revision de cada linea de factura
302
for l_id in inv['invoice_line']:
304
# Obtener valores de las lineas
305
inv_lin = invoice_lines.read(cr, uid, l_id, [
306
'name', 'price_unit', 'price_subtotal', 'quantity', 'product_id'], context=None)
308
#~ print 'Producto: ', inv_lin['name'], '\n'
310
# Verificar si tiene producto asociado
311
if inv_lin['product_id']:
312
# Si esta aqui es porque hay un
314
prod_id = inv_lin['product_id'][0]
316
# se obtienen las listas de precio, vienen ordenadas por defecto, de acuerdo al objeto
317
# product.historic de mayor a menor
319
price_ids = prod_prices.search(
320
cr, uid, [('product_id', '=', prod_id)])
322
# Buscar Precio Historico de Venta de este
323
# producto @ la fecha de
326
for price_id in price_ids:
327
if inv['date_invoice'] >= prod_prices.browse(cr, uid, price_id, context=None).name:
328
list_price = prod_prices.browse(
329
cr, uid, price_id, context=None).price
330
list_date = prod_prices.browse(
331
cr, uid, price_id, context=None).name
333
#~ print '[date_invoice : list_price : list_date]: [', inv['date_invoice'],' : ', list_price,' : ', list_date,'] \n'
336
# Determinar cuanto fue el descuento en este producto en aquel momento de la venta
337
#~ if (inv_lin['price_subtotal']/inv_lin['quantity'])< inv_lin['price_unit']:
338
if abs((inv_lin['price_subtotal']/inv_lin['quantity']) - inv_lin['price_unit']) > 0.05:
339
#~ # con esto se asegura que no se esta pasando por alto el descuento en linea
340
price_unit = round((inv_lin[
341
'price_subtotal']/inv_lin['quantity']), 2)
343
price_unit = inv_lin[
347
list_price - price_unit)*100/list_price, 1)
350
# Determinar dias entre la
351
# emision de la factura del
352
# producto y el pago del mismo
353
pay_date = mx.DateTime.strptime(
354
pay['date'], '%Y-%m-%d')
355
inv_date = mx.DateTime.strptime(
356
inv['date_invoice'], '%Y-%m-%d')
358
pay_date - inv_date).day
360
# Teniendose dias y descuento por producto se procede a buscar en el baremo
361
# el correspondiente valor de comision para el producto en cuestion.
362
# se entra con el numero de
365
# Esta busqueda devuelve los dias ordenadados de menor a mayor dia, de acuerdo
366
# con lo estipulado que se
367
# ordenaria en el modulo baremo
370
comm_res = self.pool.get('baremo.book')._calc_comm(
371
cr, uid, bid, rate_item, emission_days)
373
#############################################
374
# CALCULO DE COMISION POR LINEA DE PRODUCTO #
375
###############################
377
## TODO: ESTE VALOR DEBE DESAPARECER DE AQUI
378
# este valor se debe sustituir por un valor que viene de la factura
379
# son solo demostrativos y no deberian quedar aqui luego de enviar
380
# este modulo a produccion.
384
PenBxLinea = pay_line['amount']*(inv_lin[
385
'price_subtotal']/inv['amount_untaxed'])
386
#~ Fact_Sup = 1 - perc_Ret_ISLR/100 - perc_Ret_IM/100
387
#~ Fact_Inf = 1 + (perc_IVA/100) * (1 - perc_Ret_IVA/100) - perc_Ret_ISLR/100 - perc_Ret_IM/100
389
#~ comm_line = PenBxLinea * Fact_Sup * (bar_dcto_comm / 100) / Fact_Inf
390
comm_line = PenBxLinea * (
391
comm_res['rate_comm'] / 100)
392
#~ comm_line = PenBxLinea * (bar_dcto_comm / 100)
393
# Generar las lineas de
394
# comision por cada producto
395
comm_line_ids.create(cr, uid, {
396
'commission_id': commission.id,
398
'name': pay['name'] and pay['name'] or '/',
399
'pay_date': pay['date'],
400
'pay_off': pay['amount'],
402
'invoice_id': pay_line['invoice_id'][0],
403
'invoice_num': inv['number'],
404
'partner_id': inv['partner_id'][0],
405
'saleman_name': saleman[1],
406
'saleman_id': saleman[0],
407
'pay_inv': pay_line['amount'],
408
'inv_date': inv['date_invoice'],
409
'days': emission_days and emission_days or 0.0,
410
'inv_subtotal': inv['amount_untaxed'],
411
'item': inv_lin['name'],
412
#~ 'price_unit': price_unit,
413
'price_subtotal': inv_lin['price_subtotal'],
414
#~ 'price_list': list_price,
415
#~ 'price_date': list_date ,
416
#~ 'perc_Ret_ISLR' : perc_Ret_ISLR,
417
#~ 'perc_Ret_IM' : perc_Ret_IM,
418
#~ 'perc_Ret_IVA' : perc_Ret_IVA,
419
#~ 'perc_IVA' : perc_IVA,
420
'rate_item': rate_item and rate_item or 0.0,
421
'rate_number': comm_res['rate_number'] and comm_res['rate_number'] or 0.0,
422
'timespan': comm_res['timespan'] and comm_res['timespan'] or 0.0,
423
'baremo_comm': comm_res['rate_comm'] and comm_res['rate_comm'] or 0.0,
424
'commission': comm_line and comm_line or 0.0,
426
print 'CREANDO LINEAS DE COMISIONES (5)'
428
# Se genera un lista de tuplas con las lineas, productos y sus correspondientes fechas
429
# en las cuales no aparece precio de lista, luego al final se escriben los
430
# valores en la correspondiente bitacora para su inspeccion.
431
#~ print 'No hubo precio de lista para la fecha estipulada, hay que generar el precio en este producto \n'
432
noprice_ids.create(cr, uid, {
433
'commission_id': commission.id,
434
'product_id': prod_id,
435
'date': inv['date_invoice'],
436
'invoice_num': inv['number'],
439
# cuando una linea no tiene product_id asociado se escribe en una tabla para alertar al operador
440
# sobre esta parte no llego a un acuerdo de si se podria permitir al operador cambiar las lineas
441
# de la factura puesto que es un
442
# asunto muy delicado.
444
sale_noids.create(cr, uid, {
445
'commission_id': commission.id,
449
print 'ENTRO EN EL CREATE (3)'
450
# generar campo y vista donde se han de cargar las facturas que tienen problemas
451
# se debe grabar los tres campos de las retenciones y el numero de la factura para
452
# tener detalles concisos y porcion de
453
# voucher de pago de la factura en cuestion
454
comm_retention_ids.create(cr, uid, {
455
'commission_id': commission.id,
456
'invoice_id': pay_line['invoice_id'][0],
459
'ret_iva': no_ret_iva,
460
'ret_islr': no_ret_islr,
463
elif (pay_line['invoice_id'] == False and pay_line['paid_comm'] == False):
464
# Si esta aqui dentro es porque esta linea (transaccion) no tiene factura valida, se escribe
465
# entonces una linea en una vista donde se muestran las transacciones que no tienen factura
466
# asociada para su correccion si aplica. tampoco se ha pagado la comision del mismo
467
# solo se incluiran pagos que sean de cuentas cobrables, puesto que las de otra naturaleza,
468
# no tienen sentido mostrarlas aqui.
469
if accounts.read(cr, uid, pay_line['account_id'][0], ['type'], context=None)['type'] == 'receivable':
470
uninvoiced_pays.create(cr, uid, {
471
'commission_id': commission.id,
475
#~ No se hace nada por que el vendedor del pago que se esta consultando no se incorporo
476
#~ a la lista de asesores a los que se debe calcular la comision
478
# habiendo recorrido todos los vouchers, mostrado todos los elementos que necesitan correccion
479
# se procede a agrupar las comisiones por vendedor para mayor facilidad
482
# comm_line_ids.unlink(cr, uid, [line_ids.id for line_ids in
483
# commission.comm_line_ids])
485
# recargando las lineas que se han creado
486
commissions = self.browse(cr, uid, ids, context=None)
487
saleman_ids = self.pool.get('commission.saleman')
488
comm_voucher_ids = self.pool.get('commission.voucher')
489
comm_retention_ids = self.pool.get('commission.retention')
490
#~ print 'antes de calcular totales\n'
492
for commission in commissions:
493
#~ # recoge todos los vendedores y suma el total de sus comisiones
495
#~ # ordena en un arbol todas las lineas de comisiones de producto
497
for comm_line in commission.comm_line_ids:
499
vendor_id = comm_line.saleman_id.id
500
voucher_id = comm_line.voucher_id.id
501
invoice_id = comm_line.invoice_id.id
502
comm_line_id = comm_line.id
504
if not vendor_id in sale_comm.keys():
505
sale_comm[vendor_id] = [comm_line.saleman_name, 0.0]
506
sale_comm[vendor_id][1] += comm_line.commission
508
if not vendor_id in criba.keys():
509
criba[vendor_id] = {}
511
#~ if not voucher_id in criba[vendor_id].keys():
512
#~ criba[vendor_id][voucher_id] = [comm_line.pay_date,{}]
514
#~ if not invoice_id in criba[vendor_id][voucher_id][1].keys():
515
#~ criba[vendor_id][voucher_id][1][invoice_id] = {}
517
#~ if len(criba[vendor_id][voucher_id][1][invoice_id])==0:
518
#~ criba[vendor_id][voucher_id][1][invoice_id]=[[], comm_line.pay_inv, comm_line.perc_Ret_IVA, comm_line.perc_Ret_ISLR, comm_line.perc_Ret_IM]
520
#~ criba[vendor_id][voucher_id][1][invoice_id][0].append(comm_line_id)
522
#~ ## escribir el total para cada vendedor encontrado
524
for vendor_key in criba.keys():
525
vendor_id = saleman_ids.create(cr, uid, {
526
'commission_id': commission.id,
527
'saleman_id': vendor_key,
528
'saleman_name': sale_comm[vendor_key][0],
529
'comm_total': sale_comm[vendor_key][1],
532
total_comm += sale_comm[vendor_key][1]
534
for voucher_key in criba[vendor_key].keys():
535
voucher_id = comm_voucher_ids.create(cr, uid, {
536
'commission_id': commission.id,
537
'comm_sale_id': vendor_id,
538
'voucher_id': voucher_key,
539
'date': criba[vendor_key][voucher_key][0],
542
for inv_key in criba[vendor_key][voucher_key][1].keys():
543
invoice_id = comm_invoice_ids.create(cr, uid, {
544
'commission_id': commission.id,
545
'comm_voucher_id': voucher_id,
546
'invoice_id': inv_key,
547
'pay_inv': criba[vendor_key][voucher_key][1][inv_key][1],
548
'ret_iva': criba[vendor_key][voucher_key][1][inv_key][2],
549
'ret_islr': criba[vendor_key][voucher_key][1][inv_key][3],
550
'ret_im': criba[vendor_key][voucher_key][1][inv_key][4],
553
for id in criba[vendor_key][voucher_key][1][inv_key][0]:
554
comm_line_ids.write(cr, uid, id, {
555
'comm_invoice_id': invoice_id,
558
self.write(cr, uid, ids, {
559
'total_comm': total_comm,
565
def pre_process(self, cr, uid, ids, context={}):
566
commissions = self.browse(cr, uid, ids, context=None)
567
for commission in commissions:
568
self.prepare(cr, uid, ids, context=None)
570
if commission.comm_line_ids:
571
self.write(cr, uid, ids, {
575
raise osv.except_osv(_('Atencion !'), _(
576
'No Existen Lineas de Comision x Producto que procesar !!!'))
578
#~ if not commission.noprice_ids:
579
#~ self.write(cr, uid, ids, {
580
#~ 'state': 'decide',
583
#~ raise osv.except_osv(_('Atencion !'), _('Debe primero solucionar el asunto de los Productos sin Listas de Precio \npara las fechas especificadas antes de continuar'))
586
def delete(self, cr, uid, ids, context={}):
587
commissions = self.browse(cr, uid, ids, context=None)
589
for commission in commissions:
590
self._unlink(cr, uid, ids, context=None)
591
self.write(cr, uid, ids, {
597
def _unlink(self, cr, uid, ids, context={}):
599
uninvoiced_pays = self.pool.get('commission.uninvoiced')
600
sale_noids = self.pool.get('commission.sale.noid')
601
noprice_ids = self.pool.get('commission.noprice')
602
comm_line_ids = self.pool.get('commission.lines')
603
saleman_ids = self.pool.get('commission.saleman')
604
#~ users_ids = self.pool.get ('commission.users')
605
comm_voucher_ids = self.pool.get('commission.voucher')
606
comm_invoice_ids = self.pool.get('commission.invoice')
607
comm_retention_ids = self.pool.get('commission.retention')
609
commissions = self.browse(cr, uid, ids, context=None)
611
for commission in commissions:
613
# Desvincular todos los elementos que esten conectados a este calculo de comisiones
614
# * Desvinculando los pagos sin facturas
615
#~ uninvoiced_pays.unlink(cr, uid, [line.id for line in commission.uninvoiced_ids])
616
# * Desvinculando los articulos sin id
617
#~ sale_noids.unlink(cr, uid, [line.id for line in commission.sale_noids])
618
# * Desvinculando los productos sin fecha
619
#~ noprice_ids.unlink(cr, uid, [line.id for line in commission.noprice_ids])
620
# * Desvinculando las lineas de comisiones
621
comm_line_ids.unlink(cr, uid, [
622
line.id for line in commission.comm_line_ids])
623
# * Desvinculando los totales por vendedor
624
saleman_ids.unlink(cr, uid, [
625
line.id for line in commission.saleman_ids])
626
# * Desvinculando los vendedores
627
#~ users_ids.unlink(cr, uid, [line.id for line in commission.users_ids])
628
# * Desvinculando los vouchers afectados
629
#~ comm_voucher_ids.unlink(cr, uid, [line.id for line in commission.comm_voucher_ids])
630
# * Desvinculando los vouchers afectados
631
#~ comm_invoice_ids.unlink(cr, uid, [line.id for line in commission.comm_invoice_ids])
632
# * Desvinculando las facturas con problemas de retenciones
633
#~ comm_retention_ids.unlink(cr, uid, [line.id for line in commission.comm_retention_ids])
636
def decide(self, cr, uid, ids, context={}):
637
commissions = self.browse(cr, uid, ids, context=None)
638
avl = self.pool.get('account.voucher.line')
639
# escribir en el avl el estado buleano de paid_comm a True para indicar
640
# que ya esta comision se esta pagando
641
for commission in commissions:
642
avl.write(cr, uid, [line.concept.id for line in commission.comm_line_ids], {
646
self.write(cr, uid, ids, {
650
def going_back(self, cr, uid, ids, context={}):
651
self.write(cr, uid, ids, {
657
class commission_uninvoiced(osv.Model):
659
Commission Payment Uninvoiced : commission_uninvoiced
662
_name = 'commission.uninvoiced'
665
'name': fields.char('Comentario', size=256),
666
'commission_id': fields.many2one('commission.payment', 'Comision'),
667
'payment_id': fields.many2one('account.voucher.line', 'Descripcion de Transaccion'),
670
'name': lambda *a: None,
674
class commission_sale_noid(osv.Model):
676
Commission Payment : commission_sale_noid
679
_name = 'commission.sale.noid'
682
'name': fields.char('Comentario', size=256),
683
'commission_id': fields.many2one('commission.payment', 'Comision'),
684
'inv_line_id': fields.many2one('account.invoice.line', 'Descripcion de Articulo'),
687
'name': lambda *a: None,
691
class commission_noprice(osv.Model):
693
Commission Payment : commission_sale_noid
696
_name = 'commission.noprice'
697
_order = 'product_id'
700
'name': fields.char('Comentario', size=256),
701
'commission_id': fields.many2one('commission.payment', 'Comision'),
702
'product_id': fields.many2one('product.product', 'Producto'),
703
'date': fields.date('Fecha'),
704
'invoice_num': fields.integer('Numero de Factura'),
708
'name': lambda *a: None,
712
class commission_lines(osv.Model):
714
Commission Payment : commission_lines
717
_name = 'commission.lines'
718
_order = 'saleman_id'
721
'commission_id': fields.many2one('commission.payment', 'Comision', required=True),
722
'name': fields.char('Transaccion', size=256, required=True),
723
'pay_date': fields.date('Fecha', required=True),
724
'pay_off': fields.float('Pago', digits_compute=dp.get_precision('Commission')),
726
'voucher_id': fields.many2one('account.voucher', 'Voucher'),
728
'concept': fields.many2one('account.voucher.line', 'Concepto'),
729
'invoice_id': fields.many2one('account.invoice', 'Doc.'),
730
'invoice_num': fields.char('Doc.', size=256),
731
'partner_id': fields.many2one('res.partner', 'Empresa'),
732
'saleman_name': fields.char('Vendedor', size=256, required=True),
733
'saleman_id': fields.many2one('res.users', 'Vendedor', required=True),
734
'pay_inv': fields.float('Abono Fact.', digits_compute=dp.get_precision('Commission')),
736
'inv_date': fields.date('Fecha Doc.'),
737
'days': fields.float('Dias', digits_compute=dp.get_precision('Commission')),
739
'inv_subtotal': fields.float('SubTot. Doc.', digits_compute=dp.get_precision('Commission')),
741
'item': fields.char('Item', size=256, required=True),
742
'price_unit': fields.float('Prec. Unit.', digits_compute=dp.get_precision('Commission')),
743
'price_subtotal': fields.float('SubTot. Item', digits_compute=dp.get_precision('Commission')),
745
'price_list': fields.float('Precio Lista', digits_compute=dp.get_precision('Commission')),
746
'price_date': fields.date('Fecha Lista'),
749
#~ 'perc_Ret_ISLR': fields.float('Ret ISLR (%)', digits_compute=dp.get_precision('Commission')),
750
#~ 'perc_Ret_IM': fields.float('Ret IM (%)', digits_compute=dp.get_precision('Commission')),
751
#~ 'perc_Ret_IVA': fields.float('Ret IVA (%)', digits_compute=dp.get_precision('Commission')),
752
#~ 'perc_IVA': fields.float('IVA (%)', digits_compute=dp.get_precision('Commission')),
754
'rate_item': fields.float('Dcto. (%)', digits_compute=dp.get_precision('Commission')),
756
'rate_number': fields.float('Bar. Rate (%)', digits_compute=dp.get_precision('Commission')),
757
'timespan': fields.float('Bar. Dias', digits_compute=dp.get_precision('Commission')),
758
'baremo_comm': fields.float('Baremo %Comm.', digits_compute=dp.get_precision('Commission')),
759
'commission': fields.float('Comm. / Item', digits_compute=dp.get_precision('Commission')),
762
'name': lambda *a: None,
766
class commission_saleman(osv.Model):
768
Commission Payment : commission_saleman
771
_name = 'commission.saleman'
772
_order = 'saleman_name'
775
'name': fields.char('Comentario', size=256),
776
'commission_id': fields.many2one('commission.payment', 'Comision'),
777
'saleman_name': fields.char('Vendedor', size=256, required=True),
778
'saleman_id': fields.many2one('res.users', 'Vendedor', required=True),
779
'comm_total': fields.float('Comision a pagar', digits_compute=dp.get_precision('Commission')),
780
'comm_voucher_ids': fields.one2many('commission.voucher', 'comm_sale_id', 'Vouchers afectados en esta comision', required=False),
783
'name': lambda *a: None,
787
class commission_voucher(osv.Model):
789
Commission Payment : commission_voucher
792
_name = 'commission.voucher'
796
'name': fields.char('Comentario', size=256),
797
'commission_id': fields.many2one('commission.payment', 'Comision'),
798
'comm_sale_id': fields.many2one('commission.saleman', 'Vendedor'),
799
'voucher_id': fields.many2one('account.voucher', 'Voucher'),
800
'comm_invoice_ids': fields.one2many('commission.invoice', 'comm_voucher_id', 'Facturas afectadas en esta comision', required=False),
801
'date': fields.date('Fecha'),
804
'name': lambda *a: None,
808
class commission_invoice(osv.Model):
810
Commission Payment : commission_invoice
813
_name = 'commission.invoice'
814
_order = 'invoice_id'
817
'name': fields.char('Comentario', size=256),
818
'commission_id': fields.many2one('commission.payment', 'Comision'),
819
'comm_voucher_id': fields.many2one('commission.voucher', 'Voucher'),
820
'invoice_id': fields.many2one('account.invoice', 'Factura'),
821
'comm_line_ids': fields.one2many('commission.lines', 'comm_invoice_id', 'Comision por productos', required=False),
822
'pay_inv': fields.float('Abono Fact.', digits_compute=dp.get_precision('Commission')),
823
'ret_iva': fields.float('% Ret. IVA', digits_compute=dp.get_precision('Commission')),
824
'ret_islr': fields.float('% Ret. ISLR', digits_compute=dp.get_precision('Commission')),
825
'ret_im': fields.float('% Ret. IM', digits_compute=dp.get_precision('Commission')),
828
'name': lambda *a: None,
832
class commission_lines_2(osv.Model):
834
Commission Payment : commission_lines_2
837
_inherit = 'commission.lines'
840
'comm_invoice_id': fields.many2one('commission.invoice', 'Factura Relacional Interna'),
844
class commission_retention(osv.Model):
846
Commission Payment : commission_retention
849
_name = 'commission.retention'
850
_order = 'invoice_id'
853
'name': fields.char('Comentario', size=256),
854
'commission_id': fields.many2one('commission.payment', 'Comision'),
855
'invoice_id': fields.many2one('account.invoice', 'Factura'),
856
'voucher_id': fields.many2one('account.voucher', 'Pagado con...'),
857
'date': fields.date('Fecha'),
858
'ret_iva': fields.boolean('Ret. IVA'),
859
'ret_islr': fields.boolean('Ret. ISLR'),
860
'ret_im': fields.boolean('Ret. IM'),
863
'name': lambda *a: None,
867
class VoucherLines(osv.Model):
868
_inherit = 'account.voucher.line'
871
'paid_comm': fields.boolean('Comision Pagada?'),
872
'partner_id': fields.related('voucher_id', 'partner_id', type='many2one', relation='res.partner', string='Partner', store=True),
875
'paid_comm': lambda *a: False,
879
#~ class commission_users(osv.Model):
880
#~ _name='commission.users'
882
#~ 'name':fields.char('Nombre', size=8),
883
#~ 'commission_id':fields.many2one('commission.payment', 'Comision'),
884
#~ 'user_id': fields.many2one('res.users', 'Vendedor', required=True),
886
#~ commission_users()