File: account.py

package info (click to toggle)
tryton-modules-account-stock-landed-cost-weight 5.0.2-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 308 kB
  • sloc: python: 168; makefile: 6; sh: 3
file content (39 lines) | stat: -rw-r--r-- 1,243 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# This file is part of Tryton.  The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from decimal import Decimal

from trytond.pool import PoolMeta

__all__ = ['LandedCost']


class LandedCost(metaclass=PoolMeta):
    __name__ = 'account.landed_cost'

    @classmethod
    def __setup__(cls):
        super(LandedCost, cls).__setup__()
        cls.allocation_method.selection.append(('weight', 'By Weight'))

    def allocate_cost_by_weight(self):
        self._allocate_cost(self._get_weight_factors())

    def _get_weight_factors(self):
        "Return the factor for each move based on weight"
        moves = [m for s in self.shipments for m in s.incoming_moves
            if m.state != 'cancel']

        sum_weight = Decimal(0)
        weights = {}
        for move in moves:
            weight = Decimal(str(move.internal_weight or 0))
            weights[move.id] = weight
            sum_weight += weight
        factors = {}
        length = Decimal(len(moves))
        for move in moves:
            if not sum_weight:
                factors[move.id] = 1 / length
            else:
                factors[move.id] = weights[move.id] / sum_weight
        return factors