@@ 176-188 (lines=13) @@ | ||
173 | r = r.filter(event.Event.timestamp>=start) |
|
174 | if end: |
|
175 | r = r.filter(event.Event.timestamp<end) |
|
176 | ||
177 | return r.one().a or Decimal(0.0) |
|
178 | ||
179 | # Get the total amount of discounts people have received for keeping |
|
180 | # money in their account |
|
181 | @classmethod |
|
182 | def discounts(cls, start=None, end=None): |
|
183 | r = DBSession.query(func.sum((cls.amount / (1-cls.discount)) - cls.amount).label('d'))\ |
|
184 | .join(event.Event)\ |
|
185 | .filter(cls.discount > 0)\ |
|
186 | .filter(event.Event.deleted==False) |
|
187 | ||
188 | if start: |
|
189 | r = r.filter(event.Event.timestamp>=start) |
|
190 | if end: |
|
191 | r = r.filter(event.Event.timestamp<end) |
|
@@ 161-173 (lines=13) @@ | ||
158 | ||
159 | if distinct_on is None: |
|
160 | raise NotImplementedError("required argument distinct_on missing") |
|
161 | ||
162 | r = r.distinct(distinct_on) |
|
163 | ||
164 | return r.count() |
|
165 | ||
166 | @classmethod |
|
167 | def total(cls, start=None, end=None): |
|
168 | r = DBSession.query(func.sum(cls.amount).label('a'))\ |
|
169 | .join(event.Event)\ |
|
170 | .filter(event.Event.deleted==False) |
|
171 | ||
172 | if start: |
|
173 | r = r.filter(event.Event.timestamp>=start) |
|
174 | if end: |
|
175 | r = r.filter(event.Event.timestamp<end) |
|
176 | ||
@@ 795-806 (lines=12) @@ | ||
792 | .filter(event.Event.deleted==False)\ |
|
793 | .order_by(desc(event.Event.timestamp)) |
|
794 | else: |
|
795 | return DBSession.query(cls)\ |
|
796 | .join(Transaction)\ |
|
797 | .join(event.Event)\ |
|
798 | .filter(cls.type==trans_type)\ |
|
799 | .filter(event.Event.deleted==False)\ |
|
800 | .order_by(desc(event.Event.timestamp)) |
|
801 | ||
802 | class PurchaseLineItem(SubTransaction): |
|
803 | __mapper_args__ = {'polymorphic_identity': 'purchaselineitem'} |
|
804 | price = Column(Numeric) |
|
805 | def __init__(self, transaction, amount, item, quantity, price, wholesale): |
|
806 | SubTransaction.__init__(self, transaction, amount, item.id, quantity, wholesale) |
|
807 | self.price = price |
|
808 | ||
809 | @classmethod |
|
@@ 782-793 (lines=12) @@ | ||
779 | .join(event.Event)\ |
|
780 | .filter(cls.item_id == id)\ |
|
781 | .filter(event.Event.deleted==False)\ |
|
782 | .filter(or_(event.Event.type=="inventory", event.Event.type =="restock"))\ |
|
783 | .order_by(desc(event.Event.timestamp)) |
|
784 | ||
785 | @classmethod |
|
786 | @limitable_all |
|
787 | def all(cls, trans_type=None): |
|
788 | if not trans_type: |
|
789 | return DBSession.query(cls)\ |
|
790 | .join(Transaction)\ |
|
791 | .join(event.Event)\ |
|
792 | .filter(event.Event.deleted==False)\ |
|
793 | .order_by(desc(event.Event.timestamp)) |
|
794 | else: |
|
795 | return DBSession.query(cls)\ |
|
796 | .join(Transaction)\ |
|
@@ 769-780 (lines=12) @@ | ||
766 | return DBSession.query(cls)\ |
|
767 | .join(Transaction)\ |
|
768 | .join(event.Event)\ |
|
769 | .filter(cls.item_id == id)\ |
|
770 | .filter(event.Event.deleted==False)\ |
|
771 | .filter(event.Event.type=="purchase")\ |
|
772 | .order_by(desc(event.Event.timestamp)) |
|
773 | ||
774 | @classmethod |
|
775 | @limitable_all |
|
776 | def all_item_events(cls, id): |
|
777 | return DBSession.query(cls)\ |
|
778 | .join(Transaction)\ |
|
779 | .join(event.Event)\ |
|
780 | .filter(cls.item_id == id)\ |
|
781 | .filter(event.Event.deleted==False)\ |
|
782 | .filter(or_(event.Event.type=="inventory", event.Event.type =="restock"))\ |
|
783 | .order_by(desc(event.Event.timestamp)) |
|
@@ 481-492 (lines=12) @@ | ||
478 | .filter(event.Event.type == 'purchase')\ |
|
479 | .filter(event.Event.deleted==False).one().f or Decimal(0.0) |
|
480 | user.User.lifetime_discounts = __lifetime_discounts |
|
481 | ||
482 | ||
483 | @property |
|
484 | def __relevant_cash_deposits(self): |
|
485 | # Get the cashbox empty before this one |
|
486 | previous_cb_empty = object_session(self).query(event.Event)\ |
|
487 | .filter(event.Event.type == 'emptycashbox')\ |
|
488 | .filter(event.Event.timestamp < self.timestamp)\ |
|
489 | .filter(event.Event.deleted == False)\ |
|
490 | .order_by(desc(event.Event.timestamp))\ |
|
491 | .first() |
|
492 | ||
493 | # Now get all cash deposits between that cash box empty and this one |
|
494 | q = object_session(self).query(event.Deposit)\ |
|
495 | .filter(event.Event.timestamp < self.timestamp)\ |
|
@@ 146-157 (lines=12) @@ | ||
143 | r = r.filter(event.Event.timestamp>=start) |
|
144 | if end: |
|
145 | r = r.filter(event.Event.timestamp<end) |
|
146 | ||
147 | return r.one().c |
|
148 | ||
149 | @classmethod |
|
150 | def distinct(cls, *, distinct_on=None, start=None, end=None): |
|
151 | r = DBSession.query(cls).join(event.Event)\ |
|
152 | .filter(event.Event.deleted==False) |
|
153 | ||
154 | if start: |
|
155 | r = r.filter(event.Event.timestamp>=start) |
|
156 | if end: |
|
157 | r = r.filter(event.Event.timestamp<end) |
|
158 | ||
159 | if distinct_on is None: |
|
160 | raise NotImplementedError("required argument distinct_on missing") |