diff --git a/alembic/env.py b/alembic/env.py index b67da10..3190b70 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -28,6 +28,13 @@ target_metadata = Base.metadata # ... etc. +def include_object(object, name, type_, reflected, compare_to): + # Skip materialized views during migrations + if type_ == "table" and name == "most_recent_tcgplayer_price": + return False + return True + + def run_migrations_offline() -> None: """Run migrations in 'offline' mode. @@ -46,6 +53,7 @@ def run_migrations_offline() -> None: target_metadata=target_metadata, literal_binds=True, dialect_opts={"paramstyle": "named"}, + include_object=include_object, ) with context.begin_transaction(): @@ -67,7 +75,9 @@ def run_migrations_online() -> None: with connectable.connect() as connection: context.configure( - connection=connection, target_metadata=target_metadata + connection=connection, + target_metadata=target_metadata, + include_object=include_object, ) with context.begin_transaction(): @@ -77,4 +87,4 @@ def run_migrations_online() -> None: if context.is_offline_mode(): run_migrations_offline() else: - run_migrations_online() + run_migrations_online() \ No newline at end of file diff --git a/alembic/versions/06605c625998_product.py b/alembic/versions/06605c625998_product.py new file mode 100644 index 0000000..dc69de0 --- /dev/null +++ b/alembic/versions/06605c625998_product.py @@ -0,0 +1,34 @@ +"""product + +Revision ID: 06605c625998 +Revises: 28cfdbde1796 +Create Date: 2025-04-22 10:10:18.082314 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '06605c625998' +down_revision: Union[str, None] = '28cfdbde1796' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint('physical_items_product_id_fkey', 'physical_items', type_='foreignkey') + op.create_foreign_key(None, 'physical_items', 'tcgplayer_products', ['product_id'], ['id']) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'physical_items', type_='foreignkey') + op.create_foreign_key('physical_items_product_id_fkey', 'physical_items', 'products', ['product_id'], ['id']) + # ### end Alembic commands ### diff --git a/alembic/versions/32d21f7d33e9_inventory_management_improvements.py b/alembic/versions/32d21f7d33e9_inventory_management_improvements.py new file mode 100644 index 0000000..4081118 --- /dev/null +++ b/alembic/versions/32d21f7d33e9_inventory_management_improvements.py @@ -0,0 +1,97 @@ +"""inventory management improvements + +Revision ID: 32d21f7d33e9 +Revises: d2c33dee079c +Create Date: 2025-04-22 16:43:57.844419 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '32d21f7d33e9' +down_revision: Union[str, None] = 'd2c33dee079c' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('marketplaces', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_marketplaces_id'), 'marketplaces', ['id'], unique=False) + op.create_index(op.f('ix_marketplaces_name'), 'marketplaces', ['name'], unique=True) + op.create_table('sealed_expected_values', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('product_id', sa.Integer(), nullable=True), + sa.Column('expected_value', sa.Float(), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint(['product_id'], ['tcgplayer_products.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_sealed_expected_values_id'), 'sealed_expected_values', ['id'], unique=False) + op.create_table('marketplace_listings', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('inventory_item_id', sa.Integer(), nullable=False), + sa.Column('marketplace_id', sa.Integer(), nullable=False), + sa.Column('product_id', sa.Integer(), nullable=False), + sa.Column('listing_date', sa.DateTime(timezone=True), nullable=True), + sa.Column('delisting_date', sa.DateTime(timezone=True), nullable=True), + sa.Column('listed_price', sa.Float(), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint(['inventory_item_id'], ['inventory_items.id'], ), + sa.ForeignKeyConstraint(['marketplace_id'], ['marketplaces.id'], ), + sa.ForeignKeyConstraint(['product_id'], ['tcgplayer_products.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_marketplace_listings_id'), 'marketplace_listings', ['id'], unique=False) + op.drop_index('ix_product_expected_values_id', table_name='product_expected_values') + op.drop_table('product_expected_values') + op.add_column('sealed_boxes', sa.Column('expected_value', sa.Float(), nullable=True)) + op.add_column('sealed_cases', sa.Column('expected_value', sa.Float(), nullable=True)) + op.add_column('sealed_cases', sa.Column('num_boxes', sa.Integer(), nullable=True)) + op.add_column('transactions', sa.Column('marketplace_id', sa.Integer(), nullable=True)) + op.create_foreign_key(None, 'transactions', 'marketplaces', ['marketplace_id'], ['id']) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'transactions', type_='foreignkey') + op.drop_column('transactions', 'marketplace_id') + op.drop_column('sealed_cases', 'num_boxes') + op.drop_column('sealed_cases', 'expected_value') + op.drop_column('sealed_boxes', 'expected_value') + op.create_table('product_expected_values', + sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False), + sa.Column('product_id', sa.INTEGER(), autoincrement=False, nullable=True), + sa.Column('expected_value', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True), + sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True), + sa.Column('updated_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True), + sa.Column('deleted_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True), + sa.ForeignKeyConstraint(['product_id'], ['tcgplayer_products.id'], name='product_expected_values_product_id_fkey'), + sa.PrimaryKeyConstraint('id', name='product_expected_values_pkey') + ) + op.create_index('ix_product_expected_values_id', 'product_expected_values', ['id'], unique=False) + op.drop_index(op.f('ix_marketplace_listings_id'), table_name='marketplace_listings') + op.drop_table('marketplace_listings') + op.drop_index(op.f('ix_sealed_expected_values_id'), table_name='sealed_expected_values') + op.drop_table('sealed_expected_values') + op.drop_index(op.f('ix_marketplaces_name'), table_name='marketplaces') + op.drop_index(op.f('ix_marketplaces_id'), table_name='marketplaces') + op.drop_table('marketplaces') + # ### end Alembic commands ### diff --git a/alembic/versions/d2c33dee079c_small_change_and_mat_view.py b/alembic/versions/d2c33dee079c_small_change_and_mat_view.py new file mode 100644 index 0000000..cfa725f --- /dev/null +++ b/alembic/versions/d2c33dee079c_small_change_and_mat_view.py @@ -0,0 +1,55 @@ +"""small change and mat view + +Revision ID: d2c33dee079c +Revises: 06605c625998 +Create Date: 2025-04-22 10:27:25.322827 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'd2c33dee079c' +down_revision: Union[str, None] = '06605c625998' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('product_expected_values', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('product_id', sa.Integer(), nullable=True), + sa.Column('expected_value', sa.Float(), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint(['product_id'], ['tcgplayer_products.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_product_expected_values_id'), 'product_expected_values', ['id'], unique=False) + op.execute(""" + CREATE MATERIALIZED VIEW IF NOT EXISTS most_recent_tcgplayer_price AS + SELECT DISTINCT ON (product_id) * + FROM public.tcgplayer_price_history + ORDER BY product_id, date DESC; + """) + op.execute(""" + CREATE UNIQUE INDEX IF NOT EXISTS idx_most_recent_tcgplayer_price_product_id + ON most_recent_tcgplayer_price (product_id); + """) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_product_expected_values_id'), table_name='product_expected_values') + op.drop_table('product_expected_values') + op.execute("DROP INDEX IF EXISTS idx_most_recent_tcgplayer_price_product_id;") + op.execute("DROP MATERIALIZED VIEW IF EXISTS most_recent_tcgplayer_price;") + # ### end Alembic commands ### diff --git a/app.log b/app.log index cac99e3..7cc7acd 100644 --- a/app.log +++ b/app.log @@ -1,107 +1,617 @@ -2025-04-20 00:26:23,206 - INFO - app.main - Application starting up... -2025-04-20 00:26:23,441 - INFO - app.main - Database initialized successfully -2025-04-20 00:26:23,441 - INFO - app.services.service_manager - Service OrderManagementService registered -2025-04-20 00:26:23,442 - INFO - app.services.service_manager - Service TCGPlayerInventoryService registered -2025-04-20 00:26:23,442 - INFO - app.services.service_manager - Service LabelPrinterService registered -2025-04-20 00:26:23,443 - INFO - app.services.service_manager - Service RegularPrinterService registered -2025-04-20 00:26:23,447 - INFO - app.services.service_manager - Service AddressLabelService registered -2025-04-20 00:26:23,450 - INFO - app.services.service_manager - Service PullSheetService registered -2025-04-20 00:26:23,450 - INFO - app.services.service_manager - Service SetLabelService registered -2025-04-20 00:26:23,450 - INFO - app.services.service_manager - Service DataInitializationService registered -2025-04-20 00:26:23,450 - DEBUG - tzlocal - /etc/localtime found -2025-04-20 00:26:23,452 - DEBUG - tzlocal - 1 found: - {'/etc/localtime is a symlink to': 'America/Detroit'} -2025-04-20 00:26:23,452 - INFO - app.services.service_manager - Service SchedulerService registered -2025-04-20 00:26:23,452 - INFO - app.services.service_manager - Service FileService registered -2025-04-20 00:26:23,452 - INFO - app.services.service_manager - Service TCGCSVService registered -2025-04-20 00:26:23,452 - INFO - app.services.service_manager - Service MTGJSONService registered -2025-04-20 00:26:23,455 - INFO - app.services.service_manager - Service ManaboxService registered -2025-04-20 00:26:23,455 - INFO - app.services.service_manager - All services initialized successfully -2025-04-20 00:26:23,455 - INFO - app.services.data_initialization - Starting data initialization process -2025-04-20 00:26:23,456 - INFO - app.services.data_initialization - Data initialization completed -2025-04-20 00:26:23,456 - INFO - app.main - Data initialization results: {} -2025-04-20 00:26:23,456 - INFO - apscheduler.scheduler - Adding job tentatively -- it will be properly scheduled when the scheduler starts -2025-04-20 00:26:23,456 - INFO - app.services.scheduler.base_scheduler - Scheduled task update_open_orders_hourly to run every 3600 seconds -2025-04-20 00:26:23,456 - INFO - apscheduler.scheduler - Adding job tentatively -- it will be properly scheduled when the scheduler starts -2025-04-20 00:26:23,456 - INFO - app.services.scheduler.base_scheduler - Scheduled task update_all_orders_daily to run every 86400 seconds -2025-04-20 00:26:23,457 - INFO - apscheduler.scheduler - Added job "SchedulerService.start_scheduled_tasks.." to job store "default" -2025-04-20 00:26:23,457 - INFO - apscheduler.scheduler - Added job "SchedulerService.start_scheduled_tasks.." to job store "default" -2025-04-20 00:26:23,457 - INFO - apscheduler.scheduler - Scheduler started -2025-04-20 00:26:23,457 - INFO - app.services.scheduler.base_scheduler - Scheduler started -2025-04-20 00:26:23,457 - INFO - app.services.scheduler.scheduler_service - All scheduled tasks started -2025-04-20 00:26:23,457 - INFO - app.main - Scheduler started successfully -2025-04-20 00:26:23,457 - DEBUG - apscheduler.scheduler - Looking for jobs to run -2025-04-20 00:26:23,457 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-20 01:26:23.456315-04:00 (in 3599.998465 seconds) -2025-04-20 00:26:39,542 - DEBUG - python_multipart.multipart - Calling on_part_begin with no data -2025-04-20 00:26:39,543 - DEBUG - python_multipart.multipart - Calling on_header_field with data[63:82] -2025-04-20 00:26:39,543 - DEBUG - python_multipart.multipart - Calling on_header_value with data[84:126] -2025-04-20 00:26:39,543 - DEBUG - python_multipart.multipart - Calling on_header_end with no data -2025-04-20 00:26:39,543 - DEBUG - python_multipart.multipart - Calling on_header_field with data[128:140] -2025-04-20 00:26:39,543 - DEBUG - python_multipart.multipart - Calling on_header_value with data[142:150] -2025-04-20 00:26:39,544 - DEBUG - python_multipart.multipart - Calling on_header_end with no data -2025-04-20 00:26:39,544 - DEBUG - python_multipart.multipart - Calling on_headers_finished with no data -2025-04-20 00:26:39,544 - DEBUG - python_multipart.multipart - Calling on_part_data with data[154:13032] -2025-04-20 00:26:39,551 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:27512] -2025-04-20 00:26:39,561 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:46336] -2025-04-20 00:26:39,562 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:7240] -2025-04-20 00:26:39,577 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:50680] -2025-04-20 00:26:39,578 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:46336] -2025-04-20 00:26:39,597 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:47784] -2025-04-20 00:26:39,599 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:37704] -2025-04-20 00:26:39,603 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:55024] -2025-04-20 00:26:39,613 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:45109] -2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_part_end with no data -2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_part_begin with no data -2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_header_field with data[45174:45193] -2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_header_value with data[45195:45219] -2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_header_end with no data -2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_headers_finished with no data -2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_part_data with data[45223:45230] -2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_part_end with no data -2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_part_begin with no data -2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_header_field with data[45295:45314] -2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_header_value with data[45316:45338] -2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_header_end with no data -2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_headers_finished with no data -2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_part_data with data[45342:45358] -2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_part_end with no data -2025-04-20 00:26:39,616 - DEBUG - python_multipart.multipart - Calling on_end with no data -2025-04-20 00:26:48,984 - ERROR - app.services.manabox_service - Error: 2 TCGplayer SKUs found for Sword Coast Serpent // Capsizing Wave near_mint -2025-04-20 00:31:30,890 - DEBUG - python_multipart.multipart - Calling on_part_begin with no data -2025-04-20 00:31:30,891 - DEBUG - python_multipart.multipart - Calling on_header_field with data[63:82] -2025-04-20 00:31:30,892 - DEBUG - python_multipart.multipart - Calling on_header_value with data[84:126] -2025-04-20 00:31:30,892 - DEBUG - python_multipart.multipart - Calling on_header_end with no data -2025-04-20 00:31:30,892 - DEBUG - python_multipart.multipart - Calling on_header_field with data[128:140] -2025-04-20 00:31:30,892 - DEBUG - python_multipart.multipart - Calling on_header_value with data[142:150] -2025-04-20 00:31:30,892 - DEBUG - python_multipart.multipart - Calling on_header_end with no data -2025-04-20 00:31:30,892 - DEBUG - python_multipart.multipart - Calling on_headers_finished with no data -2025-04-20 00:31:30,893 - DEBUG - python_multipart.multipart - Calling on_part_data with data[154:13032] -2025-04-20 00:31:30,893 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:1448] -2025-04-20 00:31:30,904 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:28960] -2025-04-20 00:31:30,919 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:47784] -2025-04-20 00:31:30,920 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:8688] -2025-04-20 00:31:30,938 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:47784] -2025-04-20 00:31:30,939 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:50680] -2025-04-20 00:31:30,940 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:1448] -2025-04-20 00:31:30,962 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:4344] -2025-04-20 00:31:30,962 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:50680] -2025-04-20 00:31:30,963 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:60280] -2025-04-20 00:31:30,967 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:26064] -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:35565] -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_end with no data -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_begin with no data -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_header_field with data[35630:35649] -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_header_value with data[35651:35675] -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_header_end with no data -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_headers_finished with no data -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_data with data[35679:35686] -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_end with no data -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_begin with no data -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_header_field with data[35751:35770] -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_header_value with data[35772:35794] -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_header_end with no data -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_headers_finished with no data -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_data with data[35798:35814] -2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_end with no data -2025-04-20 00:31:30,980 - DEBUG - python_multipart.multipart - Calling on_end with no data -2025-04-20 00:31:40,209 - ERROR - app.services.manabox_service - Error: 2 TCGplayer SKUs found for Sword Coast Serpent // Capsizing Wave near_mint +2025-04-21 09:59:20,760 - INFO - app.main - Application starting up... +2025-04-21 09:59:20,850 - INFO - app.main - Database initialized successfully +2025-04-21 09:59:20,850 - INFO - app.services.service_manager - Service OrderManagementService registered +2025-04-21 09:59:20,850 - INFO - app.services.service_manager - Service TCGPlayerInventoryService registered +2025-04-21 09:59:20,850 - INFO - app.services.service_manager - Service LabelPrinterService registered +2025-04-21 09:59:20,850 - INFO - app.services.service_manager - Service RegularPrinterService registered +2025-04-21 09:59:20,853 - INFO - app.services.service_manager - Service AddressLabelService registered +2025-04-21 09:59:20,856 - INFO - app.services.service_manager - Service PullSheetService registered +2025-04-21 09:59:20,856 - INFO - app.services.service_manager - Service SetLabelService registered +2025-04-21 09:59:20,856 - INFO - app.services.service_manager - Service DataInitializationService registered +2025-04-21 09:59:20,856 - DEBUG - tzlocal - /etc/localtime found +2025-04-21 09:59:20,857 - DEBUG - tzlocal - 1 found: + {'/etc/localtime is a symlink to': 'US/Michigan'} +2025-04-21 09:59:20,857 - INFO - app.services.service_manager - Service SchedulerService registered +2025-04-21 09:59:20,857 - INFO - app.services.service_manager - Service FileService registered +2025-04-21 09:59:20,857 - INFO - app.services.service_manager - Service TCGCSVService registered +2025-04-21 09:59:20,857 - INFO - app.services.service_manager - Service MTGJSONService registered +2025-04-21 09:59:20,857 - INFO - app.services.service_manager - Service ManaboxService registered +2025-04-21 09:59:20,858 - INFO - app.services.service_manager - All services initialized successfully +2025-04-21 09:59:20,858 - INFO - app.services.data_initialization - Starting data initialization process +2025-04-21 09:59:20,858 - INFO - app.services.data_initialization - Data initialization completed +2025-04-21 09:59:20,858 - INFO - app.main - Data initialization results: {} +2025-04-21 09:59:20,858 - INFO - apscheduler.scheduler - Adding job tentatively -- it will be properly scheduled when the scheduler starts +2025-04-21 09:59:20,858 - INFO - app.services.scheduler.base_scheduler - Scheduled task update_open_orders_hourly to run every 3600 seconds +2025-04-21 09:59:20,858 - INFO - apscheduler.scheduler - Adding job tentatively -- it will be properly scheduled when the scheduler starts +2025-04-21 09:59:20,858 - INFO - app.services.scheduler.base_scheduler - Scheduled task update_all_orders_daily to run every 86400 seconds +2025-04-21 09:59:20,858 - INFO - apscheduler.scheduler - Added job "SchedulerService.start_scheduled_tasks.." to job store "default" +2025-04-21 09:59:20,858 - INFO - apscheduler.scheduler - Added job "SchedulerService.start_scheduled_tasks.." to job store "default" +2025-04-21 09:59:20,858 - INFO - apscheduler.scheduler - Scheduler started +2025-04-21 09:59:20,859 - INFO - app.services.scheduler.base_scheduler - Scheduler started +2025-04-21 09:59:20,859 - INFO - app.services.scheduler.scheduler_service - All scheduled tasks started +2025-04-21 09:59:20,859 - INFO - app.main - Scheduler started successfully +2025-04-21 09:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 09:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 10:59:20.858247-04:00 (in 3599.999006 seconds) +2025-04-21 09:59:37,683 - INFO - app.services.external_api.tcgplayer.order_management_service - Getting orders from 0 to 25 +2025-04-21 09:59:38,001 - INFO - app.services.external_api.base_external_service - Making request to https://order-management-api.tcgplayer.com/orders/search?api-version=2.0 +2025-04-21 09:59:38,002 - INFO - app.services.external_api.tcgplayer.order_management_service - Got 25 orders +2025-04-21 09:59:38,002 - INFO - app.services.external_api.tcgplayer.order_management_service - Getting orders from 25 to 50 +2025-04-21 09:59:38,161 - INFO - app.services.external_api.base_external_service - Making request to https://order-management-api.tcgplayer.com/orders/search?api-version=2.0 +2025-04-21 09:59:38,161 - INFO - app.services.external_api.tcgplayer.order_management_service - Got 25 orders +2025-04-21 09:59:38,161 - INFO - app.services.external_api.tcgplayer.order_management_service - Getting orders from 50 to 75 +2025-04-21 09:59:38,288 - INFO - app.services.external_api.base_external_service - Making request to https://order-management-api.tcgplayer.com/orders/search?api-version=2.0 +2025-04-21 09:59:38,288 - INFO - app.services.external_api.tcgplayer.order_management_service - Got 12 orders +2025-04-21 09:59:38,288 - INFO - app.services.external_api.tcgplayer.order_management_service - Getting orders from 75 to 100 +2025-04-21 09:59:38,407 - INFO - app.services.external_api.base_external_service - Making request to https://order-management-api.tcgplayer.com/orders/search?api-version=2.0 +2025-04-21 09:59:38,407 - INFO - app.services.external_api.tcgplayer.order_management_service - Got 0 orders +2025-04-21 09:59:52,350 - INFO - app.services.external_api.base_external_service - Making request to https://order-management-api.tcgplayer.com/orders/pull-sheets/export?api-version=2.0 +2025-04-21 09:59:52,807 - INFO - app.services.regular_printer_service - Print job 89 submitted to printer MFCL2750DW-3 +2025-04-21 10:01:46,714 - INFO - app.services.external_api.base_external_service - Making request to https://order-management-api.tcgplayer.com/orders/packing-slips/export?api-version=2.0 +2025-04-21 10:01:47,924 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/tcgplayer/packing_slips/pdf/packing_slip_2025-04-21_10-01-47.pdf to images +2025-04-21 10:01:49,264 - INFO - app.services.label_printer_service - Successfully converted PDF to 62 images +2025-04-21 10:01:49,264 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (1700, 2200) +2025-04-21 10:01:49,316 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:01:53,670 - INFO - app.services.label_printer_service - Processing page 2 with dimensions (1700, 2200) +2025-04-21 10:01:53,721 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:01:58,142 - INFO - app.services.label_printer_service - Processing page 3 with dimensions (1700, 2200) +2025-04-21 10:01:58,193 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:02:02,613 - INFO - app.services.label_printer_service - Processing page 4 with dimensions (1700, 2200) +2025-04-21 10:02:02,664 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:02:07,419 - INFO - app.services.label_printer_service - Processing page 5 with dimensions (1700, 2200) +2025-04-21 10:02:07,470 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:02:11,837 - INFO - app.services.label_printer_service - Processing page 6 with dimensions (1700, 2200) +2025-04-21 10:02:11,888 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:02:16,212 - INFO - app.services.label_printer_service - Processing page 7 with dimensions (1700, 2200) +2025-04-21 10:02:16,263 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:02:20,654 - INFO - app.services.label_printer_service - Processing page 8 with dimensions (1700, 2200) +2025-04-21 10:02:20,705 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:02:25,058 - INFO - app.services.label_printer_service - Processing page 9 with dimensions (1700, 2200) +2025-04-21 10:02:25,110 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:02:29,332 - INFO - app.services.label_printer_service - Processing page 10 with dimensions (1700, 2200) +2025-04-21 10:02:29,383 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:02:33,732 - INFO - app.services.label_printer_service - Processing page 11 with dimensions (1700, 2200) +2025-04-21 10:02:33,783 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:02:38,541 - INFO - app.services.label_printer_service - Processing page 12 with dimensions (1700, 2200) +2025-04-21 10:02:38,593 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:02:42,879 - INFO - app.services.label_printer_service - Processing page 13 with dimensions (1700, 2200) +2025-04-21 10:02:42,931 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:02:47,339 - INFO - app.services.label_printer_service - Processing page 14 with dimensions (1700, 2200) +2025-04-21 10:02:47,395 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:02:51,715 - INFO - app.services.label_printer_service - Processing page 15 with dimensions (1700, 2200) +2025-04-21 10:02:51,770 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:02:57,080 - INFO - app.services.label_printer_service - Processing page 16 with dimensions (1700, 2200) +2025-04-21 10:02:57,135 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:03:01,551 - INFO - app.services.label_printer_service - Processing page 17 with dimensions (1700, 2200) +2025-04-21 10:03:01,605 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:03:05,879 - INFO - app.services.label_printer_service - Processing page 18 with dimensions (1700, 2200) +2025-04-21 10:03:05,931 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:03:11,013 - INFO - app.services.label_printer_service - Processing page 19 with dimensions (1700, 2200) +2025-04-21 10:03:11,065 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:03:15,422 - INFO - app.services.label_printer_service - Processing page 20 with dimensions (1700, 2200) +2025-04-21 10:03:15,473 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:03:19,682 - INFO - app.services.label_printer_service - Processing page 21 with dimensions (1700, 2200) +2025-04-21 10:03:19,734 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:03:24,014 - INFO - app.services.label_printer_service - Processing page 22 with dimensions (1700, 2200) +2025-04-21 10:03:24,066 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:03:28,614 - INFO - app.services.label_printer_service - Processing page 23 with dimensions (1700, 2200) +2025-04-21 10:03:28,668 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:03:33,301 - INFO - app.services.label_printer_service - Processing page 24 with dimensions (1700, 2200) +2025-04-21 10:03:33,355 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:03:37,715 - INFO - app.services.label_printer_service - Processing page 25 with dimensions (1700, 2200) +2025-04-21 10:03:37,769 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:03:42,103 - INFO - app.services.label_printer_service - Processing page 26 with dimensions (1700, 2200) +2025-04-21 10:03:42,156 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:03:46,580 - INFO - app.services.label_printer_service - Processing page 27 with dimensions (1700, 2200) +2025-04-21 10:03:46,632 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:03:50,974 - INFO - app.services.label_printer_service - Processing page 28 with dimensions (1700, 2200) +2025-04-21 10:03:51,028 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:03:55,787 - INFO - app.services.label_printer_service - Processing page 29 with dimensions (1700, 2200) +2025-04-21 10:03:55,841 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:00,062 - INFO - app.services.label_printer_service - Processing page 30 with dimensions (1700, 2200) +2025-04-21 10:04:00,116 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:04,659 - INFO - app.services.label_printer_service - Processing page 31 with dimensions (1700, 2200) +2025-04-21 10:04:04,711 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:09,277 - INFO - app.services.label_printer_service - Processing page 32 with dimensions (1700, 2200) +2025-04-21 10:04:09,328 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:13,536 - INFO - app.services.label_printer_service - Processing page 33 with dimensions (1700, 2200) +2025-04-21 10:04:13,587 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:17,928 - INFO - app.services.label_printer_service - Processing page 34 with dimensions (1700, 2200) +2025-04-21 10:04:17,979 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:22,326 - INFO - app.services.label_printer_service - Processing page 35 with dimensions (1700, 2200) +2025-04-21 10:04:22,377 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:26,651 - INFO - app.services.label_printer_service - Processing page 36 with dimensions (1700, 2200) +2025-04-21 10:04:26,704 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:31,141 - INFO - app.services.label_printer_service - Processing page 37 with dimensions (1700, 2200) +2025-04-21 10:04:31,194 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:35,806 - INFO - app.services.label_printer_service - Processing page 38 with dimensions (1700, 2200) +2025-04-21 10:04:35,858 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:40,261 - INFO - app.services.label_printer_service - Processing page 39 with dimensions (1700, 2200) +2025-04-21 10:04:40,312 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:45,062 - INFO - app.services.label_printer_service - Processing page 40 with dimensions (1700, 2200) +2025-04-21 10:04:45,114 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:49,401 - INFO - app.services.label_printer_service - Processing page 41 with dimensions (1700, 2200) +2025-04-21 10:04:49,452 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:54,212 - INFO - app.services.label_printer_service - Processing page 42 with dimensions (1700, 2200) +2025-04-21 10:04:54,263 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:04:58,468 - INFO - app.services.label_printer_service - Processing page 43 with dimensions (1700, 2200) +2025-04-21 10:04:58,519 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:02,744 - INFO - app.services.label_printer_service - Processing page 44 with dimensions (1700, 2200) +2025-04-21 10:05:02,795 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:07,211 - INFO - app.services.label_printer_service - Processing page 45 with dimensions (1700, 2200) +2025-04-21 10:05:07,263 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:11,541 - INFO - app.services.label_printer_service - Processing page 46 with dimensions (1700, 2200) +2025-04-21 10:05:11,594 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:15,862 - INFO - app.services.label_printer_service - Processing page 47 with dimensions (1700, 2200) +2025-04-21 10:05:15,913 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:20,184 - INFO - app.services.label_printer_service - Processing page 48 with dimensions (1700, 2200) +2025-04-21 10:05:20,235 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:24,443 - INFO - app.services.label_printer_service - Processing page 49 with dimensions (1700, 2200) +2025-04-21 10:05:24,495 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:28,717 - INFO - app.services.label_printer_service - Processing page 50 with dimensions (1700, 2200) +2025-04-21 10:05:28,768 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:33,201 - INFO - app.services.label_printer_service - Processing page 51 with dimensions (1700, 2200) +2025-04-21 10:05:33,253 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:37,492 - INFO - app.services.label_printer_service - Processing page 52 with dimensions (1700, 2200) +2025-04-21 10:05:37,546 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:41,944 - INFO - app.services.label_printer_service - Processing page 53 with dimensions (1700, 2200) +2025-04-21 10:05:41,996 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:46,417 - INFO - app.services.label_printer_service - Processing page 54 with dimensions (1700, 2200) +2025-04-21 10:05:46,469 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:50,945 - INFO - app.services.label_printer_service - Processing page 55 with dimensions (1700, 2200) +2025-04-21 10:05:50,997 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:55,417 - INFO - app.services.label_printer_service - Processing page 56 with dimensions (1700, 2200) +2025-04-21 10:05:55,469 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:05:59,679 - INFO - app.services.label_printer_service - Processing page 57 with dimensions (1700, 2200) +2025-04-21 10:05:59,730 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:06:03,950 - INFO - app.services.label_printer_service - Processing page 58 with dimensions (1700, 2200) +2025-04-21 10:06:04,001 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:06:08,202 - INFO - app.services.label_printer_service - Processing page 59 with dimensions (1700, 2200) +2025-04-21 10:06:08,254 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:06:12,484 - INFO - app.services.label_printer_service - Processing page 60 with dimensions (1700, 2200) +2025-04-21 10:06:12,536 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:06:16,884 - INFO - app.services.label_printer_service - Processing page 61 with dimensions (1700, 2200) +2025-04-21 10:06:16,936 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:06:21,357 - INFO - app.services.label_printer_service - Processing page 62 with dimensions (1700, 2200) +2025-04-21 10:06:21,408 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660 +2025-04-21 10:07:18,973 - INFO - app.services.external_api.base_external_service - Making request to https://order-management-api.tcgplayer.com/orders/shipping/export?api-version=2.0 +2025-04-21 10:07:20,950 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-6F1231-ADE76_dk1201.pdf to images +2025-04-21 10:07:20,974 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:20,974 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:20,981 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:23,049 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-358ECF-2986A_dk1201.pdf to images +2025-04-21 10:07:23,071 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:23,071 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:23,079 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:25,153 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-F39E9D-77AA9_dk1201.pdf to images +2025-04-21 10:07:25,175 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:25,175 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:25,183 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:27,280 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-7B8F46-07CA9_dk1201.pdf to images +2025-04-21 10:07:27,303 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:27,303 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:27,310 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:29,381 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-CD283B-7CE75_dk1201.pdf to images +2025-04-21 10:07:29,403 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:29,403 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:29,410 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:31,497 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-44F0A8-7B0DD_dk1201.pdf to images +2025-04-21 10:07:31,519 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:31,519 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:31,526 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:33,606 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-CD9726-1E081_dk1201.pdf to images +2025-04-21 10:07:33,628 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:33,628 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:33,636 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:35,727 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-C22272-4A6C5_dk1201.pdf to images +2025-04-21 10:07:35,749 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:35,749 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:35,756 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:37,829 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-38C418-08A50_dk1201.pdf to images +2025-04-21 10:07:37,850 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:37,850 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:37,857 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:39,935 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-F3325F-D9394_dk1201.pdf to images +2025-04-21 10:07:39,957 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:39,957 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:39,965 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:42,051 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-4D4AD5-2DEE0_dk1201.pdf to images +2025-04-21 10:07:42,073 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:42,073 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:42,079 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:44,158 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-CEB8E6-40B9D_dk1201.pdf to images +2025-04-21 10:07:44,180 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:44,180 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:44,188 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:46,269 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-DAD794-951C5_dk1201.pdf to images +2025-04-21 10:07:46,291 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:46,291 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:46,298 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:48,370 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-D28F7F-8E174_dk1201.pdf to images +2025-04-21 10:07:48,392 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:48,392 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:48,399 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:50,485 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-AA1E8A-E1342_dk1201.pdf to images +2025-04-21 10:07:50,508 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:50,508 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:50,515 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:52,606 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-770C11-E0C58_dk1201.pdf to images +2025-04-21 10:07:52,628 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:52,628 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:52,635 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:54,726 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-19F0D1-B717B_dk1201.pdf to images +2025-04-21 10:07:54,748 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:54,748 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:54,756 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:56,839 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-F17D67-C2560_dk1201.pdf to images +2025-04-21 10:07:56,863 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:56,863 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:56,870 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:07:58,971 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-C93586-53AF2_dk1201.pdf to images +2025-04-21 10:07:58,993 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:07:58,993 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:07:59,000 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:01,087 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-547245-18EF0_dk1201.pdf to images +2025-04-21 10:08:01,109 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:01,109 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:01,116 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:03,209 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-13A615-F68B3_dk1201.pdf to images +2025-04-21 10:08:03,231 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:03,231 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:03,238 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:05,322 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-0CD238-E43A8_dk1201.pdf to images +2025-04-21 10:08:05,344 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:05,344 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:05,351 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:07,450 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-0328B4-A98B0_dk1201.pdf to images +2025-04-21 10:08:07,471 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:07,472 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:07,479 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:09,574 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-0273DA-63D47_dk1201.pdf to images +2025-04-21 10:08:09,596 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:09,596 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:09,604 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:11,687 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-E132ED-8C221_dk1201.pdf to images +2025-04-21 10:08:11,710 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:11,710 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:11,717 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:13,800 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-6E2D9E-E7D72_dk1201.pdf to images +2025-04-21 10:08:13,823 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:13,823 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:13,830 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:15,913 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-244ACE-9C069_dk1201.pdf to images +2025-04-21 10:08:15,934 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:15,934 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:15,941 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:18,024 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-785254-D88D6_dk1201.pdf to images +2025-04-21 10:08:18,046 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:18,046 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:18,053 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:20,148 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-EEA455-8B8BB_dk1201.pdf to images +2025-04-21 10:08:20,170 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:20,170 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:20,177 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:22,257 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-E4B3A9-CBAED_dk1201.pdf to images +2025-04-21 10:08:22,279 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:22,280 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:22,287 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:24,374 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-39E45B-C0C56_dk1201.pdf to images +2025-04-21 10:08:24,396 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:24,397 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:24,404 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:26,502 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-1FFFBD-79B3D_dk1201.pdf to images +2025-04-21 10:08:26,524 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:26,524 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:26,531 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:28,607 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-C772A7-BFC49_dk1201.pdf to images +2025-04-21 10:08:28,629 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:28,629 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:28,637 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:30,709 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-D47A2B-97139_dk1201.pdf to images +2025-04-21 10:08:30,730 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:30,730 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:30,738 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:32,811 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-88A2BD-4FCB9_dk1201.pdf to images +2025-04-21 10:08:32,833 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:32,833 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:32,840 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:34,929 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-AB2F4C-83B36_dk1201.pdf to images +2025-04-21 10:08:34,951 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:34,951 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:34,959 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:37,050 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-B4F7B5-802D2_dk1201.pdf to images +2025-04-21 10:08:37,073 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:37,073 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:37,081 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:39,161 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-6055D3-42114_dk1201.pdf to images +2025-04-21 10:08:39,183 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:39,183 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:39,190 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:41,272 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-A0A66C-FBD5F_dk1201.pdf to images +2025-04-21 10:08:41,295 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:41,295 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:41,302 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:43,378 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-F1B469-53DF3_dk1201.pdf to images +2025-04-21 10:08:43,400 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:43,400 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:43,407 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:45,490 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-3DA368-08CFF_dk1201.pdf to images +2025-04-21 10:08:45,513 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:45,513 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:45,520 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:47,592 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-D99596-344F5_dk1201.pdf to images +2025-04-21 10:08:47,613 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:47,613 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:47,620 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:49,689 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-E282C4-B8D1D_dk1201.pdf to images +2025-04-21 10:08:49,711 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:49,711 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:49,719 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:51,805 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-DFD7FD-BA3EC_dk1201.pdf to images +2025-04-21 10:08:51,827 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:51,827 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:51,834 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:53,913 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-3FF304-68071_dk1201.pdf to images +2025-04-21 10:08:53,936 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:53,936 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:53,944 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:56,020 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-1A3CF1-2F87F_dk1201.pdf to images +2025-04-21 10:08:56,042 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:56,042 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:56,049 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:08:58,128 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-832D39-2BAEA_dk1201.pdf to images +2025-04-21 10:08:58,150 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:08:58,150 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:08:58,157 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:00,228 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-6492E9-41E71_dk1201.pdf to images +2025-04-21 10:09:00,250 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:00,250 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:00,257 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:02,338 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-7ACEB7-8AE66_dk1201.pdf to images +2025-04-21 10:09:02,360 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:02,360 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:02,367 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:04,433 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-A296B1-1C076_dk1201.pdf to images +2025-04-21 10:09:04,455 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:04,455 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:04,462 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:06,544 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-FAD624-E6EE3_dk1201.pdf to images +2025-04-21 10:09:06,566 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:06,566 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:06,574 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:08,640 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-EF36EC-85A26_dk1201.pdf to images +2025-04-21 10:09:08,662 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:08,662 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:08,669 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:10,737 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-A2122B-9645A_dk1201.pdf to images +2025-04-21 10:09:10,759 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:10,759 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:10,766 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:12,842 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-BD7F27-6299D_dk1201.pdf to images +2025-04-21 10:09:12,864 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:12,864 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:12,871 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:14,954 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-56F6FE-ED13F_dk1201.pdf to images +2025-04-21 10:09:14,976 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:14,976 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:14,984 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:17,033 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-3EF05F-EE0E9_dk1201.pdf to images +2025-04-21 10:09:17,055 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:17,055 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:17,063 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:19,141 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-DC6D80-92997_dk1201.pdf to images +2025-04-21 10:09:19,164 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:19,164 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:19,172 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:21,250 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-4EB86C-31DAC_dk1201.pdf to images +2025-04-21 10:09:21,273 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:21,273 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:21,280 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:23,358 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-B846EE-C1DF4_dk1201.pdf to images +2025-04-21 10:09:23,381 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:23,381 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:23,388 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:25,469 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-070FA7-B1F6E_dk1201.pdf to images +2025-04-21 10:09:25,491 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:25,491 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:25,499 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:27,586 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-32D37E-B7AA0_dk1201.pdf to images +2025-04-21 10:09:27,609 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:27,609 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:27,616 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:09:29,689 - INFO - app.services.label_printer_service - Converting PDF app/data/cache/address_labels/E576ED4C-49A9B4-1F700_dk1201.pdf to images +2025-04-21 10:09:29,710 - INFO - app.services.label_printer_service - Successfully converted PDF to 1 images +2025-04-21 10:09:29,710 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (709, 229) +2025-04-21 10:09:29,718 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:10:08,365 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (991, 306) +2025-04-21 10:10:08,372 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 10:10:08,374 - INFO - app.services.label_printer_service - Printing copy 1 of 60 +2025-04-21 10:10:10,451 - INFO - app.services.label_printer_service - Printing copy 2 of 60 +2025-04-21 10:10:12,541 - INFO - app.services.label_printer_service - Printing copy 3 of 60 +2025-04-21 10:10:14,616 - INFO - app.services.label_printer_service - Printing copy 4 of 60 +2025-04-21 10:10:16,700 - INFO - app.services.label_printer_service - Printing copy 5 of 60 +2025-04-21 10:10:18,787 - INFO - app.services.label_printer_service - Printing copy 6 of 60 +2025-04-21 10:10:20,856 - INFO - app.services.label_printer_service - Printing copy 7 of 60 +2025-04-21 10:10:22,928 - INFO - app.services.label_printer_service - Printing copy 8 of 60 +2025-04-21 10:10:25,020 - INFO - app.services.label_printer_service - Printing copy 9 of 60 +2025-04-21 10:10:27,113 - INFO - app.services.label_printer_service - Printing copy 10 of 60 +2025-04-21 10:10:29,200 - INFO - app.services.label_printer_service - Printing copy 11 of 60 +2025-04-21 10:10:31,271 - INFO - app.services.label_printer_service - Printing copy 12 of 60 +2025-04-21 10:10:33,335 - INFO - app.services.label_printer_service - Printing copy 13 of 60 +2025-04-21 10:10:35,438 - INFO - app.services.label_printer_service - Printing copy 14 of 60 +2025-04-21 10:10:37,529 - INFO - app.services.label_printer_service - Printing copy 15 of 60 +2025-04-21 10:10:39,602 - INFO - app.services.label_printer_service - Printing copy 16 of 60 +2025-04-21 10:10:41,685 - INFO - app.services.label_printer_service - Printing copy 17 of 60 +2025-04-21 10:10:43,768 - INFO - app.services.label_printer_service - Printing copy 18 of 60 +2025-04-21 10:10:45,851 - INFO - app.services.label_printer_service - Printing copy 19 of 60 +2025-04-21 10:10:47,917 - INFO - app.services.label_printer_service - Printing copy 20 of 60 +2025-04-21 10:10:50,008 - INFO - app.services.label_printer_service - Printing copy 21 of 60 +2025-04-21 10:10:52,107 - INFO - app.services.label_printer_service - Printing copy 22 of 60 +2025-04-21 10:10:54,184 - INFO - app.services.label_printer_service - Printing copy 23 of 60 +2025-04-21 10:10:56,260 - INFO - app.services.label_printer_service - Printing copy 24 of 60 +2025-04-21 10:10:58,344 - INFO - app.services.label_printer_service - Printing copy 25 of 60 +2025-04-21 10:11:00,428 - INFO - app.services.label_printer_service - Printing copy 26 of 60 +2025-04-21 10:11:02,521 - INFO - app.services.label_printer_service - Printing copy 27 of 60 +2025-04-21 10:11:04,596 - INFO - app.services.label_printer_service - Printing copy 28 of 60 +2025-04-21 10:11:06,666 - INFO - app.services.label_printer_service - Printing copy 29 of 60 +2025-04-21 10:11:08,747 - INFO - app.services.label_printer_service - Printing copy 30 of 60 +2025-04-21 10:11:10,806 - INFO - app.services.label_printer_service - Printing copy 31 of 60 +2025-04-21 10:11:12,898 - INFO - app.services.label_printer_service - Printing copy 32 of 60 +2025-04-21 10:11:14,965 - INFO - app.services.label_printer_service - Printing copy 33 of 60 +2025-04-21 10:11:17,043 - INFO - app.services.label_printer_service - Printing copy 34 of 60 +2025-04-21 10:11:19,112 - INFO - app.services.label_printer_service - Printing copy 35 of 60 +2025-04-21 10:11:21,194 - INFO - app.services.label_printer_service - Printing copy 36 of 60 +2025-04-21 10:11:23,260 - INFO - app.services.label_printer_service - Printing copy 37 of 60 +2025-04-21 10:11:25,348 - INFO - app.services.label_printer_service - Printing copy 38 of 60 +2025-04-21 10:11:27,432 - INFO - app.services.label_printer_service - Printing copy 39 of 60 +2025-04-21 10:11:29,529 - INFO - app.services.label_printer_service - Printing copy 40 of 60 +2025-04-21 10:11:31,622 - INFO - app.services.label_printer_service - Printing copy 41 of 60 +2025-04-21 10:11:33,694 - INFO - app.services.label_printer_service - Printing copy 42 of 60 +2025-04-21 10:11:35,771 - INFO - app.services.label_printer_service - Printing copy 43 of 60 +2025-04-21 10:11:37,860 - INFO - app.services.label_printer_service - Printing copy 44 of 60 +2025-04-21 10:11:39,938 - INFO - app.services.label_printer_service - Printing copy 45 of 60 +2025-04-21 10:11:42,027 - INFO - app.services.label_printer_service - Printing copy 46 of 60 +2025-04-21 10:11:44,108 - INFO - app.services.label_printer_service - Printing copy 47 of 60 +2025-04-21 10:11:46,202 - INFO - app.services.label_printer_service - Printing copy 48 of 60 +2025-04-21 10:11:48,272 - INFO - app.services.label_printer_service - Printing copy 49 of 60 +2025-04-21 10:11:50,355 - INFO - app.services.label_printer_service - Printing copy 50 of 60 +2025-04-21 10:11:52,445 - INFO - app.services.label_printer_service - Printing copy 51 of 60 +2025-04-21 10:11:54,524 - INFO - app.services.label_printer_service - Printing copy 52 of 60 +2025-04-21 10:11:56,611 - INFO - app.services.label_printer_service - Printing copy 53 of 60 +2025-04-21 10:11:58,700 - INFO - app.services.label_printer_service - Printing copy 54 of 60 +2025-04-21 10:12:00,771 - INFO - app.services.label_printer_service - Printing copy 55 of 60 +2025-04-21 10:12:02,854 - INFO - app.services.label_printer_service - Printing copy 56 of 60 +2025-04-21 10:12:04,943 - INFO - app.services.label_printer_service - Printing copy 57 of 60 +2025-04-21 10:12:07,018 - INFO - app.services.label_printer_service - Printing copy 58 of 60 +2025-04-21 10:12:09,099 - INFO - app.services.label_printer_service - Printing copy 59 of 60 +2025-04-21 10:12:11,174 - INFO - app.services.label_printer_service - Printing copy 60 of 60 +2025-04-21 10:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 10:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 11:59:20.858247-04:00 (in 3599.998642 seconds) +2025-04-21 10:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 11:59:20 EDT)" (scheduled at 2025-04-21 10:59:20.858247-04:00) +2025-04-21 10:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 11:59:20 EDT)" executed successfully +2025-04-21 11:12:11,257 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (991, 306) +2025-04-21 11:12:11,264 - DEBUG - brother_ql.raster - raster_image_size: 1296x991 +2025-04-21 11:12:11,266 - INFO - app.services.label_printer_service - Printing copy 1 of 7 +2025-04-21 11:12:13,360 - INFO - app.services.label_printer_service - Printing copy 2 of 7 +2025-04-21 11:12:15,439 - INFO - app.services.label_printer_service - Printing copy 3 of 7 +2025-04-21 11:12:17,517 - INFO - app.services.label_printer_service - Printing copy 4 of 7 +2025-04-21 11:12:19,613 - INFO - app.services.label_printer_service - Printing copy 5 of 7 +2025-04-21 11:12:21,685 - INFO - app.services.label_printer_service - Printing copy 6 of 7 +2025-04-21 11:12:23,789 - INFO - app.services.label_printer_service - Printing copy 7 of 7 +2025-04-21 11:59:20,858 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 11:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 12:59:20.858247-04:00 (in 3599.999046 seconds) +2025-04-21 11:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 12:59:20 EDT)" (scheduled at 2025-04-21 11:59:20.858247-04:00) +2025-04-21 11:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 12:59:20 EDT)" executed successfully +2025-04-21 12:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 12:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 13:59:20.858247-04:00 (in 3599.998740 seconds) +2025-04-21 12:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 13:59:20 EDT)" (scheduled at 2025-04-21 12:59:20.858247-04:00) +2025-04-21 12:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 13:59:20 EDT)" executed successfully +2025-04-21 13:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 13:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 14:59:20.858247-04:00 (in 3599.998917 seconds) +2025-04-21 13:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 14:59:20 EDT)" (scheduled at 2025-04-21 13:59:20.858247-04:00) +2025-04-21 13:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 14:59:20 EDT)" executed successfully +2025-04-21 14:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 14:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 15:59:20.858247-04:00 (in 3599.998838 seconds) +2025-04-21 14:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 15:59:20 EDT)" (scheduled at 2025-04-21 14:59:20.858247-04:00) +2025-04-21 14:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 15:59:20 EDT)" executed successfully +2025-04-21 15:59:20,858 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 15:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 16:59:20.858247-04:00 (in 3599.999242 seconds) +2025-04-21 15:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 16:59:20 EDT)" (scheduled at 2025-04-21 15:59:20.858247-04:00) +2025-04-21 15:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 16:59:20 EDT)" executed successfully +2025-04-21 16:59:20,858 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 16:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 17:59:20.858247-04:00 (in 3599.999116 seconds) +2025-04-21 16:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 17:59:20 EDT)" (scheduled at 2025-04-21 16:59:20.858247-04:00) +2025-04-21 16:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 17:59:20 EDT)" executed successfully +2025-04-21 17:59:20,858 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 17:59:20,858 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 18:59:20.858247-04:00 (in 3599.999538 seconds) +2025-04-21 17:59:20,858 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 18:59:20 EDT)" (scheduled at 2025-04-21 17:59:20.858247-04:00) +2025-04-21 17:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 18:59:20 EDT)" executed successfully +2025-04-21 18:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 18:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 19:59:20.858247-04:00 (in 3599.998514 seconds) +2025-04-21 18:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 19:59:20 EDT)" (scheduled at 2025-04-21 18:59:20.858247-04:00) +2025-04-21 18:59:20,860 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 19:59:20 EDT)" executed successfully +2025-04-21 19:59:20,860 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 19:59:20,860 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 20:59:20.858247-04:00 (in 3599.997455 seconds) +2025-04-21 19:59:20,860 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 20:59:20 EDT)" (scheduled at 2025-04-21 19:59:20.858247-04:00) +2025-04-21 19:59:20,861 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 20:59:20 EDT)" executed successfully +2025-04-21 20:59:20,858 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 20:59:20,858 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 21:59:20.858247-04:00 (in 3599.999359 seconds) +2025-04-21 20:59:20,858 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 21:59:20 EDT)" (scheduled at 2025-04-21 20:59:20.858247-04:00) +2025-04-21 20:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 21:59:20 EDT)" executed successfully +2025-04-21 21:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 21:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 22:59:20.858247-04:00 (in 3599.998706 seconds) +2025-04-21 21:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 22:59:20 EDT)" (scheduled at 2025-04-21 21:59:20.858247-04:00) +2025-04-21 21:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 22:59:20 EDT)" executed successfully +2025-04-21 22:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 22:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-21 23:59:20.858247-04:00 (in 3599.998602 seconds) +2025-04-21 22:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 23:59:20 EDT)" (scheduled at 2025-04-21 22:59:20.858247-04:00) +2025-04-21 22:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-21 23:59:20 EDT)" executed successfully +2025-04-21 23:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-21 23:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 00:59:20.858247-04:00 (in 3599.998614 seconds) +2025-04-21 23:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 00:59:20 EDT)" (scheduled at 2025-04-21 23:59:20.858247-04:00) +2025-04-21 23:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 00:59:20 EDT)" executed successfully +2025-04-22 00:59:20,858 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 00:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 01:59:20.858247-04:00 (in 3599.999076 seconds) +2025-04-22 00:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 01:59:20 EDT)" (scheduled at 2025-04-22 00:59:20.858247-04:00) +2025-04-22 00:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 01:59:20 EDT)" executed successfully +2025-04-22 01:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 01:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 02:59:20.858247-04:00 (in 3599.998786 seconds) +2025-04-22 01:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 02:59:20 EDT)" (scheduled at 2025-04-22 01:59:20.858247-04:00) +2025-04-22 01:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 02:59:20 EDT)" executed successfully +2025-04-22 02:59:20,858 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 02:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 03:59:20.858247-04:00 (in 3599.999183 seconds) +2025-04-22 02:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 03:59:20 EDT)" (scheduled at 2025-04-22 02:59:20.858247-04:00) +2025-04-22 02:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 03:59:20 EDT)" executed successfully +2025-04-22 03:59:20,858 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 03:59:20,858 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 04:59:20.858247-04:00 (in 3599.999551 seconds) +2025-04-22 03:59:20,858 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 04:59:20 EDT)" (scheduled at 2025-04-22 03:59:20.858247-04:00) +2025-04-22 03:59:20,858 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 04:59:20 EDT)" executed successfully +2025-04-22 04:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 04:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 05:59:20.858247-04:00 (in 3599.998865 seconds) +2025-04-22 04:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 05:59:20 EDT)" (scheduled at 2025-04-22 04:59:20.858247-04:00) +2025-04-22 04:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 05:59:20 EDT)" executed successfully +2025-04-22 05:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 05:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 06:59:20.858247-04:00 (in 3599.998706 seconds) +2025-04-22 05:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 06:59:20 EDT)" (scheduled at 2025-04-22 05:59:20.858247-04:00) +2025-04-22 05:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 06:59:20 EDT)" executed successfully +2025-04-22 06:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 06:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 07:59:20.858247-04:00 (in 3599.998912 seconds) +2025-04-22 06:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 07:59:20 EDT)" (scheduled at 2025-04-22 06:59:20.858247-04:00) +2025-04-22 06:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 07:59:20 EDT)" executed successfully +2025-04-22 07:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 07:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 08:59:20.858247-04:00 (in 3599.998698 seconds) +2025-04-22 07:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 08:59:20 EDT)" (scheduled at 2025-04-22 07:59:20.858247-04:00) +2025-04-22 07:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 08:59:20 EDT)" executed successfully +2025-04-22 08:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 08:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 09:59:20.858247-04:00 (in 3599.998928 seconds) +2025-04-22 08:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 09:59:20 EDT)" (scheduled at 2025-04-22 08:59:20.858247-04:00) +2025-04-22 08:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 09:59:20 EDT)" executed successfully +2025-04-22 09:59:20,858 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 09:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1 day, 0:00:00], next run at: 2025-04-23 09:59:20 EDT)" (scheduled at 2025-04-22 09:59:20.858411-04:00) +2025-04-22 09:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 10:59:20 EDT)" (scheduled at 2025-04-22 09:59:20.858247-04:00) +2025-04-22 09:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 10:59:20.858247-04:00 (in 3599.998580 seconds) +2025-04-22 09:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1 day, 0:00:00], next run at: 2025-04-23 09:59:20 EDT)" executed successfully +2025-04-22 09:59:20,860 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 10:59:20 EDT)" executed successfully +2025-04-22 10:59:20,860 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 10:59:20,860 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 11:59:20.858247-04:00 (in 3599.997317 seconds) +2025-04-22 10:59:20,861 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 11:59:20 EDT)" (scheduled at 2025-04-22 10:59:20.858247-04:00) +2025-04-22 10:59:20,861 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 11:59:20 EDT)" executed successfully +2025-04-22 11:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 11:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 12:59:20.858247-04:00 (in 3599.999005 seconds) +2025-04-22 11:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 12:59:20 EDT)" (scheduled at 2025-04-22 11:59:20.858247-04:00) +2025-04-22 11:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 12:59:20 EDT)" executed successfully +2025-04-22 12:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 12:59:20,860 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 13:59:20.858247-04:00 (in 3599.998091 seconds) +2025-04-22 12:59:20,860 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 13:59:20 EDT)" (scheduled at 2025-04-22 12:59:20.858247-04:00) +2025-04-22 12:59:20,860 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 13:59:20 EDT)" executed successfully +2025-04-22 13:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 13:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 14:59:20.858247-04:00 (in 3599.998867 seconds) +2025-04-22 13:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 14:59:20 EDT)" (scheduled at 2025-04-22 13:59:20.858247-04:00) +2025-04-22 13:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 14:59:20 EDT)" executed successfully +2025-04-22 14:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 14:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 15:59:20.858247-04:00 (in 3599.998772 seconds) +2025-04-22 14:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 15:59:20 EDT)" (scheduled at 2025-04-22 14:59:20.858247-04:00) +2025-04-22 14:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 15:59:20 EDT)" executed successfully +2025-04-22 15:59:20,859 - DEBUG - apscheduler.scheduler - Looking for jobs to run +2025-04-22 15:59:20,859 - DEBUG - apscheduler.scheduler - Next wakeup is due at 2025-04-22 16:59:20.858247-04:00 (in 3599.998618 seconds) +2025-04-22 15:59:20,859 - INFO - apscheduler.executors.default - Running job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 16:59:20 EDT)" (scheduled at 2025-04-22 15:59:20.858247-04:00) +2025-04-22 15:59:20,859 - INFO - apscheduler.executors.default - Job "SchedulerService.start_scheduled_tasks.. (trigger: interval[1:00:00], next run at: 2025-04-22 16:59:20 EDT)" executed successfully diff --git a/app/contexts/inventory_item.py b/app/contexts/inventory_item.py new file mode 100644 index 0000000..ceedc9b --- /dev/null +++ b/app/contexts/inventory_item.py @@ -0,0 +1,81 @@ +from app.services.base_service import BaseService +from app.models.inventory_management import InventoryItem +from app.models.tcgplayer_product import TCGPlayerProduct +from app.contexts.inventory_product import InventoryProductContext +from sqlalchemy.orm import Session +from datetime import datetime + + +class InventoryItemContext: + def __init__(self, item: InventoryItem, db: Session): + self.item = item + self.physical_item = item.physical_item + self.marketplace_listing = item.marketplace_listing + self.parent = item.parent + self.children = item.children + self.product = item.physical_item.product + self.db = db + + @property + def cost_basis(self) -> float: + return self.item.cost_basis + + @property + def product_id(self) -> int: + return self.physical_item.product_id + + @property + def product_name(self) -> str: + return self.physical_item.product_name + + @property + def item_type(self) -> str: + return self.physical_item.item_type + + @property + def market_price(self) -> float: + return self.product.most_recent_tcgplayer_price.market_price + + @property + def tcg_low_price(self) -> float: + return self.product.most_recent_tcgplayer_price.low_price + + @property + def listed_price(self) -> float: + return self.marketplace_listing.listed_price + + def top_level_parent(self) -> "InventoryItemContext": + if self.parent: + return self.parent.top_level_parent() + else: + return self + + def box_expected_value(self) -> float: + top_level_parent_item = self.top_level_parent_item() + if 'case' in top_level_parent_item.item_type: + return top_level_parent_item.open_event.sealed_case.expected_value + elif 'box' in top_level_parent_item.item_type: + return top_level_parent_item.open_event.sealed_box.expected_value + else: + raise ValueError("Unknown top level parent item type") + + def box_acquisition_cost(self) -> float: + if self.physical_item.transaction_item: + return self.physical_item.transaction_item.unit_price + elif self.parent: + return self.parent.box_acquisition_cost() + else: + raise ValueError("Cannot find transaction unit price for this item") + + def age_on_marketplace(self) -> int: + return (datetime.now() - self.marketplace_listing.listing_date).days + +class InventoryItemContextFactory: + def __init__(self, db: Session): + self.db = db + + def get_context(self, item: InventoryItem) -> InventoryItemContext: + return InventoryItemContext(item, self.db) + + def get_context_for_product(self, product: TCGPlayerProduct) -> InventoryProductContext: + return InventoryProductContext(product, self.db) diff --git a/app/contexts/inventory_product.py b/app/contexts/inventory_product.py new file mode 100644 index 0000000..af81ab0 --- /dev/null +++ b/app/contexts/inventory_product.py @@ -0,0 +1,28 @@ +from app.models.tcgplayer_product import TCGPlayerProduct +from sqlalchemy.orm import Session + +class InventoryProductContext: + def __init__(self, product: TCGPlayerProduct, db: Session): + self.product = product + self.prices = product.most_recent_tcgplayer_price + self.db = db + + @property + def market_price(self) -> float: + return self.product.most_recent_tcgplayer_price.market_price + + @property + def low_price(self) -> float: + return self.product.most_recent_tcgplayer_price.low_price + + @property + def name(self) -> str: + return self.product.name + + @property + def image_url(self) -> str: + return self.product.image_url + + @property + def id(self) -> int: + return self.product.id \ No newline at end of file diff --git a/app/models/inventory_management.py b/app/models/inventory_management.py index bf01060..8b46a92 100644 --- a/app/models/inventory_management.py +++ b/app/models/inventory_management.py @@ -1,13 +1,15 @@ from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey from sqlalchemy.orm import relationship from app.db.database import Base +from sqlalchemy import event +from sqlalchemy.orm import Session class PhysicalItem(Base): __tablename__ = "physical_items" id = Column(Integer, primary_key=True) item_type = Column(String) - product_id = Column(Integer, ForeignKey("products.id"), nullable=False) + product_id = Column(Integer, ForeignKey("tcgplayer_products.id"), nullable=False) created_at = Column(DateTime(timezone=True)) updated_at = Column(DateTime(timezone=True)) deleted_at = Column(DateTime(timezone=True), nullable=True) @@ -18,15 +20,17 @@ class PhysicalItem(Base): } # Relationships - product = relationship("Product") + product = relationship("TCGPlayerProduct") inventory_item = relationship("InventoryItem", uselist=False, back_populates="physical_item") - transaction_items = relationship("TransactionItem", back_populates="physical_item") + transaction_item = relationship("TransactionItem", back_populates="physical_item") class SealedCase(PhysicalItem): __tablename__ = "sealed_cases" id = Column(Integer, ForeignKey('physical_items.id'), primary_key=True) - + expected_value = Column(Float) + num_boxes = Column(Integer) + __mapper_args__ = { 'polymorphic_identity': 'sealed_case' } @@ -40,6 +44,7 @@ class SealedBox(PhysicalItem): id = Column(Integer, ForeignKey('physical_items.id'), primary_key=True) case_id = Column(Integer, ForeignKey("sealed_cases.id"), nullable=True) + expected_value = Column(Float) __mapper_args__ = { 'polymorphic_identity': 'sealed_box' @@ -49,6 +54,27 @@ class SealedBox(PhysicalItem): case = relationship("SealedCase", back_populates="boxes", foreign_keys=[case_id]) open_event = relationship("OpenEvent", uselist=False, back_populates="sealed_box") +# event listeners +@event.listens_for(SealedCase, 'before_insert') +def set_expected_value(mapper, connection, target): + session = Session.object_session(target) + if session: + expected_value = session.query(SealedExpectedValue).filter(SealedExpectedValue.product_id == target.product_id).filter(SealedExpectedValue.deleted_at == None).order_by(SealedExpectedValue.created_at.desc()).first() + if expected_value: + target.expected_value = expected_value.expected_value + else: + raise ValueError("No expected value found for this product") + +@event.listens_for(SealedBox, 'before_insert') +def set_expected_value(mapper, connection, target): + session = Session.object_session(target) + if session: + expected_value = session.query(SealedExpectedValue).filter(SealedExpectedValue.product_id == target.product_id).filter(SealedExpectedValue.deleted_at == None).order_by(SealedExpectedValue.created_at.desc()).first() + if expected_value: + target.expected_value = expected_value.expected_value + else: + raise ValueError("No expected value found for this product") + class OpenBox(PhysicalItem): __tablename__ = "open_boxes" @@ -95,6 +121,7 @@ class InventoryItem(Base): physical_item = relationship("PhysicalItem", back_populates="inventory_item") parent = relationship("InventoryItem", remote_side=[id], back_populates="children") children = relationship("InventoryItem", back_populates="parent", overlaps="parent") + marketplace_listing = relationship("MarketplaceListing", back_populates="inventory_item") class TransactionItem(Base): __tablename__ = "transaction_items" @@ -151,6 +178,7 @@ class Transaction(Base): id = Column(Integer, primary_key=True, index=True) vendor_id = Column(Integer, ForeignKey("vendors.id"), nullable=True) customer_id = Column(Integer, ForeignKey("customers.id"), nullable=True) + marketplace_id = Column(Integer, ForeignKey("marketplaces.id"), nullable=True) transaction_type = Column(String) # 'purchase' or 'sale' transaction_date = Column(DateTime(timezone=True)) transaction_total_amount = Column(Float) @@ -160,4 +188,61 @@ class Transaction(Base): deleted_at = Column(DateTime(timezone=True), nullable=True) # Relationships - transaction_items = relationship("TransactionItem", back_populates="transaction") \ No newline at end of file + transaction_items = relationship("TransactionItem", back_populates="transaction") + +class SealedExpectedValue(Base): + __tablename__ = "sealed_expected_values" + + id = Column(Integer, primary_key=True, index=True) + product_id = Column(Integer, ForeignKey("tcgplayer_products.id"), nullable=True) + expected_value = Column(Float) + created_at = Column(DateTime(timezone=True)) + updated_at = Column(DateTime(timezone=True)) + deleted_at = Column(DateTime(timezone=True), nullable=True) + +class MostRecentTCGPlayerPrice(Base): + __tablename__ = "most_recent_tcgplayer_price" + __table_args__ = {'extend_existing': True, 'autoload_with': None, 'info': {'is_view': True}} + + id = Column(Integer, primary_key=True, index=True) + product_id = Column(Integer, ForeignKey("tcgplayer_products.id")) + date = Column(DateTime) + low_price = Column(Float) + mid_price = Column(Float) + high_price = Column(Float) + market_price = Column(Float) + direct_low_price = Column(Float) + sub_type_name = Column(String) + created_at = Column(DateTime(timezone=True)) + updated_at = Column(DateTime(timezone=True)) + + # Relationships + product = relationship("TCGPlayerProduct", back_populates="most_recent_tcgplayer_price") + +class Marketplace(Base): + __tablename__ = "marketplaces" + + id = Column(Integer, primary_key=True, index=True) + name = Column(String, unique=True, index=True) + created_at = Column(DateTime(timezone=True)) + updated_at = Column(DateTime(timezone=True)) + listings = relationship("MarketplaceListing", back_populates="marketplace") + +class MarketplaceListing(Base): + __tablename__ = "marketplace_listings" + + id = Column(Integer, primary_key=True, index=True) + inventory_item_id = Column(Integer, ForeignKey("inventory_items.id"), nullable=False) + marketplace_id = Column(Integer, ForeignKey("marketplaces.id"), nullable=False) + product_id = Column(Integer, ForeignKey("tcgplayer_products.id"), nullable=False) + listing_date = Column(DateTime(timezone=True)) + delisting_date = Column(DateTime(timezone=True), nullable=True) + listed_price = Column(Float) + created_at = Column(DateTime(timezone=True)) + updated_at = Column(DateTime(timezone=True)) + deleted_at = Column(DateTime(timezone=True), nullable=True) + + # Relationships + inventory_item = relationship("InventoryItem", back_populates="marketplace_listings") + marketplace = relationship("Marketplace", back_populates="listings") + product = relationship("TCGPlayerProduct", back_populates="marketplace_listings") \ No newline at end of file diff --git a/app/models/tcgplayer_product.py b/app/models/tcgplayer_product.py index e66bc42..ae9f609 100644 --- a/app/models/tcgplayer_product.py +++ b/app/models/tcgplayer_product.py @@ -1,5 +1,6 @@ from sqlalchemy import Column, Integer, String, Float, DateTime from sqlalchemy.sql import func +from sqlalchemy.orm import relationship from app.db.database import Base class TCGPlayerProduct(Base): @@ -30,4 +31,8 @@ class TCGPlayerProduct(Base): ext_flavor_text = Column(String) created_at = Column(DateTime(timezone=True), server_default=func.now()) - updated_at = Column(DateTime(timezone=True), onupdate=func.now()) \ No newline at end of file + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) + + most_recent_tcgplayer_price = relationship("MostRecentTCGPlayerPrice", back_populates="product") + marketplace_listings = relationship("MarketplaceListing", back_populates="product") + inventory_items = relationship("InventoryItem", back_populates="product") \ No newline at end of file diff --git a/app/services/scheduler/base_scheduler.py b/app/services/scheduler/base_scheduler.py index a8958f2..f4ea920 100644 --- a/app/services/scheduler/base_scheduler.py +++ b/app/services/scheduler/base_scheduler.py @@ -1,6 +1,7 @@ from typing import Callable, Dict, Any from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.interval import IntervalTrigger +from apscheduler.triggers.cron import CronTrigger import logging from apscheduler.schedulers.base import SchedulerNotRunningError @@ -16,18 +17,38 @@ class BaseScheduler: self, task_name: str, func: Callable, - interval_seconds: int, + interval_seconds: int = None, + cron_expression: str = None, *args, **kwargs ) -> None: - """Schedule a task to run at regular intervals using APScheduler""" + """Schedule a task to run at regular intervals or at specific times using APScheduler + + Args: + task_name: Name of the task + func: Function to execute + interval_seconds: Interval in seconds for periodic execution (mutually exclusive with cron_expression) + cron_expression: Cron expression for time-based scheduling (mutually exclusive with interval_seconds) + *args: Additional positional arguments for the function + **kwargs: Additional keyword arguments for the function + """ if task_name in self.jobs: logger.warning(f"Task {task_name} already exists. Removing existing job.") self.jobs[task_name].remove() + if interval_seconds and cron_expression: + raise ValueError("Cannot specify both interval_seconds and cron_expression") + elif not interval_seconds and not cron_expression: + raise ValueError("Must specify either interval_seconds or cron_expression") + + if interval_seconds: + trigger = IntervalTrigger(seconds=interval_seconds) + else: + trigger = CronTrigger.from_crontab(cron_expression) + job = self.scheduler.add_job( func, - trigger=IntervalTrigger(seconds=interval_seconds), + trigger=trigger, args=args, kwargs=kwargs, id=task_name, @@ -35,7 +56,10 @@ class BaseScheduler: ) self.jobs[task_name] = job - logger.info(f"Scheduled task {task_name} to run every {interval_seconds} seconds") + if interval_seconds: + logger.info(f"Scheduled task {task_name} to run every {interval_seconds} seconds") + else: + logger.info(f"Scheduled task {task_name} with cron expression: {cron_expression}") def remove_task(self, task_name: str) -> None: """Remove a scheduled task""" diff --git a/app/services/scheduler/scheduler_service.py b/app/services/scheduler/scheduler_service.py index fc0b569..1c01215 100644 --- a/app/services/scheduler/scheduler_service.py +++ b/app/services/scheduler/scheduler_service.py @@ -1,21 +1,25 @@ from app.db.database import transaction from app.services.scheduler.base_scheduler import BaseScheduler +from app.services.base_service import BaseService +from sqlalchemy import text import logging logger = logging.getLogger(__name__) -class SchedulerService: +class SchedulerService(BaseService): def __init__(self): + # Initialize BaseService with None as model since this service doesn't have a specific model + super().__init__(None) self.scheduler = BaseScheduler() - # Service manager will be set during initialization - self._service_manager = None - @property - def service_manager(self): - if self._service_manager is None: - from app.services.service_manager import ServiceManager - self._service_manager = ServiceManager() - return self._service_manager + async def update_tcgplayer_price_history_daily(self, db): + """ + Update the TCGPlayer price history table + """ + with transaction(db): + await db.execute(text("""REFRESH MATERIALIZED VIEW CONCURRENTLY most_recent_tcgplayer_price;""")) + logger.info("TCGPlayer price history refreshed") + async def update_open_orders_hourly(self, db): """ @@ -67,13 +71,19 @@ class SchedulerService: await self.scheduler.schedule_task( task_name="update_open_orders_hourly", func=lambda: self.update_open_orders_hourly(db), - interval_seconds=60 * 60, # 1 hour + cron_expression="0 * * * *" # Run at minute 0 of every hour ) - # Schedule all orders update to run daily at 1 AM + # Schedule all orders update to run daily at 3 AM await self.scheduler.schedule_task( task_name="update_all_orders_daily", func=lambda: self.update_all_orders_daily(db), - interval_seconds=24 * 60 * 60, # 24 hours + cron_expression="0 3 * * *" # Run at 3:00 AM every day + ) + # Schedule TCGPlayer price history update to run daily at 1 AM + await self.scheduler.schedule_task( + task_name="update_tcgplayer_price_history_daily", + func=lambda: self.update_tcgplayer_price_history_daily(db), + cron_expression="0 1 * * *" # Run at 1:00 AM every day ) self.scheduler.start()