~camptocamp/stock-logistic-report/7.0-replace-print-actions-mdh

« back to all changes in this revision

Viewing changes to stock_picking_webkit/report/stock_report.py

  • Committer: Joël Grand-Guillaume
  • Date: 2012-07-12 13:56:17 UTC
  • Revision ID: joel.grandguillaume@camptocamp.com-20120712135617-9d5paaps97npp8t5
[MRG] From trunk branch, tests and bugfix. Most improvements are on:
  - Margin modules
  - picking dispatch (better warehouse handling))
  - grouping PO
  - Filter on stock delivers from sales
(lp:c2c-addons/6.1  rev 69)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
##############################################################################
 
3
#
 
4
#   Copyright (c) 2011 Camptocamp SA (http://www.camptocamp.com)
 
5
#   @author Nicolas Bessi
 
6
#
 
7
# WARNING: This program as such is intended to be used by professional
 
8
# programmers who take the whole responsability of assessing all potential
 
9
# consequences resulting from its eventual inadequacies and bugs
 
10
# End users who are looking for a ready-to-use solution with commercial
 
11
# garantees and support are strongly adviced to contract a Free Software
 
12
# Service Company
 
13
#
 
14
# This program is Free Software; you can redistribute it and/or
 
15
# modify it under the terms of the GNU General Public License
 
16
# as published by the Free Software Foundation; either version 2
 
17
# of the License, or (at your option) any later version.
 
18
#
 
19
# This program is distributed in the hope that it will be useful,
 
20
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
21
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
22
# GNU General Public License for more details.
 
23
#
 
24
## -*- coding: utf-8 -*-
 
25
import operator
 
26
from report import report_sxw
 
27
import pooler
 
28
 
 
29
class NullMove(object):
 
30
    """helper class to generate empty lines in the delivery report"""
 
31
    def __init__(self):
 
32
        self.product_id = NullObj()
 
33
        self.picking_id = NullObj()
 
34
        self.product_qty = ''
 
35
 
 
36
class NullObj(object):
 
37
    """the null obj has any attribute you want with an empty string as the value"""
 
38
    def __getattr__(self, attr):
 
39
        return ''
 
40
 
 
41
 
 
42
class PickingAgregation(object):
 
43
 
 
44
    def __init__(self, src_stock, dest_stock, stock_moves):
 
45
        self.src_stock = src_stock
 
46
        self.dest_stock = dest_stock
 
47
        self.stock_moves = stock_moves
 
48
 
 
49
    def exists(self):
 
50
        return False
 
51
 
 
52
    def __hash__(self):
 
53
        return hash((self.src_stock.id, self.dest_stock.id))
 
54
 
 
55
    def __eq__(self, other):
 
56
        return (self.src_stock.id, self.dest_stock.id) == (other.src_stock.id, other.dest_stock.id)
 
57
 
 
58
    def moves_by_product(self):
 
59
        """iterate over moves sorted by product default_code"""
 
60
        return sorted(self.stock_moves, key=operator.attrgetter('product_id.default_code'))
 
61
 
 
62
    def moves_by_sale_order(self):
 
63
        """iterate over moves sorted by sale order name
 
64
 
 
65
        a NullMove is inserted when for each new sale order so that
 
66
        the report displays an empty line
 
67
        """
 
68
        origin = None
 
69
        for move in sorted(self.stock_moves, key=operator.attrgetter('picking_id.origin')):
 
70
            if origin is None:
 
71
                origin = move.picking_id.origin
 
72
            else:
 
73
                if move.picking_id.origin != origin:
 
74
                    yield NullMove()
 
75
                    origin = move.picking_id.origin
 
76
            yield move
 
77
 
 
78
    def product_quantity(self):
 
79
        """iterate over the different products concerned by the moves
 
80
        with their total quantity, sorted by product default_code"""
 
81
        products = {}
 
82
        product_qty = {}
 
83
        for move in self.stock_moves:
 
84
            p_code = move.product_id.default_code
 
85
            products[p_code] = move.product_id
 
86
            if p_code not in product_qty:
 
87
                product_qty[p_code] = move.product_qty
 
88
            else:
 
89
                product_qty[p_code] += move.product_qty
 
90
        for p_code in sorted(products):
 
91
            yield products[p_code], product_qty[p_code]
 
92
 
 
93
class PrintPick(report_sxw.rml_parse):
 
94
 
 
95
    def __init__(self, cursor, uid, name, context):
 
96
        super(PrintPick, self).__init__(cursor, uid, name, context=context)
 
97
        self.pool = pooler.get_pool(self.cr.dbname)
 
98
        self.cursor = self.cr
 
99
 
 
100
        self.numeration_type = False
 
101
        self.localcontext.update({})
 
102
 
 
103
    def _get_form_param(self, param, data, default=False):
 
104
        return data.get('form', {}).get(param, default) or default
 
105
 
 
106
    def set_context(self, objects, data, ids, report_type=None):
 
107
        """Return res.partner.category"""
 
108
        #!! data form is manually set in wizard
 
109
        agreg = {}
 
110
        for pick in objects:
 
111
            for move in pick.move_lines:
 
112
                if move.state == 'assigned':
 
113
                    key = (move.location_id, move.location_dest_id)
 
114
                    agreg.setdefault(key, []).append(move)
 
115
        objects = []
 
116
        for agr in agreg:
 
117
            print agr
 
118
            objects.append(PickingAgregation(agr[0], agr[1], agreg[agr]))
 
119
        return super(PrintPick, self).set_context(objects, data, ids, report_type=report_type)
 
120
 
 
121
report_sxw.report_sxw('report.webkit.aggregated_picking',
 
122
                      'stock.picking',
 
123
                      'addons/stock_picking_webkit/report/picking.html.mako',
 
124
                      parser=PrintPick)
 
125
 
 
126
report_sxw.report_sxw('report.webkit.aggregated_delivery',
 
127
                      'stock.picking',
 
128
                      'addons/stock_picking_webkit/report/delivery.html.mako',
 
129
                      parser=PrintPick)