[MERGE]: Merged with team1.
[odoo/odoo.git] / addons / sale_layout / sale_layout.py
1 # -*- encoding: utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution
5 #    Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). 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 from osv import fields,osv
24 from tools import config
25 import decimal_precision as dp
26 from tools.translate import _
27
28 class sale_order_line(osv.osv):
29
30     def _amount_line(self, cr, uid, ids, field_name, arg, context=None):
31         tax_obj = self.pool.get('account.tax')
32         cur_obj = self.pool.get('res.currency')
33         res = {}
34         context = context or {}
35         for line in self.browse(cr, uid, ids, context=context):
36             if line.layout_type=='article':
37                 return super(sale_order_line, self)._amount_line(cr, uid, ids, field_name, arg, context)
38         return res
39     def invoice_line_create(self, cr, uid, ids, context={}):
40         new_ids = []
41         list_seq = []
42         for line in self.browse(cr, uid, ids, context):
43             if line.layout_type == 'article':
44                 new_ids.append(line.id)
45                 list_seq.append(line.sequence)
46         invoice_line_ids = super(sale_order_line, self).invoice_line_create(cr, uid, new_ids, context)
47         pool_inv_line = self.pool.get('account.invoice.line')
48         seq = 0
49         for obj_inv_line in pool_inv_line.browse(cr, uid, invoice_line_ids, context=context):
50             pool_inv_line.write(cr, uid, [obj_inv_line.id], {'sequence': list_seq[seq]}, context=context)
51             seq += 1
52         return invoice_line_ids
53
54     def onchange_sale_order_line_view(self, cr, uid, id, type, context={}, *args):
55             temp ={}
56             temp['value']= {}
57             if (not type):
58                 return {}
59             if type != 'article':
60                 temp = {
61                     'value': {
62                     'product_id': False,
63                     'uos_id': False,
64                     'account_id': False,
65                     'price_unit': 0.0,
66                     'price_subtotal': 0.0,
67                     'quantity': 0,
68                     'discount': 0.0,
69                     'invoice_line_tax_id': False,
70                     'account_analytic_id': False,
71                     'product_uom_qty':0.0,
72                     },
73                 }
74                 if type == 'line':
75                     temp['value']['name'] = ' '
76                 if type == 'break':
77                     temp['value']['name'] = ' '
78                 if type == 'subtotal':
79                     temp['value']['name'] = 'Sub Total'
80                 return temp
81             return {}
82
83     def create(self, cr, user, vals, context=None):
84         if vals.has_key('layout_type'):
85             if vals['layout_type'] == 'line':
86                 vals['name'] = ' '
87             if vals['layout_type'] == 'break':
88                 vals['name'] = ' '
89             if vals['layout_type'] != 'article':
90                 vals['product_uom_qty']= 0
91         return super(sale_order_line, self).create(cr, user, vals, context)
92
93     def write(self, cr, user, ids, vals, context=None):
94         if vals.has_key('layout_type'):
95             if vals['layout_type'] == 'line':
96                 vals['name'] = ' '
97             if vals['layout_type'] == 'break':
98                 vals['name'] = ' '
99         return super(sale_order_line, self).write(cr, user, ids, vals, context)
100
101     def copy(self, cr, uid, id, default=None, context=None):
102         if default is None:
103             default = {}
104         default['layout_type'] = self.browse(cr, uid, id).layout_type
105         return super(sale_order_line, self).copy(cr, uid, id, default, context)
106
107
108     _name = "sale.order.line"
109     _order = "order_id, sequence asc"
110     _description = "Sale Order line"
111     _inherit = "sale.order.line"
112     _columns = {
113         'layout_type': fields.selection([
114                 ('article','Product'),
115                 ('title','Title'),
116                 ('text','Note'),
117                 ('subtotal','Sub Total'),
118                 ('line','Separator Line'),
119                 ('break','Page Break'),]
120             ,'Layout Type', select=True, required=True),
121         'sequence': fields.integer('Sequence Number'),
122         'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Sale Price'), readonly=True, states={'draft':[('readonly',False)]}),
123         'product_uom_qty': fields.float('Quantity (UoM)', digits=(16,2)),
124         'product_uom': fields.many2one('product.uom', 'Product UoM'),
125     }
126
127     _defaults = {
128         'layout_type': lambda *a: 'article',
129     }
130
131 sale_order_line()
132
133 class one2many_mod2(fields.one2many):
134     def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None):
135         if not context:
136             context = {}
137         if not values:
138             values = {}
139         res = {}
140         for id in ids:
141             res[id] = []
142         ids2 = obj.pool.get(self._obj).search(cr, user, [(self._fields_id,'in',ids),('layout_type','=','article')], limit=self._limit)
143         for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'):
144             res[r[self._fields_id]].append( r['id'] )
145         return res
146
147
148 class sale_order(osv.osv):
149
150     def copy(self, cr, uid, id, default=None, context=None):
151         if default is None:
152             default = {}
153         default['order_line'] = False
154         return super(sale_order, self).copy(cr, uid, id, default, context)
155
156     _inherit = "sale.order"
157     _columns = {
158         'abstract_line_ids': fields.one2many('sale.order.line', 'order_id', 'Order Lines',readonly=True, states={'draft':[('readonly',False)]}),
159         'order_line': one2many_mod2('sale.order.line', 'order_id', 'Order Lines',readonly=True, states={'draft':[('readonly',False)]}),
160     }
161
162 sale_order()
163
164 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: