more inventory management work

This commit is contained in:
zman 2025-04-22 16:44:47 -04:00
parent d8ae45c025
commit 210a033695
11 changed files with 1070 additions and 131 deletions

View File

@ -28,6 +28,13 @@ target_metadata = Base.metadata
# ... etc. # ... 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: def run_migrations_offline() -> None:
"""Run migrations in 'offline' mode. """Run migrations in 'offline' mode.
@ -46,6 +53,7 @@ def run_migrations_offline() -> None:
target_metadata=target_metadata, target_metadata=target_metadata,
literal_binds=True, literal_binds=True,
dialect_opts={"paramstyle": "named"}, dialect_opts={"paramstyle": "named"},
include_object=include_object,
) )
with context.begin_transaction(): with context.begin_transaction():
@ -67,7 +75,9 @@ def run_migrations_online() -> None:
with connectable.connect() as connection: with connectable.connect() as connection:
context.configure( context.configure(
connection=connection, target_metadata=target_metadata connection=connection,
target_metadata=target_metadata,
include_object=include_object,
) )
with context.begin_transaction(): with context.begin_transaction():

View File

@ -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 ###

View File

@ -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 ###

View File

@ -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 ###

724
app.log
View File

@ -1,107 +1,617 @@
2025-04-20 00:26:23,206 - INFO - app.main - Application starting up... 2025-04-21 09:59:20,760 - INFO - app.main - Application starting up...
2025-04-20 00:26:23,441 - INFO - app.main - Database initialized successfully 2025-04-21 09:59:20,850 - INFO - app.main - Database initialized successfully
2025-04-20 00:26:23,441 - INFO - app.services.service_manager - Service OrderManagementService registered 2025-04-21 09:59:20,850 - 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-21 09:59:20,850 - 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-21 09:59:20,850 - 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-21 09:59:20,850 - 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-21 09:59:20,853 - 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-21 09:59:20,856 - 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-21 09:59:20,856 - 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-21 09:59:20,856 - INFO - app.services.service_manager - Service DataInitializationService registered
2025-04-20 00:26:23,450 - DEBUG - tzlocal - /etc/localtime found 2025-04-21 09:59:20,856 - DEBUG - tzlocal - /etc/localtime found
2025-04-20 00:26:23,452 - DEBUG - tzlocal - 1 found: 2025-04-21 09:59:20,857 - DEBUG - tzlocal - 1 found:
{'/etc/localtime is a symlink to': 'America/Detroit'} {'/etc/localtime is a symlink to': 'US/Michigan'}
2025-04-20 00:26:23,452 - INFO - app.services.service_manager - Service SchedulerService registered 2025-04-21 09:59:20,857 - 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-21 09:59:20,857 - 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-21 09:59:20,857 - 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-21 09:59:20,857 - 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-21 09:59:20,857 - 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-21 09:59:20,858 - 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-21 09:59:20,858 - 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-21 09:59:20,858 - INFO - app.services.data_initialization - Data initialization completed
2025-04-20 00:26:23,456 - INFO - app.main - Data initialization results: {} 2025-04-21 09:59:20,858 - 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-21 09:59:20,858 - 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-21 09:59:20,858 - 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-21 09:59:20,858 - 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-21 09:59:20,858 - 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.<locals>.<lambda>" to job store "default" 2025-04-21 09:59:20,858 - INFO - apscheduler.scheduler - Added job "SchedulerService.start_scheduled_tasks.<locals>.<lambda>" to job store "default"
2025-04-20 00:26:23,457 - INFO - apscheduler.scheduler - Added job "SchedulerService.start_scheduled_tasks.<locals>.<lambda>" to job store "default" 2025-04-21 09:59:20,858 - INFO - apscheduler.scheduler - Added job "SchedulerService.start_scheduled_tasks.<locals>.<lambda>" to job store "default"
2025-04-20 00:26:23,457 - INFO - apscheduler.scheduler - Scheduler started 2025-04-21 09:59:20,858 - INFO - apscheduler.scheduler - Scheduler started
2025-04-20 00:26:23,457 - INFO - app.services.scheduler.base_scheduler - Scheduler started 2025-04-21 09:59:20,859 - 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-21 09:59:20,859 - 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-21 09:59:20,859 - INFO - app.main - Scheduler started successfully
2025-04-20 00:26:23,457 - DEBUG - apscheduler.scheduler - Looking for jobs to run 2025-04-21 09:59:20,859 - 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-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-20 00:26:39,542 - DEBUG - python_multipart.multipart - Calling on_part_begin with no data 2025-04-21 09:59:37,683 - INFO - app.services.external_api.tcgplayer.order_management_service - Getting orders from 0 to 25
2025-04-20 00:26:39,543 - DEBUG - python_multipart.multipart - Calling on_header_field with data[63:82] 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-20 00:26:39,543 - DEBUG - python_multipart.multipart - Calling on_header_value with data[84:126] 2025-04-21 09:59:38,002 - INFO - app.services.external_api.tcgplayer.order_management_service - Got 25 orders
2025-04-20 00:26:39,543 - DEBUG - python_multipart.multipart - Calling on_header_end with no data 2025-04-21 09:59:38,002 - INFO - app.services.external_api.tcgplayer.order_management_service - Getting orders from 25 to 50
2025-04-20 00:26:39,543 - DEBUG - python_multipart.multipart - Calling on_header_field with data[128:140] 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-20 00:26:39,543 - DEBUG - python_multipart.multipart - Calling on_header_value with data[142:150] 2025-04-21 09:59:38,161 - INFO - app.services.external_api.tcgplayer.order_management_service - Got 25 orders
2025-04-20 00:26:39,544 - DEBUG - python_multipart.multipart - Calling on_header_end with no data 2025-04-21 09:59:38,161 - INFO - app.services.external_api.tcgplayer.order_management_service - Getting orders from 50 to 75
2025-04-20 00:26:39,544 - DEBUG - python_multipart.multipart - Calling on_headers_finished with no data 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-20 00:26:39,544 - DEBUG - python_multipart.multipart - Calling on_part_data with data[154:13032] 2025-04-21 09:59:38,288 - INFO - app.services.external_api.tcgplayer.order_management_service - Got 12 orders
2025-04-20 00:26:39,551 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:27512] 2025-04-21 09:59:38,288 - INFO - app.services.external_api.tcgplayer.order_management_service - Getting orders from 75 to 100
2025-04-20 00:26:39,561 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:46336] 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-20 00:26:39,562 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:7240] 2025-04-21 09:59:38,407 - INFO - app.services.external_api.tcgplayer.order_management_service - Got 0 orders
2025-04-20 00:26:39,577 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:50680] 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-20 00:26:39,578 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:46336] 2025-04-21 09:59:52,807 - INFO - app.services.regular_printer_service - Print job 89 submitted to printer MFCL2750DW-3
2025-04-20 00:26:39,597 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:47784] 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-20 00:26:39,599 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:37704] 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-20 00:26:39,603 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:55024] 2025-04-21 10:01:49,264 - INFO - app.services.label_printer_service - Successfully converted PDF to 62 images
2025-04-20 00:26:39,613 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:45109] 2025-04-21 10:01:49,264 - INFO - app.services.label_printer_service - Processing page 1 with dimensions (1700, 2200)
2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_part_end with no data 2025-04-21 10:01:49,316 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_part_begin with no data 2025-04-21 10:01:53,670 - INFO - app.services.label_printer_service - Processing page 2 with dimensions (1700, 2200)
2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_header_field with data[45174:45193] 2025-04-21 10:01:53,721 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_header_value with data[45195:45219] 2025-04-21 10:01:58,142 - INFO - app.services.label_printer_service - Processing page 3 with dimensions (1700, 2200)
2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_header_end with no data 2025-04-21 10:01:58,193 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_headers_finished with no data 2025-04-21 10:02:02,613 - INFO - app.services.label_printer_service - Processing page 4 with dimensions (1700, 2200)
2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_part_data with data[45223:45230] 2025-04-21 10:02:02,664 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:26:39,614 - DEBUG - python_multipart.multipart - Calling on_part_end with no data 2025-04-21 10:02:07,419 - INFO - app.services.label_printer_service - Processing page 5 with dimensions (1700, 2200)
2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_part_begin with no data 2025-04-21 10:02:07,470 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_header_field with data[45295:45314] 2025-04-21 10:02:11,837 - INFO - app.services.label_printer_service - Processing page 6 with dimensions (1700, 2200)
2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_header_value with data[45316:45338] 2025-04-21 10:02:11,888 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_header_end with no data 2025-04-21 10:02:16,212 - INFO - app.services.label_printer_service - Processing page 7 with dimensions (1700, 2200)
2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_headers_finished with no data 2025-04-21 10:02:16,263 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_part_data with data[45342:45358] 2025-04-21 10:02:20,654 - INFO - app.services.label_printer_service - Processing page 8 with dimensions (1700, 2200)
2025-04-20 00:26:39,615 - DEBUG - python_multipart.multipart - Calling on_part_end with no data 2025-04-21 10:02:20,705 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:26:39,616 - DEBUG - python_multipart.multipart - Calling on_end with no data 2025-04-21 10:02:25,058 - INFO - app.services.label_printer_service - Processing page 9 with dimensions (1700, 2200)
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-21 10:02:25,110 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,890 - DEBUG - python_multipart.multipart - Calling on_part_begin with no data 2025-04-21 10:02:29,332 - INFO - app.services.label_printer_service - Processing page 10 with dimensions (1700, 2200)
2025-04-20 00:31:30,891 - DEBUG - python_multipart.multipart - Calling on_header_field with data[63:82] 2025-04-21 10:02:29,383 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,892 - DEBUG - python_multipart.multipart - Calling on_header_value with data[84:126] 2025-04-21 10:02:33,732 - INFO - app.services.label_printer_service - Processing page 11 with dimensions (1700, 2200)
2025-04-20 00:31:30,892 - DEBUG - python_multipart.multipart - Calling on_header_end with no data 2025-04-21 10:02:33,783 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,892 - DEBUG - python_multipart.multipart - Calling on_header_field with data[128:140] 2025-04-21 10:02:38,541 - INFO - app.services.label_printer_service - Processing page 12 with dimensions (1700, 2200)
2025-04-20 00:31:30,892 - DEBUG - python_multipart.multipart - Calling on_header_value with data[142:150] 2025-04-21 10:02:38,593 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,892 - DEBUG - python_multipart.multipart - Calling on_header_end with no data 2025-04-21 10:02:42,879 - INFO - app.services.label_printer_service - Processing page 13 with dimensions (1700, 2200)
2025-04-20 00:31:30,892 - DEBUG - python_multipart.multipart - Calling on_headers_finished with no data 2025-04-21 10:02:42,931 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,893 - DEBUG - python_multipart.multipart - Calling on_part_data with data[154:13032] 2025-04-21 10:02:47,339 - INFO - app.services.label_printer_service - Processing page 14 with dimensions (1700, 2200)
2025-04-20 00:31:30,893 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:1448] 2025-04-21 10:02:47,395 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,904 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:28960] 2025-04-21 10:02:51,715 - INFO - app.services.label_printer_service - Processing page 15 with dimensions (1700, 2200)
2025-04-20 00:31:30,919 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:47784] 2025-04-21 10:02:51,770 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,920 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:8688] 2025-04-21 10:02:57,080 - INFO - app.services.label_printer_service - Processing page 16 with dimensions (1700, 2200)
2025-04-20 00:31:30,938 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:47784] 2025-04-21 10:02:57,135 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,939 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:50680] 2025-04-21 10:03:01,551 - INFO - app.services.label_printer_service - Processing page 17 with dimensions (1700, 2200)
2025-04-20 00:31:30,940 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:1448] 2025-04-21 10:03:01,605 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,962 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:4344] 2025-04-21 10:03:05,879 - INFO - app.services.label_printer_service - Processing page 18 with dimensions (1700, 2200)
2025-04-20 00:31:30,962 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:50680] 2025-04-21 10:03:05,931 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,963 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:60280] 2025-04-21 10:03:11,013 - INFO - app.services.label_printer_service - Processing page 19 with dimensions (1700, 2200)
2025-04-20 00:31:30,967 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:26064] 2025-04-21 10:03:11,065 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_data with data[0:35565] 2025-04-21 10:03:15,422 - INFO - app.services.label_printer_service - Processing page 20 with dimensions (1700, 2200)
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_end with no data 2025-04-21 10:03:15,473 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_begin with no data 2025-04-21 10:03:19,682 - INFO - app.services.label_printer_service - Processing page 21 with dimensions (1700, 2200)
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_header_field with data[35630:35649] 2025-04-21 10:03:19,734 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_header_value with data[35651:35675] 2025-04-21 10:03:24,014 - INFO - app.services.label_printer_service - Processing page 22 with dimensions (1700, 2200)
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_header_end with no data 2025-04-21 10:03:24,066 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_headers_finished with no data 2025-04-21 10:03:28,614 - INFO - app.services.label_printer_service - Processing page 23 with dimensions (1700, 2200)
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_data with data[35679:35686] 2025-04-21 10:03:28,668 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_end with no data 2025-04-21 10:03:33,301 - INFO - app.services.label_printer_service - Processing page 24 with dimensions (1700, 2200)
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_begin with no data 2025-04-21 10:03:33,355 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_header_field with data[35751:35770] 2025-04-21 10:03:37,715 - INFO - app.services.label_printer_service - Processing page 25 with dimensions (1700, 2200)
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_header_value with data[35772:35794] 2025-04-21 10:03:37,769 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_header_end with no data 2025-04-21 10:03:42,103 - INFO - app.services.label_printer_service - Processing page 26 with dimensions (1700, 2200)
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_headers_finished with no data 2025-04-21 10:03:42,156 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_data with data[35798:35814] 2025-04-21 10:03:46,580 - INFO - app.services.label_printer_service - Processing page 27 with dimensions (1700, 2200)
2025-04-20 00:31:30,979 - DEBUG - python_multipart.multipart - Calling on_part_end with no data 2025-04-21 10:03:46,632 - DEBUG - brother_ql.raster - raster_image_size: 1296x1660
2025-04-20 00:31:30,980 - DEBUG - python_multipart.multipart - Calling on_end with no data 2025-04-21 10:03:50,974 - INFO - app.services.label_printer_service - Processing page 28 with dimensions (1700, 2200)
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 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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (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.<locals>.<lambda> (trigger: interval[1:00:00], next run at: 2025-04-22 16:59:20 EDT)" executed successfully

View File

@ -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)

View File

@ -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

View File

@ -1,13 +1,15 @@
from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from app.db.database import Base from app.db.database import Base
from sqlalchemy import event
from sqlalchemy.orm import Session
class PhysicalItem(Base): class PhysicalItem(Base):
__tablename__ = "physical_items" __tablename__ = "physical_items"
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
item_type = Column(String) 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)) created_at = Column(DateTime(timezone=True))
updated_at = Column(DateTime(timezone=True)) updated_at = Column(DateTime(timezone=True))
deleted_at = Column(DateTime(timezone=True), nullable=True) deleted_at = Column(DateTime(timezone=True), nullable=True)
@ -18,14 +20,16 @@ class PhysicalItem(Base):
} }
# Relationships # Relationships
product = relationship("Product") product = relationship("TCGPlayerProduct")
inventory_item = relationship("InventoryItem", uselist=False, back_populates="physical_item") 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): class SealedCase(PhysicalItem):
__tablename__ = "sealed_cases" __tablename__ = "sealed_cases"
id = Column(Integer, ForeignKey('physical_items.id'), primary_key=True) id = Column(Integer, ForeignKey('physical_items.id'), primary_key=True)
expected_value = Column(Float)
num_boxes = Column(Integer)
__mapper_args__ = { __mapper_args__ = {
'polymorphic_identity': 'sealed_case' 'polymorphic_identity': 'sealed_case'
@ -40,6 +44,7 @@ class SealedBox(PhysicalItem):
id = Column(Integer, ForeignKey('physical_items.id'), primary_key=True) id = Column(Integer, ForeignKey('physical_items.id'), primary_key=True)
case_id = Column(Integer, ForeignKey("sealed_cases.id"), nullable=True) case_id = Column(Integer, ForeignKey("sealed_cases.id"), nullable=True)
expected_value = Column(Float)
__mapper_args__ = { __mapper_args__ = {
'polymorphic_identity': 'sealed_box' 'polymorphic_identity': 'sealed_box'
@ -49,6 +54,27 @@ class SealedBox(PhysicalItem):
case = relationship("SealedCase", back_populates="boxes", foreign_keys=[case_id]) case = relationship("SealedCase", back_populates="boxes", foreign_keys=[case_id])
open_event = relationship("OpenEvent", uselist=False, back_populates="sealed_box") 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): class OpenBox(PhysicalItem):
__tablename__ = "open_boxes" __tablename__ = "open_boxes"
@ -95,6 +121,7 @@ class InventoryItem(Base):
physical_item = relationship("PhysicalItem", back_populates="inventory_item") physical_item = relationship("PhysicalItem", back_populates="inventory_item")
parent = relationship("InventoryItem", remote_side=[id], back_populates="children") parent = relationship("InventoryItem", remote_side=[id], back_populates="children")
children = relationship("InventoryItem", back_populates="parent", overlaps="parent") children = relationship("InventoryItem", back_populates="parent", overlaps="parent")
marketplace_listing = relationship("MarketplaceListing", back_populates="inventory_item")
class TransactionItem(Base): class TransactionItem(Base):
__tablename__ = "transaction_items" __tablename__ = "transaction_items"
@ -151,6 +178,7 @@ class Transaction(Base):
id = Column(Integer, primary_key=True, index=True) id = Column(Integer, primary_key=True, index=True)
vendor_id = Column(Integer, ForeignKey("vendors.id"), nullable=True) vendor_id = Column(Integer, ForeignKey("vendors.id"), nullable=True)
customer_id = Column(Integer, ForeignKey("customers.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_type = Column(String) # 'purchase' or 'sale'
transaction_date = Column(DateTime(timezone=True)) transaction_date = Column(DateTime(timezone=True))
transaction_total_amount = Column(Float) transaction_total_amount = Column(Float)
@ -161,3 +189,60 @@ class Transaction(Base):
# Relationships # Relationships
transaction_items = relationship("TransactionItem", back_populates="transaction") 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")

View File

@ -1,5 +1,6 @@
from sqlalchemy import Column, Integer, String, Float, DateTime from sqlalchemy import Column, Integer, String, Float, DateTime
from sqlalchemy.sql import func from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from app.db.database import Base from app.db.database import Base
class TCGPlayerProduct(Base): class TCGPlayerProduct(Base):
@ -31,3 +32,7 @@ class TCGPlayerProduct(Base):
created_at = Column(DateTime(timezone=True), server_default=func.now()) created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now()) 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")

View File

@ -1,6 +1,7 @@
from typing import Callable, Dict, Any from typing import Callable, Dict, Any
from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.interval import IntervalTrigger from apscheduler.triggers.interval import IntervalTrigger
from apscheduler.triggers.cron import CronTrigger
import logging import logging
from apscheduler.schedulers.base import SchedulerNotRunningError from apscheduler.schedulers.base import SchedulerNotRunningError
@ -16,18 +17,38 @@ class BaseScheduler:
self, self,
task_name: str, task_name: str,
func: Callable, func: Callable,
interval_seconds: int, interval_seconds: int = None,
cron_expression: str = None,
*args, *args,
**kwargs **kwargs
) -> None: ) -> 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: if task_name in self.jobs:
logger.warning(f"Task {task_name} already exists. Removing existing job.") logger.warning(f"Task {task_name} already exists. Removing existing job.")
self.jobs[task_name].remove() 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( job = self.scheduler.add_job(
func, func,
trigger=IntervalTrigger(seconds=interval_seconds), trigger=trigger,
args=args, args=args,
kwargs=kwargs, kwargs=kwargs,
id=task_name, id=task_name,
@ -35,7 +56,10 @@ class BaseScheduler:
) )
self.jobs[task_name] = job 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: def remove_task(self, task_name: str) -> None:
"""Remove a scheduled task""" """Remove a scheduled task"""

View File

@ -1,21 +1,25 @@
from app.db.database import transaction from app.db.database import transaction
from app.services.scheduler.base_scheduler import BaseScheduler from app.services.scheduler.base_scheduler import BaseScheduler
from app.services.base_service import BaseService
from sqlalchemy import text
import logging import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class SchedulerService: class SchedulerService(BaseService):
def __init__(self): def __init__(self):
# Initialize BaseService with None as model since this service doesn't have a specific model
super().__init__(None)
self.scheduler = BaseScheduler() self.scheduler = BaseScheduler()
# Service manager will be set during initialization
self._service_manager = None
@property async def update_tcgplayer_price_history_daily(self, db):
def service_manager(self): """
if self._service_manager is None: Update the TCGPlayer price history table
from app.services.service_manager import ServiceManager """
self._service_manager = ServiceManager() with transaction(db):
return self._service_manager 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): async def update_open_orders_hourly(self, db):
""" """
@ -67,13 +71,19 @@ class SchedulerService:
await self.scheduler.schedule_task( await self.scheduler.schedule_task(
task_name="update_open_orders_hourly", task_name="update_open_orders_hourly",
func=lambda: self.update_open_orders_hourly(db), 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( await self.scheduler.schedule_task(
task_name="update_all_orders_daily", task_name="update_all_orders_daily",
func=lambda: self.update_all_orders_daily(db), 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() self.scheduler.start()