U
    ԒFji                     @  s   d Z ddlmZ ddlZddlmZ ddlmZ ee	 j
j
d d d Zd	d	d
dddZd	d	d
dddZd	d	d
dddZddddZddddZddddZddddZddddZd dd!d"ZdS )#uQ   Schema idempotente do catálogo retail (categoria, subcategoria, produto_retail).    )annotationsN)Path)conectarZdeploysqlzretail_catalog_v1.sqlstrbool)tablecolumnreturnc                 C  s   |  d||f |  d k	S )Nz
        SELECT 1 FROM information_schema.COLUMNS
        WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = %s AND COLUMN_NAME = %s
        LIMIT 1
        executefetchone)curr   r	    r   :/var/www/html/LojaOnline/services/retail_catalog_schema.py_column_exists   s
    r   )r   
index_namer
   c                 C  s   |  d||f |  d k	S )Nz
        SELECT 1 FROM information_schema.STATISTICS
        WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = %s AND INDEX_NAME = %s
        LIMIT 1
        r   )r   r   r   r   r   r   _index_exists   s
    r   )r   constraint_namer
   c                 C  s   |  d||f |  d k	S )Nz
        SELECT 1 FROM information_schema.TABLE_CONSTRAINTS
        WHERE CONSTRAINT_SCHEMA = DATABASE()
          AND TABLE_NAME = %s
          AND CONSTRAINT_NAME = %s
          AND CONSTRAINT_TYPE = 'FOREIGN KEY'
        LIMIT 1
        r   )r   r   r   r   r   r   
_fk_exists$   s
    r   None)r
   c                 C  s   |  d d S )Na  
        CREATE TABLE IF NOT EXISTS categoria (
            id INT AUTO_INCREMENT PRIMARY KEY,
            id_cliente INT NOT NULL,
            nome VARCHAR(120) NOT NULL,
            ordem_exibicao INT NOT NULL DEFAULT 0,
            ativo TINYINT(1) NOT NULL DEFAULT 1,
            created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
            updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            UNIQUE KEY uk_categoria_cliente_nome (id_cliente, nome),
            KEY idx_categoria_id_cliente (id_cliente),
            KEY idx_categoria_cliente_ativo_ordem (id_cliente, ativo, ordem_exibicao)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        )r   r   r   r   r   _ensure_categoria_table3   s    r   c                 C  s$   |  d t| dds |  d d S )Na[  
        CREATE TABLE IF NOT EXISTS subcategoria (
            id INT AUTO_INCREMENT PRIMARY KEY,
            id_cliente INT NOT NULL,
            categoria_id INT NOT NULL,
            nome VARCHAR(120) NOT NULL,
            ordem_exibicao INT NOT NULL DEFAULT 0,
            ativo TINYINT(1) NOT NULL DEFAULT 1,
            created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
            updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            UNIQUE KEY uk_subcategoria_cliente_cat_nome (id_cliente, categoria_id, nome),
            KEY idx_subcategoria_id_cliente (id_cliente),
            KEY idx_subcategoria_categoria (categoria_id),
            KEY idx_subcategoria_cliente_ativo_ordem (id_cliente, ativo, ordem_exibicao)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        subcategoriaZfk_subcategoria_categoriaz
            ALTER TABLE subcategoria
            ADD CONSTRAINT fk_subcategoria_categoria
            FOREIGN KEY (categoria_id) REFERENCES categoria(id)
            ON UPDATE CASCADE ON DELETE RESTRICT
            r   r   r   r   r   r   _ensure_subcategoria_tableF   s    r   c                 C  s   t | dds| d t | dds,| d t| ddsB| d t| ddsX| d	 t| dd
sn| d t| dds| d d S )Nprodutoscategory_idzRALTER TABLE produtos ADD COLUMN category_id INT NULL DEFAULT NULL AFTER id_clientesubcategory_idzVALTER TABLE produtos ADD COLUMN subcategory_id INT NULL DEFAULT NULL AFTER category_idZidx_produtos_category_idzCALTER TABLE produtos ADD KEY idx_produtos_category_id (category_id)Zidx_produtos_subcategory_idzIALTER TABLE produtos ADD KEY idx_produtos_subcategory_id (subcategory_id)Zfk_produtos_categoryz
            ALTER TABLE produtos
            ADD CONSTRAINT fk_produtos_category
            FOREIGN KEY (category_id) REFERENCES categoria(id)
            ON UPDATE CASCADE ON DELETE SET NULL
            Zfk_produtos_subcategoryz
            ALTER TABLE produtos
            ADD CONSTRAINT fk_produtos_subcategory
            FOREIGN KEY (subcategory_id) REFERENCES subcategoria(id)
            ON UPDATE CASCADE ON DELETE SET NULL
            )r   r   r   r   r   r   r   r   _ensure_produtos_retail_columnsd   s(    

r   c                 C  s$   |  d t| dds |  d d S )Na  
        CREATE TABLE IF NOT EXISTS produto_retail (
            id INT AUTO_INCREMENT PRIMARY KEY,
            id_cliente INT NOT NULL,
            product_id INT NOT NULL COMMENT 'FK produtos.chave',
            nome_vitrine VARCHAR(200) NULL,
            descricao_vitrine TEXT NULL,
            preco_varejo DECIMAL(10,2) NULL,
            preco_atacado DECIMAL(10,2) NULL,
            comissao DECIMAL(5,2) NULL DEFAULT NULL,
            estoque DECIMAL(12,3) NOT NULL DEFAULT 0,
            permite_venda_sem_estoque TINYINT(1) NOT NULL DEFAULT 0,
            destaque TINYINT(1) NOT NULL DEFAULT 0,
            ativo TINYINT(1) NOT NULL DEFAULT 1,
            ordem_exibicao INT NOT NULL DEFAULT 0,
            created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
            updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            UNIQUE KEY uk_produto_retail_product (product_id),
            KEY idx_produto_retail_id_cliente (id_cliente),
            KEY idx_produto_retail_vitrine (id_cliente, ativo, destaque, ordem_exibicao)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        Zproduto_retailZfk_produto_retail_productz
            ALTER TABLE produto_retail
            ADD CONSTRAINT fk_produto_retail_product
            FOREIGN KEY (product_id) REFERENCES produtos(chave)
            ON UPDATE CASCADE ON DELETE CASCADE
            r   r   r   r   r   _ensure_produto_retail_table   s    r    c                  C  s   d} d}zz:t } |  }t| t| t| t| |   W n` tk
r } zB| r|z| 	  W n tk
rz   Y nX t
d|dd t   W 5 d}~X Y nX W 5 |r|   | r|    X dS )u@   Cria estrutura retail idempotente. Não altera dados existentes.Nz[RETAIL CATALOG SCHEMA ERRO]T)flush)closer   cursorr   r   r   r    commit	Exceptionrollbackprint	traceback	print_exc)connr   er   r   r   ensure_retail_catalog_schema   s.    r,   r   c                   C  s   t S )u;   Caminho do script SQL para execução manual em produção.)	_SQL_FILEr   r   r   r   sql_file_path   s    r.   )__doc__
__future__r   r(   pathlibr   databaser   __file__resolveparentr-   r   r   r   r   r   r   r    r,   r.   r   r   r   r   <module>   s   !$