Save tender ref when applying to POS batch; add flag to kick drawer

This commit is contained in:
Lance Edgar 2023-10-06 20:32:40 -05:00
parent 31e23690c3
commit f8ea49d7f3
4 changed files with 95 additions and 9 deletions

View file

@ -214,7 +214,7 @@ class POSBatchHandler(BatchHandler):
def get_tender(self, session, key, **kwargs): def get_tender(self, session, key, **kwargs):
""" """
Return the tender record for Cash. Return the tender record corresponding to the given key.
:param session: Current DB session. :param session: Current DB session.
@ -341,17 +341,33 @@ class POSBatchHandler(BatchHandler):
:returns: List of rows which were added to the batch. :returns: List of rows which were added to the batch.
""" """
session = self.app.get_session(batch) session = self.app.get_session(batch)
model = self.model
# TODO: this could probably be improved. any validation needed? tender_info = tender
if isinstance(tender, str): tender = None
item_entry = tender item_entry = None
description = f"TENDER '{tender}'" description = None
elif hasattr(tender, 'code'):
if isinstance(tender_info, model.Tender):
tender = tender_info
else:
if isinstance(tender_info, str):
tender_code = tender_info
else:
tender_code = tender_info['code']
item_entry = tender_code
description = f"TENDER '{tender_code}'"
tender = self.get_tender(session, tender_code)
if tender:
item_entry = tender.code item_entry = tender.code
description = tender.name description = tender.name
else:
item_entry = tender['code'] if tender.disabled:
description = tender['name'] # TODO: behavior here should be configurable, probably
# needs a dedicated email etc. ..or maybe just ignore
log.error("disabled tender '%s' being applied to POS batch: %s",
tender, batch)
rows = [] rows = []
@ -362,6 +378,7 @@ class POSBatchHandler(BatchHandler):
row.item_entry = item_entry row.item_entry = item_entry
row.description = description row.description = description
row.tender_total = amount row.tender_total = amount
row.tender = tender
batch.tender_total = (batch.tender_total or 0) + row.tender_total batch.tender_total = (batch.tender_total or 0) + row.tender_total
self.add_row(batch, row) self.add_row(batch, row)
rows.append(row) rows.append(row)
@ -380,12 +397,18 @@ class POSBatchHandler(BatchHandler):
raise ValueError(f"tender '{tender.name}' does not allow " raise ValueError(f"tender '{tender.name}' does not allow "
f" cash back: ${-balance:0.2f}") f" cash back: ${-balance:0.2f}")
if tender and tender.is_cash:
cash = tender
else:
cash = self.get_tender(session, 'cash')
row = self.make_row() row = self.make_row()
row.user = user row.user = user
row.row_type = self.enum.POS_ROW_TYPE_CHANGE_BACK row.row_type = self.enum.POS_ROW_TYPE_CHANGE_BACK
row.item_entry = item_entry row.item_entry = item_entry
row.description = "CHANGE BACK" row.description = "CHANGE BACK"
row.tender_total = -balance row.tender_total = -balance
row.tender = cash
batch.tender_total = (batch.tender_total or 0) + row.tender_total batch.tender_total = (batch.tender_total or 0) + row.tender_total
self.add_row(batch, row) self.add_row(batch, row)
rows.append(row) rows.append(row)

View file

@ -0,0 +1,45 @@
# -*- coding: utf-8; -*-
"""add tender.kick_drawer
Revision ID: d69dd44f495c
Revises: 9cc5b433fb1d
Create Date: 2023-10-06 20:06:56.557531
"""
# revision identifiers, used by Alembic.
revision = 'd69dd44f495c'
down_revision = '9cc5b433fb1d'
branch_labels = None
depends_on = None
from alembic import op
import sqlalchemy as sa
import rattail.db.types
def upgrade():
# tender
op.add_column('tender', sa.Column('kick_drawer', sa.Boolean(), nullable=True))
op.add_column('tender', sa.Column('disabled', sa.Boolean(), nullable=True))
op.add_column('tender_version', sa.Column('kick_drawer', sa.Boolean(), autoincrement=False, nullable=True))
op.add_column('tender_version', sa.Column('disabled', sa.Boolean(), autoincrement=False, nullable=True))
# batch_pow_row
op.add_column('batch_pos_row', sa.Column('tender_uuid', sa.String(length=32), nullable=True))
op.create_foreign_key('batch_pos_row_fk_tender', 'batch_pos_row', 'tender', ['tender_uuid'], ['uuid'])
def downgrade():
# batch_pos_row
op.drop_constraint('batch_pos_row_fk_tender', 'batch_pos_row', type_='foreignkey')
op.drop_column('batch_pos_row', 'tender_uuid')
# tender
op.drop_column('tender_version', 'disabled')
op.drop_column('tender_version', 'kick_drawer')
op.drop_column('tender', 'disabled')
op.drop_column('tender', 'kick_drawer')

View file

@ -185,6 +185,8 @@ class POSBatchRow(BatchRowMixin, Base):
name='batch_pos_row_fk_user'), name='batch_pos_row_fk_user'),
sa.ForeignKeyConstraint(['product_uuid'], ['product.uuid'], sa.ForeignKeyConstraint(['product_uuid'], ['product.uuid'],
name='batch_pos_row_fk_item'), name='batch_pos_row_fk_item'),
sa.ForeignKeyConstraint(['tender_uuid'], ['tender.uuid'],
name='batch_pos_row_fk_tender'),
) )
STATUS_OK = 1 STATUS_OK = 1
@ -307,6 +309,13 @@ class POSBatchRow(BatchRowMixin, Base):
Tender total for the item. Tender total for the item.
""") """)
tender_uuid = sa.Column(sa.String(length=32), nullable=True)
tender = orm.relationship(
'Tender',
doc="""
Reference to the associated tender, if applicable.
""")
void = sa.Column(sa.Boolean(), nullable=False, default=False, doc=""" void = sa.Column(sa.Boolean(), nullable=False, default=False, doc="""
Flag indicating the line item was voided. Flag indicating the line item was voided.
""") """)

View file

@ -66,5 +66,14 @@ class Tender(Base):
transaction balance. transaction balance.
""") """)
kick_drawer = sa.Column(sa.Boolean(), nullable=True, doc="""
Flag indicating the drawer should be kicked open when a
transaction is finalized which includes this tender.
""")
disabled = sa.Column(sa.Boolean(), nullable=True, doc="""
Flag indicating the tender is disabled, and should not be used.
""")
def __str__(self): def __str__(self):
return str(self.name or '') return str(self.name or '')