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):
"""
Return the tender record for Cash.
Return the tender record corresponding to the given key.
:param session: Current DB session.
@ -341,17 +341,33 @@ class POSBatchHandler(BatchHandler):
:returns: List of rows which were added to the batch.
"""
session = self.app.get_session(batch)
model = self.model
# TODO: this could probably be improved. any validation needed?
if isinstance(tender, str):
item_entry = tender
description = f"TENDER '{tender}'"
elif hasattr(tender, 'code'):
tender_info = tender
tender = None
item_entry = None
description = None
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
description = tender.name
else:
item_entry = tender['code']
description = tender['name']
if tender.disabled:
# 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 = []
@ -362,6 +378,7 @@ class POSBatchHandler(BatchHandler):
row.item_entry = item_entry
row.description = description
row.tender_total = amount
row.tender = tender
batch.tender_total = (batch.tender_total or 0) + row.tender_total
self.add_row(batch, row)
rows.append(row)
@ -380,12 +397,18 @@ class POSBatchHandler(BatchHandler):
raise ValueError(f"tender '{tender.name}' does not allow "
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.user = user
row.row_type = self.enum.POS_ROW_TYPE_CHANGE_BACK
row.item_entry = item_entry
row.description = "CHANGE BACK"
row.tender_total = -balance
row.tender = cash
batch.tender_total = (batch.tender_total or 0) + row.tender_total
self.add_row(batch, 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'),
sa.ForeignKeyConstraint(['product_uuid'], ['product.uuid'],
name='batch_pos_row_fk_item'),
sa.ForeignKeyConstraint(['tender_uuid'], ['tender.uuid'],
name='batch_pos_row_fk_tender'),
)
STATUS_OK = 1
@ -307,6 +309,13 @@ class POSBatchRow(BatchRowMixin, Base):
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="""
Flag indicating the line item was voided.
""")

View file

@ -66,5 +66,14 @@ class Tender(Base):
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):
return str(self.name or '')