-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinvoice.py
163 lines (141 loc) · 7.13 KB
/
invoice.py
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# The COPYRIGHT file at the top level of this repository contains the full
# copyright notices and license terms.
import datetime
from trytond.model import fields
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
__all__ = ['Invoice', 'InvoiceLine']
class Invoice(metaclass=PoolMeta):
__name__ = 'account.invoice'
shipments_origin = fields.Function(fields.One2Many('stock.shipment.out', None,
'Shipments'), 'get_shipments_origin')
shipments_origin_return = fields.Function(
fields.One2Many('stock.shipment.out.return', None, 'Shipment Returns'),
'get_shipments_origin_returns')
shipments_origin_number = fields.Function(fields.Char('Origin Shipment Number'),
'get_shipments_origin_number')
shipment_origin_addresses = fields.Function(fields.Many2Many('party.address',
None, None, 'Origin Shipment Addresses'), 'get_shipment_origin_addresses')
shipment_origin_address = fields.Function(fields.Many2One('party.address',
'Origin Shipment Address'), 'get_shipment_origin_address')
sales_origin = fields.Function(fields.One2Many('sale.sale', None,
'Sales'), 'get_sales_origin')
sales_origin_number = fields.Function(fields.Char('Origin Sales Number'),
'get_sales_origin_number')
sales_origin_reference = fields.Function(fields.Char('Origin Sales Reference'),
'get_sales_origin_reference')
def get_shipments_origin_returns(model_name):
"Computes the origin returns or shipments"
def method(self, name):
Model = Pool().get(model_name)
shipments = {
m.shipment for l in self.lines
for m in l.stock_moves if m.shipment and isinstance(m.shipment, Model)}
return list(shipments)
return method
get_shipments_origin = get_shipments_origin_returns('stock.shipment.out')
get_shipments_origin_returns = get_shipments_origin_returns('stock.shipment.out.return')
def get_shipments_origin_number(self, name=None):
numbers = []
for shipment_origin in ['shipments_origin', 'shipments_origin_return']:
for shipment in getattr(self, shipment_origin):
if shipment.number:
numbers.append(shipment.number)
return ', '.join(numbers)
def get_shipment_origin_addresses(self, name=None):
addresses = set()
for line in self.lines:
if line.origin and line.origin.__name__ == 'sale.line':
if line.origin.sale and line.origin.sale.shipment_address:
addresses.add(line.origin.sale.shipment_address)
return [address.id for address in addresses]
def get_shipment_origin_address(self, name=None):
if self.shipment_origin_addresses:
return self.shipment_origin_addresses[0].id
def get_sales_origin(self, name=None):
Line = Pool().get('sale.line')
sales = set()
for line in self.lines:
if line.origin and isinstance(line.origin, Line):
if line.origin.sale:
sales.add(line.origin.sale)
return [sale.id for sale in sales]
def get_sales_origin_reference(field_name):
"Computes the origin number or reference"
def method(self, name):
Line = Pool().get('sale.line')
numbers = set()
for line in self.lines:
if line.origin and isinstance(line.origin, Line):
if line.origin.sale:
number = getattr(line.origin.sale, field_name)
if number:
numbers.add(number)
return ', '.join(numbers)
return method
get_sales_origin_number = get_sales_origin_reference('number')
get_sales_origin_reference = get_sales_origin_reference('reference')
class InvoiceLine(metaclass=PoolMeta):
__name__ = 'account.invoice.line'
shipments_origin = fields.Function(fields.One2Many('stock.shipment.out', None,
'Shipments'), 'get_shipments_origin')
shipments_origin_return = fields.Function(
fields.One2Many('stock.shipment.out.return', None, 'Shipment Returns'),
'get_shipments_origin_returns')
shipments_origin_number = fields.Function(fields.Char(
'Origin Shipment Number'), 'get_shipments_origin_fields')
shipments_origin_effective_date = fields.Function(fields.Char(
'Origin Shipment Effective Date'), 'get_shipments_origin_fields')
shipment_addresses_name = fields.Function(fields.Text('Shipment Addresses'),
'get_shipment_addresses_name')
def get_shipments_origin_returns(model_name):
"Computes the origin returns or shipments"
def method(self, name):
Model = Pool().get(model_name)
shipments = set()
for stock_move in self.stock_moves:
shipment = stock_move.shipment
if shipment and isinstance(shipment, Model):
shipments.add(shipment.id)
return list(shipments)
return method
get_shipments_origin = get_shipments_origin_returns('stock.shipment.out')
get_shipments_origin_returns = get_shipments_origin_returns('stock.shipment.out.return')
def get_shipments_origin_fields(self, name=None):
Lang = Pool().get('ir.lang')
values = []
for shipment_origin in ['shipments_origin', 'shipments_origin_return']:
for shipment in getattr(self, shipment_origin):
value = getattr(shipment, name[17:])
if not value:
continue
if isinstance(value, datetime.date):
lang_code = Transaction().language
languages = Lang.search([('code', '=', lang_code)])
if not languages:
languages = Lang.search([('code', '=', 'en')])
language = languages[0]
values.append(language.strftime(value))
else:
values.append(value)
return values and ', '.join(values) or ''
@classmethod
def get_shipment_addresses_name(cls, lines, name):
shipment_addresses = {}
for line in lines:
addresses = set()
for shipment_origin in ['shipments_origin', 'shipments_origin_return']:
for shipment in getattr(line, shipment_origin):
address = []
if shipment.customer.name:
address.append(shipment.customer.name)
if shipment_origin == 'shipments_origin':
if shipment.delivery_address.street:
address.append(shipment.delivery_address.street)
if shipment.delivery_address.postal_code:
address.append(shipment.delivery_address.postal_code)
if shipment.delivery_address.subdivision:
address.append(shipment.delivery_address.subdivision.name)
addresses.add(', '.join(address))
shipment_addresses[line.id] = '\n'.join(addresses) if addresses else None
return shipment_addresses