# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
##
## Copyright (C) 2008-2010 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>
##
##
""" Search dialogs for payment objects """
import datetime
from decimal import Decimal
import gtk
from kiwi.currency import currency
from kiwi.ui.objectlist import Column
from stoqlib.domain.payment.payment import Payment
from stoqlib.domain.sale import SaleView
from stoqlib.domain.payment.card import CardPaymentDevice, CreditCardData
from stoqlib.domain.payment.views import (InCheckPaymentView,
OutCheckPaymentView,
CardPaymentView)
from stoqlib.lib.translation import stoqlib_gettext
from stoqlib.gui.base.dialogs import run_dialog
from stoqlib.gui.search.searchcolumns import IdentifierColumn, SearchColumn
from stoqlib.gui.search.searchdialog import SearchDialog
from stoqlib.gui.search.searcheditor import SearchEditor
from stoqlib.gui.dialogs.saledetails import SaleDetailsDialog
from stoqlib.gui.dialogs.renegotiationdetails import RenegotiationDetailsDialog
from stoqlib.gui.editors.paymenteditor import LonelyPaymentDetailsDialog
from stoqlib.gui.editors.paymentmethodeditor import CardPaymentDetailsEditor
from stoqlib.gui.utils.printing import print_report
from stoqlib.reporting.payment import (BillCheckPaymentReport,
CardPaymentReport)
_ = stoqlib_gettext
class _BaseBillCheckSearch(SearchDialog):
title = _(u"Bill & Check Payments Search")
size = (-1, 500)
selection_mode = gtk.SELECTION_MULTIPLE
report_class = BillCheckPaymentReport
search_label = _(u'Bill or check number:')
branch_filter_column = Payment.branch_id
def _get_status_values(self):
items = [(value, key) for key, value in
Payment.statuses.items()]
items.insert(0, (_('Any'), None))
return items
#
# SearchDialog Hooks
#
def get_columns(self):
return [IdentifierColumn('identifier', title=_('Payment #'), sorted=True),
Column('method_description', title=_(u'Method'),
data_type=str, expand=True),
SearchColumn('payment_number', title=_(u'Number'),
data_type=str, width=100),
SearchColumn('due_date', title=_('Due date'),
data_type=datetime.date,
width=120),
SearchColumn('paid_date', title=_('Paid date'),
data_type=datetime.date,
width=120),
SearchColumn('status_str', title=_('Status'), data_type=str,
valid_values=self._get_status_values(),
search_attribute='status'),
SearchColumn('value', title=_('Value'), data_type=currency)]
def print_report(self):
payments = self.results.get_selected_rows() or list(self.results)
print_report(self.report_class, self.results, payments,
filters=self.search.get_search_filters())
[docs]class InPaymentBillCheckSearch(_BaseBillCheckSearch):
search_spec = InCheckPaymentView
text_field_columns = [InCheckPaymentView.payment_number,
InCheckPaymentView.bank_account]
[docs]class OutPaymentBillCheckSearch(_BaseBillCheckSearch):
search_spec = OutCheckPaymentView
text_field_columns = [OutCheckPaymentView.payment_number,
OutCheckPaymentView.bank_account]
[docs] def get_columns(self):
columns = _BaseBillCheckSearch.get_columns(self)
columns.append(
SearchColumn('bill_received', title=_('Bill received'),
data_type=bool, visible=False)
)
return columns
[docs]class CardPaymentSearch(SearchEditor):
title = _(u"Card Payment Search")
size = (850, 500)
search_spec = CardPaymentView
editor_class = CardPaymentDetailsEditor
report_class = CardPaymentReport
search_label = (u'Client:')
selection_mode = gtk.SELECTION_BROWSE
text_field_columns = [CardPaymentView.drawee_name,
CardPaymentView.identifier_str]
branch_filter_column = Payment.branch_id
def __init__(self, store):
SearchEditor.__init__(self, store)
self.set_details_button_sensitive(False)
self.hide_new_button()
def _get_status_values(self):
values = [(v, k) for k, v in Payment.statuses.items()]
values.insert(0, (_("Any"), None))
return values
def _get_device_values(self):
devices = CardPaymentDevice.get_devices(self.store)
# This is used in a int filter, so we must use the id
values = [(d.description, d.id) for d in devices]
values.insert(0, (_("Any"), None))
return values
#
# SearchDialogs Hooks
#
[docs] def create_filters(self):
provider_filter = self.create_provider_filter(_('Provider:'))
self.add_filter(provider_filter, columns=[CreditCardData.provider])
self.provider_filter = provider_filter
#
# SearchEditor Hooks
#
[docs] def get_editor_model(self, payment_card_view):
return payment_card_view.credit_card_data
[docs] def get_columns(self):
# TODO: Adicionar filtro por card_type
return [IdentifierColumn('identifier', title=_('Payment #'), sorted=True),
SearchColumn('description', title=_(u'Description'),
data_type=str, expand=True),
SearchColumn('drawee_name', title=_(u'Drawee'), data_type=str,
expand=True),
SearchColumn('device_name', title=_(u'Card Device'),
data_type=str, visible=False,
search_attribute='device_id',
valid_values=self._get_device_values()),
SearchColumn('provider_name', title=_(u'Provider'),
data_type=str),
SearchColumn('due_date', title=_(u'Due date'),
data_type=datetime.date),
SearchColumn('paid_date', title=_(u'Paid date'), visible=False,
data_type=datetime.date),
SearchColumn('status_str', title=_(u'Status'), data_type=str,
expand=True, search_attribute='status',
valid_values=self._get_status_values()),
SearchColumn('value', title=_(u'Value'), data_type=currency),
SearchColumn('fare', title=_(u'Fare'), data_type=currency),
SearchColumn('fee', title=_(u'% Fee'), data_type=Decimal,
visible=False),
SearchColumn('fee_calc', title=_(u'Fee'), data_type=currency),
SearchColumn('auth', title=_(u'Authorization'), data_type=int,
visible=False)]
[docs] def row_activate(self, obj):
selected = self.results.get_selected()
self._show_details(selected)
[docs] def on_results__selection_changed(self, results, selected):
can_details = bool(selected)
self.set_details_button_sensitive(can_details)
#
# Private
#
def _show_details(self, receivable_view):
if receivable_view.sale_id is not None:
sale_view = self.store.find(SaleView, id=receivable_view.sale_id).one()
run_dialog(SaleDetailsDialog, self, self.store, sale_view)
elif receivable_view.renegotiation_id is not None:
run_dialog(RenegotiationDetailsDialog, self, self.store,
receivable_view.renegotiation)
else:
payment = receivable_view.payment
run_dialog(LonelyPaymentDetailsDialog, self, self.store, payment)
#
# Callbacks
#