diff --git a/rattail_corepos/corepos/office/commands.py b/rattail_corepos/corepos/office/commands.py index ebebd29..5b45913 100644 --- a/rattail_corepos/corepos/office/commands.py +++ b/rattail_corepos/corepos/office/commands.py @@ -111,6 +111,32 @@ class Anonymize(commands.Subcommand): message="Anonymizing all member data") +class CoreDBImportSubcommand(commands.ImportSubcommand): + """ + Base class for commands which import straight to CORE DB + """ + + def add_parser_args(self, parser): + super().add_parser_args(parser) + + parser.add_argument('--corepos-dbtype', metavar='TYPE', default='office_op', + choices=['office_op', 'office_trans'], + help="Config *type* for CORE-POS database engine to which data " + "should be written. Default type is 'office_op' - this determines " + "which config section is used with regard to the --corepos-dbkey arg.") + + parser.add_argument('--corepos-dbkey', metavar='KEY', default='default', + help="Config key for CORE-POS database engine to which data should " + "be written. This key must be defined in the config section as " + "determiend by the --corpos-dbtype arg.") + + def get_handler_kwargs(self, **kwargs): + if 'args' in kwargs: + kwargs['corepos_dbtype'] = kwargs['args'].corepos_dbtype + kwargs['corepos_dbkey'] = kwargs['args'].corepos_dbkey + return kwargs + + class ExportLaneOp(commands.ImportSubcommand): """ Export "op" data from CORE Office to CORE Lane diff --git a/rattail_corepos/corepos/office/importing/db/model.py b/rattail_corepos/corepos/office/importing/db/model.py index 6a2ae41..96ba752 100644 --- a/rattail_corepos/corepos/office/importing/db/model.py +++ b/rattail_corepos/corepos/office/importing/db/model.py @@ -34,7 +34,7 @@ CORE-POS model importers (direct DB) import logging from corepos.db.office_op import model as corepos, Session as CoreSession -from corepos.db.office_trans import model as coretrans +from corepos.db.office_trans import model as coretrans, Session as CoreTransSession from rattail import importing from rattail.importing.handlers import ToSQLAlchemyHandler @@ -47,12 +47,27 @@ class ToCoreHandler(ToSQLAlchemyHandler): """ Base class for import handlers which target a CORE database on the local side. """ - generic_local_title = 'CORE Office (DB "op")' - local_title = 'CORE Office (DB "op")' + # TODO: should change local_key in all apps! since dbtype can vary now local_key = 'corepos_db_office_op' + generic_local_title = "CORE Office (DB)" + corepos_dbtype = 'office_op' + corepos_dbkey = 'default' + + @property + def local_title(self): + dbtype = 'op' + if self.corepos_dbtype == 'office_trans': + dbtype = 'trans' + return f"CORE Office (DB '{dbtype}')" def make_session(self): - return CoreSession() + + # session type depends on the --corepos-dbtype arg + if self.corepos_dbtype == 'office_trans': + return CoreTransSession(bind=self.config.coretrans_engines[self.corepos_dbkey]) + + # assume office_op by default + return CoreSession(bind=self.config.corepos_engines[self.corepos_dbkey]) class ToCore(importing.ToSQLAlchemy): @@ -270,6 +285,13 @@ class HouseCouponImporter(ToCore): # CORE Transactions ######################################## +class StockPurchaseImporter(ToCoreTrans): + """ + CORE-POS stock purchase data importer. + """ + model_class = coretrans.StockPurchase + + class TransactionDetailImporter(ToCoreTrans): """ CORE-POS transaction data importer.