--- name: perfex-migrations description: Migrações e upgrades de módulos Perfex CRM — gestão de versões, ficheiros de migração e actualizações de base de dados. Baseado apenas na documentação oficial. layer: wiki --- # /perfex-migrations - Migrations Perfex CRM Sistema de migrações e upgrades de módulos. **Zero assumptions, zero hallucinations** - apenas documentação oficial. --- ## Documentação Base - [Preparing Module Upgrade](https://help.perfexcrm.com/preparing-module-upgrade/) - [Module Basics](https://help.perfexcrm.com/module-basics/) --- ## Como Funciona O Perfex CRM compara: - **Versão no init file** (header `Version:`) - **Versão na base de dados** (tabela `tblmodules`) Se forem diferentes → Sistema mostra "Database upgrade required". --- ## Estrutura de Migrations ``` modules/meu_modulo/ ├── meu_modulo.php # Init file com Version: X.Y.Z └── migrations/ ├── 001_version_100.php # v1.0.0 → v1.0.1 ├── 002_version_101.php # v1.0.1 → v1.0.2 ├── 100_version_100.php # v1.0.0 inicial (alternativa) ├── 110_version_110.php # v1.1.0 └── 200_version_200.php # v2.0.0 ``` --- ## Formato do Ficheiro ### Nomenclatura (CRÍTICO) O Perfex usa **Sequential Migration** (não Timestamp). ``` NNN_version_NNN.php │ │ │ │ │ └── Versão sem pontos (110 = 1.1.0) │ └── Literal "version" └── Número sequencial (3 dígitos, sem gaps) ``` **Exemplos:** | Versão | Ficheiro | |--------|----------| | 1.0.0 | `001_version_100.php` ou `100_version_100.php` | | 1.0.1 | `002_version_101.php` ou `101_version_101.php` | | 1.1.0 | `003_version_110.php` ou `110_version_110.php` | | 2.0.0 | `004_version_200.php` ou `200_version_200.php` | **Convenção recomendada:** Usar versão como prefixo (100, 110, 200...). --- ## Template Migration ```php db->field_exists('new_column', db_prefix() . 'meu_modulo')) { $CI->db->query('ALTER TABLE `' . db_prefix() . 'meu_modulo` ADD COLUMN `new_column` VARCHAR(255) DEFAULT NULL AFTER `name`'); } } } ``` ### Criar Nova Tabela ```php db->table_exists(db_prefix() . 'meu_modulo_items')) { $CI->db->query(' CREATE TABLE `' . db_prefix() . 'meu_modulo_items` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `parent_id` INT(11) UNSIGNED NOT NULL, `name` VARCHAR(255) NOT NULL, `quantity` INT(11) NOT NULL DEFAULT 1, PRIMARY KEY (`id`), KEY `parent_id` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=' . $CI->db->char_set . '; '); } } } ``` ### Modificar Coluna ```php db->query('ALTER TABLE `' . db_prefix() . 'meu_modulo` MODIFY COLUMN `amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00'); } } ``` ### Adicionar Índice ```php db->query('SHOW INDEX FROM `' . db_prefix() . 'meu_modulo` WHERE Key_name = "idx_status"')->result(); if (count($indexes) == 0) { $CI->db->query('ALTER TABLE `' . db_prefix() . 'meu_modulo` ADD INDEX `idx_status` (`status`)'); } } } ``` ### Migração de Dados ```php