Source code for stoqlib.domain.costcenter

# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
##
## Copyright (C) 2013 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>
##
"""Domain implementation for Cost Centers
"""

# pylint: enable=E1101

from storm.expr import And, Ne
from stoqlib.database.properties import (BoolCol, PriceCol,
                                         UnicodeCol, IdCol)
from storm.references import Reference
from stoqlib.domain.base import Domain
from stoqlib.domain.stockdecrease import StockDecrease
from stoqlib.lib.translation import stoqlib_gettext

_ = stoqlib_gettext


[docs]class CostCenter(Domain): """A |costcenter| holds a set of |costcenterentry| objects. |costcenterentry| are created when a resource from the company is spent. Right now, these resources are: * Money used to pay an lonely out |payment| * Products removed from the stock (not all situations). Entries are not created for out |payment| related to a |purchase|, |stockdecrease| or any other operation that changes the stock, since those costs will be accounted when the stock is actually decreased. Also, entries are only created for stock removal when the products are actually destined for a final usage. For instance, |transfer| and |loan| should not generate cost entries. As of this writing, the only stock operations that should trigger a cost entry creation are: * |sale| * |stockdecrease| """ __storm_table__ = 'cost_center' #: the name of the cost center name = UnicodeCol(default=u'') #: a description for the cost center description = UnicodeCol(default=u'') #: The budget available for this cost center budget = PriceCol(default=0) #: indicates whether it's still possible to add entries to this #: |costcenter|. is_active = BoolCol(default=True) # # Public API # def get_payment_entries(self): return self.store.find(CostCenterEntry, And(CostCenterEntry.cost_center == self, Ne(CostCenterEntry.payment_id, None))) def get_stock_transaction_entries(self): return self.store.find(CostCenterEntry, And(CostCenterEntry.cost_center == self, Ne(CostCenterEntry.stock_transaction_id, None)))
[docs] def get_stock_decreases(self): """This method fetches all the |stockdecreases| related to this |costcenter|. """ return self.store.find(StockDecrease, cost_center=self)
[docs] def get_sales(self): """This method fetches all the |sales| related to this |costcenter|""" from stoqlib.domain.sale import Sale return self.store.find(Sale, cost_center=self)
[docs] def get_payments(self): """Returns all payments registred in this |costcenter| """ from stoqlib.domain.payment.payment import Payment query = And(CostCenterEntry.cost_center == self, CostCenterEntry.payment_id == Payment.id) return self.store.find(Payment, query)
[docs] def get_entries(self): """This method gets all the |costcenterentry| related to this |costcenter|. """ return self.store.find(CostCenterEntry, cost_center=self)
@classmethod def get_active(cls, store): return store.find(cls, is_active=True)
[docs] def add_stock_transaction(self, stock_transaction): """This method is called to create a |costcenterentry| when a product is removed from stock and this is being related to this |costcenter|.""" assert stock_transaction.quantity < 0 assert self.is_active CostCenterEntry(cost_center=self, stock_transaction=stock_transaction, store=self.store)
[docs] def add_lonely_payment(self, lonely_payment): """This method is called to create a |costcenterentry| when a lonely payment is confirmed and being related to this |costcenter|.""" assert self.is_active CostCenterEntry(cost_center=self, payment=lonely_payment, store=self.store)
[docs]class CostCenterEntry(Domain): """A operation that generated some cost in a |costcenter|. A cost can be generated when a lonely out |payment| is paid or when some operations on the stock are performed. """ __storm_table__ = 'cost_center_entry' cost_center_id = IdCol() #: The cost center this entry belongs to cost_center = Reference(cost_center_id, 'CostCenter.id') payment_id = IdCol() #: The payment that generated this cost. payment = Reference(payment_id, 'Payment.id') stock_transaction_id = IdCol() #: The stock movement transaction that generated this cost. stock_transaction = Reference(stock_transaction_id, 'StockTransactionHistory.id')