~unifield-team/unifield-wm/us-826

« back to all changes in this revision

Viewing changes to stock_batch_recall/stock.py

  • Committer: Quentin THEURET
  • Date: 2011-11-30 13:31:37 UTC
  • mto: This revision was merged to the branch mainline in revision 515.
  • Revision ID: qt@tempo-consulting.fr-20111130133137-mdf2fp6hkqmwbppn
UF-647 [ADD] Added a line in Purchase Order to have information about international transport costs

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
from osv import osv, fields
25
25
from tools.translate import _
26
26
from decimal_precision import decimal_precision as dp
27
 
from tools.sql import drop_view_if_exists
28
 
 
29
27
 
30
28
class stock_batch_recall(osv.osv_memory):
31
29
    _name = 'stock.batch.recall'
37
35
        'expired_date': fields.date(string='Expired Date')
38
36
    }
39
37
    
40
 
    def get_ids(self, cr, uid, ids, context=None):
 
38
    def get_ids(self, cr, uid, ids, context={}):
41
39
        '''
42
40
        Returns all stock moves according to parameters
43
41
        '''
44
42
        move_obj = self.pool.get('stock.move')
45
43
        
46
 
        domain = [('product_qty', '>', 0.00)]
 
44
        domain = []
47
45
        for track in self.browse(cr, uid, ids):
48
46
            if not track.product_id and not track.prodlot_id and not track.expired_date:
49
47
                raise osv.except_osv(_('Error'), _('You should at least enter one information'))
57
55
                domain.append(('prodlot_id', '=', track.prodlot_id.id))
58
56
        return domain
59
57
    
60
 
    def return_view(self, cr, uid, ids, context=None):
 
58
    def return_view(self, cr, uid, ids, context={}):
61
59
        '''
62
60
        Print the report on Web client (search view)
63
61
        '''
64
 
        if context is None:
65
 
            context = {}
66
62
        mod_obj = self.pool.get('ir.model.data')
67
63
        act_obj = self.pool.get('ir.actions.act_window')
68
64
        
69
 
        view_context = {}
70
 
        #view_context = {'group_by_ctx': ['product_id', 'location_id'], 'group_by_no_leaf': 1}
 
65
        context = {'group_by': [],
 
66
                   'full':'1',
 
67
                   'group_by_no_leaf': 1}
71
68
        
72
 
        domain = self.get_ids(cr, uid, ids)
 
69
        domain =self.get_ids(cr, uid, ids)
73
70
        
74
71
        result = mod_obj._get_id(cr, uid, 'stock_batch_recall', 'action_report_batch_recall')
75
72
        id = mod_obj.read(cr, uid, [result], ['res_id'], context=context)[0]['res_id']
76
73
        
77
74
        result = act_obj.read(cr, uid, [id], context=context)[0]
 
75
        
 
76
        for d in domain:
 
77
            context.update({'search_default_%s' %d[0]: d[2]})
78
78
 
79
79
        result['domain'] = domain
80
80
        result['context'] = context
81
 
        result['target'] = 'crush'
82
81
        
83
82
        return result
84
83
        
89
88
    _description = 'Batch Recall'
90
89
    _auto = False
91
90
    _columns = {
 
91
        'date': fields.datetime('Date', readonly=True),
 
92
        'partner_id':fields.many2one('res.partner.address', 'Partner', readonly=True),
92
93
        'product_id':fields.many2one('product.product', 'Product', readonly=True),
 
94
        'product_categ_id':fields.many2one('product.category', 'Product Category', readonly=True),
93
95
        'location_id': fields.many2one('stock.location', 'Location', readonly=True),
94
 
        'prodlot_id': fields.many2one('stock.production.lot', 'Batch Number', readonly=True),
 
96
        'prodlot_id': fields.many2one('stock.production.lot', 'Lot', readonly=True),
95
97
        'expired_date': fields.date('Expired Date', readonly=True),
 
98
        'company_id': fields.many2one('res.company', 'Company', readonly=True),
96
99
        'product_qty':fields.float('Quantity',  digits_compute=dp.get_precision('Product UoM'), readonly=True),
 
100
        'value' : fields.float('Total Value',  digits_compute=dp.get_precision('Account'), required=True),
 
101
        'state': fields.selection([('draft', 'Draft'), ('waiting', 'Waiting'), ('confirmed', 'Confirmed'), ('assigned', 'Available'), ('done', 'Done'), ('cancel', 'Cancelled')], 'State', readonly=True, select=True,
 
102
              help='When the stock move is created it is in the \'Draft\' state.\n After that it is set to \'Confirmed\' state.\n If stock is available state is set to \'Avaiable\'.\n When the picking it done the state is \'Done\'.\
 
103
              \nThe state is \'Waiting\' if the move is waiting for another one.'),
97
104
        'location_type': fields.selection([('supplier', 'Supplier Location'), ('view', 'View'), ('internal', 'Internal Location'), ('customer', 'Customer Location'), ('inventory', 'Inventory'), ('procurement', 'Procurement'), ('production', 'Production'), ('transit', 'Transit Location for Inter-Companies Transfers')], 'Location Type', required=True),
98
105
    }
99
106
    
100
107
    def init(self, cr):
101
 
        drop_view_if_exists(cr, 'report_batch_recall')
 
108
        tools.drop_view_if_exists(cr, 'report_batch_recall')
102
109
        cr.execute("""
103
 
         CREATE OR REPLACE VIEW report_batch_recall AS (
104
 
            SELECT
105
 
                row_number() OVER(ORDER BY rec.product_id,
106
 
                                           lot.name,
107
 
                                           rec.location_id) AS id,
108
 
                rec.product_id AS product_id,
109
 
                rec.prodlot_id AS prodlot_id,
110
 
                rec.expired_date AS expired_date,
111
 
                rec.location_id AS location_id,
112
 
                rec.usage AS location_type,
113
 
                sum(rec.product_qty) AS product_qty
114
 
            FROM
115
 
                (
116
 
                    (SELECT
117
 
                        m.product_id AS product_id,
118
 
                        m.prodlot_id AS prodlot_id,
119
 
                        m.expired_date AS expired_date,
120
 
                        m.location_dest_id AS location_id,
121
 
                        loc.usage AS usage,
122
 
                        CASE when pt.uom_id = m.product_uom
123
 
                        THEN
124
 
                            sum(m.product_qty)
125
 
                        ELSE
126
 
                            sum(round((((m.product_qty/mu.factor)) * pu.factor)/pu.rounding)*pu.rounding)
127
 
                        END AS product_qty
128
 
                    FROM
129
 
                        stock_move m
130
 
                      LEFT JOIN
131
 
                        stock_production_lot lot
132
 
                          ON m.prodlot_id = lot.id
133
 
                      LEFT JOIN
134
 
                        stock_picking p
135
 
                          ON m.picking_id = p.id
136
 
                      LEFT JOIN
137
 
                        product_product pp
138
 
                          ON m.product_id = pp.id
139
 
                      LEFT JOIN
140
 
                        product_template pt
141
 
                          ON pp.product_tmpl_id = pt.id
142
 
                      LEFT JOIN
143
 
                        product_uom pu
144
 
                          ON pt.uom_id = pu.id
145
 
                      LEFT JOIN
146
 
                        product_uom mu
147
 
                          ON m.product_uom = mu.id
148
 
                      LEFT JOIN
149
 
                        stock_location loc
150
 
                          ON m.location_dest_id = loc.id
151
 
                    WHERE
152
 
                        m.state = 'done'
153
 
                        AND
154
 
                        loc.usage = 'internal'
155
 
                    GROUP BY
156
 
                        m.product_id,
157
 
                        m.prodlot_id,
158
 
                        m.expired_date,
159
 
                        m.location_dest_id,
160
 
                        pt.uom_id,
161
 
                        m.product_uom,
162
 
                        p.address_id,
163
 
                        loc.usage)
164
 
                UNION ALL
165
 
                    (SELECT
166
 
                        m.product_id AS product_id,
167
 
                        m.prodlot_id AS prodlot_id,
168
 
                        m.expired_date AS expired_date,
169
 
                        m.location_id AS location_id,
170
 
                        loc.usage AS usage,
171
 
                        CASE when pt.uom_id = m.product_uom
172
 
                        THEN
173
 
                            -sum(m.product_qty)
174
 
                        ELSE
175
 
                            -sum(round((((m.product_qty/mu.factor)) * pu.factor)/pu.rounding)*pu.rounding)
176
 
                        END AS product_qty
177
 
                    FROM 
178
 
                        stock_move m
179
 
                      LEFT JOIN
180
 
                        stock_production_lot lot
181
 
                          ON m.prodlot_id = lot.id
182
 
                      LEFT JOIN
183
 
                        stock_picking p
184
 
                          ON m.picking_id = p.id
185
 
                      LEFT JOIN
186
 
                        product_product pp
187
 
                          ON m.product_id = pp.id
188
 
                      LEFT JOIN
189
 
                        product_template pt
190
 
                          ON pp.product_tmpl_id = pt.id
191
 
                      LEFT JOIN
192
 
                        product_uom pu
193
 
                          ON pt.uom_id = pu.id
194
 
                      LEFT JOIN
195
 
                        product_uom mu
196
 
                          ON m.product_uom = mu.id
197
 
                      LEFT JOIN
198
 
                        stock_location loc
199
 
                          ON m.location_id = loc.id
200
 
                    WHERE
201
 
                        m.state = 'done'
202
 
                        AND
203
 
                        loc.usage = 'internal'
204
 
                    GROUP BY
205
 
                        m.product_id,
206
 
                        m.prodlot_id,
207
 
                        m.expired_date,
208
 
                        m.location_id,
209
 
                        pt.uom_id,
210
 
                        m.product_uom,
211
 
                        loc.usage,
212
 
                        p.address_id)
213
 
            ) AS rec
214
 
              LEFT JOIN
215
 
                stock_production_lot lot
216
 
                  ON rec.prodlot_id = lot.id
217
 
            GROUP BY
218
 
              rec.product_id,
219
 
              rec.expired_date,
220
 
              rec.prodlot_id,
221
 
              lot.name,
222
 
              rec.location_id,
223
 
              rec.usage
224
 
            ORDER BY
225
 
              rec.product_id,
226
 
              lot.name,
227
 
              rec.location_id
228
 
        );""")
229
 
        
230
 
    def unlink(self, cr, uid, ids, context=None):
231
 
        raise osv.except_osv(_('Error !'), _('You cannot delete any record!'))
 
110
CREATE OR REPLACE view report_batch_recall AS (
 
111
    (SELECT
 
112
        min(m.id) as id, m.date as date,
 
113
        m.address_id as partner_id, m.location_id as location_id,
 
114
        m.product_id as product_id, pt.categ_id as product_categ_id, l.usage as location_type,
 
115
        m.company_id,
 
116
        m.expired_date::date,
 
117
        m.state as state, m.prodlot_id as prodlot_id,
 
118
        coalesce(sum(-pt.standard_price * m.product_qty)::decimal, 0.0) as value,
 
119
        CASE when pt.uom_id = m.product_uom
 
120
        THEN
 
121
        coalesce(sum(-m.product_qty)::decimal, 0.0)
 
122
        ELSE
 
123
        coalesce(sum(-m.product_qty * pu.factor)::decimal, 0.0) END as product_qty
 
124
    FROM
 
125
        stock_move m
 
126
            LEFT JOIN stock_picking p ON (m.picking_id=p.id)
 
127
            LEFT JOIN product_product pp ON (m.product_id=pp.id)
 
128
                LEFT JOIN product_template pt ON (pp.product_tmpl_id=pt.id)
 
129
                LEFT JOIN product_uom pu ON (pt.uom_id=pu.id)
 
130
            LEFT JOIN product_uom u ON (m.product_uom=u.id)
 
131
            LEFT JOIN stock_location l ON (m.location_id=l.id)
 
132
    WHERE l.usage in ('internal', 'customer')
 
133
    GROUP BY
 
134
        m.id, m.product_id, m.product_uom, pt.categ_id, m.address_id, m.location_id,  m.location_dest_id,
 
135
        m.prodlot_id, m.expired_date, m.date, m.state, l.usage, m.company_id,pt.uom_id
 
136
) UNION ALL (
 
137
    SELECT
 
138
        -m.id as id, m.date as date,
 
139
        m.address_id as partner_id, m.location_dest_id as location_id,
 
140
        m.product_id as product_id, pt.categ_id as product_categ_id, l.usage as location_type,
 
141
        m.company_id,
 
142
        m.expired_date::date,
 
143
        m.state as state, m.prodlot_id as prodlot_id,
 
144
        coalesce(sum(pt.standard_price * m.product_qty )::decimal, 0.0) as value,
 
145
        CASE when pt.uom_id = m.product_uom
 
146
        THEN
 
147
        coalesce(sum(m.product_qty)::decimal, 0.0)
 
148
        ELSE
 
149
        coalesce(sum(m.product_qty * pu.factor)::decimal, 0.0) END as product_qty
 
150
    FROM
 
151
        stock_move m
 
152
            LEFT JOIN stock_picking p ON (m.picking_id=p.id)
 
153
            LEFT JOIN product_product pp ON (m.product_id=pp.id)
 
154
                LEFT JOIN product_template pt ON (pp.product_tmpl_id=pt.id)
 
155
                LEFT JOIN product_uom pu ON (pt.uom_id=pu.id)
 
156
            LEFT JOIN product_uom u ON (m.product_uom=u.id)
 
157
            LEFT JOIN stock_location l ON (m.location_dest_id=l.id)
 
158
    WHERE l.usage in ('internal', 'customer')
 
159
    GROUP BY
 
160
        m.id, m.product_id, m.product_uom, pt.categ_id, m.address_id, m.location_id, m.location_dest_id,
 
161
        m.prodlot_id, m.expired_date, m.date, m.state, l.usage, m.company_id,pt.uom_id
 
162
    )
 
163
);
 
164
        """)
232
165
 
233
166
report_batch_recall()
234
167
 
 
168
class stock_production_lot(osv.osv):
 
169
    _name = 'stock.production.lot'
 
170
    _inherit = 'stock.production.lot'
 
171
 
 
172
    def name_search(self, cr, uid, name='', args=None, operator='ilike', context=None, limit=80):
 
173
        '''
 
174
        Add the possibility to search a lot with its prefix
 
175
        '''
 
176
        res = super(stock_production_lot, self).name_search(cr, uid, name, args, operator, context, limit)
 
177
        
 
178
        ids = []
 
179
        res_ids = []
 
180
        prefix = False
 
181
        obj_name = False
 
182
        domain = []
 
183
        
 
184
        if len(name) > 1:
 
185
            tab_name = name.split('/')
 
186
            prefix = tab_name[0]
 
187
            if tab_name and len(tab_name) > 1:
 
188
                obj_name = name.split('/')[1][1:-1]
 
189
                
 
190
        if obj_name:
 
191
            domain.append(('name', '=ilike', '%%%s' %obj_name))
 
192
        if prefix:
 
193
            domain.append(('prefix', '=ilike', '%%%s' %prefix))
 
194
            
 
195
        ids = self.search(cr, uid, domain)
 
196
        
 
197
        for r in res:
 
198
            if r[0] not in ids:
 
199
                ids.append(r[0])
 
200
 
 
201
        return self.name_get(cr, uid, ids)
 
202
 
 
203
stock_production_lot()
 
204
 
235
205
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: