"""initial schema

Revision ID: 2458d88ae1f9
Revises: 
Create Date: 2026-08-04 16:06:56.134121+06:00

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

revision: str = '2458d88ae1f9'
down_revision: Union[str, None] = None
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('equipment_types',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=120), nullable=False),
    sa.Column('code', sa.String(length=20), nullable=False),
    sa.Column('unit', sa.String(length=20), server_default='pcs', nullable=False),
    sa.Column('is_serialized', sa.Boolean(), server_default='true', nullable=False),
    sa.Column('default_return_days', sa.Integer(), nullable=True),
    sa.Column('reorder_level', sa.Integer(), server_default='0', nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_equipment_types')),
    sa.UniqueConstraint('name', name=op.f('uq_equipment_types_name'))
    )
    op.create_index(op.f('ix_equipment_types_code'), 'equipment_types', ['code'], unique=True)
    op.create_index(op.f('ix_equipment_types_created_at'), 'equipment_types', ['created_at'], unique=False)
    op.create_index(op.f('ix_equipment_types_is_deleted'), 'equipment_types', ['is_deleted'], unique=False)
    op.create_table('locations',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=120), nullable=False),
    sa.Column('code', sa.String(length=20), nullable=False),
    sa.Column('type', sa.Enum('warehouse', 'office', name='location_type'), nullable=False),
    sa.Column('address', sa.Text(), nullable=True),
    sa.Column('is_default', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_locations')),
    sa.UniqueConstraint('name', name=op.f('uq_locations_name'))
    )
    op.create_index(op.f('ix_locations_code'), 'locations', ['code'], unique=True)
    op.create_index(op.f('ix_locations_created_at'), 'locations', ['created_at'], unique=False)
    op.create_index(op.f('ix_locations_is_deleted'), 'locations', ['is_deleted'], unique=False)
    op.create_table('packages',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=100), nullable=False),
    sa.Column('code', sa.String(length=20), nullable=True),
    sa.Column('speed_mbps', sa.Integer(), nullable=False),
    sa.Column('monthly_price', sa.Numeric(precision=10, scale=2), nullable=False),
    sa.Column('description', sa.Text(), nullable=True),
    sa.Column('is_active', sa.Boolean(), server_default='true', nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_packages')),
    sa.UniqueConstraint('code', name=op.f('uq_packages_code')),
    sa.UniqueConstraint('name', name=op.f('uq_packages_name'))
    )
    op.create_index(op.f('ix_packages_created_at'), 'packages', ['created_at'], unique=False)
    op.create_index(op.f('ix_packages_is_deleted'), 'packages', ['is_deleted'], unique=False)
    op.create_table('sla_policies',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('priority', sa.Enum('low', 'medium', 'high', 'critical', name='complaint_priority'), nullable=False),
    sa.Column('response_minutes', sa.Integer(), nullable=False),
    sa.Column('resolution_minutes', sa.Integer(), nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_sla_policies')),
    sa.UniqueConstraint('priority', name=op.f('uq_sla_policies_priority'))
    )
    op.create_index(op.f('ix_sla_policies_created_at'), 'sla_policies', ['created_at'], unique=False)
    op.create_table('users',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('full_name', sa.String(length=150), nullable=False),
    sa.Column('email', sa.String(length=255), nullable=False),
    sa.Column('phone', sa.String(length=20), nullable=True),
    sa.Column('password_hash', sa.String(length=255), nullable=False),
    sa.Column('role', sa.Enum('admin', 'manager', 'field_staff', 'read_only', name='user_role'), nullable=False),
    sa.Column('employee_code', sa.String(length=40), nullable=True),
    sa.Column('is_active', sa.Boolean(), server_default='true', nullable=False),
    sa.Column('last_login_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_users')),
    sa.UniqueConstraint('employee_code', name=op.f('uq_users_employee_code'))
    )
    op.create_index(op.f('ix_users_created_at'), 'users', ['created_at'], unique=False)
    op.create_index(op.f('ix_users_email'), 'users', ['email'], unique=True)
    op.create_index(op.f('ix_users_is_deleted'), 'users', ['is_deleted'], unique=False)
    op.create_index(op.f('ix_users_phone'), 'users', ['phone'], unique=False)
    op.create_index(op.f('ix_users_role'), 'users', ['role'], unique=False)
    op.create_index('ix_users_role_active', 'users', ['role', 'is_active'], unique=False)
    op.create_table('zones',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=100), nullable=False),
    sa.Column('code', sa.String(length=20), nullable=False),
    sa.Column('description', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_zones')),
    sa.UniqueConstraint('name', name=op.f('uq_zones_name'))
    )
    op.create_index(op.f('ix_zones_code'), 'zones', ['code'], unique=True)
    op.create_index(op.f('ix_zones_created_at'), 'zones', ['created_at'], unique=False)
    op.create_index(op.f('ix_zones_is_deleted'), 'zones', ['is_deleted'], unique=False)
    op.create_table('areas',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('zone_id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=120), nullable=False),
    sa.Column('code', sa.String(length=20), nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.ForeignKeyConstraint(['zone_id'], ['zones.id'], name=op.f('fk_areas_zone_id_zones'), ondelete='RESTRICT'),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_areas')),
    sa.UniqueConstraint('zone_id', 'name', name='uq_areas_zone_id_name')
    )
    op.create_index(op.f('ix_areas_code'), 'areas', ['code'], unique=True)
    op.create_index(op.f('ix_areas_created_at'), 'areas', ['created_at'], unique=False)
    op.create_index(op.f('ix_areas_is_deleted'), 'areas', ['is_deleted'], unique=False)
    op.create_index(op.f('ix_areas_zone_id'), 'areas', ['zone_id'], unique=False)
    op.create_table('audit_logs',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('user_id', sa.Integer(), nullable=True),
    sa.Column('action', sa.String(length=60), nullable=False),
    sa.Column('entity_type', sa.String(length=60), nullable=False),
    sa.Column('entity_id', sa.Integer(), nullable=True),
    sa.Column('payload', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
    sa.Column('ip_address', sa.String(length=45), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
    sa.ForeignKeyConstraint(['user_id'], ['users.id'], name=op.f('fk_audit_logs_user_id_users'), ondelete='SET NULL'),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_audit_logs'))
    )
    op.create_index(op.f('ix_audit_logs_action'), 'audit_logs', ['action'], unique=False)
    op.create_index(op.f('ix_audit_logs_created_at'), 'audit_logs', ['created_at'], unique=False)
    op.create_index('ix_audit_logs_entity', 'audit_logs', ['entity_type', 'entity_id'], unique=False)
    op.create_index(op.f('ix_audit_logs_user_id'), 'audit_logs', ['user_id'], unique=False)
    op.create_table('connection_applications',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('application_no', sa.String(length=30), nullable=False),
    sa.Column('applicant_name', sa.String(length=150), nullable=False),
    sa.Column('phone', sa.String(length=20), nullable=False),
    sa.Column('alt_phone', sa.String(length=20), nullable=True),
    sa.Column('nid', sa.String(length=30), nullable=True),
    sa.Column('email', sa.String(length=255), nullable=True),
    sa.Column('address', sa.Text(), nullable=False),
    sa.Column('area_id', sa.Integer(), nullable=False),
    sa.Column('package_id', sa.Integer(), nullable=False),
    sa.Column('requested_date', sa.Date(), nullable=False),
    sa.Column('assigned_technician_id', sa.Integer(), nullable=True),
    sa.Column('status', sa.Enum('pending', 'survey', 'approved', 'installed', 'rejected', name='application_status'), server_default='pending', nullable=False),
    sa.Column('notes', sa.Text(), nullable=True),
    sa.Column('survey_date', sa.Date(), nullable=True),
    sa.Column('surveyed_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('approved_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('installed_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('rejected_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('rejection_reason', sa.Text(), nullable=True),
    sa.Column('created_by_id', sa.Integer(), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.ForeignKeyConstraint(['area_id'], ['areas.id'], name=op.f('fk_connection_applications_area_id_areas'), ondelete='RESTRICT'),
    sa.ForeignKeyConstraint(['assigned_technician_id'], ['users.id'], name=op.f('fk_connection_applications_assigned_technician_id_users'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['created_by_id'], ['users.id'], name=op.f('fk_connection_applications_created_by_id_users'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['package_id'], ['packages.id'], name=op.f('fk_connection_applications_package_id_packages'), ondelete='RESTRICT'),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_connection_applications'))
    )
    op.create_index('ix_applications_applicant_name', 'connection_applications', ['applicant_name'], unique=False)
    op.create_index('ix_applications_area_status', 'connection_applications', ['area_id', 'status'], unique=False)
    op.create_index('ix_applications_status_requested_date', 'connection_applications', ['status', 'requested_date'], unique=False)
    op.create_index(op.f('ix_connection_applications_application_no'), 'connection_applications', ['application_no'], unique=True)
    op.create_index(op.f('ix_connection_applications_area_id'), 'connection_applications', ['area_id'], unique=False)
    op.create_index(op.f('ix_connection_applications_assigned_technician_id'), 'connection_applications', ['assigned_technician_id'], unique=False)
    op.create_index(op.f('ix_connection_applications_created_at'), 'connection_applications', ['created_at'], unique=False)
    op.create_index(op.f('ix_connection_applications_is_deleted'), 'connection_applications', ['is_deleted'], unique=False)
    op.create_index(op.f('ix_connection_applications_nid'), 'connection_applications', ['nid'], unique=False)
    op.create_index(op.f('ix_connection_applications_package_id'), 'connection_applications', ['package_id'], unique=False)
    op.create_index(op.f('ix_connection_applications_phone'), 'connection_applications', ['phone'], unique=False)
    op.create_index(op.f('ix_connection_applications_requested_date'), 'connection_applications', ['requested_date'], unique=False)
    op.create_index(op.f('ix_connection_applications_status'), 'connection_applications', ['status'], unique=False)
    op.create_table('customers',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('customer_code', sa.String(length=30), nullable=False),
    sa.Column('full_name', sa.String(length=150), nullable=False),
    sa.Column('phone', sa.String(length=20), nullable=False),
    sa.Column('alt_phone', sa.String(length=20), nullable=True),
    sa.Column('nid', sa.String(length=30), nullable=True),
    sa.Column('email', sa.String(length=255), nullable=True),
    sa.Column('address', sa.Text(), nullable=False),
    sa.Column('area_id', sa.Integer(), nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.ForeignKeyConstraint(['area_id'], ['areas.id'], name=op.f('fk_customers_area_id_areas'), ondelete='RESTRICT'),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_customers'))
    )
    op.create_index(op.f('ix_customers_area_id'), 'customers', ['area_id'], unique=False)
    op.create_index(op.f('ix_customers_created_at'), 'customers', ['created_at'], unique=False)
    op.create_index(op.f('ix_customers_customer_code'), 'customers', ['customer_code'], unique=True)
    op.create_index('ix_customers_full_name', 'customers', ['full_name'], unique=False)
    op.create_index(op.f('ix_customers_is_deleted'), 'customers', ['is_deleted'], unique=False)
    op.create_index(op.f('ix_customers_nid'), 'customers', ['nid'], unique=False)
    op.create_index(op.f('ix_customers_phone'), 'customers', ['phone'], unique=False)
    op.create_table('application_documents',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('application_id', sa.Integer(), nullable=False),
    sa.Column('doc_type', sa.Enum('nid', 'photo', 'agreement', 'survey_report', 'other', name='document_type'), nullable=False),
    sa.Column('file_name', sa.String(length=255), nullable=False),
    sa.Column('stored_path', sa.String(length=500), nullable=False),
    sa.Column('content_type', sa.String(length=120), nullable=True),
    sa.Column('file_size', sa.Integer(), nullable=False),
    sa.Column('uploaded_by_id', sa.Integer(), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.ForeignKeyConstraint(['application_id'], ['connection_applications.id'], name=op.f('fk_application_documents_application_id_connection_applications'), ondelete='CASCADE'),
    sa.ForeignKeyConstraint(['uploaded_by_id'], ['users.id'], name=op.f('fk_application_documents_uploaded_by_id_users'), ondelete='SET NULL'),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_application_documents'))
    )
    op.create_index(op.f('ix_application_documents_application_id'), 'application_documents', ['application_id'], unique=False)
    op.create_index(op.f('ix_application_documents_created_at'), 'application_documents', ['created_at'], unique=False)
    op.create_index(op.f('ix_application_documents_is_deleted'), 'application_documents', ['is_deleted'], unique=False)
    op.create_table('application_status_history',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('application_id', sa.Integer(), nullable=False),
    sa.Column('from_status', sa.Enum('pending', 'survey', 'approved', 'installed', 'rejected', name='application_status'), nullable=True),
    sa.Column('to_status', sa.Enum('pending', 'survey', 'approved', 'installed', 'rejected', name='application_status'), nullable=False),
    sa.Column('changed_by_id', sa.Integer(), nullable=True),
    sa.Column('changed_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('remarks', sa.Text(), nullable=True),
    sa.ForeignKeyConstraint(['application_id'], ['connection_applications.id'], name=op.f('fk_application_status_history_application_id_connection_applications'), ondelete='CASCADE'),
    sa.ForeignKeyConstraint(['changed_by_id'], ['users.id'], name=op.f('fk_application_status_history_changed_by_id_users'), ondelete='SET NULL'),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_application_status_history'))
    )
    op.create_index(op.f('ix_application_status_history_application_id'), 'application_status_history', ['application_id'], unique=False)
    op.create_index(op.f('ix_application_status_history_changed_at'), 'application_status_history', ['changed_at'], unique=False)
    op.create_table('connections',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('connection_code', sa.String(length=30), nullable=False),
    sa.Column('customer_id', sa.Integer(), nullable=False),
    sa.Column('application_id', sa.Integer(), nullable=True),
    sa.Column('package_id', sa.Integer(), nullable=False),
    sa.Column('area_id', sa.Integer(), nullable=False),
    sa.Column('status', sa.Enum('active', 'suspended', 'terminated', name='connection_status'), server_default='active', nullable=False),
    sa.Column('activated_on', sa.Date(), nullable=False),
    sa.Column('terminated_on', sa.Date(), nullable=True),
    sa.Column('monthly_bill', sa.Numeric(precision=10, scale=2), nullable=True),
    sa.Column('installed_by_id', sa.Integer(), nullable=True),
    sa.Column('notes', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.ForeignKeyConstraint(['application_id'], ['connection_applications.id'], name=op.f('fk_connections_application_id_connection_applications'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['area_id'], ['areas.id'], name=op.f('fk_connections_area_id_areas'), ondelete='RESTRICT'),
    sa.ForeignKeyConstraint(['customer_id'], ['customers.id'], name=op.f('fk_connections_customer_id_customers'), ondelete='RESTRICT'),
    sa.ForeignKeyConstraint(['installed_by_id'], ['users.id'], name=op.f('fk_connections_installed_by_id_users'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['package_id'], ['packages.id'], name=op.f('fk_connections_package_id_packages'), ondelete='RESTRICT'),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_connections')),
    sa.UniqueConstraint('application_id', name=op.f('uq_connections_application_id'))
    )
    op.create_index(op.f('ix_connections_activated_on'), 'connections', ['activated_on'], unique=False)
    op.create_index(op.f('ix_connections_area_id'), 'connections', ['area_id'], unique=False)
    op.create_index(op.f('ix_connections_connection_code'), 'connections', ['connection_code'], unique=True)
    op.create_index(op.f('ix_connections_created_at'), 'connections', ['created_at'], unique=False)
    op.create_index(op.f('ix_connections_customer_id'), 'connections', ['customer_id'], unique=False)
    op.create_index(op.f('ix_connections_is_deleted'), 'connections', ['is_deleted'], unique=False)
    op.create_index(op.f('ix_connections_package_id'), 'connections', ['package_id'], unique=False)
    op.create_index(op.f('ix_connections_status'), 'connections', ['status'], unique=False)
    op.create_table('equipment_items',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('equipment_type_id', sa.Integer(), nullable=False),
    sa.Column('model', sa.String(length=120), nullable=True),
    sa.Column('serial_number', sa.String(length=120), nullable=True),
    sa.Column('condition', sa.Enum('new', 'used', 'faulty', name='equipment_condition'), server_default='new', nullable=False),
    sa.Column('quantity', sa.Integer(), server_default='1', nullable=False),
    sa.Column('holder_type', sa.Enum('warehouse', 'technician', 'customer', name='holder_type'), server_default='warehouse', nullable=False),
    sa.Column('location_id', sa.Integer(), nullable=True),
    sa.Column('holder_user_id', sa.Integer(), nullable=True),
    sa.Column('holder_customer_id', sa.Integer(), nullable=True),
    sa.Column('status', sa.Enum('in_stock', 'issued', 'returned', 'written_off', name='equipment_item_status'), server_default='in_stock', nullable=False),
    sa.Column('purchase_date', sa.Date(), nullable=True),
    sa.Column('unit_cost', sa.Numeric(precision=10, scale=2), nullable=True),
    sa.Column('notes', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.CheckConstraint("(holder_type = 'warehouse' AND location_id IS NOT NULL  AND holder_user_id IS NULL AND holder_customer_id IS NULL) OR (holder_type = 'technician' AND holder_user_id IS NOT NULL  AND holder_customer_id IS NULL) OR (holder_type = 'customer' AND holder_customer_id IS NOT NULL  AND holder_user_id IS NULL)", name=op.f('ck_equipment_items_holder_target_consistent')),
    sa.CheckConstraint('quantity >= 0', name=op.f('ck_equipment_items_quantity_non_negative')),
    sa.ForeignKeyConstraint(['equipment_type_id'], ['equipment_types.id'], name=op.f('fk_equipment_items_equipment_type_id_equipment_types'), ondelete='RESTRICT'),
    sa.ForeignKeyConstraint(['holder_customer_id'], ['customers.id'], name=op.f('fk_equipment_items_holder_customer_id_customers'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['holder_user_id'], ['users.id'], name=op.f('fk_equipment_items_holder_user_id_users'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['location_id'], ['locations.id'], name=op.f('fk_equipment_items_location_id_locations'), ondelete='RESTRICT'),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_equipment_items'))
    )
    op.create_index(op.f('ix_equipment_items_condition'), 'equipment_items', ['condition'], unique=False)
    op.create_index(op.f('ix_equipment_items_created_at'), 'equipment_items', ['created_at'], unique=False)
    op.create_index(op.f('ix_equipment_items_equipment_type_id'), 'equipment_items', ['equipment_type_id'], unique=False)
    op.create_index(op.f('ix_equipment_items_holder_customer_id'), 'equipment_items', ['holder_customer_id'], unique=False)
    op.create_index(op.f('ix_equipment_items_holder_type'), 'equipment_items', ['holder_type'], unique=False)
    op.create_index(op.f('ix_equipment_items_holder_user_id'), 'equipment_items', ['holder_user_id'], unique=False)
    op.create_index(op.f('ix_equipment_items_is_deleted'), 'equipment_items', ['is_deleted'], unique=False)
    op.create_index(op.f('ix_equipment_items_location_id'), 'equipment_items', ['location_id'], unique=False)
    op.create_index(op.f('ix_equipment_items_serial_number'), 'equipment_items', ['serial_number'], unique=True)
    op.create_index(op.f('ix_equipment_items_status'), 'equipment_items', ['status'], unique=False)
    op.create_index('ix_equipment_items_type_location', 'equipment_items', ['equipment_type_id', 'location_id'], unique=False)
    op.create_index('ix_equipment_items_type_status', 'equipment_items', ['equipment_type_id', 'status'], unique=False)
    op.create_table('complaints',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('ticket_no', sa.String(length=30), nullable=False),
    sa.Column('connection_id', sa.Integer(), nullable=False),
    sa.Column('complaint_type', sa.Enum('no_internet', 'slow_speed', 'billing', 'equipment_fault', 'other', name='complaint_type'), nullable=False),
    sa.Column('description', sa.Text(), nullable=False),
    sa.Column('priority', sa.Enum('low', 'medium', 'high', 'critical', name='complaint_priority'), server_default='medium', nullable=False),
    sa.Column('assigned_technician_id', sa.Integer(), nullable=True),
    sa.Column('status', sa.Enum('open', 'in_progress', 'resolved', 'closed', name='complaint_status'), server_default='open', nullable=False),
    sa.Column('resolution_notes', sa.Text(), nullable=True),
    sa.Column('contact_phone', sa.String(length=20), nullable=True),
    sa.Column('reported_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('first_response_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('resolved_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('closed_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('sla_response_due_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('sla_resolution_due_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('response_minutes', sa.Integer(), nullable=True),
    sa.Column('resolution_minutes', sa.Integer(), nullable=True),
    sa.Column('created_by_id', sa.Integer(), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.ForeignKeyConstraint(['assigned_technician_id'], ['users.id'], name=op.f('fk_complaints_assigned_technician_id_users'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['connection_id'], ['connections.id'], name=op.f('fk_complaints_connection_id_connections'), ondelete='RESTRICT'),
    sa.ForeignKeyConstraint(['created_by_id'], ['users.id'], name=op.f('fk_complaints_created_by_id_users'), ondelete='SET NULL'),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_complaints'))
    )
    op.create_index(op.f('ix_complaints_assigned_technician_id'), 'complaints', ['assigned_technician_id'], unique=False)
    op.create_index(op.f('ix_complaints_complaint_type'), 'complaints', ['complaint_type'], unique=False)
    op.create_index(op.f('ix_complaints_connection_id'), 'complaints', ['connection_id'], unique=False)
    op.create_index(op.f('ix_complaints_created_at'), 'complaints', ['created_at'], unique=False)
    op.create_index(op.f('ix_complaints_is_deleted'), 'complaints', ['is_deleted'], unique=False)
    op.create_index(op.f('ix_complaints_priority'), 'complaints', ['priority'], unique=False)
    op.create_index('ix_complaints_priority_status', 'complaints', ['priority', 'status'], unique=False)
    op.create_index(op.f('ix_complaints_reported_at'), 'complaints', ['reported_at'], unique=False)
    op.create_index(op.f('ix_complaints_resolved_at'), 'complaints', ['resolved_at'], unique=False)
    op.create_index(op.f('ix_complaints_status'), 'complaints', ['status'], unique=False)
    op.create_index('ix_complaints_status_reported_at', 'complaints', ['status', 'reported_at'], unique=False)
    op.create_index('ix_complaints_technician_status', 'complaints', ['assigned_technician_id', 'status'], unique=False)
    op.create_index(op.f('ix_complaints_ticket_no'), 'complaints', ['ticket_no'], unique=True)
    op.create_table('equipment_distributions',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('equipment_item_id', sa.Integer(), nullable=False),
    sa.Column('quantity', sa.Integer(), server_default='1', nullable=False),
    sa.Column('returned_quantity', sa.Integer(), server_default='0', nullable=False),
    sa.Column('issued_to_type', sa.Enum('warehouse', 'technician', 'customer', name='holder_type'), nullable=False),
    sa.Column('issued_to_user_id', sa.Integer(), nullable=True),
    sa.Column('issued_to_customer_id', sa.Integer(), nullable=True),
    sa.Column('connection_application_id', sa.Integer(), nullable=True),
    sa.Column('connection_id', sa.Integer(), nullable=True),
    sa.Column('from_location_id', sa.Integer(), nullable=True),
    sa.Column('issued_by_id', sa.Integer(), nullable=True),
    sa.Column('issued_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('expected_return_date', sa.Date(), nullable=True),
    sa.Column('status', sa.Enum('issued', 'partially_returned', 'returned', 'written_off', name='distribution_status'), server_default='issued', nullable=False),
    sa.Column('notes', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.CheckConstraint("(issued_to_type = 'technician' AND issued_to_user_id IS NOT NULL) OR (issued_to_type = 'customer' AND issued_to_customer_id IS NOT NULL)", name=op.f('ck_equipment_distributions_issue_target_consistent')),
    sa.CheckConstraint('quantity > 0', name=op.f('ck_equipment_distributions_quantity_positive')),
    sa.CheckConstraint('returned_quantity >= 0 AND returned_quantity <= quantity', name=op.f('ck_equipment_distributions_returned_within_issued')),
    sa.ForeignKeyConstraint(['connection_application_id'], ['connection_applications.id'], name=op.f('fk_equipment_distributions_connection_application_id_connection_applications'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['connection_id'], ['connections.id'], name=op.f('fk_equipment_distributions_connection_id_connections'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['equipment_item_id'], ['equipment_items.id'], name=op.f('fk_equipment_distributions_equipment_item_id_equipment_items'), ondelete='RESTRICT'),
    sa.ForeignKeyConstraint(['from_location_id'], ['locations.id'], name=op.f('fk_equipment_distributions_from_location_id_locations'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['issued_by_id'], ['users.id'], name=op.f('fk_equipment_distributions_issued_by_id_users'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['issued_to_customer_id'], ['customers.id'], name=op.f('fk_equipment_distributions_issued_to_customer_id_customers'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['issued_to_user_id'], ['users.id'], name=op.f('fk_equipment_distributions_issued_to_user_id_users'), ondelete='SET NULL'),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_equipment_distributions'))
    )
    op.create_index('ix_distributions_status_expected_return', 'equipment_distributions', ['status', 'expected_return_date'], unique=False)
    op.create_index(op.f('ix_equipment_distributions_connection_application_id'), 'equipment_distributions', ['connection_application_id'], unique=False)
    op.create_index(op.f('ix_equipment_distributions_connection_id'), 'equipment_distributions', ['connection_id'], unique=False)
    op.create_index(op.f('ix_equipment_distributions_created_at'), 'equipment_distributions', ['created_at'], unique=False)
    op.create_index(op.f('ix_equipment_distributions_equipment_item_id'), 'equipment_distributions', ['equipment_item_id'], unique=False)
    op.create_index(op.f('ix_equipment_distributions_expected_return_date'), 'equipment_distributions', ['expected_return_date'], unique=False)
    op.create_index(op.f('ix_equipment_distributions_is_deleted'), 'equipment_distributions', ['is_deleted'], unique=False)
    op.create_index(op.f('ix_equipment_distributions_issued_at'), 'equipment_distributions', ['issued_at'], unique=False)
    op.create_index(op.f('ix_equipment_distributions_issued_to_customer_id'), 'equipment_distributions', ['issued_to_customer_id'], unique=False)
    op.create_index(op.f('ix_equipment_distributions_issued_to_user_id'), 'equipment_distributions', ['issued_to_user_id'], unique=False)
    op.create_index(op.f('ix_equipment_distributions_status'), 'equipment_distributions', ['status'], unique=False)
    op.create_table('complaint_status_history',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('complaint_id', sa.Integer(), nullable=False),
    sa.Column('from_status', sa.Enum('open', 'in_progress', 'resolved', 'closed', name='complaint_status'), nullable=True),
    sa.Column('to_status', sa.Enum('open', 'in_progress', 'resolved', 'closed', name='complaint_status'), nullable=False),
    sa.Column('changed_by_id', sa.Integer(), nullable=True),
    sa.Column('changed_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('remarks', sa.Text(), nullable=True),
    sa.ForeignKeyConstraint(['changed_by_id'], ['users.id'], name=op.f('fk_complaint_status_history_changed_by_id_users'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['complaint_id'], ['complaints.id'], name=op.f('fk_complaint_status_history_complaint_id_complaints'), ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_complaint_status_history'))
    )
    op.create_index(op.f('ix_complaint_status_history_changed_at'), 'complaint_status_history', ['changed_at'], unique=False)
    op.create_index(op.f('ix_complaint_status_history_complaint_id'), 'complaint_status_history', ['complaint_id'], unique=False)
    op.create_table('equipment_collections',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('distribution_id', sa.Integer(), nullable=True),
    sa.Column('equipment_item_id', sa.Integer(), nullable=False),
    sa.Column('quantity', sa.Integer(), server_default='1', nullable=False),
    sa.Column('condition_on_return', sa.Enum('new', 'used', 'faulty', name='equipment_condition'), nullable=False),
    sa.Column('collected_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('collected_by_id', sa.Integer(), nullable=True),
    sa.Column('collected_from_user_id', sa.Integer(), nullable=True),
    sa.Column('collected_from_customer_id', sa.Integer(), nullable=True),
    sa.Column('returned_to_location_id', sa.Integer(), nullable=False),
    sa.Column('notes', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
    sa.Column('is_deleted', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
    sa.CheckConstraint('quantity > 0', name=op.f('ck_equipment_collections_quantity_positive')),
    sa.ForeignKeyConstraint(['collected_by_id'], ['users.id'], name=op.f('fk_equipment_collections_collected_by_id_users'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['collected_from_customer_id'], ['customers.id'], name=op.f('fk_equipment_collections_collected_from_customer_id_customers'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['collected_from_user_id'], ['users.id'], name=op.f('fk_equipment_collections_collected_from_user_id_users'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['distribution_id'], ['equipment_distributions.id'], name=op.f('fk_equipment_collections_distribution_id_equipment_distributions'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['equipment_item_id'], ['equipment_items.id'], name=op.f('fk_equipment_collections_equipment_item_id_equipment_items'), ondelete='RESTRICT'),
    sa.ForeignKeyConstraint(['returned_to_location_id'], ['locations.id'], name=op.f('fk_equipment_collections_returned_to_location_id_locations'), ondelete='RESTRICT'),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_equipment_collections'))
    )
    op.create_index(op.f('ix_equipment_collections_collected_at'), 'equipment_collections', ['collected_at'], unique=False)
    op.create_index(op.f('ix_equipment_collections_created_at'), 'equipment_collections', ['created_at'], unique=False)
    op.create_index(op.f('ix_equipment_collections_distribution_id'), 'equipment_collections', ['distribution_id'], unique=False)
    op.create_index(op.f('ix_equipment_collections_equipment_item_id'), 'equipment_collections', ['equipment_item_id'], unique=False)
    op.create_index(op.f('ix_equipment_collections_is_deleted'), 'equipment_collections', ['is_deleted'], unique=False)
    op.create_index(op.f('ix_equipment_collections_returned_to_location_id'), 'equipment_collections', ['returned_to_location_id'], unique=False)
    op.create_table('equipment_stock_movements',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('equipment_type_id', sa.Integer(), nullable=False),
    sa.Column('equipment_item_id', sa.Integer(), nullable=True),
    sa.Column('location_id', sa.Integer(), nullable=True),
    sa.Column('movement_type', sa.Enum('inbound', 'issue', 'return', 'adjustment', 'write_off', name='stock_movement_type'), nullable=False),
    sa.Column('quantity_delta', sa.Integer(), nullable=False),
    sa.Column('distribution_id', sa.Integer(), nullable=True),
    sa.Column('collection_id', sa.Integer(), nullable=True),
    sa.Column('moved_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('created_by_id', sa.Integer(), nullable=True),
    sa.Column('notes', sa.Text(), nullable=True),
    sa.ForeignKeyConstraint(['collection_id'], ['equipment_collections.id'], name=op.f('fk_equipment_stock_movements_collection_id_equipment_collections'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['created_by_id'], ['users.id'], name=op.f('fk_equipment_stock_movements_created_by_id_users'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['distribution_id'], ['equipment_distributions.id'], name=op.f('fk_equipment_stock_movements_distribution_id_equipment_distributions'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['equipment_item_id'], ['equipment_items.id'], name=op.f('fk_equipment_stock_movements_equipment_item_id_equipment_items'), ondelete='SET NULL'),
    sa.ForeignKeyConstraint(['equipment_type_id'], ['equipment_types.id'], name=op.f('fk_equipment_stock_movements_equipment_type_id_equipment_types'), ondelete='RESTRICT'),
    sa.ForeignKeyConstraint(['location_id'], ['locations.id'], name=op.f('fk_equipment_stock_movements_location_id_locations'), ondelete='SET NULL'),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_equipment_stock_movements'))
    )
    op.create_index(op.f('ix_equipment_stock_movements_equipment_item_id'), 'equipment_stock_movements', ['equipment_item_id'], unique=False)
    op.create_index(op.f('ix_equipment_stock_movements_equipment_type_id'), 'equipment_stock_movements', ['equipment_type_id'], unique=False)
    op.create_index(op.f('ix_equipment_stock_movements_location_id'), 'equipment_stock_movements', ['location_id'], unique=False)
    op.create_index(op.f('ix_equipment_stock_movements_moved_at'), 'equipment_stock_movements', ['moved_at'], unique=False)
    op.create_index(op.f('ix_equipment_stock_movements_movement_type'), 'equipment_stock_movements', ['movement_type'], unique=False)
    op.create_index('ix_stock_movements_type_moved_at', 'equipment_stock_movements', ['equipment_type_id', 'moved_at'], unique=False)
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_index('ix_stock_movements_type_moved_at', table_name='equipment_stock_movements')
    op.drop_index(op.f('ix_equipment_stock_movements_movement_type'), table_name='equipment_stock_movements')
    op.drop_index(op.f('ix_equipment_stock_movements_moved_at'), table_name='equipment_stock_movements')
    op.drop_index(op.f('ix_equipment_stock_movements_location_id'), table_name='equipment_stock_movements')
    op.drop_index(op.f('ix_equipment_stock_movements_equipment_type_id'), table_name='equipment_stock_movements')
    op.drop_index(op.f('ix_equipment_stock_movements_equipment_item_id'), table_name='equipment_stock_movements')
    op.drop_table('equipment_stock_movements')
    op.drop_index(op.f('ix_equipment_collections_returned_to_location_id'), table_name='equipment_collections')
    op.drop_index(op.f('ix_equipment_collections_is_deleted'), table_name='equipment_collections')
    op.drop_index(op.f('ix_equipment_collections_equipment_item_id'), table_name='equipment_collections')
    op.drop_index(op.f('ix_equipment_collections_distribution_id'), table_name='equipment_collections')
    op.drop_index(op.f('ix_equipment_collections_created_at'), table_name='equipment_collections')
    op.drop_index(op.f('ix_equipment_collections_collected_at'), table_name='equipment_collections')
    op.drop_table('equipment_collections')
    op.drop_index(op.f('ix_complaint_status_history_complaint_id'), table_name='complaint_status_history')
    op.drop_index(op.f('ix_complaint_status_history_changed_at'), table_name='complaint_status_history')
    op.drop_table('complaint_status_history')
    op.drop_index(op.f('ix_equipment_distributions_status'), table_name='equipment_distributions')
    op.drop_index(op.f('ix_equipment_distributions_issued_to_user_id'), table_name='equipment_distributions')
    op.drop_index(op.f('ix_equipment_distributions_issued_to_customer_id'), table_name='equipment_distributions')
    op.drop_index(op.f('ix_equipment_distributions_issued_at'), table_name='equipment_distributions')
    op.drop_index(op.f('ix_equipment_distributions_is_deleted'), table_name='equipment_distributions')
    op.drop_index(op.f('ix_equipment_distributions_expected_return_date'), table_name='equipment_distributions')
    op.drop_index(op.f('ix_equipment_distributions_equipment_item_id'), table_name='equipment_distributions')
    op.drop_index(op.f('ix_equipment_distributions_created_at'), table_name='equipment_distributions')
    op.drop_index(op.f('ix_equipment_distributions_connection_id'), table_name='equipment_distributions')
    op.drop_index(op.f('ix_equipment_distributions_connection_application_id'), table_name='equipment_distributions')
    op.drop_index('ix_distributions_status_expected_return', table_name='equipment_distributions')
    op.drop_table('equipment_distributions')
    op.drop_index(op.f('ix_complaints_ticket_no'), table_name='complaints')
    op.drop_index('ix_complaints_technician_status', table_name='complaints')
    op.drop_index('ix_complaints_status_reported_at', table_name='complaints')
    op.drop_index(op.f('ix_complaints_status'), table_name='complaints')
    op.drop_index(op.f('ix_complaints_resolved_at'), table_name='complaints')
    op.drop_index(op.f('ix_complaints_reported_at'), table_name='complaints')
    op.drop_index('ix_complaints_priority_status', table_name='complaints')
    op.drop_index(op.f('ix_complaints_priority'), table_name='complaints')
    op.drop_index(op.f('ix_complaints_is_deleted'), table_name='complaints')
    op.drop_index(op.f('ix_complaints_created_at'), table_name='complaints')
    op.drop_index(op.f('ix_complaints_connection_id'), table_name='complaints')
    op.drop_index(op.f('ix_complaints_complaint_type'), table_name='complaints')
    op.drop_index(op.f('ix_complaints_assigned_technician_id'), table_name='complaints')
    op.drop_table('complaints')
    op.drop_index('ix_equipment_items_type_status', table_name='equipment_items')
    op.drop_index('ix_equipment_items_type_location', table_name='equipment_items')
    op.drop_index(op.f('ix_equipment_items_status'), table_name='equipment_items')
    op.drop_index(op.f('ix_equipment_items_serial_number'), table_name='equipment_items')
    op.drop_index(op.f('ix_equipment_items_location_id'), table_name='equipment_items')
    op.drop_index(op.f('ix_equipment_items_is_deleted'), table_name='equipment_items')
    op.drop_index(op.f('ix_equipment_items_holder_user_id'), table_name='equipment_items')
    op.drop_index(op.f('ix_equipment_items_holder_type'), table_name='equipment_items')
    op.drop_index(op.f('ix_equipment_items_holder_customer_id'), table_name='equipment_items')
    op.drop_index(op.f('ix_equipment_items_equipment_type_id'), table_name='equipment_items')
    op.drop_index(op.f('ix_equipment_items_created_at'), table_name='equipment_items')
    op.drop_index(op.f('ix_equipment_items_condition'), table_name='equipment_items')
    op.drop_table('equipment_items')
    op.drop_index(op.f('ix_connections_status'), table_name='connections')
    op.drop_index(op.f('ix_connections_package_id'), table_name='connections')
    op.drop_index(op.f('ix_connections_is_deleted'), table_name='connections')
    op.drop_index(op.f('ix_connections_customer_id'), table_name='connections')
    op.drop_index(op.f('ix_connections_created_at'), table_name='connections')
    op.drop_index(op.f('ix_connections_connection_code'), table_name='connections')
    op.drop_index(op.f('ix_connections_area_id'), table_name='connections')
    op.drop_index(op.f('ix_connections_activated_on'), table_name='connections')
    op.drop_table('connections')
    op.drop_index(op.f('ix_application_status_history_changed_at'), table_name='application_status_history')
    op.drop_index(op.f('ix_application_status_history_application_id'), table_name='application_status_history')
    op.drop_table('application_status_history')
    op.drop_index(op.f('ix_application_documents_is_deleted'), table_name='application_documents')
    op.drop_index(op.f('ix_application_documents_created_at'), table_name='application_documents')
    op.drop_index(op.f('ix_application_documents_application_id'), table_name='application_documents')
    op.drop_table('application_documents')
    op.drop_index(op.f('ix_customers_phone'), table_name='customers')
    op.drop_index(op.f('ix_customers_nid'), table_name='customers')
    op.drop_index(op.f('ix_customers_is_deleted'), table_name='customers')
    op.drop_index('ix_customers_full_name', table_name='customers')
    op.drop_index(op.f('ix_customers_customer_code'), table_name='customers')
    op.drop_index(op.f('ix_customers_created_at'), table_name='customers')
    op.drop_index(op.f('ix_customers_area_id'), table_name='customers')
    op.drop_table('customers')
    op.drop_index(op.f('ix_connection_applications_status'), table_name='connection_applications')
    op.drop_index(op.f('ix_connection_applications_requested_date'), table_name='connection_applications')
    op.drop_index(op.f('ix_connection_applications_phone'), table_name='connection_applications')
    op.drop_index(op.f('ix_connection_applications_package_id'), table_name='connection_applications')
    op.drop_index(op.f('ix_connection_applications_nid'), table_name='connection_applications')
    op.drop_index(op.f('ix_connection_applications_is_deleted'), table_name='connection_applications')
    op.drop_index(op.f('ix_connection_applications_created_at'), table_name='connection_applications')
    op.drop_index(op.f('ix_connection_applications_assigned_technician_id'), table_name='connection_applications')
    op.drop_index(op.f('ix_connection_applications_area_id'), table_name='connection_applications')
    op.drop_index(op.f('ix_connection_applications_application_no'), table_name='connection_applications')
    op.drop_index('ix_applications_status_requested_date', table_name='connection_applications')
    op.drop_index('ix_applications_area_status', table_name='connection_applications')
    op.drop_index('ix_applications_applicant_name', table_name='connection_applications')
    op.drop_table('connection_applications')
    op.drop_index(op.f('ix_audit_logs_user_id'), table_name='audit_logs')
    op.drop_index('ix_audit_logs_entity', table_name='audit_logs')
    op.drop_index(op.f('ix_audit_logs_created_at'), table_name='audit_logs')
    op.drop_index(op.f('ix_audit_logs_action'), table_name='audit_logs')
    op.drop_table('audit_logs')
    op.drop_index(op.f('ix_areas_zone_id'), table_name='areas')
    op.drop_index(op.f('ix_areas_is_deleted'), table_name='areas')
    op.drop_index(op.f('ix_areas_created_at'), table_name='areas')
    op.drop_index(op.f('ix_areas_code'), table_name='areas')
    op.drop_table('areas')
    op.drop_index(op.f('ix_zones_is_deleted'), table_name='zones')
    op.drop_index(op.f('ix_zones_created_at'), table_name='zones')
    op.drop_index(op.f('ix_zones_code'), table_name='zones')
    op.drop_table('zones')
    op.drop_index('ix_users_role_active', table_name='users')
    op.drop_index(op.f('ix_users_role'), table_name='users')
    op.drop_index(op.f('ix_users_phone'), table_name='users')
    op.drop_index(op.f('ix_users_is_deleted'), table_name='users')
    op.drop_index(op.f('ix_users_email'), table_name='users')
    op.drop_index(op.f('ix_users_created_at'), table_name='users')
    op.drop_table('users')
    op.drop_index(op.f('ix_sla_policies_created_at'), table_name='sla_policies')
    op.drop_table('sla_policies')
    op.drop_index(op.f('ix_packages_is_deleted'), table_name='packages')
    op.drop_index(op.f('ix_packages_created_at'), table_name='packages')
    op.drop_table('packages')
    op.drop_index(op.f('ix_locations_is_deleted'), table_name='locations')
    op.drop_index(op.f('ix_locations_created_at'), table_name='locations')
    op.drop_index(op.f('ix_locations_code'), table_name='locations')
    op.drop_table('locations')
    op.drop_index(op.f('ix_equipment_types_is_deleted'), table_name='equipment_types')
    op.drop_index(op.f('ix_equipment_types_created_at'), table_name='equipment_types')
    op.drop_index(op.f('ix_equipment_types_code'), table_name='equipment_types')
    op.drop_table('equipment_types')
    # ### end Alembic commands ###

    # Autogenerate creates native enum types but never drops them; without this
    # a downgrade->upgrade cycle fails with "type ... already exists".
    for enum_name in (
        'application_status',
        'complaint_priority',
        'complaint_status',
        'complaint_type',
        'connection_status',
        'distribution_status',
        'document_type',
        'equipment_condition',
        'equipment_item_status',
        'holder_type',
        'location_type',
        'stock_movement_type',
        'user_role',
    ):
        op.execute(sa.text(f'DROP TYPE IF EXISTS {enum_name}'))
