trytond-account_invoice_shi.../invoice.py

160 lines
7.1 KiB
Python

# 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 = set()
for line in self.lines:
if line.origin and line.origin.__name__ == 'sale.line':
for move in line.origin.moves:
if move.shipment and isinstance(move.shipment, Model):
shipments.add(move.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_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):
sales = set()
for line in self.lines:
if line.origin and line.origin.__name__ == 'sale.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):
numbers = set()
for line in self.lines:
if line.origin and line.origin.__name__ == 'sale.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 value and isinstance(value, datetime.date):
language = Transaction().language
languages = Lang.search([('code', '=', language)])
if not languages:
languages = Lang.search([('code', '=', 'en_US')])
language = languages[0]
values.append(Lang.strftime(value, language.code,
language.date))
elif value:
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.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