diff --git a/corepos/db/common/__init__.py b/corepos/db/common/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/corepos/db/common/op.py b/corepos/db/common/op.py deleted file mode 100644 index 7cf84fc..0000000 --- a/corepos/db/common/op.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8; -*- -################################################################################ -# -# pyCOREPOS -- Python Interface to CORE POS -# Copyright © 2018-2025 Lance Edgar -# -# This file is part of pyCOREPOS. -# -# pyCOREPOS 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. -# -# pyCOREPOS 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 -# pyCOREPOS. If not, see . -# -################################################################################ -""" -Common schema for operational data models -""" - -import sqlalchemy as sa - - -class EmployeeBase: - """ - Base class for Employee models, shared by Office + Lane. - """ - number = sa.Column('emp_no', sa.SmallInteger(), nullable=False, - primary_key=True, autoincrement=False) - - cashier_password = sa.Column('CashierPassword', sa.String(length=50), nullable=True) - - admin_password = sa.Column('AdminPassword', sa.String(length=50), nullable=True) - - first_name = sa.Column('FirstName', sa.String(length=255), nullable=True) - - last_name = sa.Column('LastName', sa.String(length=255), nullable=True) - - job_title = sa.Column('JobTitle', sa.String(length=255), nullable=True) - - active = sa.Column('EmpActive', sa.Boolean(), nullable=True) - - frontend_security = sa.Column('frontendsecurity', sa.SmallInteger(), nullable=True) - - backend_security = sa.Column('backendsecurity', sa.SmallInteger(), nullable=True) - - birth_date = sa.Column('birthdate', sa.DateTime(), nullable=True) - - def __str__(self): - return ' '.join([self.first_name or '', self.last_name or '']).strip() diff --git a/corepos/db/common/trans.py b/corepos/db/common/trans.py deleted file mode 100644 index 2b4e503..0000000 --- a/corepos/db/common/trans.py +++ /dev/null @@ -1,123 +0,0 @@ -# -*- coding: utf-8; -*- -################################################################################ -# -# pyCOREPOS -- Python Interface to CORE POS -# Copyright © 2018-2025 Lance Edgar -# -# This file is part of pyCOREPOS. -# -# pyCOREPOS 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. -# -# pyCOREPOS 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 -# pyCOREPOS. If not, see . -# -################################################################################ -""" -Common schema for transaction data models -""" - -import sqlalchemy as sa -from sqlalchemy import orm -from sqlalchemy.ext.declarative import declared_attr - - -class TransactionDetailBase: - """ - Base class for POS transaction detail models, shared by Office + - Lane. - """ - - # register - register_number = sa.Column('register_no', sa.Integer(), nullable=True) - - # txn - transaction_id = sa.Column('trans_id', sa.Integer(), nullable=True) - transaction_number = sa.Column('trans_no', sa.Integer(), nullable=True) - transaction_type = sa.Column('trans_type', sa.String(length=1), nullable=True) - transaction_subtype = sa.Column('trans_subtype', sa.String(length=2), nullable=True) - trans_status = sa.Column(sa.String(length=1), nullable=True) - - @declared_attr - def transaction_status(self): - return orm.synonym('trans_status') - - # cashier - employee_number = sa.Column('emp_no', sa.Integer(), nullable=True) - - # customer - card_number = sa.Column('card_no', sa.Integer(), nullable=True) - member_type = sa.Column('memType', sa.Integer(), nullable=True) - staff = sa.Column(sa.Boolean(), nullable=True) - - ############################## - # remainder is "line item" ... - ############################## - - upc = sa.Column(sa.String(length=13), nullable=True) - - department_number = sa.Column('department', sa.Integer(), nullable=True) - - description = sa.Column(sa.String(length=30), nullable=True) - - quantity = sa.Column(sa.Float(), nullable=True) - - scale = sa.Column(sa.Boolean(), nullable=True, default=False) - - cost = sa.Column(sa.Numeric(precision=10, scale=2), nullable=True) - - unitPrice = sa.Column('unitPrice', sa.Numeric(precision=10, scale=2), nullable=True) - - @declared_attr - def unit_price(self): - return orm.synonym('unitPrice') - - total = sa.Column(sa.Numeric(precision=10, scale=2), nullable=True) - - reg_price = sa.Column('regPrice', sa.Numeric(precision=10, scale=2), nullable=True) - - tax = sa.Column(sa.SmallInteger(), nullable=True) - - @declared_attr - def tax_rate_id(self): - return orm.synonym('tax') - - food_stamp = sa.Column('foodstamp', sa.Boolean(), nullable=True) - - discount = sa.Column(sa.Numeric(precision=10, scale=2), nullable=True) - - member_discount = sa.Column('memDiscount', sa.Numeric(precision=10, scale=2), nullable=True) - - discountable = sa.Column(sa.Boolean(), nullable=True) - - discount_type = sa.Column('discounttype', sa.Integer(), nullable=True) - - voided = sa.Column(sa.Integer(), nullable=True) - - percent_discount = sa.Column('percentDiscount', sa.Integer(), nullable=True) - - item_quantity = sa.Column('ItemQtty', sa.Float(), nullable=True) - - volume_discount_type = sa.Column('volDiscType', sa.Integer(), nullable=True) - - volume = sa.Column(sa.Integer(), nullable=True) - - volume_special = sa.Column('VolSpecial', sa.Numeric(precision=10, scale=2), nullable=True) - - mix_match = sa.Column('mixMatch', sa.String(length=13), nullable=True) - - matched = sa.Column(sa.Boolean(), nullable=True) - - num_flag = sa.Column('numflag', sa.Integer(), nullable=True, default=0) - - char_flag = sa.Column('charflag', sa.String(length=2), nullable=True) - - def __str__(self): - return self.description or '' diff --git a/corepos/db/lane_op/model.py b/corepos/db/lane_op/model.py index 08da4f2..c7ed5b2 100644 --- a/corepos/db/lane_op/model.py +++ b/corepos/db/lane_op/model.py @@ -2,7 +2,7 @@ ################################################################################ # # pyCOREPOS -- Python Interface to CORE POS -# Copyright © 2018-2025 Lance Edgar +# Copyright © 2018-2023 Lance Edgar # # This file is part of pyCOREPOS. # @@ -27,19 +27,10 @@ Data model for CORE POS "lane_op" DB import sqlalchemy as sa from sqlalchemy import orm -from corepos.db.common import op as common - Base = orm.declarative_base() -class Employee(common.EmployeeBase, Base): - """ - Data model for ``employees`` table. - """ - __tablename__ = 'employees' - - class Department(Base): """ Represents a department within the organization. diff --git a/corepos/db/lane_trans/__init__.py b/corepos/db/lane_trans/__init__.py deleted file mode 100644 index 8e8c706..0000000 --- a/corepos/db/lane_trans/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8; -*- -################################################################################ -# -# pyCOREPOS -- Python Interface to CORE POS -# Copyright © 2018-2025 Lance Edgar -# -# This file is part of pyCOREPOS. -# -# pyCOREPOS 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. -# -# pyCOREPOS 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 -# pyCOREPOS. If not, see . -# -################################################################################ -""" -Lane Transaction Database -""" - -from sqlalchemy import orm - - -Session = orm.sessionmaker() diff --git a/corepos/db/lane_trans/model.py b/corepos/db/lane_trans/model.py deleted file mode 100644 index b656d8f..0000000 --- a/corepos/db/lane_trans/model.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8; -*- -################################################################################ -# -# pyCOREPOS -- Python Interface to CORE POS -# Copyright © 2018-2025 Lance Edgar -# -# This file is part of pyCOREPOS. -# -# pyCOREPOS 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. -# -# pyCOREPOS 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 -# pyCOREPOS. If not, see . -# -################################################################################ -""" -Data model for CORE POS "lane_trans" DB -""" - -import sqlalchemy as sa -from sqlalchemy import orm - -from corepos.db.common import trans as common - - -Base = orm.declarative_base() - - -class DTransactionBase(common.TransactionDetailBase): - """ - Base class for ``dtransactions`` and similar models. - """ - pos_row_id = sa.Column(sa.Integer(), primary_key=True, nullable=False) - - store_id = sa.Column(sa.Integer(), nullable=True, default=0) - date_time = sa.Column('datetime', sa.DateTime(), nullable=True) - - -class DTransaction(DTransactionBase, Base): - """ - Represents a record from ``dtransactions`` table. - """ - __tablename__ = 'dtransactions' - - -class LocalTempTrans(common.TransactionDetailBase, Base): - """ - Represents a record from ``localtemptrans`` table. - """ - __tablename__ = 'localtemptrans' - __table_args__ = ( - sa.PrimaryKeyConstraint('trans_id'), - ) - - date_time = sa.Column('datetime', sa.DateTime(), nullable=True) diff --git a/corepos/db/office_arch/model.py b/corepos/db/office_arch/model.py index bc5838f..49b0bbd 100644 --- a/corepos/db/office_arch/model.py +++ b/corepos/db/office_arch/model.py @@ -2,7 +2,7 @@ ################################################################################ # # pyCOREPOS -- Python Interface to CORE POS -# Copyright © 2018-2025 Lance Edgar +# Copyright © 2018-2024 Lance Edgar # # This file is part of pyCOREPOS. # @@ -24,11 +24,9 @@ CORE Office "arch" data model """ -import sqlalchemy as sa from sqlalchemy import orm -from corepos.db.common import trans as common -from corepos.db.office_trans.model import DTransactionBase +from corepos.db.office_trans.model import DTransactionBase, DLogBase Base = orm.declarative_base() @@ -36,7 +34,7 @@ Base = orm.declarative_base() class BigArchive(DTransactionBase, Base): """ - Data model for ``bigArchive`` table. + Represents a record from ``bigArchive`` table. """ __tablename__ = 'bigArchive' @@ -45,19 +43,8 @@ class BigArchive(DTransactionBase, Base): TransactionDetail = BigArchive -class DLogBase(common.TransactionDetailBase): - """ - Base class for ``dlogBig`` and similar models. - """ - store_row_id = sa.Column(sa.Integer(), primary_key=True, nullable=False) - - store_id = sa.Column(sa.Integer(), nullable=True, default=0) - pos_row_id = sa.Column(sa.Integer(), nullable=True) - date_time = sa.Column('tdate', sa.DateTime(), nullable=True) - - class DLogBig(DLogBase, Base): """ - Data model for ``dlogBig`` view. + Represents a record from ``dlogBig`` view. """ __tablename__ = 'dlogBig' diff --git a/corepos/db/office_op/model.py b/corepos/db/office_op/model.py index 67f405a..ff3f493 100644 --- a/corepos/db/office_op/model.py +++ b/corepos/db/office_op/model.py @@ -2,7 +2,7 @@ ################################################################################ # # pyCOREPOS -- Python Interface to CORE POS -# Copyright © 2018-2025 Lance Edgar +# Copyright © 2018-2024 Lance Edgar # # This file is part of pyCOREPOS. # @@ -31,8 +31,6 @@ import sqlalchemy as sa from sqlalchemy import orm from sqlalchemy.ext.associationproxy import association_proxy -from corepos.db.common import op as common - log = logging.getLogger(__name__) @@ -993,12 +991,35 @@ class ProductPhysicalLocation(Base): location = sa.Column(sa.SmallInteger(), nullable=True, default=0) -class Employee(common.EmployeeBase, Base): +class Employee(Base): """ - Data model for ``employees`` table. + Represents an employee within the organization. """ __tablename__ = 'employees' + number = sa.Column('emp_no', sa.SmallInteger(), primary_key=True, autoincrement=False, nullable=False) + + cashier_password = sa.Column('CashierPassword', sa.String(length=50), nullable=True) + + admin_password = sa.Column('AdminPassword', sa.String(length=50), nullable=True) + + first_name = sa.Column('FirstName', sa.String(length=255), nullable=True) + + last_name = sa.Column('LastName', sa.String(length=255), nullable=True) + + job_title = sa.Column('JobTitle', sa.String(length=255), nullable=True) + + active = sa.Column('EmpActive', sa.Boolean(), nullable=True) + + frontend_security = sa.Column('frontendsecurity', sa.SmallInteger(), nullable=True) + + backend_security = sa.Column('backendsecurity', sa.SmallInteger(), nullable=True) + + birth_date = sa.Column('birthdate', sa.DateTime(), nullable=True) + + def __str__(self): + return ' '.join([self.first_name or '', self.last_name or '']).strip() + class MemberType(Base): """ diff --git a/corepos/db/office_trans/model.py b/corepos/db/office_trans/model.py index c2b0959..b4659cd 100644 --- a/corepos/db/office_trans/model.py +++ b/corepos/db/office_trans/model.py @@ -2,7 +2,7 @@ ################################################################################ # # pyCOREPOS -- Python Interface to CORE POS -# Copyright © 2018-2025 Lance Edgar +# Copyright © 2018-2024 Lance Edgar # # This file is part of pyCOREPOS. # @@ -26,8 +26,7 @@ CORE POS Transaction Data Model import sqlalchemy as sa from sqlalchemy import orm - -from corepos.db.common import trans as common +from sqlalchemy.ext.declarative import declared_attr Base = orm.declarative_base() @@ -69,20 +68,118 @@ class EquityLiveBalance(Base): start_date = sa.Column('startdate', sa.DateTime(), nullable=True) -class DTransactionBase(common.TransactionDetailBase): +class TransactionDetailBase: """ - Base class for ``dtransactions`` and similar models. + Represents a POS transaction detail record. """ - store_row_id = sa.Column(sa.Integer(), primary_key=True, nullable=False) - pos_row_id = sa.Column(sa.Integer(), nullable=True) + # store + store_row_id = sa.Column(sa.Integer(), primary_key=True, nullable=False) store_id = sa.Column(sa.Integer(), nullable=True, default=0) + + # register + register_number = sa.Column('register_no', sa.Integer(), nullable=True) + pos_row_id = sa.Column(sa.Integer(), nullable=True) + + # txn + transaction_id = sa.Column('trans_id', sa.Integer(), nullable=True) + transaction_number = sa.Column('trans_no', sa.Integer(), nullable=True) + transaction_type = sa.Column('trans_type', sa.String(length=1), nullable=True) + transaction_subtype = sa.Column('trans_subtype', sa.String(length=2), nullable=True) + + trans_status = sa.Column(sa.String(length=1), nullable=True) + + @declared_attr + def transaction_status(self): + return orm.synonym('trans_status') + + # cashier + employee_number = sa.Column('emp_no', sa.Integer(), nullable=True) + + # customer + card_number = sa.Column('card_no', sa.Integer(), nullable=True) + member_type = sa.Column('memType', sa.Integer(), nullable=True) + staff = sa.Column(sa.Boolean(), nullable=True) + + ############################## + # remainder is "line item" ... + ############################## + + upc = sa.Column(sa.String(length=13), nullable=True) + + department_number = sa.Column('department', sa.Integer(), nullable=True) + + description = sa.Column(sa.String(length=30), nullable=True) + + quantity = sa.Column(sa.Float(), nullable=True) + + scale = sa.Column(sa.Boolean(), nullable=True, default=False) + + cost = sa.Column(sa.Numeric(precision=10, scale=2), nullable=True) + + unitPrice = sa.Column('unitPrice', sa.Numeric(precision=10, scale=2), nullable=True) + + @declared_attr + def unit_price(self): + return orm.synonym('unitPrice') + + total = sa.Column(sa.Numeric(precision=10, scale=2), nullable=True) + + reg_price = sa.Column('regPrice', sa.Numeric(precision=10, scale=2), nullable=True) + + tax = sa.Column(sa.SmallInteger(), nullable=True) + + @declared_attr + def tax_rate_id(self): + return orm.synonym('tax') + + food_stamp = sa.Column('foodstamp', sa.Boolean(), nullable=True) + + discount = sa.Column(sa.Numeric(precision=10, scale=2), nullable=True) + + member_discount = sa.Column('memDiscount', sa.Numeric(precision=10, scale=2), nullable=True) + + discountable = sa.Column(sa.Boolean(), nullable=True) + + discount_type = sa.Column('discounttype', sa.Integer(), nullable=True) + + voided = sa.Column(sa.Integer(), nullable=True) + + percent_discount = sa.Column('percentDiscount', sa.Integer(), nullable=True) + + item_quantity = sa.Column('ItemQtty', sa.Float(), nullable=True) + + volume_discount_type = sa.Column('volDiscType', sa.Integer(), nullable=True) + + volume = sa.Column(sa.Integer(), nullable=True) + + volume_special = sa.Column('VolSpecial', sa.Numeric(precision=10, scale=2), nullable=True) + + mix_match = sa.Column('mixMatch', sa.String(length=13), nullable=True) + + matched = sa.Column(sa.Boolean(), nullable=True) + + num_flag = sa.Column('numflag', sa.Integer(), nullable=True, default=0) + + char_flag = sa.Column('charflag', sa.String(length=2), nullable=True) + + def __str__(self): + return self.description or '' + + +class DTransactionBase(TransactionDetailBase): + date_time = sa.Column('datetime', sa.DateTime(), nullable=True) +class DLogBase(TransactionDetailBase): + + date_time = sa.Column('tdate', sa.DateTime(), nullable=True) + + class DTransaction(DTransactionBase, Base): """ - Data model for ``dtransactions`` table. + Represents a record from ``dtransactions`` table. """ __tablename__ = 'dtransactions'