Source code for rattail.custorders

# -*- coding: utf-8; -*-
################################################################################
#
#  Rattail -- Retail Software Framework
#  Copyright © 2010-2023 Lance Edgar
#
#  This file is part of Rattail.
#
#  Rattail is free software: you can redistribute it and/or modify it under the
#  terms of the GNU General Public License as published by the Free Software
#  Foundation, either version 3 of the License, or (at your option) any later
#  version.
#
#  Rattail 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 General Public License for more
#  details.
#
#  You should have received a copy of the GNU General Public License along with
#  Rattail.  If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Customer Orders Handler

Please note this is different from the Customer Order Batch Handler.
"""

import decimal

from rattail.app import GenericHandler


[docs] class CustomerOrderHandler(GenericHandler): """ Base class and default implementation for customer order handlers. """
[docs] def get_default_item_discount(self, product=None, **kwargs): """ Returns default item discount available. If product is given, the default may be specific to its department etc. """ if product: department = product.department if department and department.default_custorder_discount is not None: return department.default_custorder_discount discount = self.config.get('rattail.custorders', 'default_item_discount') if discount: return decimal.Decimal(discount)
[docs] def resolve_person(self, pending, person, user, **kwargs): """ Resolve a pending person for all customer orders. """ for order in list(pending.custorder_records): order.person = person order.pending_customer = None for item in order.items: item.add_event(self.enum.CUSTORDER_ITEM_EVENT_CUSTOMER_RESOLVED, user)
[docs] def resolve_product(self, pending, product, user, **kwargs): """ Resolve a pending product for all customer orders. """ for item in pending.custorder_item_records: item.product = product item.pending_product = None item.product_upc = product.upc item.product_item_id = product.item_id item.product_scancode = product.scancode item.product_brand = product.brand.name if product.brand else None item.product_description = product.description item.product_size = product.size # TODO: not sure this is needed really? item.product_weighed = product.weighed # TODO: model notes say this is not needed #item.product_unit_of_measure = product.unit_of_measure department = product.department item.department_number = department.number if department else None item.department_name = department.name if department else None # TODO: should be smarter about getting this item.case_quantity = product.case_size cost = product.cost item.product_unit_cost = cost.unit_cost if cost else None regprice = product.regular_price item.unit_regular_price = regprice.price if regprice else None curprice = product.current_price item.unit_sale_price = curprice.price if curprice else None item.sale_ends = curprice.ends if curprice else None item.unit_price = item.unit_sale_price or item.unit_regular_price # TODO: should recalculate total price #item.total_price = ... item.add_event(self.enum.CUSTORDER_ITEM_EVENT_PRODUCT_RESOLVED, user)
[docs] def mark_received(self, order_items, user, **kwargs): """ Mark the given set of customer order items as having been received (i.e. from the vendor). """ model = self.model event_kw = { 'type_code': self.enum.CUSTORDER_ITEM_EVENT_RECEIVED, 'user': user, 'note': kwargs.get('note'), } for item in order_items: item.status_code = self.enum.CUSTORDER_ITEM_STATUS_RECEIVED item.status_text = None item.events.append(model.CustomerOrderItemEvent(**event_kw))
[docs] def add_note(self, item, note_text, user, apply_all=False, **kwargs): """ Add a note to the given order item. :param apply_all: If set, the note should be added to all items on the order, instead of just the one item given. """ model = self.model if apply_all: items = item.order.items else: items = [item] occurred = kwargs.get('occurred') for item in items: item.events.append(model.CustomerOrderItemEvent( type_code=self.enum.CUSTORDER_ITEM_EVENT_NOTE_ADDED, user=user, note=note_text, occurred=occurred))