# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
##
## Copyright (C) 2008 Async Open Source <http://www.async.com.br>
## All rights reserved
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU Lesser General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU Lesser General Public License for more details.
##
## You should have received a copy of the GNU Lesser General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., or visit: http://www.gnu.org/.
##
## Author(s): Stoq Team <stoq-devel@async.com.br>
##
""" Purchase editors """
import gtk
from kiwi.datatypes import ValidationError
from stoqlib.gui.editors.baseeditor import BaseEditor
from stoqlib.domain.purchase import PurchaseOrder, PurchaseItem
from stoqlib.lib.defaults import QUANTITY_PRECISION, MAX_INT
from stoqlib.lib.dateutils import localtoday
from stoqlib.lib.parameters import sysparam
from stoqlib.lib.translation import stoqlib_gettext
_ = stoqlib_gettext
[docs]class PurchaseItemEditor(BaseEditor):
gladefile = 'PurchaseItemEditor'
model_type = PurchaseItem
model_name = _("Purchase Item")
proxy_widgets = ['cost',
'expected_receival_date',
'quantity',
'total']
def __init__(self, store, model, visual_mode=False):
self.proxy = None
BaseEditor.__init__(self, store, model, visual_mode)
order = self.model.order
if order.status == PurchaseOrder.ORDER_CONFIRMED:
self._set_not_editable()
self.sold_lbl.hide()
self.returned_lbl.hide()
self.quantity_sold.hide()
self.quantity_returned.hide()
if model.parent_item:
# We should not allow the user to edit the children
self._set_not_editable()
parent_expected = model.parent_item.expected_receival_date
self.expected_receival_date.update(parent_expected)
self.expected_receival_date.set_sensitive(False)
def _setup_widgets(self):
self.order.set_text(unicode(self.model.order.identifier))
for widget in [self.quantity, self.cost, self.quantity_sold,
self.quantity_returned]:
widget.set_adjustment(gtk.Adjustment(lower=0, upper=MAX_INT,
step_incr=1))
unit = self.model.sellable.unit
digits = QUANTITY_PRECISION if unit and unit.allow_fraction else 0
for widget in [self.quantity,
self.quantity_sold,
self.quantity_returned]:
widget.set_digits(digits)
self.description.set_text(self.model.sellable.get_description())
self.cost.set_digits(sysparam.get_int('COST_PRECISION_DIGITS'))
def _set_not_editable(self):
self.cost.set_sensitive(False)
self.quantity.set_sensitive(False)
def _maybe_update_children_quantity(self):
for child in self.model.children_items:
child_qty = child.get_component_quantity(self.model)
child.quantity = self.model.quantity * child_qty
#
# Public API
#
[docs] def setup_proxies(self):
self._setup_widgets()
self.proxy = self.add_proxy(self.model, self.proxy_widgets)
[docs] def on_confirm(self):
self._maybe_update_children_quantity()
#
# Kiwi callbacks
#
[docs] def after_cost__changed(self, widget):
if self.proxy:
self.proxy.update('total')
[docs] def after_quantity__changed(self, widget):
if self.proxy:
self.proxy.update('total')
[docs] def on_expected_receival_date__validate(self, widget, value):
if value < localtoday().date():
return ValidationError(_(u'The expected receival date should be '
'a future date or today.'))
[docs] def on_cost__validate(self, widget, value):
if value <= 0:
return ValidationError(_(u'The cost should be greater than zero.'))
[docs] def on_quantity__validate(self, widget, value):
if value <= 0:
return ValidationError(_(u'The quantity should be greater than '
'zero.'))
[docs]class InConsignmentItemEditor(PurchaseItemEditor):
proxy_widgets = PurchaseItemEditor.proxy_widgets[:]
proxy_widgets.extend(['quantity_sold',
'quantity_returned'])
def __init__(self, store, model):
self._original_sold_qty = model.quantity_sold
self._original_returned_qty = model.quantity_returned
self._allowed_sold = None
PurchaseItemEditor.__init__(self, store, model)
order = self.model.order
assert order.status == PurchaseOrder.ORDER_CONSIGNED
self._set_not_editable()
# disable expected_receival_date (the items was already received)
self.expected_receival_date.set_sensitive(False)
# enable consignment fields
self.sold_lbl.show()
self.returned_lbl.show()
self.quantity_sold.show()
self.quantity_returned.show()
#
# Kiwi Callbacks
#
[docs] def on_expected_receival_date__validate(self, widget, value):
# Override the signal handler in PurchaseItemEditor, this is the
# simple way to disable this validation, since we dont have the
# handler_id to call self.expected_receival_date.disconnect() method.
pass
[docs] def on_quantity_sold__validate(self, widget, value):
if value < self._original_sold_qty:
return ValidationError(_(u'Can not decrease this quantity.'))
total = self.quantity_returned.read() + value
if value and total > self.model.quantity_received:
return ValidationError(_(u'Sold and returned quantity does '
'not match.'))
[docs] def on_quantity_returned__validate(self, widget, value):
if value < self._original_returned_qty:
return ValidationError(_(u'Can not decrease this quantity.'))
max_returned = self.model.quantity_received - self.quantity_sold.read()
if value and value > max_returned:
return ValidationError(_(u'Invalid returned quantity'))
[docs]class PurchaseQuoteItemEditor(PurchaseItemEditor):
proxy_widgets = PurchaseItemEditor.proxy_widgets[:]
proxy_widgets.remove('cost')
def __init__(self, store, model):
PurchaseItemEditor.__init__(self, store, model)
self.cost.hide()
self.cost_lbl.hide()