diff --git a/elastic/migrations/2025_08_31_221640_create_invoices_index.php b/elastic/migrations/2025_08_31_221640_create_invoices_index.php index aad798f900..e7e1b78bb8 100644 --- a/elastic/migrations/2025_08_31_221640_create_invoices_index.php +++ b/elastic/migrations/2025_08_31_221640_create_invoices_index.php @@ -5,6 +5,7 @@ use Elastic\Adapter\Indices\Mapping; use Elastic\Adapter\Indices\Settings; use Elastic\Migrations\Facades\Index; use Elastic\Migrations\MigrationInterface; +use Elastic\Elasticsearch\ClientBuilder; final class CreateInvoicesIndex implements MigrationInterface { @@ -13,6 +14,12 @@ final class CreateInvoicesIndex implements MigrationInterface */ public function up(): void { + // Check if index already exists (idempotency) + $client = ClientBuilder::fromConfig(config('elastic.client.connections.default')); + if ($client->indices()->exists(['index' => 'invoices_v2'])) { + return; // Index already exists, skip creation + } + $mapping = [ 'properties' => [ // Core invoice fields diff --git a/elastic/migrations/2025_08_31_221641_create_quotes_index.php b/elastic/migrations/2025_08_31_221641_create_quotes_index.php index 64b88795b9..476510d0ea 100644 --- a/elastic/migrations/2025_08_31_221641_create_quotes_index.php +++ b/elastic/migrations/2025_08_31_221641_create_quotes_index.php @@ -5,6 +5,7 @@ use Elastic\Adapter\Indices\Mapping; use Elastic\Adapter\Indices\Settings; use Elastic\Migrations\Facades\Index; use Elastic\Migrations\MigrationInterface; +use Elastic\Elasticsearch\ClientBuilder; final class CreateQuotesIndex implements MigrationInterface { @@ -13,6 +14,12 @@ final class CreateQuotesIndex implements MigrationInterface */ public function up(): void { + // Check if index already exists (idempotency) + $client = ClientBuilder::fromConfig(config('elastic.client.connections.default')); + if ($client->indices()->exists(['index' => 'quotes_v2'])) { + return; // Index already exists, skip creation + } + $mapping = [ 'properties' => [ // Core quote fields diff --git a/elastic/migrations/2025_08_31_221642_create_credits_index.php b/elastic/migrations/2025_08_31_221642_create_credits_index.php index ab95e05d40..1fe57cdbf4 100644 --- a/elastic/migrations/2025_08_31_221642_create_credits_index.php +++ b/elastic/migrations/2025_08_31_221642_create_credits_index.php @@ -5,6 +5,7 @@ use Elastic\Adapter\Indices\Mapping; use Elastic\Adapter\Indices\Settings; use Elastic\Migrations\Facades\Index; use Elastic\Migrations\MigrationInterface; +use Elastic\Elasticsearch\ClientBuilder; final class CreateCreditsIndex implements MigrationInterface { @@ -13,6 +14,12 @@ final class CreateCreditsIndex implements MigrationInterface */ public function up(): void { + // Check if index already exists (idempotency) + $client = ClientBuilder::fromConfig(config('elastic.client.connections.default')); + if ($client->indices()->exists(['index' => 'credits_v2'])) { + return; // Index already exists, skip creation + } + $mapping = [ 'properties' => [ // Core credit fields diff --git a/elastic/migrations/2025_08_31_221643_create_recurring_invoices_index.php b/elastic/migrations/2025_08_31_221643_create_recurring_invoices_index.php index 53e5086ac4..4533c5a6dd 100644 --- a/elastic/migrations/2025_08_31_221643_create_recurring_invoices_index.php +++ b/elastic/migrations/2025_08_31_221643_create_recurring_invoices_index.php @@ -5,6 +5,7 @@ use Elastic\Adapter\Indices\Mapping; use Elastic\Adapter\Indices\Settings; use Elastic\Migrations\Facades\Index; use Elastic\Migrations\MigrationInterface; +use Elastic\Elasticsearch\ClientBuilder; final class CreateRecurringInvoicesIndex implements MigrationInterface { @@ -13,9 +14,11 @@ final class CreateRecurringInvoicesIndex implements MigrationInterface */ public function up(): void { - // Force drop any existing indices to avoid mapping conflicts - Index::dropIfExists('recurring_invoices_v2'); - Index::dropIfExists('recurring_invoices'); + // Check if index already exists (idempotency) + $client = ClientBuilder::fromConfig(config('elastic.client.connections.default')); + if ($client->indices()->exists(['index' => 'recurring_invoices_v2'])) { + return; // Index already exists, skip creation + } $mapping = [ 'properties' => [ diff --git a/elastic/migrations/2025_08_31_221644_create_purchase_orders_index.php b/elastic/migrations/2025_08_31_221644_create_purchase_orders_index.php index 6b765a6e16..028bd345af 100644 --- a/elastic/migrations/2025_08_31_221644_create_purchase_orders_index.php +++ b/elastic/migrations/2025_08_31_221644_create_purchase_orders_index.php @@ -5,6 +5,7 @@ use Elastic\Adapter\Indices\Mapping; use Elastic\Adapter\Indices\Settings; use Elastic\Migrations\Facades\Index; use Elastic\Migrations\MigrationInterface; +use Elastic\Elasticsearch\ClientBuilder; final class CreatePurchaseOrdersIndex implements MigrationInterface { @@ -13,6 +14,12 @@ final class CreatePurchaseOrdersIndex implements MigrationInterface */ public function up(): void { + // Check if index already exists (idempotency) + $client = ClientBuilder::fromConfig(config('elastic.client.connections.default')); + if ($client->indices()->exists(['index' => 'purchase_orders_v2'])) { + return; // Index already exists, skip creation + } + $mapping = [ 'properties' => [ // Core purchase order fields diff --git a/elastic/migrations/2025_08_31_221645_create_vendors_index.php b/elastic/migrations/2025_08_31_221645_create_vendors_index.php index f38f87cfdf..76ea3b4b13 100644 --- a/elastic/migrations/2025_08_31_221645_create_vendors_index.php +++ b/elastic/migrations/2025_08_31_221645_create_vendors_index.php @@ -5,6 +5,7 @@ use Elastic\Adapter\Indices\Mapping; use Elastic\Adapter\Indices\Settings; use Elastic\Migrations\Facades\Index; use Elastic\Migrations\MigrationInterface; +use Elastic\Elasticsearch\ClientBuilder; final class CreateVendorsIndex implements MigrationInterface { @@ -13,6 +14,12 @@ final class CreateVendorsIndex implements MigrationInterface */ public function up(): void { + // Check if index already exists (idempotency) + $client = ClientBuilder::fromConfig(config('elastic.client.connections.default')); + if ($client->indices()->exists(['index' => 'vendors_v2'])) { + return; // Index already exists, skip creation + } + $mapping = [ 'properties' => [ // Core vendor fields diff --git a/elastic/migrations/2025_08_31_221646_create_expenses_index.php b/elastic/migrations/2025_08_31_221646_create_expenses_index.php index d847e95107..9a8fc4257e 100644 --- a/elastic/migrations/2025_08_31_221646_create_expenses_index.php +++ b/elastic/migrations/2025_08_31_221646_create_expenses_index.php @@ -5,6 +5,7 @@ use Elastic\Adapter\Indices\Mapping; use Elastic\Adapter\Indices\Settings; use Elastic\Migrations\Facades\Index; use Elastic\Migrations\MigrationInterface; +use Elastic\Elasticsearch\ClientBuilder; final class CreateExpensesIndex implements MigrationInterface { @@ -13,6 +14,12 @@ final class CreateExpensesIndex implements MigrationInterface */ public function up(): void { + // Check if index already exists (idempotency) + $client = ClientBuilder::fromConfig(config('elastic.client.connections.default')); + if ($client->indices()->exists(['index' => 'expenses_v2'])) { + return; // Index already exists, skip creation + } + $mapping = [ 'properties' => [ // Core expense fields diff --git a/elastic/migrations/2025_08_31_221647_create_projects_index.php b/elastic/migrations/2025_08_31_221647_create_projects_index.php index 6cc21c0f84..f6d09e821c 100644 --- a/elastic/migrations/2025_08_31_221647_create_projects_index.php +++ b/elastic/migrations/2025_08_31_221647_create_projects_index.php @@ -5,6 +5,7 @@ use Elastic\Adapter\Indices\Mapping; use Elastic\Adapter\Indices\Settings; use Elastic\Migrations\Facades\Index; use Elastic\Migrations\MigrationInterface; +use Elastic\Elasticsearch\ClientBuilder; final class CreateProjectsIndex implements MigrationInterface { @@ -13,6 +14,12 @@ final class CreateProjectsIndex implements MigrationInterface */ public function up(): void { + // Check if index already exists (idempotency) + $client = ClientBuilder::fromConfig(config('elastic.client.connections.default')); + if ($client->indices()->exists(['index' => 'projects_v2'])) { + return; // Index already exists, skip creation + } + $mapping = [ 'properties' => [ // Core project fields diff --git a/elastic/migrations/2025_08_31_221648_create_tasks_index.php b/elastic/migrations/2025_08_31_221648_create_tasks_index.php index 30aeedf806..7dcbd9fa9d 100644 --- a/elastic/migrations/2025_08_31_221648_create_tasks_index.php +++ b/elastic/migrations/2025_08_31_221648_create_tasks_index.php @@ -5,6 +5,7 @@ use Elastic\Adapter\Indices\Mapping; use Elastic\Adapter\Indices\Settings; use Elastic\Migrations\Facades\Index; use Elastic\Migrations\MigrationInterface; +use Elastic\Elasticsearch\ClientBuilder; final class CreateTasksIndex implements MigrationInterface { @@ -13,6 +14,12 @@ final class CreateTasksIndex implements MigrationInterface */ public function up(): void { + // Check if index already exists (idempotency) + $client = ClientBuilder::fromConfig(config('elastic.client.connections.default')); + if ($client->indices()->exists(['index' => 'tasks_v2'])) { + return; // Index already exists, skip creation + } + $mapping = [ 'properties' => [ // Core task fields @@ -68,4 +75,3 @@ final class CreateTasksIndex implements MigrationInterface } } - diff --git a/elastic/migrations/2025_08_31_221649_create_client_contacts_index.php b/elastic/migrations/2025_08_31_221649_create_client_contacts_index.php index 4d19002bd4..2883a77b59 100644 --- a/elastic/migrations/2025_08_31_221649_create_client_contacts_index.php +++ b/elastic/migrations/2025_08_31_221649_create_client_contacts_index.php @@ -5,6 +5,7 @@ use Elastic\Adapter\Indices\Mapping; use Elastic\Adapter\Indices\Settings; use Elastic\Migrations\Facades\Index; use Elastic\Migrations\MigrationInterface; +use Elastic\Elasticsearch\ClientBuilder; final class CreateClientContactsIndex implements MigrationInterface { @@ -13,6 +14,12 @@ final class CreateClientContactsIndex implements MigrationInterface */ public function up(): void { + // Check if index already exists (idempotency) + $client = ClientBuilder::fromConfig(config('elastic.client.connections.default')); + if ($client->indices()->exists(['index' => 'client_contacts_v2'])) { + return; // Index already exists, skip creation + } + $mapping = [ 'properties' => [ // Core client contact fields diff --git a/elastic/migrations/2025_08_31_221650_create_vendor_contacts_index.php b/elastic/migrations/2025_08_31_221650_create_vendor_contacts_index.php index 9a8de4da39..f110eea727 100644 --- a/elastic/migrations/2025_08_31_221650_create_vendor_contacts_index.php +++ b/elastic/migrations/2025_08_31_221650_create_vendor_contacts_index.php @@ -5,6 +5,7 @@ use Elastic\Adapter\Indices\Mapping; use Elastic\Adapter\Indices\Settings; use Elastic\Migrations\Facades\Index; use Elastic\Migrations\MigrationInterface; +use Elastic\Elasticsearch\ClientBuilder; final class CreateVendorContactsIndex implements MigrationInterface { @@ -13,6 +14,12 @@ final class CreateVendorContactsIndex implements MigrationInterface */ public function up(): void { + // Check if index already exists (idempotency) + $client = ClientBuilder::fromConfig(config('elastic.client.connections.default')); + if ($client->indices()->exists(['index' => 'vendor_contacts_v2'])) { + return; // Index already exists, skip creation + } + $mapping = [ 'properties' => [ // Core vendor contact fields diff --git a/elastic/migrations/2025_08_31_221651_create_clients_index.php b/elastic/migrations/2025_08_31_221651_create_clients_index.php index c18b69bbed..0b989365b7 100644 --- a/elastic/migrations/2025_08_31_221651_create_clients_index.php +++ b/elastic/migrations/2025_08_31_221651_create_clients_index.php @@ -5,6 +5,7 @@ use Elastic\Adapter\Indices\Mapping; use Elastic\Adapter\Indices\Settings; use Elastic\Migrations\Facades\Index; use Elastic\Migrations\MigrationInterface; +use Elastic\Elasticsearch\ClientBuilder; final class CreateClientsIndex implements MigrationInterface { @@ -13,6 +14,12 @@ final class CreateClientsIndex implements MigrationInterface */ public function up(): void { + // Check if index already exists (idempotency) + $client = ClientBuilder::fromConfig(config('elastic.client.connections.default')); + if ($client->indices()->exists(['index' => 'clients_v2'])) { + return; // Index already exists, skip creation + } + $mapping = [ 'properties' => [ // Core client fields @@ -143,4 +150,3 @@ final class CreateClientsIndex implements MigrationInterface -