127 lines
3.7 KiB
Python
127 lines
3.7 KiB
Python
# 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 trytond.model import ModelView, ModelSQL, fields
|
|
from trytond.pool import Pool
|
|
from trytond.transaction import Transaction
|
|
from trytond.modules.currency.fields import Monetary
|
|
from trytond.modules.product import price_digits
|
|
from decimal import Decimal
|
|
from datetime import date
|
|
|
|
|
|
class SaleOrder(ModelView, ModelSQL):
|
|
"Sale Order"
|
|
__name__ = 'sale.order'
|
|
|
|
company = fields.Many2One(
|
|
'company.company', "Company", required=True
|
|
)
|
|
party = fields.Many2One(
|
|
'party.party', "Party", required=True
|
|
)
|
|
pickup_location = fields.Selection(
|
|
[("on_site", "On Site"),
|
|
("at_home", "At Home")], 'Pickup Location'
|
|
)
|
|
lines = fields.One2Many(
|
|
'order.line', 'order', 'Lines'
|
|
)
|
|
date = fields.Date("Date", required=True
|
|
)
|
|
currency = fields.Many2One(
|
|
'currency.currency', 'Currency', required=True
|
|
)
|
|
total_order = fields.Function(
|
|
Monetary("Total", currency='currency', digits='currency'),
|
|
'on_change_with_total_order'
|
|
)
|
|
|
|
@staticmethod
|
|
def default_company():
|
|
return Transaction().context.get('company')
|
|
|
|
@staticmethod
|
|
def default_date():
|
|
return date.today()
|
|
|
|
@fields.depends('lines')
|
|
def on_change_with_total_order(self, name=None):
|
|
total = Decimal('0.0')
|
|
if self.lines:
|
|
for line in self.lines:
|
|
if line.total_amount:
|
|
total += Decimal(line.total_amount)
|
|
return total
|
|
|
|
@classmethod
|
|
def default_currency(cls, **pattern):
|
|
pool = Pool()
|
|
Company = pool.get('company.company')
|
|
company = pattern.get('company')
|
|
if not company:
|
|
company = cls.default_company()
|
|
if company:
|
|
return Company(company).currency.id
|
|
|
|
|
|
class OrderLine(ModelView, ModelSQL):
|
|
"Order Line"
|
|
__name__ = 'order.line'
|
|
|
|
company = fields.Many2One(
|
|
'company.company', "Company", required=True
|
|
)
|
|
order = fields.Many2One(
|
|
'sale.order', "Sale"
|
|
)
|
|
currency = fields.Many2One(
|
|
'currency.currency', 'Currency', required=True
|
|
)
|
|
product = fields.Many2One(
|
|
'product.product', 'Product', required=True
|
|
)
|
|
unit = fields.Many2One(
|
|
'product.uom', 'Unit'
|
|
)
|
|
product_uom_category = fields.Function(
|
|
fields.Many2One('product.uom.category', 'Product UOM Category'),
|
|
'on_change_with_product_uom_category'
|
|
)
|
|
quantity = fields.Float(
|
|
"Quantity", digits=('unit')
|
|
)
|
|
unitprice = Monetary(
|
|
"Unit Price", digits=price_digits, currency='currency'
|
|
)
|
|
total_amount = fields.Function(
|
|
Monetary("Total Amount", currency='currency', digits='currency'),
|
|
'on_change_with_total_amount'
|
|
)
|
|
|
|
@staticmethod
|
|
def default_company():
|
|
return Transaction().context.get('company')
|
|
|
|
@classmethod
|
|
def default_currency(cls, **pattern):
|
|
pool = Pool()
|
|
Company = pool.get('company.company')
|
|
company = pattern.get('company')
|
|
if not company:
|
|
company = cls.default_company()
|
|
if company:
|
|
return Company(company).currency.id
|
|
|
|
@fields.depends('product')
|
|
def on_change_with_product_uom_category(self, name=None):
|
|
if self.product:
|
|
return self.product.default_uom.category.id
|
|
return None
|
|
|
|
@fields.depends('quantity', 'unitprice')
|
|
def on_change_with_total_amount(self, name=None):
|
|
if self.unitprice and self.quantity:
|
|
total_amount = self.unitprice * Decimal(self.quantity)
|
|
|
|
return total_amount
|