Merge lp:~pexego/openobject-addons/6.1-pexego-sale_commission into lp:~pexego/openobject-addons/6.1-pexego
- 6.1-pexego-sale_commission
- Merge into 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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Pexego | Pending | ||
Review via email: mp+195983@code.launchpad.net |
Commit message
Description of the change
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
1 | === modified file 'sale_commission/__init__.py' | |||
2 | --- sale_commission/__init__.py 2012-07-13 10:51:04 +0000 | |||
3 | +++ sale_commission/__init__.py 2014-03-13 12:35:19 +0000 | |||
4 | @@ -28,6 +28,7 @@ | |||
5 | 28 | import sale_order | 28 | import sale_order |
6 | 29 | import stock_picking | 29 | import stock_picking |
7 | 30 | import wizard | 30 | import wizard |
8 | 31 | import product | ||
9 | 31 | 32 | ||
10 | 32 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: | 33 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: |
11 | 33 | 34 | ||
12 | 34 | 35 | ||
13 | === modified file 'sale_commission/i18n/es.po' | |||
14 | --- sale_commission/i18n/es.po 2012-07-13 10:51:04 +0000 | |||
15 | +++ sale_commission/i18n/es.po 2014-03-13 12:35:19 +0000 | |||
16 | @@ -1,18 +1,18 @@ | |||
17 | 1 | # Translation of OpenERP Server. | 1 | # Translation of OpenERP Server. |
18 | 2 | # This file contains the translation of the following modules: | 2 | # This file contains the translation of the following modules: |
20 | 3 | # * sale_commission | 3 | # * sale_commission |
21 | 4 | # | 4 | # |
22 | 5 | msgid "" | 5 | msgid "" |
23 | 6 | msgstr "" | 6 | msgstr "" |
29 | 7 | "Project-Id-Version: OpenERP Server 6.0.1\n" | 7 | "Project-Id-Version: OpenERP Server 6.1\n" |
30 | 8 | "Report-Msgid-Bugs-To: support@openerp.com\n" | 8 | "Report-Msgid-Bugs-To: \n" |
31 | 9 | "POT-Creation-Date: 2011-05-02 11:44+0000\n" | 9 | "POT-Creation-Date: 2013-11-27 09:45+0000\n" |
32 | 10 | "PO-Revision-Date: 2011-05-02 14:17+0100\n" | 10 | "PO-Revision-Date: 2013-11-27 09:45+0000\n" |
33 | 11 | "Last-Translator: Raimon Esteve <resteve@zikzakmedia.com>\n" | 11 | "Last-Translator: <>\n" |
34 | 12 | "Language-Team: \n" | 12 | "Language-Team: \n" |
35 | 13 | "MIME-Version: 1.0\n" | 13 | "MIME-Version: 1.0\n" |
36 | 14 | "Content-Type: text/plain; charset=UTF-8\n" | 14 | "Content-Type: text/plain; charset=UTF-8\n" |
38 | 15 | "Content-Transfer-Encoding: 8bit\n" | 15 | "Content-Transfer-Encoding: \n" |
39 | 16 | "Plural-Forms: \n" | 16 | "Plural-Forms: \n" |
40 | 17 | 17 | ||
41 | 18 | #. module: sale_commission | 18 | #. module: sale_commission |
42 | @@ -26,6 +26,11 @@ | |||
43 | 26 | msgstr "Factura Nº" | 26 | msgstr "Factura Nº" |
44 | 27 | 27 | ||
45 | 28 | #. module: sale_commission | 28 | #. module: sale_commission |
46 | 29 | #: view:sale.agent:0 | ||
47 | 30 | msgid "Saleagent" | ||
48 | 31 | msgstr "Agente" | ||
49 | 32 | |||
50 | 33 | #. module: sale_commission | ||
51 | 29 | #: selection:sale.agent,settlement:0 | 34 | #: selection:sale.agent,settlement:0 |
52 | 30 | msgid "Monthly" | 35 | msgid "Monthly" |
53 | 31 | msgstr "Mensual" | 36 | msgstr "Mensual" |
54 | @@ -76,11 +81,6 @@ | |||
55 | 76 | msgstr "Resumen de facturas" | 81 | msgstr "Resumen de facturas" |
56 | 77 | 82 | ||
57 | 78 | #. module: sale_commission | 83 | #. module: sale_commission |
58 | 79 | #: sql_constraint:sale.order:0 | ||
59 | 80 | msgid "Order Reference must be unique !" | ||
60 | 81 | msgstr "¡La referencia del pedido debe ser única!" | ||
61 | 82 | |||
62 | 83 | #. module: sale_commission | ||
63 | 84 | #: field:settlement.agent,total_sections:0 | 84 | #: field:settlement.agent,total_sections:0 |
64 | 85 | msgid "Total sections" | 85 | msgid "Total sections" |
65 | 86 | msgstr "Total tramos" | 86 | msgstr "Total tramos" |
66 | @@ -96,6 +96,7 @@ | |||
67 | 96 | msgstr "Informe de liquidación" | 96 | msgstr "Informe de liquidación" |
68 | 97 | 97 | ||
69 | 98 | #. module: sale_commission | 98 | #. module: sale_commission |
70 | 99 | #: model:ir.actions.act_window,name:sale_commission.action_recalculate_commission | ||
71 | 99 | #: view:recalculate.commission.wizard:0 | 100 | #: view:recalculate.commission.wizard:0 |
72 | 100 | msgid "Recalculate agents commissions" | 101 | msgid "Recalculate agents commissions" |
73 | 101 | msgstr "Recalcular comisiones" | 102 | msgstr "Recalcular comisiones" |
74 | @@ -106,6 +107,7 @@ | |||
75 | 106 | msgstr "Resumen de agentes" | 107 | msgstr "Resumen de agentes" |
76 | 107 | 108 | ||
77 | 108 | #. module: sale_commission | 109 | #. module: sale_commission |
78 | 110 | #: view:commission:0 | ||
79 | 109 | #: view:res.partner:0 | 111 | #: view:res.partner:0 |
80 | 110 | #: view:sale.order:0 | 112 | #: view:sale.order:0 |
81 | 111 | msgid "Agents and Commissions" | 113 | msgid "Agents and Commissions" |
82 | @@ -123,6 +125,11 @@ | |||
83 | 123 | msgstr "Liquidación de agente" | 125 | msgstr "Liquidación de agente" |
84 | 124 | 126 | ||
85 | 125 | #. module: sale_commission | 127 | #. module: sale_commission |
86 | 128 | #: selection:settled.invoice.wizard,mode:0 | ||
87 | 129 | msgid "for each sale invoice" | ||
88 | 130 | msgstr "por cada factura de venta" | ||
89 | 131 | |||
90 | 132 | #. module: sale_commission | ||
91 | 126 | #: view:account.invoice.line:0 | 133 | #: view:account.invoice.line:0 |
92 | 127 | msgid "Notes" | 134 | msgid "Notes" |
93 | 128 | msgstr "Notas" | 135 | msgstr "Notas" |
94 | @@ -133,7 +140,7 @@ | |||
95 | 133 | msgstr "Anual" | 140 | msgstr "Anual" |
96 | 134 | 141 | ||
97 | 135 | #. module: sale_commission | 142 | #. module: sale_commission |
99 | 136 | #: code:addons/sale_commission/settled.py:193 | 143 | #: code:addons/sale_commission/settled.py:190 |
100 | 137 | #, python-format | 144 | #, python-format |
101 | 138 | msgid "Error!" | 145 | msgid "Error!" |
102 | 139 | msgstr "Error!" | 146 | msgstr "Error!" |
103 | @@ -178,6 +185,7 @@ | |||
104 | 178 | #: field:invoice.line.agent,agent_id:0 | 185 | #: field:invoice.line.agent,agent_id:0 |
105 | 179 | #: field:res.partner.agent,agent_id:0 | 186 | #: field:res.partner.agent,agent_id:0 |
106 | 180 | #: view:sale.agent:0 | 187 | #: view:sale.agent:0 |
107 | 188 | #: field:sale.line.agent,agent_id:0 | ||
108 | 181 | #: field:sale.order.agent,agent_id:0 | 189 | #: field:sale.order.agent,agent_id:0 |
109 | 182 | #: view:settled.invoice.agent:0 | 190 | #: view:settled.invoice.agent:0 |
110 | 183 | #: field:settled.invoice.agent,agent_id:0 | 191 | #: field:settled.invoice.agent,agent_id:0 |
111 | @@ -192,26 +200,30 @@ | |||
112 | 192 | msgstr "Resumen de liquidaciones de agentes" | 200 | msgstr "Resumen de liquidaciones de agentes" |
113 | 193 | 201 | ||
114 | 194 | #. module: sale_commission | 202 | #. module: sale_commission |
120 | 195 | #: model:ir.actions.act_window,name:sale_commission.action_recalculate_commission | 203 | #: field:commission,product_agent_ids:0 |
121 | 196 | msgid "Recalculate agents commissions " | 204 | #: field:product.agent.commission,agent_ids:0 |
122 | 197 | msgstr "Recalcular comisiones de agentes " | 205 | #: field:product.product,product_agent_ids:0 |
118 | 198 | |||
119 | 199 | #. module: sale_commission | ||
123 | 200 | #: field:res.partner,commission_ids:0 | 206 | #: field:res.partner,commission_ids:0 |
124 | 201 | #: view:res.partner.agent:0 | 207 | #: view:res.partner.agent:0 |
125 | 202 | #: field:sale.order,sale_agent_ids:0 | 208 | #: field:sale.order,sale_agent_ids:0 |
126 | 203 | #: view:sale.order.agent:0 | 209 | #: view:sale.order.agent:0 |
127 | 210 | #: field:sale.order.line,line_agent_ids:0 | ||
128 | 204 | #: view:stock.picking:0 | 211 | #: view:stock.picking:0 |
129 | 205 | msgid "Agents" | 212 | msgid "Agents" |
130 | 206 | msgstr "Agentes" | 213 | msgstr "Agentes" |
131 | 207 | 214 | ||
132 | 208 | #. module: sale_commission | 215 | #. module: sale_commission |
134 | 209 | #: code:addons/sale_commission/wizard/wizard_invoice.py:55 | 216 | #: code:addons/sale_commission/wizard/wizard_invoice.py:56 |
135 | 210 | #, python-format | 217 | #, python-format |
136 | 211 | msgid "No Invoices were created" | 218 | msgid "No Invoices were created" |
137 | 212 | msgstr "No se crearon facturas" | 219 | msgstr "No se crearon facturas" |
138 | 213 | 220 | ||
139 | 214 | #. module: sale_commission | 221 | #. module: sale_commission |
140 | 222 | #: field:settled.invoice.wizard,mode:0 | ||
141 | 223 | msgid "A line" | ||
142 | 224 | msgstr "Una linea" | ||
143 | 225 | |||
144 | 226 | #. module: sale_commission | ||
145 | 215 | #: view:settled.wizard:0 | 227 | #: view:settled.wizard:0 |
146 | 216 | msgid "Select period to Settle" | 228 | msgid "Select period to Settle" |
147 | 217 | msgstr "Seleccionar período a liquidar" | 229 | msgstr "Seleccionar período a liquidar" |
148 | @@ -220,13 +232,14 @@ | |||
149 | 220 | #: model:ir.model,name:sale_commission.model_res_partner | 232 | #: model:ir.model,name:sale_commission.model_res_partner |
150 | 221 | #: field:res.partner.agent,partner_id:0 | 233 | #: field:res.partner.agent,partner_id:0 |
151 | 222 | #: field:sale.agent,partner_id:0 | 234 | #: field:sale.agent,partner_id:0 |
152 | 235 | #: field:settled.invoice.agent,partner_id:0 | ||
153 | 223 | msgid "Partner" | 236 | msgid "Partner" |
154 | 224 | msgstr "Empresa" | 237 | msgstr "Empresa" |
155 | 225 | 238 | ||
156 | 226 | #. module: sale_commission | 239 | #. module: sale_commission |
160 | 227 | #: model:ir.model,name:sale_commission.model_sale_order | 240 | #: view:sale.order:0 |
161 | 228 | msgid "Sales Order" | 241 | msgid "Agents and Commisions" |
162 | 229 | msgstr "Pedido de venta" | 242 | msgstr "Agentes y comisiones" |
163 | 230 | 243 | ||
164 | 231 | #. module: sale_commission | 244 | #. module: sale_commission |
165 | 232 | #: report:settlement.report:0 | 245 | #: report:settlement.report:0 |
166 | @@ -287,12 +300,6 @@ | |||
167 | 287 | msgstr "Estado" | 300 | msgstr "Estado" |
168 | 288 | 301 | ||
169 | 289 | #. module: sale_commission | 302 | #. module: sale_commission |
170 | 290 | #: code:addons/sale_commission/settled.py:251 | ||
171 | 291 | #, python-format | ||
172 | 292 | msgid "Error, partner fail !" | ||
173 | 293 | msgstr "Error, fallo en la empresa !" | ||
174 | 294 | |||
175 | 295 | #. module: sale_commission | ||
176 | 296 | #: model:ir.model,name:sale_commission.model_stock_picking | 303 | #: model:ir.model,name:sale_commission.model_stock_picking |
177 | 297 | msgid "Picking List" | 304 | msgid "Picking List" |
178 | 298 | msgstr "Albarán" | 305 | msgstr "Albarán" |
179 | @@ -323,6 +330,12 @@ | |||
180 | 323 | msgstr "IMPORTE FACTURADO" | 330 | msgstr "IMPORTE FACTURADO" |
181 | 324 | 331 | ||
182 | 325 | #. module: sale_commission | 332 | #. module: sale_commission |
183 | 333 | #: field:commission,type:0 | ||
184 | 334 | #: field:sale.agent,type:0 | ||
185 | 335 | msgid "Type" | ||
186 | 336 | msgstr "Tipo" | ||
187 | 337 | |||
188 | 338 | #. module: sale_commission | ||
189 | 326 | #: view:settled.invoice.wizard:0 | 339 | #: view:settled.invoice.wizard:0 |
190 | 327 | msgid "Create invoice" | 340 | msgid "Create invoice" |
191 | 328 | msgstr "Crear factura" | 341 | msgstr "Crear factura" |
192 | @@ -363,6 +376,11 @@ | |||
193 | 363 | msgstr "Comisión por defecto" | 376 | msgstr "Comisión por defecto" |
194 | 364 | 377 | ||
195 | 365 | #. module: sale_commission | 378 | #. module: sale_commission |
196 | 379 | #: selection:settled.invoice.wizard,mode:0 | ||
197 | 380 | msgid "for each invoice line settled" | ||
198 | 381 | msgstr "por cada linea de factura liquidada" | ||
199 | 382 | |||
200 | 383 | #. module: sale_commission | ||
201 | 366 | #: field:settlement,date:0 | 384 | #: field:settlement,date:0 |
202 | 367 | msgid "Created Date" | 385 | msgid "Created Date" |
203 | 368 | msgstr "Fecha de creación" | 386 | msgstr "Fecha de creación" |
204 | @@ -378,6 +396,11 @@ | |||
205 | 378 | msgstr "Código del agente" | 396 | msgstr "Código del agente" |
206 | 379 | 397 | ||
207 | 380 | #. module: sale_commission | 398 | #. module: sale_commission |
208 | 399 | #: view:product.product:0 | ||
209 | 400 | msgid "Agents and Products" | ||
210 | 401 | msgstr "Agentes y productos" | ||
211 | 402 | |||
212 | 403 | #. module: sale_commission | ||
213 | 381 | #: view:settled.wizard:0 | 404 | #: view:settled.wizard:0 |
214 | 382 | msgid "Run Settlement Agents" | 405 | msgid "Run Settlement Agents" |
215 | 383 | msgstr "Ejecutar liquidaciones de agentes" | 406 | msgstr "Ejecutar liquidaciones de agentes" |
216 | @@ -394,9 +417,9 @@ | |||
217 | 394 | msgstr "Agentes de ventas" | 417 | msgstr "Agentes de ventas" |
218 | 395 | 418 | ||
219 | 396 | #. module: sale_commission | 419 | #. module: sale_commission |
223 | 397 | #: constraint:product.product:0 | 420 | #: model:ir.model,name:sale_commission.model_sale_order |
224 | 398 | msgid "Several dimension values for the same dimension type" | 421 | msgid "Sales Order" |
225 | 399 | msgstr "Varios valores de dimensión para el tipo de la misma dimensión" | 422 | msgstr "Pedido de venta" |
226 | 400 | 423 | ||
227 | 401 | #. module: sale_commission | 424 | #. module: sale_commission |
228 | 402 | #: view:commission:0 | 425 | #: view:commission:0 |
229 | @@ -404,15 +427,20 @@ | |||
230 | 404 | msgstr "Info. general" | 427 | msgstr "Info. general" |
231 | 405 | 428 | ||
232 | 406 | #. module: sale_commission | 429 | #. module: sale_commission |
233 | 430 | #: view:settlement:0 | ||
234 | 407 | #: view:settlement.agent:0 | 431 | #: view:settlement.agent:0 |
235 | 408 | #: field:settlement.agent,invoices:0 | 432 | #: field:settlement.agent,invoices:0 |
236 | 409 | msgid "Invoices" | 433 | msgid "Invoices" |
237 | 410 | msgstr "Facturas" | 434 | msgstr "Facturas" |
238 | 411 | 435 | ||
239 | 412 | #. module: sale_commission | 436 | #. module: sale_commission |
243 | 413 | #: field:product.product,commission_exent:0 | 437 | #: view:account.invoice.line:0 |
244 | 414 | msgid "Commission exent" | 438 | #: field:account.invoice.line,commission_ids:0 |
245 | 415 | msgstr "Exento de comisiones" | 439 | #: view:commission:0 |
246 | 440 | #: model:ir.ui.menu,name:sale_commission.menu_sale_commissions | ||
247 | 441 | #: model:ir.ui.menu,name:sale_commission.menu_sale_commissions_conf | ||
248 | 442 | msgid "Commissions" | ||
249 | 443 | msgstr "Comisiones" | ||
250 | 416 | 444 | ||
251 | 417 | #. module: sale_commission | 445 | #. module: sale_commission |
252 | 418 | #: model:ir.ui.menu,name:sale_commission.menu_settlement | 446 | #: model:ir.ui.menu,name:sale_commission.menu_settlement |
253 | @@ -437,6 +465,11 @@ | |||
254 | 437 | msgstr "TOTAL :" | 465 | msgstr "TOTAL :" |
255 | 438 | 466 | ||
256 | 439 | #. module: sale_commission | 467 | #. module: sale_commission |
257 | 468 | #: report:settlement.report:0 | ||
258 | 469 | msgid "PARTNER" | ||
259 | 470 | msgstr "PARTNER" | ||
260 | 471 | |||
261 | 472 | #. module: sale_commission | ||
262 | 440 | #: model:ir.model,name:sale_commission.model_settled_invoice_wizard | 473 | #: model:ir.model,name:sale_commission.model_settled_invoice_wizard |
263 | 441 | msgid "settled.invoice.wizard" | 474 | msgid "settled.invoice.wizard" |
264 | 442 | msgstr "settled.invoice.wizard" | 475 | msgstr "settled.invoice.wizard" |
265 | @@ -447,9 +480,9 @@ | |||
266 | 447 | msgstr "Facturado" | 480 | msgstr "Facturado" |
267 | 448 | 481 | ||
268 | 449 | #. module: sale_commission | 482 | #. module: sale_commission |
272 | 450 | #: view:sale.agent:0 | 483 | #: field:settled.invoice.agent,invoice_number:0 |
273 | 451 | msgid "Saleagent" | 484 | msgid "Invoice no" |
274 | 452 | msgstr "Agente" | 485 | msgstr "Factura nº" |
275 | 453 | 486 | ||
276 | 454 | #. module: sale_commission | 487 | #. module: sale_commission |
277 | 455 | #: field:sale.order.agent,sale_id:0 | 488 | #: field:sale.order.agent,sale_id:0 |
278 | @@ -518,7 +551,7 @@ | |||
279 | 518 | msgstr "tramos" | 551 | msgstr "tramos" |
280 | 519 | 552 | ||
281 | 520 | #. module: sale_commission | 553 | #. module: sale_commission |
283 | 521 | #: code:addons/sale_commission/settled.py:193 | 554 | #: code:addons/sale_commission/settled.py:190 |
284 | 522 | #, python-format | 555 | #, python-format |
285 | 523 | msgid "You can't delete it, if it isn't in cancel state." | 556 | msgid "You can't delete it, if it isn't in cancel state." |
286 | 524 | msgstr "No se puede borrar. No está en estado cancelado" | 557 | msgstr "No se puede borrar. No está en estado cancelado" |
287 | @@ -553,7 +586,17 @@ | |||
288 | 553 | msgstr "settled.wizard" | 586 | msgstr "settled.wizard" |
289 | 554 | 587 | ||
290 | 555 | #. module: sale_commission | 588 | #. module: sale_commission |
292 | 556 | #: code:addons/sale_commission/wizard/wizard_invoice.py:55 | 589 | #: selection:settled.invoice.wizard,mode:0 |
293 | 590 | msgid "summary for each agent" | ||
294 | 591 | msgstr "resumen por cada agente" | ||
295 | 592 | |||
296 | 593 | #. module: sale_commission | ||
297 | 594 | #: sql_constraint:stock.picking:0 | ||
298 | 595 | msgid "Reference must be unique per Company!" | ||
299 | 596 | msgstr "¡La referencia debe ser única por compañía!" | ||
300 | 597 | |||
301 | 598 | #. module: sale_commission | ||
302 | 599 | #: code:addons/sale_commission/wizard/wizard_invoice.py:56 | ||
303 | 557 | #, python-format | 600 | #, python-format |
304 | 558 | msgid "Error" | 601 | msgid "Error" |
305 | 559 | msgstr "Error" | 602 | msgstr "Error" |
306 | @@ -564,26 +607,24 @@ | |||
307 | 564 | msgstr "Entidad o empleado relacionado" | 607 | msgstr "Entidad o empleado relacionado" |
308 | 565 | 608 | ||
309 | 566 | #. module: sale_commission | 609 | #. module: sale_commission |
310 | 567 | #: code:addons/sale_commission/settled.py:252 | ||
311 | 568 | #, python-format | ||
312 | 569 | msgid "Agent to settle hasn't assigned partner." | ||
313 | 570 | msgstr "El agente a liquidar no tiene una empresa asignada." | ||
314 | 571 | |||
315 | 572 | #. module: sale_commission | ||
316 | 573 | #: field:settled.invoice.agent,settlement_agent_id:0 | 610 | #: field:settled.invoice.agent,settlement_agent_id:0 |
317 | 574 | msgid "Agent settl." | 611 | msgid "Agent settl." |
318 | 575 | msgstr "Liq.de agente." | 612 | msgstr "Liq.de agente." |
319 | 576 | 613 | ||
320 | 577 | #. module: sale_commission | 614 | #. module: sale_commission |
321 | 615 | #: field:sale.line.agent,line_id:0 | ||
322 | 616 | msgid "Sale order line" | ||
323 | 617 | msgstr "Linea del pedido" | ||
324 | 618 | |||
325 | 619 | #. module: sale_commission | ||
326 | 578 | #: field:settlement.line,commission:0 | 620 | #: field:settlement.line,commission:0 |
327 | 579 | msgid "Quantity" | 621 | msgid "Quantity" |
328 | 580 | msgstr "Cantidad" | 622 | msgstr "Cantidad" |
329 | 581 | 623 | ||
330 | 582 | #. module: sale_commission | 624 | #. module: sale_commission |
335 | 583 | #: field:commission,type:0 | 625 | #: sql_constraint:account.invoice:0 |
336 | 584 | #: field:sale.agent,type:0 | 626 | msgid "Invoice Number must be unique per Company!" |
337 | 585 | msgid "Type" | 627 | msgstr "¡El número de factura debe ser único por compañía!" |
334 | 586 | msgstr "Tipo" | ||
338 | 587 | 628 | ||
339 | 588 | #. module: sale_commission | 629 | #. module: sale_commission |
340 | 589 | #: field:sale.agent,code:0 | 630 | #: field:sale.agent,code:0 |
341 | @@ -617,13 +658,9 @@ | |||
342 | 617 | msgstr "Factura" | 658 | msgstr "Factura" |
343 | 618 | 659 | ||
344 | 619 | #. module: sale_commission | 660 | #. module: sale_commission |
352 | 620 | #: view:account.invoice.line:0 | 661 | #: field:product.product,commission_exent:0 |
353 | 621 | #: field:account.invoice.line,commission_ids:0 | 662 | msgid "Commission exent" |
354 | 622 | #: view:commission:0 | 663 | msgstr "Exento de comisiones" |
348 | 623 | #: model:ir.ui.menu,name:sale_commission.menu_sale_commissions | ||
349 | 624 | #: model:ir.ui.menu,name:sale_commission.menu_sale_commissions_conf | ||
350 | 625 | msgid "Commissions" | ||
351 | 626 | msgstr "Comisiones" | ||
355 | 627 | 664 | ||
356 | 628 | #. module: sale_commission | 665 | #. module: sale_commission |
357 | 629 | #: view:recalculate.commission.wizard:0 | 666 | #: view:recalculate.commission.wizard:0 |
358 | @@ -634,12 +671,18 @@ | |||
359 | 634 | msgstr "Cancelar" | 671 | msgstr "Cancelar" |
360 | 635 | 672 | ||
361 | 636 | #. module: sale_commission | 673 | #. module: sale_commission |
362 | 674 | #: model:ir.model,name:sale_commission.model_sale_line_agent | ||
363 | 675 | msgid "sale.line.agent" | ||
364 | 676 | msgstr "sale.line.agent" | ||
365 | 677 | |||
366 | 678 | #. module: sale_commission | ||
367 | 637 | #: help:sale.agent,partner_id:0 | 679 | #: help:sale.agent,partner_id:0 |
368 | 638 | msgid "Associated partner, is necessary for income invoices." | 680 | msgid "Associated partner, is necessary for income invoices." |
369 | 639 | msgstr "Empresa asociada, es necesario para las facturas entrantes generadas." | 681 | msgstr "Empresa asociada, es necesario para las facturas entrantes generadas." |
370 | 640 | 682 | ||
371 | 641 | #. module: sale_commission | 683 | #. module: sale_commission |
372 | 642 | #: view:sale.agent:0 | 684 | #: view:sale.agent:0 |
373 | 685 | #: view:settlement:0 | ||
374 | 643 | #: view:settlement.agent:0 | 686 | #: view:settlement.agent:0 |
375 | 644 | #: field:settlement.agent,settlement_id:0 | 687 | #: field:settlement.agent,settlement_id:0 |
376 | 645 | msgid "Settlement" | 688 | msgid "Settlement" |
377 | @@ -651,9 +694,9 @@ | |||
378 | 651 | msgstr "Retención aplicada" | 694 | msgstr "Retención aplicada" |
379 | 652 | 695 | ||
380 | 653 | #. module: sale_commission | 696 | #. module: sale_commission |
384 | 654 | #: field:settled.invoice.agent,invoice_number:0 | 697 | #: sql_constraint:sale.order:0 |
385 | 655 | msgid "Invoice no" | 698 | msgid "Order Reference must be unique per Company!" |
386 | 656 | msgstr "Factura nº" | 699 | msgstr "¡La referencia del pedido debe ser única por compañía!" |
387 | 657 | 700 | ||
388 | 658 | #. module: sale_commission | 701 | #. module: sale_commission |
389 | 659 | #: report:settlement.report:0 | 702 | #: report:settlement.report:0 |
390 | @@ -661,9 +704,10 @@ | |||
391 | 661 | msgstr "FECHA FACTURA" | 704 | msgstr "FECHA FACTURA" |
392 | 662 | 705 | ||
393 | 663 | #. module: sale_commission | 706 | #. module: sale_commission |
397 | 664 | #: code:addons/sale_commission/invoice.py:82 | 707 | #: code:addons/sale_commission/invoice.py:91 |
398 | 665 | #: code:addons/sale_commission/partner_agent.py:80 | 708 | #: code:addons/sale_commission/partner_agent.py:81 |
399 | 666 | #: code:addons/sale_commission/sale_order.py:67 | 709 | #: code:addons/sale_commission/sale_order.py:68 |
400 | 710 | #: code:addons/sale_commission/sale_order.py:152 | ||
401 | 667 | #, python-format | 711 | #, python-format |
402 | 668 | msgid "Fee installments!" | 712 | msgid "Fee installments!" |
403 | 669 | msgstr "Fee installments!" | 713 | msgstr "Fee installments!" |
404 | @@ -679,9 +723,10 @@ | |||
405 | 679 | msgstr "Líneas de detalle" | 723 | msgstr "Líneas de detalle" |
406 | 680 | 724 | ||
407 | 681 | #. module: sale_commission | 725 | #. module: sale_commission |
411 | 682 | #: code:addons/sale_commission/invoice.py:84 | 726 | #: code:addons/sale_commission/invoice.py:93 |
412 | 683 | #: code:addons/sale_commission/partner_agent.py:81 | 727 | #: code:addons/sale_commission/partner_agent.py:82 |
413 | 684 | #: code:addons/sale_commission/sale_order.py:68 | 728 | #: code:addons/sale_commission/sale_order.py:69 |
414 | 729 | #: code:addons/sale_commission/sale_order.py:153 | ||
415 | 685 | #, python-format | 730 | #, python-format |
416 | 686 | msgid "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." | 731 | msgid "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." |
417 | 687 | msgstr "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" | 732 | msgstr "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" |
418 | @@ -693,6 +738,7 @@ | |||
419 | 693 | 738 | ||
420 | 694 | #. module: sale_commission | 739 | #. module: sale_commission |
421 | 695 | #: model:ir.model,name:sale_commission.model_product_product | 740 | #: model:ir.model,name:sale_commission.model_product_product |
422 | 741 | #: field:product.agent.commission,product_id:0 | ||
423 | 696 | msgid "Product" | 742 | msgid "Product" |
424 | 697 | msgstr "Producto" | 743 | msgstr "Producto" |
425 | 698 | 744 | ||
426 | @@ -702,6 +748,12 @@ | |||
427 | 702 | msgstr "Período de liquidación" | 748 | msgstr "Período de liquidación" |
428 | 703 | 749 | ||
429 | 704 | #. module: sale_commission | 750 | #. module: sale_commission |
430 | 751 | #: view:commission:0 | ||
431 | 752 | #: view:product.product:0 | ||
432 | 753 | msgid "Agents/Commissions" | ||
433 | 754 | msgstr "Agents/Commissions" | ||
434 | 755 | |||
435 | 756 | #. module: sale_commission | ||
436 | 705 | #: field:sale.agent,customer:0 | 757 | #: field:sale.agent,customer:0 |
437 | 706 | msgid "Customer" | 758 | msgid "Customer" |
438 | 707 | msgstr "Cliente" | 759 | msgstr "Cliente" |
439 | @@ -758,14 +810,22 @@ | |||
440 | 758 | msgstr "Importe liquidado" | 810 | msgstr "Importe liquidado" |
441 | 759 | 811 | ||
442 | 760 | #. module: sale_commission | 812 | #. module: sale_commission |
443 | 813 | #: model:ir.model,name:sale_commission.model_product_agent_commission | ||
444 | 814 | msgid "product.agent.commission" | ||
445 | 815 | msgstr "product.agent.commission" | ||
446 | 816 | |||
447 | 817 | #. module: sale_commission | ||
448 | 761 | #: field:invoice.line.agent,commission_id:0 | 818 | #: field:invoice.line.agent,commission_id:0 |
449 | 819 | #: field:product.agent.commission,commission_id:0 | ||
450 | 762 | #: field:res.partner.agent,commission_id:0 | 820 | #: field:res.partner.agent,commission_id:0 |
451 | 821 | #: field:sale.line.agent,commission_id:0 | ||
452 | 763 | #: field:sale.order.agent,commission_id:0 | 822 | #: field:sale.order.agent,commission_id:0 |
453 | 764 | msgid "Applied commission" | 823 | msgid "Applied commission" |
454 | 765 | msgstr "Comisión aplicada" | 824 | msgstr "Comisión aplicada" |
455 | 766 | 825 | ||
456 | 767 | #. module: sale_commission | 826 | #. module: sale_commission |
457 | 768 | #: field:invoice.line.agent,settled:0 | 827 | #: field:invoice.line.agent,settled:0 |
458 | 828 | #: view:settlement:0 | ||
459 | 769 | #: selection:settlement,state:0 | 829 | #: selection:settlement,state:0 |
460 | 770 | msgid "Settled" | 830 | msgid "Settled" |
461 | 771 | msgstr "Liquidado" | 831 | msgstr "Liquidado" |
462 | 772 | 832 | ||
463 | === modified file 'sale_commission/invoice.py' | |||
464 | --- sale_commission/invoice.py 2012-07-13 10:51:04 +0000 | |||
465 | +++ sale_commission/invoice.py 2014-03-13 12:35:19 +0000 | |||
466 | @@ -31,20 +31,25 @@ | |||
467 | 31 | _name = "invoice.line.agent" | 31 | _name = "invoice.line.agent" |
468 | 32 | 32 | ||
469 | 33 | _columns = { | 33 | _columns = { |
471 | 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=''), |
472 | 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'), |
473 | 36 | 'invoice_date':fields.related('invoice_id',type='date_invoice', readonly=True), | 36 | 'invoice_date':fields.related('invoice_id',type='date_invoice', readonly=True), |
474 | 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=''), |
476 | 38 | 'commission_id':fields.many2one('commission', 'Applied commission', required=True, ondelete='cascade', help=''), | 38 | 'commission_id':fields.many2one('commission', 'Applied commission', required=True, help=''), |
477 | 39 | 'settled':fields.boolean('Settled', readonly=True), | 39 | 'settled':fields.boolean('Settled', readonly=True), |
478 | 40 | 'quantity':fields.float('Settled amount') | 40 | 'quantity':fields.float('Settled amount') |
479 | 41 | } | 41 | } |
480 | 42 | _defaults = { | 42 | _defaults = { |
481 | 43 | 'settled': lambda *a: False, | 43 | 'settled': lambda *a: False, |
482 | 44 | 'quantity':lambda *a: 0 | ||
483 | 45 | } | 44 | } |
484 | 46 | 45 | ||
485 | 47 | 46 | ||
486 | 47 | def copy_data(self, cr, uid, id, default=None, context=None): | ||
487 | 48 | if not default: | ||
488 | 49 | default = {} | ||
489 | 50 | default.update({'settled': False}) | ||
490 | 51 | return super(invoice_line_agent, self).copy_data(cr, uid, id, default, context=context) | ||
491 | 52 | |||
492 | 48 | def calculate_commission (self, cr, uid, ids): | 53 | def calculate_commission (self, cr, uid, ids): |
493 | 49 | for line_agent in self.browse(cr,uid,ids): | 54 | for line_agent in self.browse(cr,uid,ids): |
494 | 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: |
495 | @@ -126,9 +131,15 @@ | |||
496 | 126 | def _refund_cleanup_lines(self, cr, uid, lines): | 131 | def _refund_cleanup_lines(self, cr, uid, lines): |
497 | 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""" |
498 | 128 | res = super(account_invoice, self)._refund_cleanup_lines(cr, uid, lines) | 133 | res = super(account_invoice, self)._refund_cleanup_lines(cr, uid, lines) |
499 | 134 | # import ipdb; ipdb.set_trace() | ||
500 | 129 | for line in res: | 135 | for line in res: |
501 | 130 | if 'commission_ids' in line[2]: | 136 | if 'commission_ids' in line[2]: |
503 | 131 | line[2]['commission_ids'] = [(6,0, line[2].get('commission_ids', [])) ] | 137 | duply_ids = [] |
504 | 138 | for cm_id in line[2].get('commission_ids', []): | ||
505 | 139 | dup_id = self.pool.get("invoice.line.agent").copy(cr, uid, cm_id, {'settled': False} ) | ||
506 | 140 | duply_ids.append(dup_id) | ||
507 | 141 | # line[2]['commission_ids'] = [(6,0, line[2].get('commission_ids', [])) ] | ||
508 | 142 | line[2]['commission_ids'] = [(6,0, duply_ids) ] | ||
509 | 132 | 143 | ||
510 | 133 | return res | 144 | return res |
511 | 134 | 145 | ||
512 | 135 | 146 | ||
513 | === modified file 'sale_commission/partner_agent.py' | |||
514 | --- sale_commission/partner_agent.py 2012-07-13 10:51:04 +0000 | |||
515 | +++ sale_commission/partner_agent.py 2014-03-13 12:35:19 +0000 | |||
516 | @@ -50,7 +50,7 @@ | |||
517 | 50 | _columns = { | 50 | _columns = { |
518 | 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), |
519 | 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=''), |
521 | 53 | 'commission_id':fields.many2one('commission', 'Applied commission', required=True, ondelete='cascade', help=''), | 53 | 'commission_id':fields.many2one('commission', 'Applied commission', required=True, help=''), |
522 | 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, |
523 | 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), |
524 | 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)}) |
525 | 57 | 57 | ||
526 | === added file 'sale_commission/product.py' | |||
527 | --- sale_commission/product.py 1970-01-01 00:00:00 +0000 | |||
528 | +++ sale_commission/product.py 2014-03-13 12:35:19 +0000 | |||
529 | @@ -0,0 +1,47 @@ | |||
530 | 1 | # -*- coding: utf-8 -*- | ||
531 | 2 | ############################################################################## | ||
532 | 3 | # | ||
533 | 4 | # OpenERP, Open Source Management Solution | ||
534 | 5 | # Copyright (C) 2011 Pexego Sistemas Informáticos (<http://www.pexego.es>). All Rights Reserved | ||
535 | 6 | # $Id$ | ||
536 | 7 | # | ||
537 | 8 | # This program is free software: you can redistribute it and/or modify | ||
538 | 9 | # it under the terms of the GNU General Public License as published by | ||
539 | 10 | # the Free Software Foundation, either version 3 of the License, or | ||
540 | 11 | # (at your option) any later version. | ||
541 | 12 | # | ||
542 | 13 | # This program is distributed in the hope that it will be useful, | ||
543 | 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
544 | 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
545 | 16 | # GNU General Public License for more details. | ||
546 | 17 | # | ||
547 | 18 | # You should have received a copy of the GNU General Public License | ||
548 | 19 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
549 | 20 | # | ||
550 | 21 | ############################################################################## | ||
551 | 22 | |||
552 | 23 | """Modificamos las ventas para incluir el comportamiento de comisiones""" | ||
553 | 24 | from osv import fields, osv | ||
554 | 25 | |||
555 | 26 | class product_agent_commission(osv.osv): | ||
556 | 27 | _name = "product.agent.commission" | ||
557 | 28 | _rec_name = "commission_id" | ||
558 | 29 | |||
559 | 30 | _columns = { | ||
560 | 31 | 'product_id':fields.many2one('product.product', 'Product', required=False, ondelete='cascade', help=''), | ||
561 | 32 | 'commission_id':fields.many2one('commission', 'Applied commission', required=True, help=''), | ||
562 | 33 | 'agent_ids':fields.many2many('sale.agent', 'product_agent_sale_agent_rel', 'product_commission_id','agent_id','Agents'), | ||
563 | 34 | } | ||
564 | 35 | |||
565 | 36 | product_agent_commission() | ||
566 | 37 | |||
567 | 38 | class product_product(osv.osv): | ||
568 | 39 | |||
569 | 40 | _inherit = 'product.product' | ||
570 | 41 | _columns = { | ||
571 | 42 | 'product_agent_ids':fields.one2many('product.agent.commission', 'product_id', 'Agents') | ||
572 | 43 | } | ||
573 | 44 | |||
574 | 45 | |||
575 | 46 | product_product() | ||
576 | 47 | |||
577 | 0 | 48 | ||
578 | === modified file 'sale_commission/product_view.xml' | |||
579 | --- sale_commission/product_view.xml 2012-07-13 10:51:04 +0000 | |||
580 | +++ sale_commission/product_view.xml 2014-03-13 12:35:19 +0000 | |||
581 | @@ -11,6 +11,30 @@ | |||
582 | 11 | <field name="company_id" position="after"> | 11 | <field name="company_id" position="after"> |
583 | 12 | <field name="commission_exent"/> | 12 | <field name="commission_exent"/> |
584 | 13 | </field> | 13 | </field> |
585 | 14 | |||
586 | 15 | <xpath expr="/form/notebook/page[@string='Procurement & Locations']/group[3]" position="after"> | ||
587 | 16 | <group colspan="2" col="2"> | ||
588 | 17 | <separator colspan="2" string="Agents/Commissions"/> | ||
589 | 18 | <field name="product_agent_ids" nolabel="1" mode="tree,form"> | ||
590 | 19 | <tree string="Agents and Products" editable="top"> | ||
591 | 20 | <!-- <field name="agent_ids" on_change="onchange_agent_id(agent_id)"/> | ||
592 | 21 | <field name="commission_id" on_change="onchange_commission_id(agent_id,commission_id)"/> --> | ||
593 | 22 | <field name="agent_ids"> | ||
594 | 23 | <tree> | ||
595 | 24 | <field name="name"/> | ||
596 | 25 | </tree> | ||
597 | 26 | </field> | ||
598 | 27 | <field name="commission_id"/> | ||
599 | 28 | </tree> | ||
600 | 29 | <form> | ||
601 | 30 | <field name="commission_id"/> | ||
602 | 31 | <separator colspan="4" string="Agents/Commissions"/> | ||
603 | 32 | <field name="agent_ids" colspan="4" nolabel="1"/> | ||
604 | 33 | |||
605 | 34 | </form> | ||
606 | 35 | </field> | ||
607 | 36 | </group> | ||
608 | 37 | </xpath> | ||
609 | 14 | </field> | 38 | </field> |
610 | 15 | </record> | 39 | </record> |
611 | 16 | 40 | ||
612 | 17 | 41 | ||
613 | === modified file 'sale_commission/sale_order.py' | |||
614 | --- sale_commission/sale_order.py 2013-11-20 16:40:20 +0000 | |||
615 | +++ sale_commission/sale_order.py 2014-03-13 12:35:19 +0000 | |||
616 | @@ -40,7 +40,7 @@ | |||
617 | 40 | _columns = { | 40 | _columns = { |
618 | 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=''), |
619 | 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=''), |
621 | 43 | 'commission_id':fields.many2one('commission', 'Applied commission', required=True, ondelete='cascade', help=''), | 43 | 'commission_id':fields.many2one('commission', 'Applied commission', required=True, help=''), |
622 | 44 | } | 44 | } |
623 | 45 | 45 | ||
624 | 46 | def onchange_agent_id(self, cr, uid, ids, agent_id): | 46 | def onchange_agent_id(self, cr, uid, ids, agent_id): |
625 | @@ -80,7 +80,6 @@ | |||
626 | 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)]}) |
627 | 81 | } | 81 | } |
628 | 82 | 82 | ||
629 | 83 | |||
630 | 84 | def onchange_partner_id(self, cr, uid, ids, part): | 83 | def onchange_partner_id(self, cr, uid, ids, part): |
631 | 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""" |
632 | 86 | sale_agent_ids=[] | 85 | sale_agent_ids=[] |
633 | @@ -116,36 +115,149 @@ | |||
634 | 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]] }) |
635 | 117 | return res | 116 | return res |
636 | 118 | 117 | ||
637 | 118 | def create(self, cr, uid, values, context=None): | ||
638 | 119 | """ | ||
639 | 120 | Para que el cliente gtk no borre el agente al darle a guardar | ||
640 | 121 | """ | ||
641 | 122 | res = super(sale_order, self).create(cr, uid, values, context=context) | ||
642 | 123 | if 'sale_agent_ids' in values: | ||
643 | 124 | for sale_order_agent in values['sale_agent_ids']: | ||
644 | 125 | self.pool.get('sale.order.agent').write(cr, uid, sale_order_agent[1], {'sale_id':res}) | ||
645 | 126 | return res | ||
646 | 127 | |||
647 | 119 | sale_order() | 128 | sale_order() |
648 | 120 | 129 | ||
649 | 130 | class sale_line_agent(osv.osv): | ||
650 | 131 | _name = "sale.line.agent" | ||
651 | 132 | _rec_name = "agent_id" | ||
652 | 133 | |||
653 | 134 | _columns = { | ||
654 | 135 | 'line_id':fields.many2one('sale.order.line', 'Sale order line', required=False, ondelete='cascade', help=''), | ||
655 | 136 | 'agent_id':fields.many2one('sale.agent', 'Agent', required=True, ondelete='cascade', help=''), | ||
656 | 137 | 'commission_id':fields.many2one('commission', 'Applied commission', required=True, help=''), | ||
657 | 138 | } | ||
658 | 139 | |||
659 | 140 | def onchange_agent_id(self, cr, uid, ids, agent_id): | ||
660 | 141 | """al cambiar el agente cargamos sus comisión""" | ||
661 | 142 | result = {} | ||
662 | 143 | v = {} | ||
663 | 144 | if agent_id: | ||
664 | 145 | agent = self.pool.get('sale.agent').browse(cr, uid, agent_id) | ||
665 | 146 | v['commission_id'] = agent.commission.id | ||
666 | 147 | |||
667 | 148 | result['value'] = v | ||
668 | 149 | return result | ||
669 | 150 | |||
670 | 151 | def onchange_commission_id(self, cr, uid, ids, agent_id=False, commission_id=False): | ||
671 | 152 | """al cambiar la comisión comprobamos la selección""" | ||
672 | 153 | result = {} | ||
673 | 154 | |||
674 | 155 | if commission_id: | ||
675 | 156 | partner_commission = self.pool.get('commission').browse(cr, uid, commission_id) | ||
676 | 157 | if partner_commission.sections: | ||
677 | 158 | if agent_id: | ||
678 | 159 | agent = self.pool.get('sale.agent').browse(cr, uid, agent_id) | ||
679 | 160 | if agent.commission.id != partner_commission.id: | ||
680 | 161 | result['warning'] = {} | ||
681 | 162 | result['warning']['title'] = _('Fee installments!') | ||
682 | 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.') | ||
683 | 164 | return result | ||
684 | 165 | sale_line_agent() | ||
685 | 166 | |||
686 | 121 | 167 | ||
687 | 122 | class sale_order_line(osv.osv): | 168 | class sale_order_line(osv.osv): |
688 | 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""" |
689 | 124 | 170 | ||
690 | 125 | _inherit = "sale.order.line" | 171 | _inherit = "sale.order.line" |
692 | 126 | 172 | _columns = { | |
693 | 173 | 'line_agent_ids':fields.one2many('sale.line.agent', 'line_id', 'Agents', states={'draft': [('readonly', False)]}) | ||
694 | 174 | } | ||
695 | 127 | 175 | ||
696 | 128 | def invoice_line_create(self, cr, uid, ids, context=None): | 176 | def invoice_line_create(self, cr, uid, ids, context=None): |
697 | 129 | if context is None: | 177 | if context is None: |
698 | 130 | context = {} | 178 | context = {} |
700 | 131 | 179 | ||
701 | 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) |
715 | 133 | so_ref = self.browse(cr,uid,ids)[0].order_id | 181 | for inv_line in self.pool.get('account.invoice.line').browse(cr, uid, res): |
716 | 134 | for so_agent_id in so_ref.sale_agent_ids: | 182 | list_ids = [x.id for x in inv_line.commission_ids] |
717 | 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) |
718 | 136 | for inv_line in inv_lines: | 184 | return res |
719 | 137 | if inv_line.product_id and inv_line.product_id.commission_exent != True: | 185 | |
720 | 138 | vals = { | 186 | def _create_invoice_line_agent(self,cr,uid,ids,agent_id,commission_id): |
721 | 139 | 'invoice_line_id': inv_line.id, | 187 | vals = { |
722 | 140 | 'agent_id': so_agent_id.agent_id.id, | 188 | 'agent_id' : agent_id, |
723 | 141 | 'commission_id': so_agent_id.commission_id.id, | 189 | 'commission_id' :commission_id, |
724 | 142 | 'settled': False | 190 | 'settled': False |
725 | 143 | } | 191 | } |
726 | 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) |
727 | 145 | self.pool.get('invoice.line.agent').calculate_commission(cr, uid, [line_agent_id]) | 193 | return line_agent_id |
728 | 194 | |||
729 | 195 | def _prepare_order_line_invoice_line(self, cr, uid, line, account_id=False, context=None): | ||
730 | 196 | res = super(sale_order_line,self)._prepare_order_line_invoice_line(cr,uid,line,account_id,context) | ||
731 | 197 | list_ids = [] | ||
732 | 198 | if not line.product_id.commission_exent: | ||
733 | 199 | if not line.line_agent_ids: #si la linea no tiene comissiones arrastro los del pedido a la linea de factura | ||
734 | 200 | for so_comm in line.order_id.sale_agent_ids: | ||
735 | 201 | line_agent_id= self._create_invoice_line_agent(cr,uid,[],so_comm.agent_id.id,so_comm.commission_id.id) | ||
736 | 202 | list_ids.append(line_agent_id) | ||
737 | 203 | |||
738 | 204 | else: | ||
739 | 205 | for l_comm in line.line_agent_ids: | ||
740 | 206 | line_agent_id= self._create_invoice_line_agent(cr,uid,[],l_comm.agent_id.id,l_comm.commission_id.id) | ||
741 | 207 | list_ids.append(line_agent_id) | ||
742 | 208 | res['commission_ids'] = [(6,0,list_ids)] | ||
743 | 209 | return res | ||
744 | 210 | |||
745 | 211 | def _create_line_commission(self,cr,uid,ids,agent_id,commission_id): | ||
746 | 212 | sale_line_agent = self.pool.get("sale.line.agent") | ||
747 | 213 | vals={ | ||
748 | 214 | 'agent_id' : agent_id, | ||
749 | 215 | 'commission_id' : commission_id | ||
750 | 216 | } | ||
751 | 217 | if ids: | ||
752 | 218 | vals['line_id'] = ids[0] | ||
753 | 219 | return sale_line_agent.create(cr,uid,vals) | ||
754 | 220 | def product_id_change2(self, cr, uid, ids,pricelist, product, qty=0, | ||
755 | 221 | uom=False, qty_uos=0, uos=False, name='', partner_id=False, | ||
756 | 222 | lang=False, update_tax=True, date_order=False, packaging=False, fiscal_position=False, flag=False,sale_agent_ids=False,context=None): | ||
757 | 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) | ||
758 | 224 | if product: | ||
759 | 225 | list_agent_ids = [] | ||
760 | 226 | product_obj = self.pool.get("product.product").browse(cr,uid,product) | ||
761 | 227 | # order_obj = self.pool.get("sale.order").browse(cr,uid,context['order_id']) | ||
762 | 228 | sale_line_agent = self.pool.get("sale.line.agent") | ||
763 | 229 | if ids: | ||
764 | 230 | sale_line_agent.unlink(cr,uid,sale_line_agent.search(cr,uid,[('line_id','in',ids)])) | ||
765 | 231 | res['value']['line_agent_ids'] = [] | ||
766 | 232 | if not product_obj.commission_exent: | ||
767 | 233 | order_comm_ids = [x[1] for x in sale_agent_ids if x[0] != 2] | ||
768 | 234 | order_agent_ids = [ x.agent_id.id for x in self.pool.get("sale.order.agent").browse(cr,uid,order_comm_ids)] | ||
769 | 235 | # order_agent_ids = [x.agent_id.id for x in order_obj.sale_agent_ids] | ||
770 | 236 | dic= {} | ||
771 | 237 | for prod_record in product_obj.product_agent_ids: | ||
772 | 238 | if not prod_record.agent_ids: #no hay agentes especificados para la comisión: se usan los agentes del pedido | ||
773 | 239 | for agent_id in order_agent_ids: | ||
774 | 240 | if agent_id not in dic: | ||
775 | 241 | dic[agent_id] = prod_record.commission_id.id | ||
776 | 242 | else: | ||
777 | 243 | for agent_id in prod_record.agent_ids: | ||
778 | 244 | if agent_id.id in order_agent_ids: | ||
779 | 245 | dic[agent_id.id] = prod_record.commission_id.id | ||
780 | 246 | |||
781 | 247 | for k in dic: | ||
782 | 248 | line_agent_id = self._create_line_commission(cr,uid,ids,k,dic[k]) | ||
783 | 249 | list_agent_ids.append(int(line_agent_id)) | ||
784 | 250 | res['value']['line_agent_ids'] = list_agent_ids | ||
785 | 251 | return res | ||
786 | 252 | |||
787 | 253 | def create(self, cr, uid, values, context=None): | ||
788 | 254 | """ | ||
789 | 255 | Para que el cliente gtk no borre el agente de la linea al darle a guardar | ||
790 | 256 | """ | ||
791 | 257 | res = super(sale_order_line, self).create(cr, uid, values, context=context) | ||
792 | 258 | if 'line_agent_ids' in values: | ||
793 | 259 | for sale_line_agent in values['line_agent_ids']: | ||
794 | 260 | self.pool.get('sale.line.agent').write(cr, uid, sale_line_agent[1], {'line_id':res}) | ||
795 | 146 | return res | 261 | return res |
796 | 147 | 262 | ||
797 | 148 | sale_order_line() | 263 | sale_order_line() |
798 | 149 | |||
799 | 150 | |||
800 | 151 | |||
801 | 152 | 264 | ||
802 | === modified file 'sale_commission/sale_order_view.xml' | |||
803 | --- sale_commission/sale_order_view.xml 2012-07-13 10:51:04 +0000 | |||
804 | +++ sale_commission/sale_order_view.xml 2014-03-13 12:35:19 +0000 | |||
805 | @@ -2,19 +2,6 @@ | |||
806 | 2 | <openerp> | 2 | <openerp> |
807 | 3 | <data> | 3 | <data> |
808 | 4 | 4 | ||
809 | 5 | <!--record id="view_order_comm_tree" model="ir.ui.view"> | ||
810 | 6 | <field name="name">sale.order.comm.tree</field> | ||
811 | 7 | <field name="model">sale.order</field> | ||
812 | 8 | <field name="inherit_id" ref="sale.view_order_tree"/> | ||
813 | 9 | <field name="type">tree</field> | ||
814 | 10 | <field name="arch" type="xml"> | ||
815 | 11 | <field name="partner_shipping_id" position="after"> | ||
816 | 12 | <field name="agent_code" select="2"/> | ||
817 | 13 | <field name="country" select="2"/> | ||
818 | 14 | </field> | ||
819 | 15 | </field> | ||
820 | 16 | </record--> | ||
821 | 17 | |||
822 | 18 | <record id="view_order_agent_form_inherit" model="ir.ui.view"> | 5 | <record id="view_order_agent_form_inherit" model="ir.ui.view"> |
823 | 19 | <field name="name">sale.agent.order.inherit.form</field> | 6 | <field name="name">sale.agent.order.inherit.form</field> |
824 | 20 | <field name="model">sale.order</field> | 7 | <field name="model">sale.order</field> |
825 | @@ -32,6 +19,19 @@ | |||
826 | 32 | </field> | 19 | </field> |
827 | 33 | </group> | 20 | </group> |
828 | 34 | </field> | 21 | </field> |
829 | 22 | <xpath expr="//field[@name='order_line']/form/notebook/page[@string='History']" position="after"> | ||
830 | 23 | <page string='Agents and Commisions'> | ||
831 | 24 | <field name="line_agent_ids" nolabel="1" colspan="4"> | ||
832 | 25 | <tree string="Agents and Commissions" editable="top"> | ||
833 | 26 | <field name="agent_id" on_change="onchange_agent_id(agent_id)" /> | ||
834 | 27 | <field name="commission_id" on_change="onchange_commission_id(agent_id,commission_id)"/> | ||
835 | 28 | </tree> | ||
836 | 29 | </field> | ||
837 | 30 | </page> | ||
838 | 31 | </xpath> | ||
839 | 32 | <xpath expr="//field[@name='order_line']/form/notebook/page[@string='Order Line']/group[1]/field[@name='product_id']" position="replace"> | ||
840 | 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)"/> | ||
841 | 34 | </xpath> | ||
842 | 35 | </field> | 35 | </field> |
843 | 36 | </record> | 36 | </record> |
844 | 37 | 37 | ||
845 | 38 | 38 | ||
846 | === modified file 'sale_commission/saleagent.py' | |||
847 | --- sale_commission/saleagent.py 2012-07-13 10:51:04 +0000 | |||
848 | +++ sale_commission/saleagent.py 2014-03-13 12:35:19 +0000 | |||
849 | @@ -32,7 +32,8 @@ | |||
850 | 32 | 'name': fields.char('Name', size=64, required=True), | 32 | 'name': fields.char('Name', size=64, required=True), |
851 | 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), |
852 | 34 | 'fix_qty': fields.float('Fix Percentage'), | 34 | 'fix_qty': fields.float('Fix Percentage'), |
854 | 35 | 'sections': fields.one2many('commission.section', 'commission_id', 'Sections') | 35 | 'sections': fields.one2many('commission.section', 'commission_id', 'Sections'), |
855 | 36 | 'product_agent_ids':fields.one2many('product.agent.commission', 'commission_id', 'Agents') | ||
856 | 36 | } | 37 | } |
857 | 37 | _defaults = { | 38 | _defaults = { |
858 | 38 | 'type' : lambda *a: 'fijo', | 39 | 'type' : lambda *a: 'fijo', |
859 | @@ -40,9 +41,8 @@ | |||
860 | 40 | 41 | ||
861 | 41 | def calcula_tramos(self, cr, uid, ids, base): | 42 | def calcula_tramos(self, cr, uid, ids, base): |
862 | 42 | commission = self.browse(cr, uid, ids)[0] | 43 | commission = self.browse(cr, uid, ids)[0] |
863 | 43 | #Cálculo de tramos | ||
864 | 44 | for section in commission.sections: | 44 | for section in commission.sections: |
866 | 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): |
867 | 46 | res = base * section.percent / 100.0 | 46 | res = base * section.percent / 100.0 |
868 | 47 | return res | 47 | return res |
869 | 48 | return 0.0 | 48 | return 0.0 |
870 | @@ -59,7 +59,7 @@ | |||
871 | 59 | 'commission_from': fields.float('From'), | 59 | 'commission_from': fields.float('From'), |
872 | 60 | 'commission_until': fields.float('Until'), | 60 | 'commission_until': fields.float('Until'), |
873 | 61 | 'percent': fields.float('Percent'), | 61 | 'percent': fields.float('Percent'), |
875 | 62 | 'commission_id': fields.many2one('commission', 'Commission') | 62 | 'commission_id': fields.many2one('commission', 'Commission', required=True) |
876 | 63 | 63 | ||
877 | 64 | } | 64 | } |
878 | 65 | 65 | ||
879 | 66 | 66 | ||
880 | === modified file 'sale_commission/saleagent_view.xml' | |||
881 | --- sale_commission/saleagent_view.xml 2012-07-13 10:51:04 +0000 | |||
882 | +++ sale_commission/saleagent_view.xml 2014-03-13 12:35:19 +0000 | |||
883 | @@ -128,7 +128,21 @@ | |||
884 | 128 | </tree> | 128 | </tree> |
885 | 129 | </field> | 129 | </field> |
886 | 130 | </group> | 130 | </group> |
888 | 131 | 131 | <field name="product_agent_ids" nolabel="1" colspan="4"> | |
889 | 132 | <tree string="Agents and Commissions" editable="top"> | ||
890 | 133 | <field name="agent_ids"> | ||
891 | 134 | <tree> | ||
892 | 135 | <field name="name"/> | ||
893 | 136 | </tree> | ||
894 | 137 | </field> | ||
895 | 138 | <field name="product_id"/> | ||
896 | 139 | </tree> | ||
897 | 140 | <form> | ||
898 | 141 | <field name="product_id"/> | ||
899 | 142 | <separator colspan="4" string="Agents/Commissions"/> | ||
900 | 143 | <field name="agent_ids" colspan="4" nolabel="1"/> | ||
901 | 144 | </form> | ||
902 | 145 | </field> | ||
903 | 132 | </form> | 146 | </form> |
904 | 133 | </field> | 147 | </field> |
905 | 134 | </record> | 148 | </record> |
906 | 135 | 149 | ||
907 | === modified file 'sale_commission/security/ir.model.access.csv' | |||
908 | --- sale_commission/security/ir.model.access.csv 2012-07-13 10:51:04 +0000 | |||
909 | +++ sale_commission/security/ir.model.access.csv 2014-03-13 12:35:19 +0000 | |||
910 | @@ -26,3 +26,6 @@ | |||
911 | 26 | "access_settled_invoice_agent_salesman","access_settled_invoice_agent_salesman","model_settled_invoice_agent","base.group_sale_salesman",1,0,0,0 | 26 | "access_settled_invoice_agent_salesman","access_settled_invoice_agent_salesman","model_settled_invoice_agent","base.group_sale_salesman",1,0,0,0 |
912 | 27 | "access_settled_invoice_agent_sale_manager","access_settled_invoice_agent_sale_manager","model_settled_invoice_agent","base.group_sale_manager",1,1,1,1 | 27 | "access_settled_invoice_agent_sale_manager","access_settled_invoice_agent_sale_manager","model_settled_invoice_agent","base.group_sale_manager",1,1,1,1 |
913 | 28 | "access_settled_invoice_agent_partner_manager","access_settled_invoice_agent_partner_manager","model_settled_invoice_agent","base.group_partner_manager",1,0,0,0 | 28 | "access_settled_invoice_agent_partner_manager","access_settled_invoice_agent_partner_manager","model_settled_invoice_agent","base.group_partner_manager",1,0,0,0 |
914 | 29 | "access_sale_line_agent_salesman","access_sale_line_agent_salesman","model_sale_line_agent","base.group_sale_salesman",1,1,1,1 | ||
915 | 30 | "access_product_agent_commission_salesman","access_product_agent_commission_salesman","model_product_agent_commission","base.group_sale_salesman",1,0,0,0 | ||
916 | 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 | ||
917 | 29 | \ No newline at end of file | 32 | \ No newline at end of file |
918 | 30 | 33 | ||
919 | === modified file 'sale_commission/settled.py' | |||
920 | --- sale_commission/settled.py 2013-10-16 10:36:21 +0000 | |||
921 | +++ sale_commission/settled.py 2014-03-13 12:35:19 +0000 | |||
922 | @@ -94,14 +94,13 @@ | |||
923 | 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 ' \ |
924 | 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 ' \ |
925 | 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 ' \ |
927 | 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\')'\ |
928 | 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 +'\''\ |
929 | 99 | ' AND account_invoice.company_id = ' + str(user.company_id.id) | 99 | ' AND account_invoice.company_id = ' + str(user.company_id.id) |
930 | 100 | 100 | ||
931 | 101 | cr.execute(sql) | 101 | cr.execute(sql) |
932 | 102 | res = cr.fetchall() | 102 | res = cr.fetchall() |
933 | 103 | inv_line_agent_ids = [x[0] for x in res] | 103 | inv_line_agent_ids = [x[0] for x in res] |
934 | 104 | |||
935 | 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) |
936 | 106 | 105 | ||
937 | 107 | 106 | ||
938 | @@ -141,13 +140,13 @@ | |||
939 | 141 | 'state': lambda *a: 'settled' | 140 | 'state': lambda *a: 'settled' |
940 | 142 | } | 141 | } |
941 | 143 | 142 | ||
943 | 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): |
944 | 145 | 144 | ||
945 | 146 | agents_pool=self.pool.get('settlement.agent') | 145 | agents_pool=self.pool.get('settlement.agent') |
946 | 147 | res={} | 146 | res={} |
947 | 148 | for settlement in self.browse(cursor, user, ids, context=context): | 147 | for settlement in self.browse(cursor, user, ids, context=context): |
948 | 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) |
950 | 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) |
951 | 151 | 150 | ||
952 | 152 | res[settlement.id] = invoices_agent.values() | 151 | res[settlement.id] = invoices_agent.values() |
953 | 153 | return res | 152 | return res |
954 | @@ -198,7 +197,7 @@ | |||
955 | 198 | """Liquidaciones de Agentes""" | 197 | """Liquidaciones de Agentes""" |
956 | 199 | 198 | ||
957 | 200 | _name = 'settlement.agent' | 199 | _name = 'settlement.agent' |
959 | 201 | 200 | _rec_name = 'agent_id' | |
960 | 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): |
961 | 203 | '''Call after the creation of the invoice line''' | 202 | '''Call after the creation of the invoice line''' |
962 | 204 | return | 203 | return |
963 | @@ -232,7 +231,7 @@ | |||
964 | 232 | return False | 231 | return False |
965 | 233 | 232 | ||
966 | 234 | 233 | ||
968 | 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): |
969 | 236 | '''Return ids of created invoices for the settlements''' | 235 | '''Return ids of created invoices for the settlements''' |
970 | 237 | 236 | ||
971 | 238 | invoice_obj = self.pool.get('account.invoice') | 237 | invoice_obj = self.pool.get('account.invoice') |
972 | @@ -241,12 +240,12 @@ | |||
973 | 241 | res = {} | 240 | res = {} |
974 | 242 | 241 | ||
975 | 243 | for settlement in self.browse(cursor, user, ids, context=context): | 242 | for settlement in self.browse(cursor, user, ids, context=context): |
977 | 244 | 243 | if (not settlement.total_sections) and (not settlement.total): | |
978 | 244 | continue | ||
979 | 245 | payment_term_id = False | 245 | payment_term_id = False |
980 | 246 | partner = settlement.agent_id and settlement.agent_id.partner_id | 246 | partner = settlement.agent_id and settlement.agent_id.partner_id |
981 | 247 | if not partner: | 247 | if not partner: |
984 | 248 | raise osv.except_osv(_('Error, partner fail !'), | 248 | continue |
983 | 249 | _('Agent to settle hasn\'t assigned partner.')) | ||
985 | 250 | 249 | ||
986 | 251 | #El tipo es de facura de proveedor | 250 | #El tipo es de facura de proveedor |
987 | 252 | account_id = partner.property_account_payable.id | 251 | account_id = partner.property_account_payable.id |
988 | @@ -299,31 +298,50 @@ | |||
989 | 299 | ) | 298 | ) |
990 | 300 | else: | 299 | else: |
991 | 301 | tax_ids = map(lambda x: x.id, taxes) | 300 | tax_ids = map(lambda x: x.id, taxes) |
1002 | 302 | for invoice in settlement.invoices: | 301 | |
1003 | 303 | origin = invoice.invoice_number | 302 | account_id = self.pool.get('account.fiscal.position').map_account(cursor, user, partner.property_account_position, account_id) |
1004 | 304 | name = invoice.invoice_number | 303 | uos_id = False #set UoS if it's a sale and the picking doesn't have one |
1005 | 305 | price_unit = invoice.settled_amount | 304 | if mode == 'invoice': |
1006 | 306 | discount = 0 | 305 | for invoice in settlement.invoices: |
1007 | 307 | 306 | invoice_line_id = invoice_line_obj.create(cursor, user, { | |
1008 | 308 | #set UoS if it's a sale and the picking doesn't have one | 307 | 'name': invoice.invoice_number, |
1009 | 309 | uos_id = False | 308 | 'origin': invoice.invoice_number, |
1010 | 310 | 309 | 'invoice_id': invoice_id, | |
1011 | 311 | account_id = self.pool.get('account.fiscal.position').map_account(cursor, user, partner.property_account_position, account_id) | 310 | 'uos_id': uos_id, |
1012 | 311 | 'product_id': product.id, | ||
1013 | 312 | 'account_id': account_id, | ||
1014 | 313 | 'price_unit': invoice.settled_amount, | ||
1015 | 314 | 'discount': 0, | ||
1016 | 315 | 'quantity': 1, | ||
1017 | 316 | 'invoice_line_tax_id': [(6, 0, tax_ids)], | ||
1018 | 317 | }, context=context) | ||
1019 | 318 | elif mode == 'line': | ||
1020 | 319 | for line in settlement.lines: | ||
1021 | 320 | invoice_line_id = invoice_line_obj.create(cursor, user, { | ||
1022 | 321 | 'name': line.invoice_id.number, | ||
1023 | 322 | 'origin': line.invoice_id.number, | ||
1024 | 323 | 'invoice_id': invoice_id, | ||
1025 | 324 | 'uos_id': uos_id, | ||
1026 | 325 | 'product_id': product.id, | ||
1027 | 326 | 'account_id': account_id, | ||
1028 | 327 | 'price_unit': line.commission, | ||
1029 | 328 | 'discount': 0, | ||
1030 | 329 | 'quantity': 1, | ||
1031 | 330 | 'invoice_line_tax_id': [(6, 0, tax_ids)], | ||
1032 | 331 | }, context=context) | ||
1033 | 332 | elif mode == 'agent': | ||
1034 | 312 | invoice_line_id = invoice_line_obj.create(cursor, user, { | 333 | invoice_line_id = invoice_line_obj.create(cursor, user, { |
1049 | 313 | 'name': name, | 334 | 'name': settlement.settlement_id.name or '', |
1050 | 314 | 'origin': origin, | 335 | 'origin': settlement.settlement_id.name or '', |
1051 | 315 | 'invoice_id': invoice_id, | 336 | 'invoice_id': invoice_id, |
1052 | 316 | 'uos_id': uos_id, | 337 | 'uos_id': uos_id, |
1053 | 317 | 'product_id': product.id, | 338 | 'product_id': product.id, |
1054 | 318 | 'account_id': account_id, | 339 | 'account_id': account_id, |
1055 | 319 | 'price_unit': price_unit, | 340 | 'price_unit': settlement.total, |
1056 | 320 | 'discount': discount, | 341 | 'discount': 0, |
1057 | 321 | 'quantity': 1, | 342 | 'quantity': 1, |
1058 | 322 | 'invoice_line_tax_id': [(6, 0, tax_ids)], | 343 | 'invoice_line_tax_id': [(6, 0, tax_ids)], |
1059 | 323 | #'account_analytic_id': account_analytic_id, | 344 | }, context=context) |
1046 | 324 | }, context=context) | ||
1047 | 325 | self._invoice_line_hook(cursor, user, invoice, invoice_line_id) | ||
1048 | 326 | |||
1060 | 327 | invoice_obj.button_compute(cursor, user, [invoice_id], context=context, | 345 | invoice_obj.button_compute(cursor, user, [invoice_id], context=context, |
1061 | 328 | set_total=(type in ('in_invoice', 'in_refund'))) | 346 | set_total=(type in ('in_invoice', 'in_refund'))) |
1062 | 329 | self._invoice_hook(cursor, user, settlement, invoice_id) | 347 | self._invoice_hook(cursor, user, settlement, invoice_id) |
1063 | @@ -338,7 +356,7 @@ | |||
1064 | 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 ' \ |
1065 | 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 ' \ |
1066 | 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 ' \ |
1068 | 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\''\ |
1069 | 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 +'\''\ |
1070 | 343 | ' AND account_invoice.company_id = ' + str(user.company_id.id) | 361 | ' AND account_invoice.company_id = ' + str(user.company_id.id) |
1071 | 344 | 362 | ||
1072 | @@ -352,13 +370,14 @@ | |||
1073 | 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 ' \ |
1074 | 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 ' \ |
1075 | 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 ' \ |
1077 | 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\')'\ |
1078 | 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 +'\''\ |
1079 | 357 | ' AND account_invoice.company_id = ' + str(user.company_id.id) | 375 | ' AND account_invoice.company_id = ' + str(user.company_id.id) |
1080 | 358 | 376 | ||
1081 | 359 | cr.execute(sql) | 377 | cr.execute(sql) |
1082 | 360 | res = cr.fetchall() | 378 | res = cr.fetchall() |
1083 | 361 | inv_line_ids = [x[0] for x in res] | 379 | inv_line_ids = [x[0] for x in res] |
1084 | 380 | |||
1085 | 362 | total_per = 0 | 381 | total_per = 0 |
1086 | 363 | total_sections = 0 | 382 | total_sections = 0 |
1087 | 364 | total = 0 | 383 | total = 0 |
1088 | @@ -380,14 +399,17 @@ | |||
1089 | 380 | if line.commission_id.type == "tramos": | 399 | if line.commission_id.type == "tramos": |
1090 | 381 | if line.invoice_line_id.product_id.commission_exent != True: | 400 | if line.invoice_line_id.product_id.commission_exent != True: |
1091 | 382 | # Hacemos un agregado de la base de cálculo agrupándolo por las distintas comisiones en tramos que tenga el agente asignadas | 401 | # Hacemos un agregado de la base de cálculo agrupándolo por las distintas comisiones en tramos que tenga el agente asignadas |
1092 | 402 | if line.invoice_line_id.invoice_id.type == 'out_refund': | ||
1093 | 403 | sign_price = - line.invoice_line_id.price_subtotal | ||
1094 | 404 | else: | ||
1095 | 405 | sign_price = line.invoice_line_id.price_subtotal | ||
1096 | 406 | |||
1097 | 383 | if line.commission_id.id in sections: | 407 | if line.commission_id.id in sections: |
1099 | 384 | sections[line.commission_id.id]['base'] = sections[line.commission_id.id]['base'] + line.invoice_line_id.price_subtotal | 408 | sections[line.commission_id.id]['base'] = sections[line.commission_id.id]['base'] + sign_price |
1100 | 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 tramos | 409 | 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 |
1101 | 386 | else: | 410 | else: |
1104 | 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]} |
1103 | 388 | |||
1105 | 389 | #Tramos para cada tipo de comisión creados | 412 | #Tramos para cada tipo de comisión creados |
1106 | 390 | |||
1107 | 391 | for tramo in sections: | 413 | for tramo in sections: |
1108 | 392 | #Cálculo de la comisión para cada tramo | 414 | #Cálculo de la comisión para cada tramo |
1109 | 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'])}) |
1110 | @@ -395,7 +417,7 @@ | |||
1111 | 395 | # reparto de la comisión para cada linea | 417 | # reparto de la comisión para cada linea |
1112 | 396 | 418 | ||
1113 | 397 | for linea_tramo in sections[tramo]['lines']: | 419 | for linea_tramo in sections[tramo]['lines']: |
1115 | 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)) |
1116 | 399 | linea_tramo.write({'commission':com_por_linea}) | 421 | linea_tramo.write({'commission':com_por_linea}) |
1117 | 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)]) |
1118 | 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}) |
1119 | @@ -438,7 +460,11 @@ | |||
1120 | 438 | invoice_line_amount = line.invoice_line_id.price_subtotal | 460 | invoice_line_amount = line.invoice_line_id.price_subtotal |
1121 | 439 | if commission_app.type=="fijo": | 461 | if commission_app.type=="fijo": |
1122 | 440 | commission_per = commission_app.fix_qty | 462 | commission_per = commission_app.fix_qty |
1124 | 441 | amount = amount + line.invoice_line_id.price_subtotal * float(commission_per) / 100 | 463 | # Para tener en cuenta las rectificativas |
1125 | 464 | if line.invoice_line_id.invoice_id.type == 'out_refund': | ||
1126 | 465 | amount = amount - line.invoice_line_id.price_subtotal * float(commission_per) / 100 | ||
1127 | 466 | else: | ||
1128 | 467 | amount = amount + line.invoice_line_id.price_subtotal * float(commission_per) / 100 | ||
1129 | 442 | 468 | ||
1130 | 443 | elif commission_app.type=="tramos": | 469 | elif commission_app.type=="tramos": |
1131 | 444 | invoice_line_amount = 0 | 470 | invoice_line_amount = 0 |
1132 | 445 | 471 | ||
1133 | === modified file 'sale_commission/stock_picking.py' | |||
1134 | --- sale_commission/stock_picking.py 2012-07-13 10:51:04 +0000 | |||
1135 | +++ sale_commission/stock_picking.py 2014-03-13 12:35:19 +0000 | |||
1136 | @@ -44,22 +44,41 @@ | |||
1137 | 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' ) |
1138 | 45 | } | 45 | } |
1139 | 46 | 46 | ||
1140 | 47 | def _create_invoice_line_agent(self,cr,uid,ids,agent_id,commission_id,invoice_line_id): | ||
1141 | 48 | vals = { | ||
1142 | 49 | 'agent_id' : agent_id, | ||
1143 | 50 | 'commission_id' : commission_id, | ||
1144 | 51 | 'settled': False, | ||
1145 | 52 | 'invoice_line_id' : invoice_line_id | ||
1146 | 53 | } | ||
1147 | 54 | line_agent_id=self.pool.get('invoice.line.agent').create(cr, uid, vals) | ||
1148 | 55 | self.pool.get('invoice.line.agent').calculate_commission(cr, uid, [line_agent_id]) | ||
1149 | 56 | return line_agent_id | ||
1150 | 57 | |||
1151 | 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): |
1152 | 48 | '''Call after the creation of the invoice line''' | 59 | '''Call after the creation of the invoice line''' |
1153 | 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) |
1155 | 50 | 61 | # import ipdb; ipdb.set_trace() | |
1156 | 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 : |
1157 | 52 | so_ref = move_line.sale_line_id.order_id | 63 | so_ref = move_line.sale_line_id.order_id |
1168 | 53 | for so_agent_id in so_ref.sale_agent_ids: | 64 | line = move_line.sale_line_id |
1169 | 54 | vals = { | 65 | if not line.line_agent_ids: #si la linea no tiene comissiones arrastro los del pedido a la linea de factura |
1170 | 55 | 'invoice_line_id': invoice_line_id, | 66 | for so_comm in line.order_id.sale_agent_ids: |
1171 | 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) |
1172 | 57 | 'commission_id': so_agent_id.commission_id.id, | 68 | else: |
1173 | 58 | 'settled': False | 69 | for l_comm in line.line_agent_ids: |
1174 | 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) |
1175 | 60 | 71 | ||
1176 | 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: |
1177 | 62 | self.pool.get('invoice.line.agent').calculate_commission(cursor, user, [line_agent_id]) | 73 | # vals = { |
1178 | 74 | # 'invoice_line_id': invoice_line_id, | ||
1179 | 75 | # 'agent_id': so_agent_id.agent_id.id, | ||
1180 | 76 | # 'commission_id': so_agent_id.commission_id.id, | ||
1181 | 77 | # 'settled': False | ||
1182 | 78 | # } | ||
1183 | 79 | |||
1184 | 80 | # line_agent_id=self.pool.get('invoice.line.agent').create(cursor, user, vals) | ||
1185 | 81 | # self.pool.get('invoice.line.agent').calculate_commission(cursor, user, [line_agent_id]) | ||
1186 | 63 | return | 82 | return |
1187 | 64 | 83 | ||
1188 | 65 | stock_picking() | 84 | stock_picking() |
1189 | 66 | \ No newline at end of file | 85 | \ No newline at end of file |
1190 | 67 | 86 | ||
1191 | === modified file 'sale_commission/wizard/wizard_invoice.py' | |||
1192 | --- sale_commission/wizard/wizard_invoice.py 2012-07-13 10:51:04 +0000 | |||
1193 | +++ sale_commission/wizard/wizard_invoice.py 2014-03-13 12:35:19 +0000 | |||
1194 | @@ -30,6 +30,7 @@ | |||
1195 | 30 | _columns = { | 30 | _columns = { |
1196 | 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), |
1197 | 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), |
1198 | 33 | 'mode': fields.selection([('line', 'for each invoice line settled'),('invoice','for each sale invoice'),('agent','summary for each agent')], 'A line', required=True), | ||
1199 | 33 | } | 34 | } |
1200 | 34 | _defaults = { | 35 | _defaults = { |
1201 | 35 | } | 36 | } |
1202 | @@ -39,13 +40,13 @@ | |||
1203 | 39 | def create_invoice(self, cr, uid, ids, context=None): | 40 | def create_invoice(self, cr, uid, ids, context=None): |
1204 | 40 | if context is None: | 41 | if context is None: |
1205 | 41 | context = {} | 42 | context = {} |
1207 | 42 | 43 | # import ipdb; ipdb.set_trace() | |
1208 | 43 | data_pool = self.pool.get('ir.model.data') | 44 | data_pool = self.pool.get('ir.model.data') |
1209 | 44 | settlement_obj = self.pool.get('settlement') | 45 | settlement_obj = self.pool.get('settlement') |
1210 | 45 | 46 | ||
1211 | 46 | for o in self.browse(cr, uid, ids, context=context): | 47 | for o in self.browse(cr, uid, ids, context=context): |
1212 | 47 | res = settlement_obj.action_invoice_create(cr, uid, context['active_ids'], | 48 | res = settlement_obj.action_invoice_create(cr, uid, context['active_ids'], |
1214 | 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) |
1215 | 49 | 50 | ||
1216 | 50 | invoice_ids = res.values() | 51 | invoice_ids = res.values() |
1217 | 51 | 52 | ||
1218 | 52 | 53 | ||
1219 | === modified file 'sale_commission/wizard/wizard_invoice.xml' | |||
1220 | --- sale_commission/wizard/wizard_invoice.xml 2012-07-13 10:51:04 +0000 | |||
1221 | +++ sale_commission/wizard/wizard_invoice.xml 2014-03-13 12:35:19 +0000 | |||
1222 | @@ -8,10 +8,12 @@ | |||
1223 | 8 | <field name="arch" type="xml"> | 8 | <field name="arch" type="xml"> |
1224 | 9 | <form string="Create invoices"> | 9 | <form string="Create invoices"> |
1225 | 10 | <separator colspan="4" string="Create invoice" /> | 10 | <separator colspan="4" string="Create invoice" /> |
1227 | 11 | <field name="journal_id"/> | 11 | <field name="journal_id" domain="[('type','=','purchase')]"/> |
1228 | 12 | <newline/> | 12 | <newline/> |
1229 | 13 | <field name="product_id"/> | 13 | <field name="product_id"/> |
1230 | 14 | <newline/> | 14 | <newline/> |
1231 | 15 | <field name="mode"/> | ||
1232 | 16 | <newline/> | ||
1233 | 15 | <button special="cancel" string="_Cancel" icon='gtk-cancel'/> | 17 | <button special="cancel" string="_Cancel" icon='gtk-cancel'/> |
1234 | 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"/> |
1235 | 17 | </form> | 19 | </form> |