# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4

##
## Copyright (C) 2005-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>
##
""" Interfaces definition for all domain classes """

# pylint: disable=E0102,E0211,E0213,W0404

from zope.interface import Attribute, Interface

# pylint: enable=W0404


#
# Interfaces
#


class IActive(Interface):
    """It defines if a certain object can be active or not"""

    is_active = Attribute('This attribute defines if the object is active')

    def inactivate():
        """Inactivate an active object"""

    def activate():
        """Activate an inactive object"""

    def get_status_string():
        """Active or Inactive in the specific locale"""


class IContainer(Interface):
    """An objects that holds other objects or items"""

    def add_item(item):
        """Add a persistent or non-persistent item associated with this
        model."""

    def get_items():
        """Get all the items in the container. The result value could be a
        simple python list or an instance which maps to SQL statement.  """

    def remove_item(item):
        """Remove from the list or database the item desired."""


class IDescribable(Interface):
    """It defines that a object can be described through get_description
    method.
    """
    # TODO: Replace this with a property
    def get_description():
        """ Returns a description that identifies the object """


class IORMObject(Interface):
    id = Attribute("Object ID")

    def delete(obj_id, store):
        "Delete an ORM Interface Object"


class IReversal(Interface):
    """A financial entry which support reversal operations"""

    def reverse_entry(invoice_number):
        """Takes a financial entry and reverse it, creating a new instance
        with an oposite value
        """


class IInvoice(Interface):
    """Information relating to operations (e.g. sale, transfer, loan)
    that generate NF-e
    """

    comments = Attribute("Operation comments")
    discount_value = Attribute("Discount value")
    identifier = Attribute("Identifier of performed operation")
    invoice_subtotal = Attribute("Operation subtotal")
    invoice_total = Attribute("Operation total")
    payments = Attribute("Payments generated by the operation")
    recipient = Attribute("Operation recipient")
    transporter = Attribute("Operation transporter")


class IInvoiceItem(Interface):
    """Information of NF-e items"""

    parent = Attribute("The parent operation")
    sellable = Attribute("Sellable")
    quantity = Attribute("Quantity")
    base_price = Attribute("Base price")
    price = Attribute("Price")
    cfop_code = Attribute("C.F.O.P code")
    item_discount = Attribute("The discount applied in item")

    # Tax references
    icms_info = Attribute("ICMS info object")
    ipi_info = Attribute("IPI info object")
    pis_info = Attribute("PIS info object")
    cofins_info = Attribute("Cofins info object")

# pylint: enable=E0102,E0211,E0213
