# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
##
## Copyright (C) 2009 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>
##
##
""" Payments Renegotiation Wizard """
import datetime
from kiwi.currency import currency
from kiwi.datatypes import ValidationError
from kiwi.ui.objectlist import Column
from stoqlib.api import api
from stoqlib.domain.payment.renegotiation import PaymentRenegotiation
from stoqlib.domain.payment.group import PaymentGroup
from stoqlib.gui.base.wizards import WizardEditorStep, BaseWizard
from stoqlib.gui.search.searchcolumns import IdentifierColumn
from stoqlib.gui.wizards.salewizard import BaseMethodSelectionStep
from stoqlib.lib.translation import stoqlib_gettext
_ = stoqlib_gettext
#
# Wizard Steps
#
[docs]class PaymentRenegotiationPaymentListStep(BaseMethodSelectionStep,
WizardEditorStep):
gladefile = 'PaymentRenegotiationPaymentListStep'
model_type = PaymentRenegotiation
proxy_widgets = ('surcharge_value', 'discount_value', 'total')
def __init__(self, store, wizard, model, groups):
self.groups = groups
WizardEditorStep.__init__(self, store, wizard, model)
BaseMethodSelectionStep.__init__(self)
def _setup_widgets(self):
self.total.set_sensitive(False)
self.subtotal.set_sensitive(False)
client = self.groups[0].get_parent().client
if client:
self.client.prefill([(client.person.name, client)])
self.client.select(client)
self.client.set_sensitive(False)
self.payment_list.set_columns(self._get_columns())
payments = []
for group in self.groups:
group.renegotiation = self.model
group.get_parent().set_renegotiated()
payments.extend(group.get_pending_payments())
assert len(payments)
self.payment_list.add_list(payments)
subtotal = 0
for payment in payments:
subtotal += payment.value
payment.cancel()
self._subtotal = subtotal
self.subtotal.update(self._subtotal)
def _get_columns(self):
return [IdentifierColumn('identifier', title=('Payment #')),
Column('description', title=_('Description'), data_type=str,
expand=True),
Column('due_date', title=_('Due date'),
data_type=datetime.date, width=90),
Column('status_str', title=_('Status'), data_type=str, width=80),
Column('value', title=_('Value'), data_type=currency,
width=100)]
def _update_totals(self):
surcharge = self.model.surcharge_value
discount = self.model.discount_value
self.model.total = self._subtotal + surcharge - discount
self.proxy.update('total')
def _update_next_step(self, method):
if method and method.method_name == 'money':
self.wizard.enable_finish()
else:
self.wizard.disable_finish()
#
# WizardStep hooks
#
[docs] def post_init(self):
self.model.group.clear_unused()
self._update_next_step(self.pm_slave.get_selected_method())
self.register_validate_function(self.wizard.refresh_next)
self.force_validation()
self.pm_slave.set_client(self.model.client, self.model.total)
[docs] def setup_proxies(self):
self._setup_widgets()
self.proxy = self.add_proxy(self.model,
PaymentRenegotiationPaymentListStep.proxy_widgets)
self._update_totals()
#
# Callbacks
#
[docs] def on_surcharge_value__validate(self, entry, value):
if value < 0:
return ValidationError(
_('Surcharge must be greater than 0'))
[docs] def on_discount_value__validate(self, entry, value):
if value < 0:
return ValidationError(
_('Discount must be greater than 0'))
if value >= self._subtotal:
return ValidationError(
_('Discount can not be greater than total amount'))
[docs] def after_surcharge_value__changed(self, entry):
self._update_totals()
[docs] def after_discount_value__changed(self, entry):
self._update_totals()
#
# Main wizard
#
[docs]class PaymentRenegotiationWizard(BaseWizard):
size = (550, 400)
title = _('Payments Renegotiation Wizard')
def __init__(self, store, groups):
self.groups = groups
self.model = self._create_model(store)
first = PaymentRenegotiationPaymentListStep(store, self, self.model, self.groups)
BaseWizard.__init__(self, store, first, self.model)
[docs] def need_create_payment(self):
return self.get_total_amount() > 0
[docs] def get_total_amount(self):
return self.model.total
[docs] def get_total_paid(self):
return self.model.group.get_total_paid()
[docs] def get_total_to_pay(self):
return self.get_total_amount() - self.get_total_paid()
def _create_model(self, store):
value = 0 # will be updated in the first step.
branch = api.get_current_branch(store)
user = api.get_current_user(store)
client = self.groups[0].get_parent().client
# Set person as None to allow renegotiate payments without client.
person = None
if client:
person = client.person
group = PaymentGroup(payer=person,
store=store)
model = PaymentRenegotiation(total=value,
branch=branch,
responsible=user,
client=client,
group=group,
store=store)
return model
#
# BaseWizard hooks
#
[docs] def finish(self):
self.retval = True
for payment in self.model.group.payments:
payment.set_pending()
self.close()