Save tender ref when applying to POS batch; add flag to kick drawer
This commit is contained in:
		
							parent
							
								
									31e23690c3
								
							
						
					
					
						commit
						f8ea49d7f3
					
				
					 4 changed files with 95 additions and 9 deletions
				
			
		| 
						 | 
					@ -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)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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')
 | 
				
			||||||
| 
						 | 
					@ -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.
 | 
				
			||||||
    """)
 | 
					    """)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 '')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue