diff --git a/app/Domains/Tenant/Models/Tenant.php b/app/Domains/Tenant/Models/Tenant.php index fdc8ae3..81949da 100644 --- a/app/Domains/Tenant/Models/Tenant.php +++ b/app/Domains/Tenant/Models/Tenant.php @@ -17,6 +17,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany; 'primary_color', 'secondary_color', 'danger_color', + 'success_color', 'header_footer_bg_color', 'header_logo_id', 'footer_logo_id', diff --git a/app/Domains/Tenant/Requests/StoreTenantRequest.php b/app/Domains/Tenant/Requests/StoreTenantRequest.php index 8e01975..4aea0ba 100644 --- a/app/Domains/Tenant/Requests/StoreTenantRequest.php +++ b/app/Domains/Tenant/Requests/StoreTenantRequest.php @@ -56,6 +56,7 @@ class StoreTenantRequest extends FormRequest 'primary_color' => ['required', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'secondary_color' => ['required', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'danger_color' => ['required', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], + 'success_color' => ['required', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'header_footer_bg_color' => ['required', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'header_logo' => $logoRule, 'footer_logo' => $logoRule, diff --git a/app/Domains/Tenant/Requests/UpdateTenantRequest.php b/app/Domains/Tenant/Requests/UpdateTenantRequest.php index c8c15c6..173ba49 100644 --- a/app/Domains/Tenant/Requests/UpdateTenantRequest.php +++ b/app/Domains/Tenant/Requests/UpdateTenantRequest.php @@ -67,6 +67,7 @@ class UpdateTenantRequest extends FormRequest 'primary_color' => ['nullable', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'secondary_color' => ['nullable', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'danger_color' => ['nullable', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], + 'success_color' => ['nullable', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'header_footer_bg_color' => ['nullable', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'header_logo' => $logoRule, 'footer_logo' => $logoRule, diff --git a/app/Domains/Tenant/Resources/TenantResource.php b/app/Domains/Tenant/Resources/TenantResource.php index 3b82fdc..dd357b8 100644 --- a/app/Domains/Tenant/Resources/TenantResource.php +++ b/app/Domains/Tenant/Resources/TenantResource.php @@ -23,6 +23,7 @@ class TenantResource extends JsonResource 'primary_color' => $this->primary_color, 'secondary_color' => $this->secondary_color, 'danger_color' => $this->danger_color, + 'success_color' => $this->success_color, 'header_footer_bg_color' => $this->header_footer_bg_color, // 1 day 'header_logo' => $this->headerLogo?->getTemporaryUrl(1440), diff --git a/database/migrations/2026_07_01_114500_add_success_color_to_tenants_table.php b/database/migrations/2026_07_01_114500_add_success_color_to_tenants_table.php new file mode 100644 index 0000000..b390ba5 --- /dev/null +++ b/database/migrations/2026_07_01_114500_add_success_color_to_tenants_table.php @@ -0,0 +1,28 @@ +string('success_color')->default('#28a745')->after('danger_color'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('tenants', function (Blueprint $table) { + $table->dropColumn('success_color'); + }); + } +}; diff --git a/database/seeders/TenantSeeder.php b/database/seeders/TenantSeeder.php index 1794e21..73791cb 100644 --- a/database/seeders/TenantSeeder.php +++ b/database/seeders/TenantSeeder.php @@ -74,6 +74,7 @@ class TenantSeeder extends Seeder 'primary_color' => '#6376F3', 'secondary_color' => '#A0A0A0', 'danger_color' => '#FF8888', + 'success_color' => '#198754', 'header_footer_bg_color' => '#313131', 'header_logo' => $headerLogo, 'footer_logo' => $footerLogo, diff --git a/tests/Feature/Cart/CartControllerTest.php b/tests/Feature/Cart/CartControllerTest.php index a9d3fd4..dcd53d7 100644 --- a/tests/Feature/Cart/CartControllerTest.php +++ b/tests/Feature/Cart/CartControllerTest.php @@ -324,6 +324,7 @@ class CartControllerTest extends TestCase 'primary_color' => '#111111', 'secondary_color' => '#222222', 'danger_color' => '#333333', + 'success_color' => '#28a745', 'header_footer_bg_color' => '#444444', 'header_logo_id' => $headerAttachment->id, 'footer_logo_id' => $footerAttachment->id, diff --git a/tests/Feature/Catalog/AttributeControllerTest.php b/tests/Feature/Catalog/AttributeControllerTest.php index ca3f36a..b1b3ed8 100644 --- a/tests/Feature/Catalog/AttributeControllerTest.php +++ b/tests/Feature/Catalog/AttributeControllerTest.php @@ -122,6 +122,7 @@ class AttributeControllerTest extends TestCase 'primary_color' => '#111111', 'secondary_color' => '#222222', 'danger_color' => '#333333', + 'success_color' => '#28a745', 'header_footer_bg_color' => '#444444', 'header_logo_id' => $headerAttachment->id, 'footer_logo_id' => $footerAttachment->id, diff --git a/tests/Feature/Catalog/ProductControllerTest.php b/tests/Feature/Catalog/ProductControllerTest.php index 1a82ff6..d663447 100644 --- a/tests/Feature/Catalog/ProductControllerTest.php +++ b/tests/Feature/Catalog/ProductControllerTest.php @@ -806,6 +806,7 @@ class ProductControllerTest extends TestCase 'primary_color' => '#111111', 'secondary_color' => '#222222', 'danger_color' => '#333333', + 'success_color' => '#28a745', 'header_footer_bg_color' => '#444444', 'header_logo_id' => $headerAttachment->id, 'footer_logo_id' => $footerAttachment->id, diff --git a/tests/Feature/Catalog/ProductVariantAttachmentTest.php b/tests/Feature/Catalog/ProductVariantAttachmentTest.php index b1e9927..23fc89f 100644 --- a/tests/Feature/Catalog/ProductVariantAttachmentTest.php +++ b/tests/Feature/Catalog/ProductVariantAttachmentTest.php @@ -41,6 +41,7 @@ class ProductVariantAttachmentTest extends TestCase 'primary_color' => '#ffffff', 'secondary_color' => '#ffffff', 'danger_color' => '#ffffff', + 'success_color' => '#ffffff', 'header_footer_bg_color' => '#ffffff', 'header_logo_id' => $headerAttachment->id, 'footer_logo_id' => $footerAttachment->id, diff --git a/tests/Feature/Tenant/BootstrapTenantControllerTest.php b/tests/Feature/Tenant/BootstrapTenantControllerTest.php index 7ba822f..0730f97 100644 --- a/tests/Feature/Tenant/BootstrapTenantControllerTest.php +++ b/tests/Feature/Tenant/BootstrapTenantControllerTest.php @@ -40,6 +40,7 @@ class BootstrapTenantControllerTest extends TestCase 'primary_color' => '#ff0000', 'secondary_color' => '#00ff00', 'danger_color' => '#0000ff', + 'success_color' => '#00ff00', 'header_footer_bg_color' => '#ffffff', 'header_logo_id' => $headerAttachment->id, 'footer_logo_id' => $footerAttachment->id, @@ -54,6 +55,7 @@ class BootstrapTenantControllerTest extends TestCase ->assertJsonPath('data.primary_color', '#ff0000') ->assertJsonPath('data.secondary_color', '#00ff00') ->assertJsonPath('data.danger_color', '#0000ff') + ->assertJsonPath('data.success_color', '#00ff00') ->assertJsonPath('data.header_footer_bg_color', '#ffffff'); $headerUrl = $response->json('data.header_logo'); @@ -107,6 +109,7 @@ class BootstrapTenantControllerTest extends TestCase 'primary_color' => '#111111', 'secondary_color' => '#222222', 'danger_color' => '#333333', + 'success_color' => '#555555', 'header_footer_bg_color' => '#444444', 'header_logo' => $base64Image, 'footer_logo' => $base64Image, @@ -118,6 +121,7 @@ class BootstrapTenantControllerTest extends TestCase ->assertJsonPath('data.primary_color', '#111111') ->assertJsonPath('data.secondary_color', '#222222') ->assertJsonPath('data.danger_color', '#333333') + ->assertJsonPath('data.success_color', '#555555') ->assertJsonPath('data.header_footer_bg_color', '#444444'); $tenant = Tenant::query()->with(['headerLogo', 'footerLogo'])->where('codigo', 'acme')->firstOrFail(); @@ -130,6 +134,7 @@ class BootstrapTenantControllerTest extends TestCase 'primary_color' => '#111111', 'secondary_color' => '#222222', 'danger_color' => '#333333', + 'success_color' => '#555555', 'header_footer_bg_color' => '#444444', 'header_logo_id' => $tenant->header_logo_id, 'footer_logo_id' => $tenant->footer_logo_id, @@ -154,6 +159,7 @@ class BootstrapTenantControllerTest extends TestCase 'primary_color' => '#111111', 'secondary_color' => '#222222', 'danger_color' => '#333333', + 'success_color' => '#555555', 'header_footer_bg_color' => '#444444', 'header_logo' => (string) Str::uuid(), 'footer_logo' => (string) Str::uuid(), @@ -203,6 +209,7 @@ class BootstrapTenantControllerTest extends TestCase 'primary_color' => '#555555', 'secondary_color' => '#666666', 'danger_color' => '#777777', + 'success_color' => '#999999', 'header_footer_bg_color' => '#888888', 'header_logo' => $hdrUuid, 'footer_logo' => $ftrUuid, @@ -215,6 +222,7 @@ class BootstrapTenantControllerTest extends TestCase ->assertJsonPath('data.primary_color', '#555555') ->assertJsonPath('data.secondary_color', '#666666') ->assertJsonPath('data.danger_color', '#777777') + ->assertJsonPath('data.success_color', '#999999') ->assertJsonPath('data.header_footer_bg_color', '#888888'); $headerUrl = $successfulResponse->json('data.header_logo'); @@ -234,6 +242,7 @@ class BootstrapTenantControllerTest extends TestCase 'primary_color' => '#555555', 'secondary_color' => '#666666', 'danger_color' => '#777777', + 'success_color' => '#999999', 'header_footer_bg_color' => '#888888', 'header_logo_id' => $hdrAttachment->id, 'footer_logo_id' => $ftrAttachment->id, @@ -286,6 +295,7 @@ class BootstrapTenantControllerTest extends TestCase 'primary_color' => 'invalid-color', 'secondary_color' => '#222222', 'danger_color' => '#333333', + 'success_color' => '#555555', 'header_footer_bg_color' => '#444444', 'header_logo' => (string) Str::uuid(), 'footer_logo' => (string) Str::uuid(), @@ -300,12 +310,28 @@ class BootstrapTenantControllerTest extends TestCase 'primary_color' => '#12345', 'secondary_color' => '#222222', 'danger_color' => '#333333', + 'success_color' => '#555555', 'header_footer_bg_color' => '#444444', 'header_logo' => (string) Str::uuid(), 'footer_logo' => (string) Str::uuid(), ]); $response2->assertJsonValidationErrors(['primary_color']); + + $response3 = $this->postJson('/api/tenants', [ + 'codigo' => 'acme', + 'nombre' => 'Acme', + 'dominio' => 'acme.com', + 'primary_color' => '#111111', + 'secondary_color' => '#222222', + 'danger_color' => '#333333', + 'success_color' => 'invalid-color', + 'header_footer_bg_color' => '#444444', + 'header_logo' => (string) Str::uuid(), + 'footer_logo' => (string) Str::uuid(), + ]); + + $response3->assertJsonValidationErrors(['success_color']); } public function test_it_validates_logo_must_be_image_or_svg(): void @@ -319,6 +345,7 @@ class BootstrapTenantControllerTest extends TestCase 'primary_color' => '#111111', 'secondary_color' => '#222222', 'danger_color' => '#333333', + 'success_color' => '#555555', 'header_footer_bg_color' => '#444444', 'header_logo' => UploadedFile::fake()->create('document.pdf', 10, 'application/pdf'), 'footer_logo' => (string) Str::uuid(), @@ -333,6 +360,7 @@ class BootstrapTenantControllerTest extends TestCase 'primary_color' => '#111111', 'secondary_color' => '#222222', 'danger_color' => '#333333', + 'success_color' => '#555555', 'header_footer_bg_color' => '#444444', 'header_logo' => 'data:application/pdf;base64,JVBERi0xLjQKJdcfqksKMSAwIG9iagogIDw8IC9UeXBlIC9DYXRhbG9nCiAgICAvUGFnZXMgMiAwIFI...', 'footer_logo' => (string) Str::uuid(), @@ -355,6 +383,7 @@ class BootstrapTenantControllerTest extends TestCase 'primary_color' => '#111111', 'secondary_color' => '#222222', 'danger_color' => '#333333', + 'success_color' => '#555555', 'header_footer_bg_color' => '#444444', 'header_logo' => $header, 'footer_logo' => $footer, @@ -410,6 +439,7 @@ class BootstrapTenantControllerTest extends TestCase 'primary_color' => '#ff0000', 'secondary_color' => '#00ff00', 'danger_color' => '#0000ff', + 'success_color' => '#00ff00', 'header_footer_bg_color' => '#ffffff', 'header_logo_id' => $headerAttachment->id, 'footer_logo_id' => $footerAttachment->id, @@ -438,6 +468,7 @@ class BootstrapTenantControllerTest extends TestCase 'primary_color' => '#111111', 'secondary_color' => '#222222', 'danger_color' => '#333333', + 'success_color' => '#555555', 'header_footer_bg_color' => '#444444', 'header_logo' => $base64Image, 'footer_logo' => $ftrUuid,