Merge lp:~pexego/openobject-addons/6.1-pexego-sale_commission into lp:~pexego/openobject-addons/6.1-pexego

Proposed by Javier
Status: Merged
Merged at revision: 24
Proposed branch: lp:~pexego/openobject-addons/6.1-pexego-sale_commission
Merge into: lp:~pexego/openobject-addons/6.1-pexego
Diff against target: 1235 lines (+483/-163)
15 files modified
sale_commission/__init__.py (+1/-0)
sale_commission/i18n/es.po (+125/-65)
sale_commission/invoice.py (+15/-4)
sale_commission/partner_agent.py (+1/-1)
sale_commission/product.py (+47/-0)
sale_commission/product_view.xml (+24/-0)
sale_commission/sale_order.py (+132/-20)
sale_commission/sale_order_view.xml (+13/-13)
sale_commission/saleagent.py (+4/-4)
sale_commission/saleagent_view.xml (+15/-1)
sale_commission/security/ir.model.access.csv (+3/-0)
sale_commission/settled.py (+67/-41)
sale_commission/stock_picking.py (+30/-11)
sale_commission/wizard/wizard_invoice.py (+3/-2)
sale_commission/wizard/wizard_invoice.xml (+3/-1)
To merge this branch: bzr merge lp:~pexego/openobject-addons/6.1-pexego-sale_commission
Reviewer Review Type Date Requested Status
Pexego Pending
Review via email: mp+195983@code.launchpad.net
To post a comment you must log in.
25. By Javier

[ADD]:sale_commission: Modificaciones en la generación de factura. 3 opciones de desglose

26. By Javier

[MERGE]

27. By Javier

[ADD]sale_commission: traducciones

28. By Javier

[FIX]:sale_commission: improved onchange_product_id of sale.order.line

29. By Javier

[FIX] sale_commission: Bug en product_id_change2 corregido

30. By Javier

[FIX]sale_commission: Modificaciones para que no borre los agentes de las lineas de venta en el cliente gtk

31. By Javier

[FIX]sale_commission: No permitir borrar comisiones si se han usado en algún lado, domain en los diarios para que solo muestre los de tipo compras

32. By Javier

[FIX] sale_commission: Modificacion para tener en cuenta las facturas rectificativas

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'sale_commission/__init__.py'
--- sale_commission/__init__.py 2012-07-13 10:51:04 +0000
+++ sale_commission/__init__.py 2014-03-13 12:35:19 +0000
@@ -28,6 +28,7 @@
28import sale_order28import sale_order
29import stock_picking29import stock_picking
30import wizard30import wizard
31import product
3132
32# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:33# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
3334
3435
=== modified file 'sale_commission/i18n/es.po'
--- sale_commission/i18n/es.po 2012-07-13 10:51:04 +0000
+++ sale_commission/i18n/es.po 2014-03-13 12:35:19 +0000
@@ -1,18 +1,18 @@
1# Translation of OpenERP Server.1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:2# This file contains the translation of the following modules:
3# * sale_commission3# * sale_commission
4#4#
5msgid ""5msgid ""
6msgstr ""6msgstr ""
7"Project-Id-Version: OpenERP Server 6.0.1\n"7"Project-Id-Version: OpenERP Server 6.1\n"
8"Report-Msgid-Bugs-To: support@openerp.com\n"8"Report-Msgid-Bugs-To: \n"
9"POT-Creation-Date: 2011-05-02 11:44+0000\n"9"POT-Creation-Date: 2013-11-27 09:45+0000\n"
10"PO-Revision-Date: 2011-05-02 14:17+0100\n"10"PO-Revision-Date: 2013-11-27 09:45+0000\n"
11"Last-Translator: Raimon Esteve <resteve@zikzakmedia.com>\n"11"Last-Translator: <>\n"
12"Language-Team: \n"12"Language-Team: \n"
13"MIME-Version: 1.0\n"13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: 8bit\n"15"Content-Transfer-Encoding: \n"
16"Plural-Forms: \n"16"Plural-Forms: \n"
1717
18#. module: sale_commission18#. module: sale_commission
@@ -26,6 +26,11 @@
26msgstr "Factura Nº"26msgstr "Factura Nº"
2727
28#. module: sale_commission28#. module: sale_commission
29#: view:sale.agent:0
30msgid "Saleagent"
31msgstr "Agente"
32
33#. module: sale_commission
29#: selection:sale.agent,settlement:034#: selection:sale.agent,settlement:0
30msgid "Monthly"35msgid "Monthly"
31msgstr "Mensual"36msgstr "Mensual"
@@ -76,11 +81,6 @@
76msgstr "Resumen de facturas"81msgstr "Resumen de facturas"
7782
78#. module: sale_commission83#. module: sale_commission
79#: sql_constraint:sale.order:0
80msgid "Order Reference must be unique !"
81msgstr "¡La referencia del pedido debe ser única!"
82
83#. module: sale_commission
84#: field:settlement.agent,total_sections:084#: field:settlement.agent,total_sections:0
85msgid "Total sections"85msgid "Total sections"
86msgstr "Total tramos"86msgstr "Total tramos"
@@ -96,6 +96,7 @@
96msgstr "Informe de liquidación"96msgstr "Informe de liquidación"
9797
98#. module: sale_commission98#. module: sale_commission
99#: model:ir.actions.act_window,name:sale_commission.action_recalculate_commission
99#: view:recalculate.commission.wizard:0100#: view:recalculate.commission.wizard:0
100msgid "Recalculate agents commissions"101msgid "Recalculate agents commissions"
101msgstr "Recalcular comisiones"102msgstr "Recalcular comisiones"
@@ -106,6 +107,7 @@
106msgstr "Resumen de agentes"107msgstr "Resumen de agentes"
107108
108#. module: sale_commission109#. module: sale_commission
110#: view:commission:0
109#: view:res.partner:0111#: view:res.partner:0
110#: view:sale.order:0112#: view:sale.order:0
111msgid "Agents and Commissions"113msgid "Agents and Commissions"
@@ -123,6 +125,11 @@
123msgstr "Liquidación de agente"125msgstr "Liquidación de agente"
124126
125#. module: sale_commission127#. module: sale_commission
128#: selection:settled.invoice.wizard,mode:0
129msgid "for each sale invoice"
130msgstr "por cada factura de venta"
131
132#. module: sale_commission
126#: view:account.invoice.line:0133#: view:account.invoice.line:0
127msgid "Notes"134msgid "Notes"
128msgstr "Notas"135msgstr "Notas"
@@ -133,7 +140,7 @@
133msgstr "Anual"140msgstr "Anual"
134141
135#. module: sale_commission142#. module: sale_commission
136#: code:addons/sale_commission/settled.py:193143#: code:addons/sale_commission/settled.py:190
137#, python-format144#, python-format
138msgid "Error!"145msgid "Error!"
139msgstr "Error!"146msgstr "Error!"
@@ -178,6 +185,7 @@
178#: field:invoice.line.agent,agent_id:0185#: field:invoice.line.agent,agent_id:0
179#: field:res.partner.agent,agent_id:0186#: field:res.partner.agent,agent_id:0
180#: view:sale.agent:0187#: view:sale.agent:0
188#: field:sale.line.agent,agent_id:0
181#: field:sale.order.agent,agent_id:0189#: field:sale.order.agent,agent_id:0
182#: view:settled.invoice.agent:0190#: view:settled.invoice.agent:0
183#: field:settled.invoice.agent,agent_id:0191#: field:settled.invoice.agent,agent_id:0
@@ -192,26 +200,30 @@
192msgstr "Resumen de liquidaciones de agentes"200msgstr "Resumen de liquidaciones de agentes"
193201
194#. module: sale_commission202#. module: sale_commission
195#: model:ir.actions.act_window,name:sale_commission.action_recalculate_commission203#: field:commission,product_agent_ids:0
196msgid "Recalculate agents commissions "204#: field:product.agent.commission,agent_ids:0
197msgstr "Recalcular comisiones de agentes "205#: field:product.product,product_agent_ids:0
198
199#. module: sale_commission
200#: field:res.partner,commission_ids:0206#: field:res.partner,commission_ids:0
201#: view:res.partner.agent:0207#: view:res.partner.agent:0
202#: field:sale.order,sale_agent_ids:0208#: field:sale.order,sale_agent_ids:0
203#: view:sale.order.agent:0209#: view:sale.order.agent:0
210#: field:sale.order.line,line_agent_ids:0
204#: view:stock.picking:0211#: view:stock.picking:0
205msgid "Agents"212msgid "Agents"
206msgstr "Agentes"213msgstr "Agentes"
207214
208#. module: sale_commission215#. module: sale_commission
209#: code:addons/sale_commission/wizard/wizard_invoice.py:55216#: code:addons/sale_commission/wizard/wizard_invoice.py:56
210#, python-format217#, python-format
211msgid "No Invoices were created"218msgid "No Invoices were created"
212msgstr "No se crearon facturas"219msgstr "No se crearon facturas"
213220
214#. module: sale_commission221#. module: sale_commission
222#: field:settled.invoice.wizard,mode:0
223msgid "A line"
224msgstr "Una linea"
225
226#. module: sale_commission
215#: view:settled.wizard:0227#: view:settled.wizard:0
216msgid "Select period to Settle"228msgid "Select period to Settle"
217msgstr "Seleccionar período a liquidar"229msgstr "Seleccionar período a liquidar"
@@ -220,13 +232,14 @@
220#: model:ir.model,name:sale_commission.model_res_partner232#: model:ir.model,name:sale_commission.model_res_partner
221#: field:res.partner.agent,partner_id:0233#: field:res.partner.agent,partner_id:0
222#: field:sale.agent,partner_id:0234#: field:sale.agent,partner_id:0
235#: field:settled.invoice.agent,partner_id:0
223msgid "Partner"236msgid "Partner"
224msgstr "Empresa"237msgstr "Empresa"
225238
226#. module: sale_commission239#. module: sale_commission
227#: model:ir.model,name:sale_commission.model_sale_order240#: view:sale.order:0
228msgid "Sales Order"241msgid "Agents and Commisions"
229msgstr "Pedido de venta"242msgstr "Agentes y comisiones"
230243
231#. module: sale_commission244#. module: sale_commission
232#: report:settlement.report:0245#: report:settlement.report:0
@@ -287,12 +300,6 @@
287msgstr "Estado"300msgstr "Estado"
288301
289#. module: sale_commission302#. module: sale_commission
290#: code:addons/sale_commission/settled.py:251
291#, python-format
292msgid "Error, partner fail !"
293msgstr "Error, fallo en la empresa !"
294
295#. module: sale_commission
296#: model:ir.model,name:sale_commission.model_stock_picking303#: model:ir.model,name:sale_commission.model_stock_picking
297msgid "Picking List"304msgid "Picking List"
298msgstr "Albarán"305msgstr "Albarán"
@@ -323,6 +330,12 @@
323msgstr "IMPORTE FACTURADO"330msgstr "IMPORTE FACTURADO"
324331
325#. module: sale_commission332#. module: sale_commission
333#: field:commission,type:0
334#: field:sale.agent,type:0
335msgid "Type"
336msgstr "Tipo"
337
338#. module: sale_commission
326#: view:settled.invoice.wizard:0339#: view:settled.invoice.wizard:0
327msgid "Create invoice"340msgid "Create invoice"
328msgstr "Crear factura"341msgstr "Crear factura"
@@ -363,6 +376,11 @@
363msgstr "Comisión por defecto"376msgstr "Comisión por defecto"
364377
365#. module: sale_commission378#. module: sale_commission
379#: selection:settled.invoice.wizard,mode:0
380msgid "for each invoice line settled"
381msgstr "por cada linea de factura liquidada"
382
383#. module: sale_commission
366#: field:settlement,date:0384#: field:settlement,date:0
367msgid "Created Date"385msgid "Created Date"
368msgstr "Fecha de creación"386msgstr "Fecha de creación"
@@ -378,6 +396,11 @@
378msgstr "Código del agente"396msgstr "Código del agente"
379397
380#. module: sale_commission398#. module: sale_commission
399#: view:product.product:0
400msgid "Agents and Products"
401msgstr "Agentes y productos"
402
403#. module: sale_commission
381#: view:settled.wizard:0404#: view:settled.wizard:0
382msgid "Run Settlement Agents"405msgid "Run Settlement Agents"
383msgstr "Ejecutar liquidaciones de agentes"406msgstr "Ejecutar liquidaciones de agentes"
@@ -394,9 +417,9 @@
394msgstr "Agentes de ventas"417msgstr "Agentes de ventas"
395418
396#. module: sale_commission419#. module: sale_commission
397#: constraint:product.product:0420#: model:ir.model,name:sale_commission.model_sale_order
398msgid "Several dimension values for the same dimension type"421msgid "Sales Order"
399msgstr "Varios valores de dimensión para el tipo de la misma dimensión"422msgstr "Pedido de venta"
400423
401#. module: sale_commission424#. module: sale_commission
402#: view:commission:0425#: view:commission:0
@@ -404,15 +427,20 @@
404msgstr "Info. general"427msgstr "Info. general"
405428
406#. module: sale_commission429#. module: sale_commission
430#: view:settlement:0
407#: view:settlement.agent:0431#: view:settlement.agent:0
408#: field:settlement.agent,invoices:0432#: field:settlement.agent,invoices:0
409msgid "Invoices"433msgid "Invoices"
410msgstr "Facturas"434msgstr "Facturas"
411435
412#. module: sale_commission436#. module: sale_commission
413#: field:product.product,commission_exent:0437#: view:account.invoice.line:0
414msgid "Commission exent"438#: field:account.invoice.line,commission_ids:0
415msgstr "Exento de comisiones"439#: view:commission:0
440#: model:ir.ui.menu,name:sale_commission.menu_sale_commissions
441#: model:ir.ui.menu,name:sale_commission.menu_sale_commissions_conf
442msgid "Commissions"
443msgstr "Comisiones"
416444
417#. module: sale_commission445#. module: sale_commission
418#: model:ir.ui.menu,name:sale_commission.menu_settlement446#: model:ir.ui.menu,name:sale_commission.menu_settlement
@@ -437,6 +465,11 @@
437msgstr "TOTAL :"465msgstr "TOTAL :"
438466
439#. module: sale_commission467#. module: sale_commission
468#: report:settlement.report:0
469msgid "PARTNER"
470msgstr "PARTNER"
471
472#. module: sale_commission
440#: model:ir.model,name:sale_commission.model_settled_invoice_wizard473#: model:ir.model,name:sale_commission.model_settled_invoice_wizard
441msgid "settled.invoice.wizard"474msgid "settled.invoice.wizard"
442msgstr "settled.invoice.wizard"475msgstr "settled.invoice.wizard"
@@ -447,9 +480,9 @@
447msgstr "Facturado"480msgstr "Facturado"
448481
449#. module: sale_commission482#. module: sale_commission
450#: view:sale.agent:0483#: field:settled.invoice.agent,invoice_number:0
451msgid "Saleagent"484msgid "Invoice no"
452msgstr "Agente"485msgstr "Factura nº"
453486
454#. module: sale_commission487#. module: sale_commission
455#: field:sale.order.agent,sale_id:0488#: field:sale.order.agent,sale_id:0
@@ -518,7 +551,7 @@
518msgstr "tramos"551msgstr "tramos"
519552
520#. module: sale_commission553#. module: sale_commission
521#: code:addons/sale_commission/settled.py:193554#: code:addons/sale_commission/settled.py:190
522#, python-format555#, python-format
523msgid "You can't delete it, if it isn't in cancel state."556msgid "You can't delete it, if it isn't in cancel state."
524msgstr "No se puede borrar. No está en estado cancelado"557msgstr "No se puede borrar. No está en estado cancelado"
@@ -553,7 +586,17 @@
553msgstr "settled.wizard"586msgstr "settled.wizard"
554587
555#. module: sale_commission588#. module: sale_commission
556#: code:addons/sale_commission/wizard/wizard_invoice.py:55589#: selection:settled.invoice.wizard,mode:0
590msgid "summary for each agent"
591msgstr "resumen por cada agente"
592
593#. module: sale_commission
594#: sql_constraint:stock.picking:0
595msgid "Reference must be unique per Company!"
596msgstr "¡La referencia debe ser única por compañía!"
597
598#. module: sale_commission
599#: code:addons/sale_commission/wizard/wizard_invoice.py:56
557#, python-format600#, python-format
558msgid "Error"601msgid "Error"
559msgstr "Error"602msgstr "Error"
@@ -564,26 +607,24 @@
564msgstr "Entidad o empleado relacionado"607msgstr "Entidad o empleado relacionado"
565608
566#. module: sale_commission609#. module: sale_commission
567#: code:addons/sale_commission/settled.py:252
568#, python-format
569msgid "Agent to settle hasn't assigned partner."
570msgstr "El agente a liquidar no tiene una empresa asignada."
571
572#. module: sale_commission
573#: field:settled.invoice.agent,settlement_agent_id:0610#: field:settled.invoice.agent,settlement_agent_id:0
574msgid "Agent settl."611msgid "Agent settl."
575msgstr "Liq.de agente."612msgstr "Liq.de agente."
576613
577#. module: sale_commission614#. module: sale_commission
615#: field:sale.line.agent,line_id:0
616msgid "Sale order line"
617msgstr "Linea del pedido"
618
619#. module: sale_commission
578#: field:settlement.line,commission:0620#: field:settlement.line,commission:0
579msgid "Quantity"621msgid "Quantity"
580msgstr "Cantidad"622msgstr "Cantidad"
581623
582#. module: sale_commission624#. module: sale_commission
583#: field:commission,type:0625#: sql_constraint:account.invoice:0
584#: field:sale.agent,type:0626msgid "Invoice Number must be unique per Company!"
585msgid "Type"627msgstr "¡El número de factura debe ser único por compañía!"
586msgstr "Tipo"
587628
588#. module: sale_commission629#. module: sale_commission
589#: field:sale.agent,code:0630#: field:sale.agent,code:0
@@ -617,13 +658,9 @@
617msgstr "Factura"658msgstr "Factura"
618659
619#. module: sale_commission660#. module: sale_commission
620#: view:account.invoice.line:0661#: field:product.product,commission_exent:0
621#: field:account.invoice.line,commission_ids:0662msgid "Commission exent"
622#: view:commission:0663msgstr "Exento de comisiones"
623#: model:ir.ui.menu,name:sale_commission.menu_sale_commissions
624#: model:ir.ui.menu,name:sale_commission.menu_sale_commissions_conf
625msgid "Commissions"
626msgstr "Comisiones"
627664
628#. module: sale_commission665#. module: sale_commission
629#: view:recalculate.commission.wizard:0666#: view:recalculate.commission.wizard:0
@@ -634,12 +671,18 @@
634msgstr "Cancelar"671msgstr "Cancelar"
635672
636#. module: sale_commission673#. module: sale_commission
674#: model:ir.model,name:sale_commission.model_sale_line_agent
675msgid "sale.line.agent"
676msgstr "sale.line.agent"
677
678#. module: sale_commission
637#: help:sale.agent,partner_id:0679#: help:sale.agent,partner_id:0
638msgid "Associated partner, is necessary for income invoices."680msgid "Associated partner, is necessary for income invoices."
639msgstr "Empresa asociada, es necesario para las facturas entrantes generadas."681msgstr "Empresa asociada, es necesario para las facturas entrantes generadas."
640682
641#. module: sale_commission683#. module: sale_commission
642#: view:sale.agent:0684#: view:sale.agent:0
685#: view:settlement:0
643#: view:settlement.agent:0686#: view:settlement.agent:0
644#: field:settlement.agent,settlement_id:0687#: field:settlement.agent,settlement_id:0
645msgid "Settlement"688msgid "Settlement"
@@ -651,9 +694,9 @@
651msgstr "Retención aplicada"694msgstr "Retención aplicada"
652695
653#. module: sale_commission696#. module: sale_commission
654#: field:settled.invoice.agent,invoice_number:0697#: sql_constraint:sale.order:0
655msgid "Invoice no"698msgid "Order Reference must be unique per Company!"
656msgstr "Factura nº"699msgstr "¡La referencia del pedido debe ser única por compañía!"
657700
658#. module: sale_commission701#. module: sale_commission
659#: report:settlement.report:0702#: report:settlement.report:0
@@ -661,9 +704,10 @@
661msgstr "FECHA FACTURA"704msgstr "FECHA FACTURA"
662705
663#. module: sale_commission706#. module: sale_commission
664#: code:addons/sale_commission/invoice.py:82707#: code:addons/sale_commission/invoice.py:91
665#: code:addons/sale_commission/partner_agent.py:80708#: code:addons/sale_commission/partner_agent.py:81
666#: code:addons/sale_commission/sale_order.py:67709#: code:addons/sale_commission/sale_order.py:68
710#: code:addons/sale_commission/sale_order.py:152
667#, python-format711#, python-format
668msgid "Fee installments!"712msgid "Fee installments!"
669msgstr "Fee installments!"713msgstr "Fee installments!"
@@ -679,9 +723,10 @@
679msgstr "Líneas de detalle"723msgstr "Líneas de detalle"
680724
681#. module: sale_commission725#. module: sale_commission
682#: code:addons/sale_commission/invoice.py:84726#: code:addons/sale_commission/invoice.py:93
683#: code:addons/sale_commission/partner_agent.py:81727#: code:addons/sale_commission/partner_agent.py:82
684#: code:addons/sale_commission/sale_order.py:68728#: code:addons/sale_commission/sale_order.py:69
729#: code:addons/sale_commission/sale_order.py:153
685#, python-format730#, python-format
686msgid "A commission has been assigned by sections that does not match that defined for the agent by default, so that these sections shall apply only on this bill."731msgid "A commission has been assigned by sections that does not match that defined for the agent by default, so that these sections shall apply only on this bill."
687msgstr "Se ha asignado una comisión por tramos que no coincide con la definida por defecto para el agente, por lo que ese tramo solo se aplica a esta factura"732msgstr "Se ha asignado una comisión por tramos que no coincide con la definida por defecto para el agente, por lo que ese tramo solo se aplica a esta factura"
@@ -693,6 +738,7 @@
693738
694#. module: sale_commission739#. module: sale_commission
695#: model:ir.model,name:sale_commission.model_product_product740#: model:ir.model,name:sale_commission.model_product_product
741#: field:product.agent.commission,product_id:0
696msgid "Product"742msgid "Product"
697msgstr "Producto"743msgstr "Producto"
698744
@@ -702,6 +748,12 @@
702msgstr "Período de liquidación"748msgstr "Período de liquidación"
703749
704#. module: sale_commission750#. module: sale_commission
751#: view:commission:0
752#: view:product.product:0
753msgid "Agents/Commissions"
754msgstr "Agents/Commissions"
755
756#. module: sale_commission
705#: field:sale.agent,customer:0757#: field:sale.agent,customer:0
706msgid "Customer"758msgid "Customer"
707msgstr "Cliente"759msgstr "Cliente"
@@ -758,14 +810,22 @@
758msgstr "Importe liquidado"810msgstr "Importe liquidado"
759811
760#. module: sale_commission812#. module: sale_commission
813#: model:ir.model,name:sale_commission.model_product_agent_commission
814msgid "product.agent.commission"
815msgstr "product.agent.commission"
816
817#. module: sale_commission
761#: field:invoice.line.agent,commission_id:0818#: field:invoice.line.agent,commission_id:0
819#: field:product.agent.commission,commission_id:0
762#: field:res.partner.agent,commission_id:0820#: field:res.partner.agent,commission_id:0
821#: field:sale.line.agent,commission_id:0
763#: field:sale.order.agent,commission_id:0822#: field:sale.order.agent,commission_id:0
764msgid "Applied commission"823msgid "Applied commission"
765msgstr "Comisión aplicada"824msgstr "Comisión aplicada"
766825
767#. module: sale_commission826#. module: sale_commission
768#: field:invoice.line.agent,settled:0827#: field:invoice.line.agent,settled:0
828#: view:settlement:0
769#: selection:settlement,state:0829#: selection:settlement,state:0
770msgid "Settled"830msgid "Settled"
771msgstr "Liquidado"831msgstr "Liquidado"
772832
=== modified file 'sale_commission/invoice.py'
--- sale_commission/invoice.py 2012-07-13 10:51:04 +0000
+++ sale_commission/invoice.py 2014-03-13 12:35:19 +0000
@@ -31,20 +31,25 @@
31 _name = "invoice.line.agent"31 _name = "invoice.line.agent"
3232
33 _columns = {33 _columns = {
34 'invoice_line_id':fields.many2one('account.invoice.line', 'Invoice Line', required=True, ondelete='cascade', help=''),34 'invoice_line_id':fields.many2one('account.invoice.line', 'Invoice Line', required=False, ondelete='cascade', help=''),
35 'invoice_id':fields.related('invoice_line_id', 'invoice_id', type='many2one', relation='account.invoice', string='Invoice'),35 'invoice_id':fields.related('invoice_line_id', 'invoice_id', type='many2one', relation='account.invoice', string='Invoice'),
36 'invoice_date':fields.related('invoice_id',type='date_invoice', readonly=True),36 'invoice_date':fields.related('invoice_id',type='date_invoice', readonly=True),
37 'agent_id': fields.many2one('sale.agent', 'Agent', required=True, ondelete='cascade', help=''),37 'agent_id': fields.many2one('sale.agent', 'Agent', required=True, ondelete='cascade', help=''),
38 'commission_id':fields.many2one('commission', 'Applied commission', required=True, ondelete='cascade', help=''),38 'commission_id':fields.many2one('commission', 'Applied commission', required=True, help=''),
39 'settled':fields.boolean('Settled', readonly=True),39 'settled':fields.boolean('Settled', readonly=True),
40 'quantity':fields.float('Settled amount')40 'quantity':fields.float('Settled amount')
41 }41 }
42 _defaults = {42 _defaults = {
43 'settled': lambda *a: False,43 'settled': lambda *a: False,
44 'quantity':lambda *a: 0
45 }44 }
4645
4746
47 def copy_data(self, cr, uid, id, default=None, context=None):
48 if not default:
49 default = {}
50 default.update({'settled': False})
51 return super(invoice_line_agent, self).copy_data(cr, uid, id, default, context=context)
52
48 def calculate_commission (self, cr, uid, ids):53 def calculate_commission (self, cr, uid, ids):
49 for line_agent in self.browse(cr,uid,ids):54 for line_agent in self.browse(cr,uid,ids):
50 if line_agent.commission_id.type == 'fijo' and line_agent.commission_id.fix_qty:55 if line_agent.commission_id.type == 'fijo' and line_agent.commission_id.fix_qty:
@@ -126,9 +131,15 @@
126 def _refund_cleanup_lines(self, cr, uid, lines):131 def _refund_cleanup_lines(self, cr, uid, lines):
127 """ugly function to map all fields of account.invoice.line when creates refund invoice"""132 """ugly function to map all fields of account.invoice.line when creates refund invoice"""
128 res = super(account_invoice, self)._refund_cleanup_lines(cr, uid, lines)133 res = super(account_invoice, self)._refund_cleanup_lines(cr, uid, lines)
134 # import ipdb; ipdb.set_trace()
129 for line in res:135 for line in res:
130 if 'commission_ids' in line[2]:136 if 'commission_ids' in line[2]:
131 line[2]['commission_ids'] = [(6,0, line[2].get('commission_ids', [])) ]137 duply_ids = []
138 for cm_id in line[2].get('commission_ids', []):
139 dup_id = self.pool.get("invoice.line.agent").copy(cr, uid, cm_id, {'settled': False} )
140 duply_ids.append(dup_id)
141 # line[2]['commission_ids'] = [(6,0, line[2].get('commission_ids', [])) ]
142 line[2]['commission_ids'] = [(6,0, duply_ids) ]
132 143
133 return res144 return res
134145
135146
=== modified file 'sale_commission/partner_agent.py'
--- sale_commission/partner_agent.py 2012-07-13 10:51:04 +0000
+++ sale_commission/partner_agent.py 2014-03-13 12:35:19 +0000
@@ -50,7 +50,7 @@
50 _columns = {50 _columns = {
51 'partner_id':fields.many2one('res.partner', 'Partner', required=True, ondelete='cascade', help='', select=1),51 'partner_id':fields.many2one('res.partner', 'Partner', required=True, ondelete='cascade', help='', select=1),
52 'agent_id':fields.many2one('sale.agent', 'Agent', required=True, ondelete='cascade', help=''),52 'agent_id':fields.many2one('sale.agent', 'Agent', required=True, ondelete='cascade', help=''),
53 'commission_id':fields.many2one('commission', 'Applied commission', required=True, ondelete='cascade', help=''),53 'commission_id':fields.many2one('commission', 'Applied commission', required=True, help=''),
54 'type': fields.related('agent_id', 'type', type="selection", selection=[('asesor', 'Adviser'), ('comercial', 'Commercial')], readonly=True,54 'type': fields.related('agent_id', 'type', type="selection", selection=[('asesor', 'Adviser'), ('comercial', 'Commercial')], readonly=True,
55 store={'sale.agent': (_get_partner_agents_to_update_from_sale_agents, ['type'], 10),55 store={'sale.agent': (_get_partner_agents_to_update_from_sale_agents, ['type'], 10),
56 'res.partner.agent': (lambda self, cr, uid, ids, c={}: ids, None, 20)})56 'res.partner.agent': (lambda self, cr, uid, ids, c={}: ids, None, 20)})
5757
=== added file 'sale_commission/product.py'
--- sale_commission/product.py 1970-01-01 00:00:00 +0000
+++ sale_commission/product.py 2014-03-13 12:35:19 +0000
@@ -0,0 +1,47 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2011 Pexego Sistemas Informáticos (<http://www.pexego.es>). All Rights Reserved
6# $Id$
7#
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.
12#
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.
17#
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/>.
20#
21##############################################################################
22
23"""Modificamos las ventas para incluir el comportamiento de comisiones"""
24from osv import fields, osv
25
26class product_agent_commission(osv.osv):
27 _name = "product.agent.commission"
28 _rec_name = "commission_id"
29
30 _columns = {
31 'product_id':fields.many2one('product.product', 'Product', required=False, ondelete='cascade', help=''),
32 'commission_id':fields.many2one('commission', 'Applied commission', required=True, help=''),
33 'agent_ids':fields.many2many('sale.agent', 'product_agent_sale_agent_rel', 'product_commission_id','agent_id','Agents'),
34 }
35
36product_agent_commission()
37
38class product_product(osv.osv):
39
40 _inherit = 'product.product'
41 _columns = {
42 'product_agent_ids':fields.one2many('product.agent.commission', 'product_id', 'Agents')
43 }
44
45
46product_product()
47
048
=== modified file 'sale_commission/product_view.xml'
--- sale_commission/product_view.xml 2012-07-13 10:51:04 +0000
+++ sale_commission/product_view.xml 2014-03-13 12:35:19 +0000
@@ -11,6 +11,30 @@
11 <field name="company_id" position="after">11 <field name="company_id" position="after">
12 <field name="commission_exent"/>12 <field name="commission_exent"/>
13 </field>13 </field>
14
15 <xpath expr="/form/notebook/page[@string='Procurement &amp; Locations']/group[3]" position="after">
16 <group colspan="2" col="2">
17 <separator colspan="2" string="Agents/Commissions"/>
18 <field name="product_agent_ids" nolabel="1" mode="tree,form">
19 <tree string="Agents and Products" editable="top">
20 <!-- <field name="agent_ids" on_change="onchange_agent_id(agent_id)"/>
21 <field name="commission_id" on_change="onchange_commission_id(agent_id,commission_id)"/> -->
22 <field name="agent_ids">
23 <tree>
24 <field name="name"/>
25 </tree>
26 </field>
27 <field name="commission_id"/>
28 </tree>
29 <form>
30 <field name="commission_id"/>
31 <separator colspan="4" string="Agents/Commissions"/>
32 <field name="agent_ids" colspan="4" nolabel="1"/>
33
34 </form>
35 </field>
36 </group>
37 </xpath>
14 </field>38 </field>
15 </record>39 </record>
1640
1741
=== modified file 'sale_commission/sale_order.py'
--- sale_commission/sale_order.py 2013-11-20 16:40:20 +0000
+++ sale_commission/sale_order.py 2014-03-13 12:35:19 +0000
@@ -40,7 +40,7 @@
40 _columns = {40 _columns = {
41 'sale_id':fields.many2one('sale.order', 'Sale order', required=False, ondelete='cascade', help=''),41 'sale_id':fields.many2one('sale.order', 'Sale order', required=False, ondelete='cascade', help=''),
42 'agent_id':fields.many2one('sale.agent', 'Agent', required=True, ondelete='cascade', help=''),42 'agent_id':fields.many2one('sale.agent', 'Agent', required=True, ondelete='cascade', help=''),
43 'commission_id':fields.many2one('commission', 'Applied commission', required=True, ondelete='cascade', help=''),43 'commission_id':fields.many2one('commission', 'Applied commission', required=True, help=''),
44 }44 }
4545
46 def onchange_agent_id(self, cr, uid, ids, agent_id):46 def onchange_agent_id(self, cr, uid, ids, agent_id):
@@ -80,7 +80,6 @@
80 'sale_agent_ids':fields.one2many('sale.order.agent', 'sale_id', 'Agents', states={'draft': [('readonly', False)]})80 'sale_agent_ids':fields.one2many('sale.order.agent', 'sale_id', 'Agents', states={'draft': [('readonly', False)]})
81 }81 }
8282
83
84 def onchange_partner_id(self, cr, uid, ids, part):83 def onchange_partner_id(self, cr, uid, ids, part):
85 """heredamos el evento de cambio del campo partner_id para actualizar el campo agent_id"""84 """heredamos el evento de cambio del campo partner_id para actualizar el campo agent_id"""
86 sale_agent_ids=[]85 sale_agent_ids=[]
@@ -116,36 +115,149 @@
116 self.pool.get('stock.picking').write(cr, uid, pickings, {'agent_ids': [[6, 0, agents]] })115 self.pool.get('stock.picking').write(cr, uid, pickings, {'agent_ids': [[6, 0, agents]] })
117 return res116 return res
118117
118 def create(self, cr, uid, values, context=None):
119 """
120 Para que el cliente gtk no borre el agente al darle a guardar
121 """
122 res = super(sale_order, self).create(cr, uid, values, context=context)
123 if 'sale_agent_ids' in values:
124 for sale_order_agent in values['sale_agent_ids']:
125 self.pool.get('sale.order.agent').write(cr, uid, sale_order_agent[1], {'sale_id':res})
126 return res
127
119sale_order()128sale_order()
120129
130class sale_line_agent(osv.osv):
131 _name = "sale.line.agent"
132 _rec_name = "agent_id"
133
134 _columns = {
135 'line_id':fields.many2one('sale.order.line', 'Sale order line', required=False, ondelete='cascade', help=''),
136 'agent_id':fields.many2one('sale.agent', 'Agent', required=True, ondelete='cascade', help=''),
137 'commission_id':fields.many2one('commission', 'Applied commission', required=True, help=''),
138 }
139
140 def onchange_agent_id(self, cr, uid, ids, agent_id):
141 """al cambiar el agente cargamos sus comisión"""
142 result = {}
143 v = {}
144 if agent_id:
145 agent = self.pool.get('sale.agent').browse(cr, uid, agent_id)
146 v['commission_id'] = agent.commission.id
147
148 result['value'] = v
149 return result
150
151 def onchange_commission_id(self, cr, uid, ids, agent_id=False, commission_id=False):
152 """al cambiar la comisión comprobamos la selección"""
153 result = {}
154
155 if commission_id:
156 partner_commission = self.pool.get('commission').browse(cr, uid, commission_id)
157 if partner_commission.sections:
158 if agent_id:
159 agent = self.pool.get('sale.agent').browse(cr, uid, agent_id)
160 if agent.commission.id != partner_commission.id:
161 result['warning'] = {}
162 result['warning']['title'] = _('Fee installments!')
163 result['warning']['message'] = _('A commission has been assigned by sections that does not match that defined for the agent by default, so that these sections shall apply only on this bill.')
164 return result
165sale_line_agent()
166
121167
122class sale_order_line(osv.osv):168class sale_order_line(osv.osv):
123 """Modificamos las lineas ventas para incluir las comisiones en las facturas creadas desde ventas"""169 """Modificamos las lineas ventas para incluir las comisiones en las facturas creadas desde ventas"""
124170
125 _inherit = "sale.order.line"171 _inherit = "sale.order.line"
126172 _columns = {
173 'line_agent_ids':fields.one2many('sale.line.agent', 'line_id', 'Agents', states={'draft': [('readonly', False)]})
174 }
127175
128 def invoice_line_create(self, cr, uid, ids, context=None):176 def invoice_line_create(self, cr, uid, ids, context=None):
129 if context is None:177 if context is None:
130 context = {}178 context = {}
131179
132 res = super(sale_order_line, self).invoice_line_create(cr, uid, ids, context)180 res = super(sale_order_line, self).invoice_line_create(cr, uid, ids, context)
133 so_ref = self.browse(cr,uid,ids)[0].order_id181 for inv_line in self.pool.get('account.invoice.line').browse(cr, uid, res):
134 for so_agent_id in so_ref.sale_agent_ids:182 list_ids = [x.id for x in inv_line.commission_ids]
135 inv_lines = self.pool.get('account.invoice.line').browse(cr, uid, res)183 self.pool.get('invoice.line.agent').calculate_commission(cr,uid,list_ids)
136 for inv_line in inv_lines:184 return res
137 if inv_line.product_id and inv_line.product_id.commission_exent != True:185
138 vals = {186 def _create_invoice_line_agent(self,cr,uid,ids,agent_id,commission_id):
139 'invoice_line_id': inv_line.id,187 vals = {
140 'agent_id': so_agent_id.agent_id.id,188 'agent_id' : agent_id,
141 'commission_id': so_agent_id.commission_id.id,189 'commission_id' :commission_id,
142 'settled': False190 'settled': False
143 }191 }
144 line_agent_id=self.pool.get('invoice.line.agent').create(cr, uid, vals)192 line_agent_id=self.pool.get('invoice.line.agent').create(cr, uid, vals)
145 self.pool.get('invoice.line.agent').calculate_commission(cr, uid, [line_agent_id])193 return line_agent_id
194
195 def _prepare_order_line_invoice_line(self, cr, uid, line, account_id=False, context=None):
196 res = super(sale_order_line,self)._prepare_order_line_invoice_line(cr,uid,line,account_id,context)
197 list_ids = []
198 if not line.product_id.commission_exent:
199 if not line.line_agent_ids: #si la linea no tiene comissiones arrastro los del pedido a la linea de factura
200 for so_comm in line.order_id.sale_agent_ids:
201 line_agent_id= self._create_invoice_line_agent(cr,uid,[],so_comm.agent_id.id,so_comm.commission_id.id)
202 list_ids.append(line_agent_id)
203
204 else:
205 for l_comm in line.line_agent_ids:
206 line_agent_id= self._create_invoice_line_agent(cr,uid,[],l_comm.agent_id.id,l_comm.commission_id.id)
207 list_ids.append(line_agent_id)
208 res['commission_ids'] = [(6,0,list_ids)]
209 return res
210
211 def _create_line_commission(self,cr,uid,ids,agent_id,commission_id):
212 sale_line_agent = self.pool.get("sale.line.agent")
213 vals={
214 'agent_id' : agent_id,
215 'commission_id' : commission_id
216 }
217 if ids:
218 vals['line_id'] = ids[0]
219 return sale_line_agent.create(cr,uid,vals)
220 def product_id_change2(self, cr, uid, ids,pricelist, product, qty=0,
221 uom=False, qty_uos=0, uos=False, name='', partner_id=False,
222 lang=False, update_tax=True, date_order=False, packaging=False, fiscal_position=False, flag=False,sale_agent_ids=False,context=None):
223 res = super(sale_order_line, self).product_id_change(cr, uid, ids, pricelist, product, qty,uom, qty_uos, uos, name, partner_id,lang, update_tax, date_order,packaging,fiscal_position,flag,context)
224 if product:
225 list_agent_ids = []
226 product_obj = self.pool.get("product.product").browse(cr,uid,product)
227 # order_obj = self.pool.get("sale.order").browse(cr,uid,context['order_id'])
228 sale_line_agent = self.pool.get("sale.line.agent")
229 if ids:
230 sale_line_agent.unlink(cr,uid,sale_line_agent.search(cr,uid,[('line_id','in',ids)]))
231 res['value']['line_agent_ids'] = []
232 if not product_obj.commission_exent:
233 order_comm_ids = [x[1] for x in sale_agent_ids if x[0] != 2]
234 order_agent_ids = [ x.agent_id.id for x in self.pool.get("sale.order.agent").browse(cr,uid,order_comm_ids)]
235 # order_agent_ids = [x.agent_id.id for x in order_obj.sale_agent_ids]
236 dic= {}
237 for prod_record in product_obj.product_agent_ids:
238 if not prod_record.agent_ids: #no hay agentes especificados para la comisión: se usan los agentes del pedido
239 for agent_id in order_agent_ids:
240 if agent_id not in dic:
241 dic[agent_id] = prod_record.commission_id.id
242 else:
243 for agent_id in prod_record.agent_ids:
244 if agent_id.id in order_agent_ids:
245 dic[agent_id.id] = prod_record.commission_id.id
246
247 for k in dic:
248 line_agent_id = self._create_line_commission(cr,uid,ids,k,dic[k])
249 list_agent_ids.append(int(line_agent_id))
250 res['value']['line_agent_ids'] = list_agent_ids
251 return res
252
253 def create(self, cr, uid, values, context=None):
254 """
255 Para que el cliente gtk no borre el agente de la linea al darle a guardar
256 """
257 res = super(sale_order_line, self).create(cr, uid, values, context=context)
258 if 'line_agent_ids' in values:
259 for sale_line_agent in values['line_agent_ids']:
260 self.pool.get('sale.line.agent').write(cr, uid, sale_line_agent[1], {'line_id':res})
146 return res261 return res
147262
148sale_order_line()263sale_order_line()
149
150
151
152264
=== modified file 'sale_commission/sale_order_view.xml'
--- sale_commission/sale_order_view.xml 2012-07-13 10:51:04 +0000
+++ sale_commission/sale_order_view.xml 2014-03-13 12:35:19 +0000
@@ -2,19 +2,6 @@
2<openerp>2<openerp>
3 <data>3 <data>
44
5 <!--record id="view_order_comm_tree" model="ir.ui.view">
6 <field name="name">sale.order.comm.tree</field>
7 <field name="model">sale.order</field>
8 <field name="inherit_id" ref="sale.view_order_tree"/>
9 <field name="type">tree</field>
10 <field name="arch" type="xml">
11 <field name="partner_shipping_id" position="after">
12 <field name="agent_code" select="2"/>
13 <field name="country" select="2"/>
14 </field>
15 </field>
16 </record-->
17
18 <record id="view_order_agent_form_inherit" model="ir.ui.view">5 <record id="view_order_agent_form_inherit" model="ir.ui.view">
19 <field name="name">sale.agent.order.inherit.form</field>6 <field name="name">sale.agent.order.inherit.form</field>
20 <field name="model">sale.order</field>7 <field name="model">sale.order</field>
@@ -32,6 +19,19 @@
32 </field>19 </field>
33 </group>20 </group>
34 </field>21 </field>
22 <xpath expr="//field[@name='order_line']/form/notebook/page[@string='History']" position="after">
23 <page string='Agents and Commisions'>
24 <field name="line_agent_ids" nolabel="1" colspan="4">
25 <tree string="Agents and Commissions" editable="top">
26 <field name="agent_id" on_change="onchange_agent_id(agent_id)" />
27 <field name="commission_id" on_change="onchange_commission_id(agent_id,commission_id)"/>
28 </tree>
29 </field>
30 </page>
31 </xpath>
32 <xpath expr="//field[@name='order_line']/form/notebook/page[@string='Order Line']/group[1]/field[@name='product_id']" position="replace">
33 <field colspan="3" context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'shop':parent.shop_id, 'uom':product_uom, 'force_product_uom': True,'order_id': parent.id,'sale_agent_ids': parent.sale_agent_ids}" name="product_id" on_change="product_id_change2(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, True, parent.date_order, product_packaging, parent.fiscal_position, False,parent.sale_agent_ids,context)"/>
34 </xpath>
35 </field>35 </field>
36 </record>36 </record>
3737
3838
=== modified file 'sale_commission/saleagent.py'
--- sale_commission/saleagent.py 2012-07-13 10:51:04 +0000
+++ sale_commission/saleagent.py 2014-03-13 12:35:19 +0000
@@ -32,7 +32,8 @@
32 'name': fields.char('Name', size=64, required=True),32 'name': fields.char('Name', size=64, required=True),
33 'type': fields.selection((('fijo', 'Fix percentage'), ('tramos', 'By sections')), 'Type', required=True),33 'type': fields.selection((('fijo', 'Fix percentage'), ('tramos', 'By sections')), 'Type', required=True),
34 'fix_qty': fields.float('Fix Percentage'),34 'fix_qty': fields.float('Fix Percentage'),
35 'sections': fields.one2many('commission.section', 'commission_id', 'Sections')35 'sections': fields.one2many('commission.section', 'commission_id', 'Sections'),
36 'product_agent_ids':fields.one2many('product.agent.commission', 'commission_id', 'Agents')
36 }37 }
37 _defaults = {38 _defaults = {
38 'type' : lambda *a: 'fijo',39 'type' : lambda *a: 'fijo',
@@ -40,9 +41,8 @@
4041
41 def calcula_tramos(self, cr, uid, ids, base):42 def calcula_tramos(self, cr, uid, ids, base):
42 commission = self.browse(cr, uid, ids)[0]43 commission = self.browse(cr, uid, ids)[0]
43 #Cálculo de tramos
44 for section in commission.sections:44 for section in commission.sections:
45 if base >= section.commission_from and (base < section.commission_until or section.commission_until == 0):45 if abs(base) >= section.commission_from and (abs(base) < section.commission_until or section.commission_until == 0):
46 res = base * section.percent / 100.046 res = base * section.percent / 100.0
47 return res47 return res
48 return 0.048 return 0.0
@@ -59,7 +59,7 @@
59 'commission_from': fields.float('From'),59 'commission_from': fields.float('From'),
60 'commission_until': fields.float('Until'),60 'commission_until': fields.float('Until'),
61 'percent': fields.float('Percent'),61 'percent': fields.float('Percent'),
62 'commission_id': fields.many2one('commission', 'Commission')62 'commission_id': fields.many2one('commission', 'Commission', required=True)
6363
64 }64 }
6565
6666
=== modified file 'sale_commission/saleagent_view.xml'
--- sale_commission/saleagent_view.xml 2012-07-13 10:51:04 +0000
+++ sale_commission/saleagent_view.xml 2014-03-13 12:35:19 +0000
@@ -128,7 +128,21 @@
128 </tree>128 </tree>
129 </field>129 </field>
130 </group>130 </group>
131 131 <field name="product_agent_ids" nolabel="1" colspan="4">
132 <tree string="Agents and Commissions" editable="top">
133 <field name="agent_ids">
134 <tree>
135 <field name="name"/>
136 </tree>
137 </field>
138 <field name="product_id"/>
139 </tree>
140 <form>
141 <field name="product_id"/>
142 <separator colspan="4" string="Agents/Commissions"/>
143 <field name="agent_ids" colspan="4" nolabel="1"/>
144 </form>
145 </field>
132 </form>146 </form>
133 </field>147 </field>
134 </record>148 </record>
135149
=== modified file 'sale_commission/security/ir.model.access.csv'
--- sale_commission/security/ir.model.access.csv 2012-07-13 10:51:04 +0000
+++ sale_commission/security/ir.model.access.csv 2014-03-13 12:35:19 +0000
@@ -26,3 +26,6 @@
26"access_settled_invoice_agent_salesman","access_settled_invoice_agent_salesman","model_settled_invoice_agent","base.group_sale_salesman",1,0,0,026"access_settled_invoice_agent_salesman","access_settled_invoice_agent_salesman","model_settled_invoice_agent","base.group_sale_salesman",1,0,0,0
27"access_settled_invoice_agent_sale_manager","access_settled_invoice_agent_sale_manager","model_settled_invoice_agent","base.group_sale_manager",1,1,1,127"access_settled_invoice_agent_sale_manager","access_settled_invoice_agent_sale_manager","model_settled_invoice_agent","base.group_sale_manager",1,1,1,1
28"access_settled_invoice_agent_partner_manager","access_settled_invoice_agent_partner_manager","model_settled_invoice_agent","base.group_partner_manager",1,0,0,028"access_settled_invoice_agent_partner_manager","access_settled_invoice_agent_partner_manager","model_settled_invoice_agent","base.group_partner_manager",1,0,0,0
29"access_sale_line_agent_salesman","access_sale_line_agent_salesman","model_sale_line_agent","base.group_sale_salesman",1,1,1,1
30"access_product_agent_commission_salesman","access_product_agent_commission_salesman","model_product_agent_commission","base.group_sale_salesman",1,0,0,0
31"access_product_agent_commission_sale_manager","access_product_agent_commission_sale_manager","model_product_agent_commission","base.group_sale_manager",1,1,1,1
29\ No newline at end of file32\ No newline at end of file
3033
=== modified file 'sale_commission/settled.py'
--- sale_commission/settled.py 2013-10-16 10:36:21 +0000
+++ sale_commission/settled.py 2014-03-13 12:35:19 +0000
@@ -94,14 +94,13 @@
94 'INNER JOIN invoice_line_agent ON invoice_line_agent.invoice_line_id=account_invoice_line.id ' \94 'INNER JOIN invoice_line_agent ON invoice_line_agent.invoice_line_id=account_invoice_line.id ' \
95 'INNER JOIN account_invoice ON account_invoice_line.invoice_id = account_invoice.id ' \95 'INNER JOIN account_invoice ON account_invoice_line.invoice_id = account_invoice.id ' \
96 'WHERE invoice_line_agent.agent_id in (' + ",".join(map(str, context['active_ids'])) + ') AND invoice_line_agent.settled=False ' \96 'WHERE invoice_line_agent.agent_id in (' + ",".join(map(str, context['active_ids'])) + ') AND invoice_line_agent.settled=False ' \
97 'AND account_invoice.state<>\'draft\' AND account_invoice.type=\'out_invoice\''\97 'AND account_invoice.state not in (\'draft\',\'cancel\') AND account_invoice.type in (\'out_invoice\',\'out_refund\')'\
98 'AND account_invoice.date_invoice >= \'' + o.date_from + '\' AND account_invoice.date_invoice <= \'' + o.date_to +'\''\98 'AND account_invoice.date_invoice >= \'' + o.date_from + '\' AND account_invoice.date_invoice <= \'' + o.date_to +'\''\
99 ' AND account_invoice.company_id = ' + str(user.company_id.id)99 ' AND account_invoice.company_id = ' + str(user.company_id.id)
100100
101 cr.execute(sql)101 cr.execute(sql)
102 res = cr.fetchall()102 res = cr.fetchall()
103 inv_line_agent_ids = [x[0] for x in res]103 inv_line_agent_ids = [x[0] for x in res]
104
105 self.pool.get ('invoice.line.agent').calculate_commission( cr, uid, inv_line_agent_ids)104 self.pool.get ('invoice.line.agent').calculate_commission( cr, uid, inv_line_agent_ids)
106105
107106
@@ -141,13 +140,13 @@
141 'state': lambda *a: 'settled'140 'state': lambda *a: 'settled'
142 }141 }
143142
144 def action_invoice_create(self, cursor, user, ids, journal_id, product_id, context=None):143 def action_invoice_create(self, cursor, user, ids, journal_id, product_id,mode,context=None):
145144
146 agents_pool=self.pool.get('settlement.agent')145 agents_pool=self.pool.get('settlement.agent')
147 res={}146 res={}
148 for settlement in self.browse(cursor, user, ids, context=context):147 for settlement in self.browse(cursor, user, ids, context=context):
149 settlement_agent_ids = map(lambda x: x.id, settlement.settlement_agent_id)148 settlement_agent_ids = map(lambda x: x.id, settlement.settlement_agent_id)
150 invoices_agent = agents_pool.action_invoice_create(cursor, user, settlement_agent_ids, journal_id, product_id)149 invoices_agent = agents_pool.action_invoice_create(cursor, user, settlement_agent_ids, journal_id, product_id,mode)
151150
152 res[settlement.id] = invoices_agent.values()151 res[settlement.id] = invoices_agent.values()
153 return res152 return res
@@ -198,7 +197,7 @@
198 """Liquidaciones de Agentes"""197 """Liquidaciones de Agentes"""
199198
200 _name = 'settlement.agent'199 _name = 'settlement.agent'
201200 _rec_name = 'agent_id'
202 def _invoice_line_hook(self, cursor, user, move_line, invoice_line_id):201 def _invoice_line_hook(self, cursor, user, move_line, invoice_line_id):
203 '''Call after the creation of the invoice line'''202 '''Call after the creation of the invoice line'''
204 return203 return
@@ -232,7 +231,7 @@
232 return False231 return False
233232
234233
235 def action_invoice_create(self, cursor, user, ids, journal_id, product_id, context=None):234 def action_invoice_create(self, cursor, user, ids, journal_id, product_id,mode,context=None):
236 '''Return ids of created invoices for the settlements'''235 '''Return ids of created invoices for the settlements'''
237236
238 invoice_obj = self.pool.get('account.invoice')237 invoice_obj = self.pool.get('account.invoice')
@@ -241,12 +240,12 @@
241 res = {}240 res = {}
242241
243 for settlement in self.browse(cursor, user, ids, context=context):242 for settlement in self.browse(cursor, user, ids, context=context):
244243 if (not settlement.total_sections) and (not settlement.total):
244 continue
245 payment_term_id = False245 payment_term_id = False
246 partner = settlement.agent_id and settlement.agent_id.partner_id246 partner = settlement.agent_id and settlement.agent_id.partner_id
247 if not partner:247 if not partner:
248 raise osv.except_osv(_('Error, partner fail !'),248 continue
249 _('Agent to settle hasn\'t assigned partner.'))
250249
251 #El tipo es de facura de proveedor250 #El tipo es de facura de proveedor
252 account_id = partner.property_account_payable.id251 account_id = partner.property_account_payable.id
@@ -299,31 +298,50 @@
299 )298 )
300 else:299 else:
301 tax_ids = map(lambda x: x.id, taxes)300 tax_ids = map(lambda x: x.id, taxes)
302 for invoice in settlement.invoices:301
303 origin = invoice.invoice_number302 account_id = self.pool.get('account.fiscal.position').map_account(cursor, user, partner.property_account_position, account_id)
304 name = invoice.invoice_number303 uos_id = False #set UoS if it's a sale and the picking doesn't have one
305 price_unit = invoice.settled_amount304 if mode == 'invoice':
306 discount = 0305 for invoice in settlement.invoices:
307306 invoice_line_id = invoice_line_obj.create(cursor, user, {
308 #set UoS if it's a sale and the picking doesn't have one307 'name': invoice.invoice_number,
309 uos_id = False308 'origin': invoice.invoice_number,
310309 'invoice_id': invoice_id,
311 account_id = self.pool.get('account.fiscal.position').map_account(cursor, user, partner.property_account_position, account_id)310 'uos_id': uos_id,
311 'product_id': product.id,
312 'account_id': account_id,
313 'price_unit': invoice.settled_amount,
314 'discount': 0,
315 'quantity': 1,
316 'invoice_line_tax_id': [(6, 0, tax_ids)],
317 }, context=context)
318 elif mode == 'line':
319 for line in settlement.lines:
320 invoice_line_id = invoice_line_obj.create(cursor, user, {
321 'name': line.invoice_id.number,
322 'origin': line.invoice_id.number,
323 'invoice_id': invoice_id,
324 'uos_id': uos_id,
325 'product_id': product.id,
326 'account_id': account_id,
327 'price_unit': line.commission,
328 'discount': 0,
329 'quantity': 1,
330 'invoice_line_tax_id': [(6, 0, tax_ids)],
331 }, context=context)
332 elif mode == 'agent':
312 invoice_line_id = invoice_line_obj.create(cursor, user, {333 invoice_line_id = invoice_line_obj.create(cursor, user, {
313 'name': name,334 'name': settlement.settlement_id.name or '',
314 'origin': origin,335 'origin': settlement.settlement_id.name or '',
315 'invoice_id': invoice_id,336 'invoice_id': invoice_id,
316 'uos_id': uos_id,337 'uos_id': uos_id,
317 'product_id': product.id,338 'product_id': product.id,
318 'account_id': account_id,339 'account_id': account_id,
319 'price_unit': price_unit,340 'price_unit': settlement.total,
320 'discount': discount,341 'discount': 0,
321 'quantity': 1,342 'quantity': 1,
322 'invoice_line_tax_id': [(6, 0, tax_ids)],343 'invoice_line_tax_id': [(6, 0, tax_ids)],
323 #'account_analytic_id': account_analytic_id,344 }, context=context)
324 }, context=context)
325 self._invoice_line_hook(cursor, user, invoice, invoice_line_id)
326
327 invoice_obj.button_compute(cursor, user, [invoice_id], context=context,345 invoice_obj.button_compute(cursor, user, [invoice_id], context=context,
328 set_total=(type in ('in_invoice', 'in_refund')))346 set_total=(type in ('in_invoice', 'in_refund')))
329 self._invoice_hook(cursor, user, settlement, invoice_id)347 self._invoice_hook(cursor, user, settlement, invoice_id)
@@ -338,7 +356,7 @@
338 'INNER JOIN invoice_line_agent ON invoice_line_agent.invoice_line_id=account_invoice_line.id ' \356 'INNER JOIN invoice_line_agent ON invoice_line_agent.invoice_line_id=account_invoice_line.id ' \
339 'INNER JOIN account_invoice ON account_invoice_line.invoice_id = account_invoice.id ' \357 'INNER JOIN account_invoice ON account_invoice_line.invoice_id = account_invoice.id ' \
340 'WHERE invoice_line_agent.agent_id=' + str(set_agent.agent_id.id) + ' AND invoice_line_agent.settled=True ' \358 'WHERE invoice_line_agent.agent_id=' + str(set_agent.agent_id.id) + ' AND invoice_line_agent.settled=True ' \
341 'AND account_invoice.state<>\'draft\' AND account_invoice.type=\'out_invoice\''\359 'AND account_invoice.state not in (\'draft\',\'cancel\') AND account_invoice.type=\'out_invoice\''\
342 'AND account_invoice.date_invoice >= \'' + date_from + '\' AND account_invoice.date_invoice <= \'' + date_to +'\''\360 'AND account_invoice.date_invoice >= \'' + date_from + '\' AND account_invoice.date_invoice <= \'' + date_to +'\''\
343 ' AND account_invoice.company_id = ' + str(user.company_id.id)361 ' AND account_invoice.company_id = ' + str(user.company_id.id)
344362
@@ -352,13 +370,14 @@
352 'INNER JOIN invoice_line_agent ON invoice_line_agent.invoice_line_id=account_invoice_line.id ' \370 'INNER JOIN invoice_line_agent ON invoice_line_agent.invoice_line_id=account_invoice_line.id ' \
353 'INNER JOIN account_invoice ON account_invoice_line.invoice_id = account_invoice.id ' \371 'INNER JOIN account_invoice ON account_invoice_line.invoice_id = account_invoice.id ' \
354 'WHERE invoice_line_agent.agent_id=' + str(set_agent.agent_id.id) + ' AND invoice_line_agent.settled=False ' \372 'WHERE invoice_line_agent.agent_id=' + str(set_agent.agent_id.id) + ' AND invoice_line_agent.settled=False ' \
355 'AND account_invoice.state<>\'draft\' AND account_invoice.type=\'out_invoice\''\373 'AND account_invoice.state not in (\'draft\',\'cancel\') AND account_invoice.type in (\'out_invoice\',\'out_refund\')'\
356 'AND account_invoice.date_invoice >= \'' + date_from + '\' AND account_invoice.date_invoice <= \'' + date_to +'\''\374 'AND account_invoice.date_invoice >= \'' + date_from + '\' AND account_invoice.date_invoice <= \'' + date_to +'\''\
357 ' AND account_invoice.company_id = ' + str(user.company_id.id)375 ' AND account_invoice.company_id = ' + str(user.company_id.id)
358 376
359 cr.execute(sql)377 cr.execute(sql)
360 res = cr.fetchall()378 res = cr.fetchall()
361 inv_line_ids = [x[0] for x in res]379 inv_line_ids = [x[0] for x in res]
380
362 total_per = 0381 total_per = 0
363 total_sections = 0382 total_sections = 0
364 total = 0383 total = 0
@@ -380,14 +399,17 @@
380 if line.commission_id.type == "tramos":399 if line.commission_id.type == "tramos":
381 if line.invoice_line_id.product_id.commission_exent != True:400 if line.invoice_line_id.product_id.commission_exent != True:
382 # Hacemos un agregado de la base de cálculo agrupándolo por las distintas comisiones en tramos que tenga el agente asignadas401 # Hacemos un agregado de la base de cálculo agrupándolo por las distintas comisiones en tramos que tenga el agente asignadas
402 if line.invoice_line_id.invoice_id.type == 'out_refund':
403 sign_price = - line.invoice_line_id.price_subtotal
404 else:
405 sign_price = line.invoice_line_id.price_subtotal
406
383 if line.commission_id.id in sections:407 if line.commission_id.id in sections:
384 sections[line.commission_id.id]['base'] = sections[line.commission_id.id]['base'] + line.invoice_line_id.price_subtotal408 sections[line.commission_id.id]['base'] = sections[line.commission_id.id]['base'] + sign_price
385 sections[line.commission_id.id]['lines'].append(line) # Añade la línea de la que se añade esta base para el cálculo por tramos409 sections[line.commission_id.id]['lines'].append(line) # Añade la línea de la que se añade esta base para el cálculo por tramos
386 else:410 else:
387 sections[line.commission_id.id] = {'type': line.commission_id, 'base':line.invoice_line_id.price_subtotal, 'lines':[line]}411 sections[line.commission_id.id] = {'type': line.commission_id, 'base':sign_price, 'lines':[line]}
388
389 #Tramos para cada tipo de comisión creados 412 #Tramos para cada tipo de comisión creados
390
391 for tramo in sections:413 for tramo in sections:
392 #Cálculo de la comisión para cada tramo414 #Cálculo de la comisión para cada tramo
393 sections[tramo].update({'commission': sections[tramo]['type'].calcula_tramos(sections[tramo]['base'])})415 sections[tramo].update({'commission': sections[tramo]['type'].calcula_tramos(sections[tramo]['base'])})
@@ -395,7 +417,7 @@
395 # reparto de la comisión para cada linea417 # reparto de la comisión para cada linea
396 418
397 for linea_tramo in sections[tramo]['lines']:419 for linea_tramo in sections[tramo]['lines']:
398 com_por_linea = sections[tramo]['commission']* (linea_tramo.invoice_line_id.price_subtotal/sections[tramo]['base'])420 com_por_linea = sections[tramo]['commission']* (linea_tramo.invoice_line_id.price_subtotal/(abs(sections[tramo]['base']) or 1.0))
399 linea_tramo.write({'commission':com_por_linea})421 linea_tramo.write({'commission':com_por_linea})
400 inv_ag_ids = self.pool.get('invoice.line.agent').search(cr, uid, [('invoice_line_id', '=', linea_tramo.invoice_line_id.id), ('agent_id', '=', set_agent.agent_id.id)])422 inv_ag_ids = self.pool.get('invoice.line.agent').search(cr, uid, [('invoice_line_id', '=', linea_tramo.invoice_line_id.id), ('agent_id', '=', set_agent.agent_id.id)])
401 self.pool.get('invoice.line.agent').write(cr, uid, inv_ag_ids, {'settled': True, 'quantity': com_por_linea})423 self.pool.get('invoice.line.agent').write(cr, uid, inv_ag_ids, {'settled': True, 'quantity': com_por_linea})
@@ -438,7 +460,11 @@
438 invoice_line_amount = line.invoice_line_id.price_subtotal460 invoice_line_amount = line.invoice_line_id.price_subtotal
439 if commission_app.type=="fijo":461 if commission_app.type=="fijo":
440 commission_per = commission_app.fix_qty462 commission_per = commission_app.fix_qty
441 amount = amount + line.invoice_line_id.price_subtotal * float(commission_per) / 100463 # Para tener en cuenta las rectificativas
464 if line.invoice_line_id.invoice_id.type == 'out_refund':
465 amount = amount - line.invoice_line_id.price_subtotal * float(commission_per) / 100
466 else:
467 amount = amount + line.invoice_line_id.price_subtotal * float(commission_per) / 100
442468
443 elif commission_app.type=="tramos":469 elif commission_app.type=="tramos":
444 invoice_line_amount = 0470 invoice_line_amount = 0
445471
=== modified file 'sale_commission/stock_picking.py'
--- sale_commission/stock_picking.py 2012-07-13 10:51:04 +0000
+++ sale_commission/stock_picking.py 2014-03-13 12:35:19 +0000
@@ -44,22 +44,41 @@
44 'agent_ids':fields.many2many('sale.agent','sale_agent_clinic_rel', 'agent_id', 'clinic_id', 'Agentes' )44 'agent_ids':fields.many2many('sale.agent','sale_agent_clinic_rel', 'agent_id', 'clinic_id', 'Agentes' )
45 }45 }
4646
47 def _create_invoice_line_agent(self,cr,uid,ids,agent_id,commission_id,invoice_line_id):
48 vals = {
49 'agent_id' : agent_id,
50 'commission_id' : commission_id,
51 'settled': False,
52 'invoice_line_id' : invoice_line_id
53 }
54 line_agent_id=self.pool.get('invoice.line.agent').create(cr, uid, vals)
55 self.pool.get('invoice.line.agent').calculate_commission(cr, uid, [line_agent_id])
56 return line_agent_id
57
47 def _invoice_line_hook(self, cursor, user, move_line, invoice_line_id):58 def _invoice_line_hook(self, cursor, user, move_line, invoice_line_id):
48 '''Call after the creation of the invoice line'''59 '''Call after the creation of the invoice line'''
49 super(stock_picking, self)._invoice_line_hook(cursor, user, move_line, invoice_line_id)60 super(stock_picking, self)._invoice_line_hook(cursor, user, move_line, invoice_line_id)
5061 # import ipdb; ipdb.set_trace()
51 if move_line and move_line.sale_line_id and move_line.sale_line_id.product_id.commission_exent != True :62 if move_line and move_line.sale_line_id and move_line.sale_line_id.product_id.commission_exent != True :
52 so_ref = move_line.sale_line_id.order_id63 so_ref = move_line.sale_line_id.order_id
53 for so_agent_id in so_ref.sale_agent_ids:64 line = move_line.sale_line_id
54 vals = {65 if not line.line_agent_ids: #si la linea no tiene comissiones arrastro los del pedido a la linea de factura
55 'invoice_line_id': invoice_line_id,66 for so_comm in line.order_id.sale_agent_ids:
56 'agent_id': so_agent_id.agent_id.id,67 line_agent_id= self._create_invoice_line_agent(cursor,user,[],so_comm.agent_id.id,so_comm.commission_id.id,invoice_line_id)
57 'commission_id': so_agent_id.commission_id.id,68 else:
58 'settled': False69 for l_comm in line.line_agent_ids:
59 }70 line_agent_id= self._create_invoice_line_agent(cursor,user,[],l_comm.agent_id.id,l_comm.commission_id.id,invoice_line_id)
6071
61 line_agent_id=self.pool.get('invoice.line.agent').create(cursor, user, vals)72 # for so_agent_id in so_ref.sale_agent_ids:
62 self.pool.get('invoice.line.agent').calculate_commission(cursor, user, [line_agent_id])73 # vals = {
74 # 'invoice_line_id': invoice_line_id,
75 # 'agent_id': so_agent_id.agent_id.id,
76 # 'commission_id': so_agent_id.commission_id.id,
77 # 'settled': False
78 # }
79
80 # line_agent_id=self.pool.get('invoice.line.agent').create(cursor, user, vals)
81 # self.pool.get('invoice.line.agent').calculate_commission(cursor, user, [line_agent_id])
63 return82 return
6483
65stock_picking()84stock_picking()
66\ No newline at end of file85\ No newline at end of file
6786
=== modified file 'sale_commission/wizard/wizard_invoice.py'
--- sale_commission/wizard/wizard_invoice.py 2012-07-13 10:51:04 +0000
+++ sale_commission/wizard/wizard_invoice.py 2014-03-13 12:35:19 +0000
@@ -30,6 +30,7 @@
30 _columns = {30 _columns = {
31 'journal_id':fields.many2one('account.journal', 'Target journal', required=True, select=1),31 'journal_id':fields.many2one('account.journal', 'Target journal', required=True, select=1),
32 'product_id':fields.many2one('product.product', 'Product for account', required=True, select=1),32 'product_id':fields.many2one('product.product', 'Product for account', required=True, select=1),
33 'mode': fields.selection([('line', 'for each invoice line settled'),('invoice','for each sale invoice'),('agent','summary for each agent')], 'A line', required=True),
33 }34 }
34 _defaults = {35 _defaults = {
35 }36 }
@@ -39,13 +40,13 @@
39 def create_invoice(self, cr, uid, ids, context=None):40 def create_invoice(self, cr, uid, ids, context=None):
40 if context is None:41 if context is None:
41 context = {}42 context = {}
4243 # import ipdb; ipdb.set_trace()
43 data_pool = self.pool.get('ir.model.data')44 data_pool = self.pool.get('ir.model.data')
44 settlement_obj = self.pool.get('settlement')45 settlement_obj = self.pool.get('settlement')
4546
46 for o in self.browse(cr, uid, ids, context=context):47 for o in self.browse(cr, uid, ids, context=context):
47 res = settlement_obj.action_invoice_create(cr, uid, context['active_ids'],48 res = settlement_obj.action_invoice_create(cr, uid, context['active_ids'],
48 journal_id=o.journal_id.id, product_id=o.product_id.id, context=context)49 journal_id=o.journal_id.id, product_id=o.product_id.id,mode=o.mode,context=context)
4950
50 invoice_ids = res.values()51 invoice_ids = res.values()
5152
5253
=== modified file 'sale_commission/wizard/wizard_invoice.xml'
--- sale_commission/wizard/wizard_invoice.xml 2012-07-13 10:51:04 +0000
+++ sale_commission/wizard/wizard_invoice.xml 2014-03-13 12:35:19 +0000
@@ -8,10 +8,12 @@
8 <field name="arch" type="xml">8 <field name="arch" type="xml">
9 <form string="Create invoices">9 <form string="Create invoices">
10 <separator colspan="4" string="Create invoice" />10 <separator colspan="4" string="Create invoice" />
11 <field name="journal_id"/>11 <field name="journal_id" domain="[('type','=','purchase')]"/>
12 <newline/>12 <newline/>
13 <field name="product_id"/>13 <field name="product_id"/>
14 <newline/>14 <newline/>
15 <field name="mode"/>
16 <newline/>
15 <button special="cancel" string="_Cancel" icon='gtk-cancel'/>17 <button special="cancel" string="_Cancel" icon='gtk-cancel'/>
16 <button name="create_invoice" string="Create" type="object" icon="terp-gtk-go-back-rtl"/>18 <button name="create_invoice" string="Create" type="object" icon="terp-gtk-go-back-rtl"/>
17 </form>19 </form>

Subscribers

People subscribed via source and target branches