Changeset - 25483a21a057
[Not reviewed]
0 2 0
Lance Edgar (lance) - 3 years ago 2021-09-27 11:31:12
lance@edbob.org
Add "all" enum values for custorder item status, event

also attach "initiated" event(s) when creating new custorder
2 files changed with 72 insertions and 8 deletions:
0 comments (0 inline, 0 general)
rattail/batch/custorder.py
Show inline comments
 
@@ -288,109 +288,114 @@ class CustomerOrderBatchHandler(BatchHandler):
 

	
 
        product = row.product
 
        row.product_upc = product.upc
 
        row.product_brand = six.text_type(product.brand or "")
 
        row.product_description = product.description
 
        row.product_size = product.size
 
        row.product_weighed = product.weighed
 
        row.case_quantity = self.get_case_size_for_product(product)
 

	
 
        department = product.department
 
        row.department_number = department.number if department else None
 
        row.department_name = department.name if department else None
 

	
 
        cost = product.cost
 
        row.product_unit_cost = cost.unit_cost if cost else None
 

	
 
        regprice = product.regular_price
 
        row.unit_price = regprice.price if regprice else None
 

	
 
        # we need to know if total price is updated
 
        old_total = row.total_price
 

	
 
        # maybe update total price
 
        if row.unit_price is None:
 
            row.total_price = None
 
        elif not row.unit_price:
 
            row.total_price = 0
 
        else:
 
            row.total_price = row.unit_price * row.order_quantity
 
            if row.order_uom == self.enum.UNIT_OF_MEASURE_CASE:
 
                row.total_price *= (row.case_quantity or 1)
 

	
 
        # update total price for batch too, if it changed
 
        if row.total_price != old_total:
 
            batch = row.batch
 
            batch.total_price = ((batch.total_price or 0)
 
                                 + (row.total_price or 0)
 
                                 - (old_total or 0))
 

	
 
        row.status_code = row.STATUS_OK
 

	
 
    def remove_row(self, row):
 
        batch = row.batch
 

	
 
        if not row.removed:
 
            row.removed = True
 

	
 
            if row.total_price:
 
                batch.total_price = (batch.total_price or 0) - row.total_price
 

	
 
        self.refresh_batch_status(batch)
 

	
 
    def execute(self, batch, user=None, progress=None, **kwargs):
 
        """
 
        Default behavior here will simply create a new (proper) Customer Order
 
        based on the batch contents.  Override as needed.
 
        """
 
        batch_fields = [
 
            'store',
 
            'id',
 
            'customer',
 
            'person',
 
            'phone_number',
 
            'email_address',
 
            'total_price',
 
        ]
 

	
 
        order = model.CustomerOrder()
 
        order.created_by = user
 
        order.status_code = self.enum.CUSTORDER_STATUS_ORDERED
 
        for field in batch_fields:
 
            setattr(order, field, getattr(batch, field))
 

	
 
        row_fields = [
 
            'product',
 
            'product_upc',
 
            'product_brand',
 
            'product_description',
 
            'product_size',
 
            'product_weighed',
 
            'department_number',
 
            'department_name',
 
            'case_quantity',
 
            'order_quantity',
 
            'order_uom',
 
            'product_unit_cost',
 
            'unit_price',
 
            'discount_percent',
 
            'total_price',
 
            'paid_amount',
 
            'payment_transaction_number',
 
        ]
 

	
 
        def convert(row, i):
 
            item = model.CustomerOrderItem()
 
            item.sequence = i
 
            item.status_code = self.enum.CUSTORDER_ITEM_STATUS_ORDERED
 
            item.status_code = self.enum.CUSTORDER_ITEM_STATUS_INITIATED
 
            for field in row_fields:
 
                setattr(item, field, getattr(row, field))
 
            order.items.append(item)
 

	
 
            # attach event
 
            item.events.append(model.CustomerOrderItemEvent(
 
                type_code=self.enum.CUSTORDER_ITEM_EVENT_INITIATED,
 
                user=user))
 

	
 
        self.progress_loop(convert, batch.active_rows(), progress,
 
                           message="Converting batch rows to order items")
 

	
 
        session = orm.object_session(batch)
 
        session.add(order)
 
        session.flush()
 

	
 
        return order
rattail/enum.py
Show inline comments
 
# -*- coding: utf-8; -*-
 
################################################################################
 
#
 
#  Rattail -- Retail Software Framework
 
#  Copyright © 2010-2021 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/>.
 
#
 
################################################################################
 
"""
 
**Enumerations**
 

	
 
The following enumerations are provided:
 

	
 
.. attribute:: BATCH_ACTION
 

	
 
   Action types for use with batches.  These are taken from the SIL
 
   specification.
 

	
 
.. attribute:: EMAIL_PREFERENCE
 

	
 
   Various options indicating a person's preferences on whether to receive
 
   email, and if so, in what format.
 

	
 
.. attribute:: EMPLOYEE_STATUS
 

	
 
   Status types for employees (e.g. current, former).
 

	
 
.. attribute:: PHONE_TYPE
 

	
 
   Various "types" of phone contact information (e.g. home, work).
 

	
 
.. attribute:: PRICE_TYPE
 

	
 
   Various types of prices which may exist for a product.  These are taken from
 
   the SIL specification.
 

	
 
.. attribute:: UNIT_OF_MEASURE
 

	
 
   Units of measure for use with products (e.g. each, pound).  These are taken
 
   from the SIL specification.
 
"""
 

	
 
from __future__ import unicode_literals, absolute_import
 

	
 
from rattail.util import OrderedDict
 

	
 

	
 
BATCH_ACTION_ADD                = 'ADD'
 
BATCH_ACTION_ADD_REPLACE        = 'ADDRPL'
 
BATCH_ACTION_CHANGE             = 'CHANGE'
 
BATCH_ACTION_LOAD               = 'LOAD'
 
BATCH_ACTION_REMOVE             = 'REMOVE'
 

	
 
BATCH_ACTION = {
 
    BATCH_ACTION_ADD            : "Add",
 
    BATCH_ACTION_ADD_REPLACE    : "Add/Replace",
 
    BATCH_ACTION_CHANGE         : "Change",
 
    BATCH_ACTION_LOAD           : "Load",
 
    BATCH_ACTION_REMOVE         : "Remove",
 
    }
 

	
 

	
 
CUSTORDER_BATCH_MODE_CREATING            = 10
 
CUSTORDER_BATCH_MODE_GATHERING           = 20
 

	
 
CUSTORDER_BATCH_MODE = {
 
    CUSTORDER_BATCH_MODE_CREATING        : "creating",
 
    CUSTORDER_BATCH_MODE_GATHERING       : "gathering",
 
}
 

	
 

	
 
CUSTORDER_STATUS_ORDERED                = 10
 
# CUSTORDER_STATUS_PAID                   = 20
 

	
 
CUSTORDER_STATUS = {
 
    CUSTORDER_STATUS_ORDERED            : "ordered",
 
    # CUSTORDER_STATUS_PAID               : "paid",
 
}
 

	
 

	
 
CUSTORDER_ITEM_STATUS_ORDERED           = 10
 
# CUSTORDER_ITEM_STATUS_PAID              = 20
 

	
 
CUSTORDER_ITEM_STATUS = {
 
    CUSTORDER_ITEM_STATUS_ORDERED       : "ordered",
 
    # CUSTORDER_ITEM_STATUS_PAID          : "paid",
 
}
 
CUSTORDER_ITEM_STATUS_INITIATED         = 10
 
# TODO: deprecate / remove this one
 
CUSTORDER_ITEM_STATUS_ORDERED           = CUSTORDER_ITEM_STATUS_INITIATED
 
CUSTORDER_ITEM_STATUS_PAID              = 20
 
CUSTORDER_ITEM_STATUS_PLACED            = 30
 
CUSTORDER_ITEM_STATUS_RECEIVED          = 40
 
CUSTORDER_ITEM_STATUS_CONTACTED         = 50
 
CUSTORDER_ITEM_STATUS_CONTACT_FAILED    = 60
 
CUSTORDER_ITEM_STATUS_DELIVERED         = 70
 
CUSTORDER_ITEM_STATUS_CANCELED          = 900
 
CUSTORDER_ITEM_STATUS_REFUND_PENDING    = 910
 
CUSTORDER_ITEM_STATUS_REFUNDED          = 920
 
CUSTORDER_ITEM_STATUS_RESTOCKED         = 930
 
CUSTORDER_ITEM_STATUS_EXPIRED           = 940
 
CUSTORDER_ITEM_STATUS_INACTIVE          = 950
 

	
 
CUSTORDER_ITEM_STATUS = OrderedDict([
 
    (CUSTORDER_ITEM_STATUS_INITIATED,           "customer order initiated"),
 
    (CUSTORDER_ITEM_STATUS_PAID,                "payment received"),
 
    (CUSTORDER_ITEM_STATUS_PLACED,              "order placed with vendor"),
 
    (CUSTORDER_ITEM_STATUS_RECEIVED,            "received from vendor"),
 
    (CUSTORDER_ITEM_STATUS_CONTACTED,           "customer contacted"),
 
    (CUSTORDER_ITEM_STATUS_CONTACT_FAILED,      "unable to contact customer"),
 
    (CUSTORDER_ITEM_STATUS_DELIVERED,           "delivered to customer"),
 
    (CUSTORDER_ITEM_STATUS_CANCELED,            "canceled"),
 
    (CUSTORDER_ITEM_STATUS_REFUND_PENDING,      "refund pending"),
 
    (CUSTORDER_ITEM_STATUS_REFUNDED,            "refunded"),
 
    (CUSTORDER_ITEM_STATUS_RESTOCKED,           "restocked"),
 
    (CUSTORDER_ITEM_STATUS_EXPIRED,             "expired"),
 
    (CUSTORDER_ITEM_STATUS_INACTIVE,            "inactive"),
 
])
 

	
 

	
 
CUSTORDER_ITEM_EVENT_INITIATED          = 10
 
CUSTORDER_ITEM_EVENT_PAID               = 20
 
CUSTORDER_ITEM_EVENT_PLACED             = 30
 
CUSTORDER_ITEM_EVENT_RECEIVED           = 40
 
CUSTORDER_ITEM_EVENT_CONTACTED          = 50
 
CUSTORDER_ITEM_EVENT_CONTACT_FAILED     = 60
 
CUSTORDER_ITEM_EVENT_DELIVERED          = 70
 
CUSTORDER_ITEM_EVENT_STATUS_CHANGE      = 500 # nb. this is not in STATUS enum
 
CUSTORDER_ITEM_EVENT_CANCELED           = 900
 
CUSTORDER_ITEM_EVENT_REFUND_PENDING     = 910
 
CUSTORDER_ITEM_EVENT_REFUNDED           = 920
 
CUSTORDER_ITEM_EVENT_RESTOCKED          = 930
 
CUSTORDER_ITEM_EVENT_EXPIRED            = 940
 
CUSTORDER_ITEM_EVENT_INACTIVE           = 950
 

	
 
CUSTORDER_ITEM_EVENT = OrderedDict([
 
    (CUSTORDER_ITEM_EVENT_INITIATED,            "customer order initiated"),
 
    (CUSTORDER_ITEM_EVENT_PAID,                 "payment received"),
 
    (CUSTORDER_ITEM_EVENT_PLACED,               "order placed with vendor"),
 
    (CUSTORDER_ITEM_EVENT_RECEIVED,             "received from vendor"),
 
    (CUSTORDER_ITEM_EVENT_CONTACTED,            "customer contacted"),
 
    (CUSTORDER_ITEM_EVENT_CONTACT_FAILED,       "unable to contact customer"),
 
    (CUSTORDER_ITEM_EVENT_DELIVERED,            "delivered to customer"),
 
    (CUSTORDER_ITEM_EVENT_STATUS_CHANGE,        "manual status change"),
 
    (CUSTORDER_ITEM_EVENT_CANCELED,             "canceled"),
 
    (CUSTORDER_ITEM_EVENT_REFUND_PENDING,       "refund pending"),
 
    (CUSTORDER_ITEM_EVENT_REFUNDED,             "refunded"),
 
    (CUSTORDER_ITEM_EVENT_RESTOCKED,            "restocked"),
 
    (CUSTORDER_ITEM_EVENT_EXPIRED,              "expired"),
 
    (CUSTORDER_ITEM_EVENT_INACTIVE,             "inactive"),
 
])
 

	
 

	
 
EMAIL_ATTEMPT_CREATED           = 0
 
EMAIL_ATTEMPT_SUCCESS           = 1
 
EMAIL_ATTEMPT_FAILURE           = 2
 
# EMAIL_ATTEMPT_BOUNCED           = 3
 

	
 
EMAIL_ATTEMPT = {
 
    EMAIL_ATTEMPT_CREATED       : "created",
 
    EMAIL_ATTEMPT_SUCCESS       : "success",
 
    EMAIL_ATTEMPT_FAILURE       : "failure",
 
    # EMAIL_ATTEMPT_BOUNCED       : "bounced",
 
}
 

	
 

	
 
EMAIL_PREFERENCE_NONE           = 0
 
EMAIL_PREFERENCE_TEXT           = 1
 
EMAIL_PREFERENCE_HTML           = 2
 
EMAIL_PREFERENCE_MOBILE         = 3
 

	
 
EMAIL_PREFERENCE = {
 
    EMAIL_PREFERENCE_NONE       : "No Emails",
 
    EMAIL_PREFERENCE_TEXT       : "Text",
 
    EMAIL_PREFERENCE_HTML       : "HTML",
 
    EMAIL_PREFERENCE_MOBILE     : "Mobile",
 
    }
 

	
 

	
 
HANDHELD_DEVICE_TYPE_MOTOROLA           = 'motorola'
 
HANDHELD_DEVICE_TYPE_PALMOS             = 'palmos'
 

	
 
HANDHELD_DEVICE_TYPE = {
 
    HANDHELD_DEVICE_TYPE_MOTOROLA       : "Motorola",
 
    HANDHELD_DEVICE_TYPE_PALMOS         : "PalmOS",
 
}
 

	
 

	
 
IMPORTER_BATCH_ROW_STATUS_NOCHANGE      = 0
 
IMPORTER_BATCH_ROW_STATUS_CREATE        = 1
 
IMPORTER_BATCH_ROW_STATUS_UPDATE        = 2
 
IMPORTER_BATCH_ROW_STATUS_DELETE        = 3
 

	
 
IMPORTER_BATCH_ROW_STATUS = {
 
    IMPORTER_BATCH_ROW_STATUS_NOCHANGE  : "no change",
 
    IMPORTER_BATCH_ROW_STATUS_CREATE    : "create",
 
    IMPORTER_BATCH_ROW_STATUS_UPDATE    : "update",
 
    IMPORTER_BATCH_ROW_STATUS_DELETE    : "delete",
 
}
 

	
 

	
 
INVENTORY_MODE_REPLACE          = 1
 
INVENTORY_MODE_REPLACE_ADJUST   = 2
 
INVENTORY_MODE_ADJUST           = 3
 
INVENTORY_MODE_ZERO_ALL         = 4
 
INVENTORY_MODE_VARIANCE         = 5
 

	
 
INVENTORY_MODE = {
 
    INVENTORY_MODE_REPLACE              : "Replace only",
 
    INVENTORY_MODE_REPLACE_ADJUST       : "Replace then adjust",
 
    INVENTORY_MODE_ADJUST               : "Adjust only",
 
    INVENTORY_MODE_ZERO_ALL             : "Zero all",
 
    INVENTORY_MODE_VARIANCE             : "Variance Correction",
 
}
 

	
 

	
 
MESSAGE_STATUS_INBOX            = 1
 
MESSAGE_STATUS_ARCHIVE          = 2
 

	
 
MESSAGE_STATUS = {
 
    MESSAGE_STATUS_INBOX        : "Inbox",
 
    MESSAGE_STATUS_ARCHIVE      : "Archive",
 
}
 

	
 

	
 
PHONE_TYPE_HOME                 = 'home'
 
PHONE_TYPE_MOBILE               = 'mobile'
 
PHONE_TYPE_OTHER                = 'other'
 

	
 
PHONE_TYPE = {
 
    PHONE_TYPE_HOME             : "Home",
 
    PHONE_TYPE_MOBILE           : "Mobile",
 
    PHONE_TYPE_OTHER            : "Other",
 
    }
 

	
 

	
 
PRICE_TYPE_REGULAR              = 0
 
PRICE_TYPE_TPR                  = 1
 
PRICE_TYPE_SALE                 = 2
 
PRICE_TYPE_MANAGER_SPECIAL      = 3
 
PRICE_TYPE_ALTERNATE            = 4
 
PRICE_TYPE_FREQUENT_SHOPPER     = 5
 
PRICE_TYPE_MFR_SUGGESTED        = 901
 

	
 
PRICE_TYPE = {
 
    PRICE_TYPE_REGULAR          : "Regular Price",
 
    PRICE_TYPE_TPR              : "TPR",
0 comments (0 inline, 0 general)