Recursos para Desenvolvimento Complexo

0.4.4 2020-09-19 01:21 UTC

README

Build Status Total Downloads Latest Stable Version License

Sobre o Siravel

Siravel é um pacote Laravel robusto e completo para desenvolvimento de aplicações complexas multi-tenant, e-commerce e CMS. Desenvolvido pela SierraTecnologia, o Siravel fornece uma arquitetura modular baseada em features, permitindo construir sistemas SaaS corporativos com isolamento de tenants, gerenciamento de negócios e uma ampla gama de funcionalidades prontas para uso.

Principais Características

  • 🏢 Arquitetura Multi-tenant: Isolamento completo por tenant com suporte a database-per-tenant
  • 🎯 Sistema Modular de Features: 13+ módulos plugáveis (Blog, Commerce, Travels, etc.)
  • 🛒 E-commerce Completo: Produtos, pedidos, assinaturas, pagamentos e cupons
  • 📝 CMS Robusto: Páginas, menus, widgets, FAQs com suporte a traduções
  • 🔐 Autenticação Avançada: Suporte a LDAP e autenticação social
  • 🎨 Sistema de Temas: Temas customizáveis com white-label
  • 📊 Business Intelligence: Analytics, relatórios e métricas
  • 🌍 Multi-idioma: Sistema completo de traduções
  • 🔌 Extensível: Arquitetura baseada em providers e features

Índice

Requisitos

  • PHP: ^7.2 | ^8.0
  • Laravel: ^7.0 | ^8.0
  • MySQL 5.7+ ou MariaDB 10.2+
  • Composer 2.0+
  • Extensões PHP: mbstring, openssl, PDO, tokenizer, xml, ctype, json, bcmath, gd ou imagick

Instalação

Via Composer

composer require sierratecnologia/siravel

Publicar Assets e Configurações

# Publicar tudo
php artisan vendor:publish --provider="Siravel\SiravelProvider"

# Ou publicar seletivamente
php artisan vendor:publish --tag=siravel-config
php artisan vendor:publish --tag=siravel-migrations
php artisan vendor:publish --tag=siravel-assets

Executar Migrações

php artisan migrate

Instalar o Siravel

php artisan sitec:siravel:install

Este comando irá:

  • Configurar o ambiente multi-tenant
  • Criar estruturas de banco de dados
  • Publicar configurações padrão
  • Configurar o primeiro negócio/organização

Configuração

Arquivo de Configuração Principal

Após a publicação, o arquivo config/siravel.php estará disponível:

return [
    // Negócio/organização padrão
    'default' => env('SIRAVEL_DEFAULT_BUSINESS', 'ricasolucoes'),

    // Prefixo de tabelas do banco de dados
    'db-prefix' => env('SIRAVEL_DB_PREFIX', ''),

    // Paginação padrão
    'pagination' => env('SIRAVEL_PAGINATION', 25),

    // Tema frontend padrão
    'frontend-theme' => env('SIRAVEL_THEME', 'default'),

    // Habilitar multi-tenancy
    'multi-tenant' => env('SIRAVEL_MULTI_TENANT', true),

    // Configurações de features
    'features' => [
        'blog' => true,
        'commerce' => true,
        'travels' => false,
        // ... outras features
    ],
];

Variáveis de Ambiente

Adicione ao seu arquivo .env:

# Configurações do Siravel
SIRAVEL_DEFAULT_BUSINESS=sua-empresa
SIRAVEL_DB_PREFIX=
SIRAVEL_PAGINATION=25
SIRAVEL_THEME=default
SIRAVEL_MULTI_TENANT=true

# Configurações de Tenancy
TENANCY_CONNECTION=mysql
TENANCY_HOST=localhost
TENANCY_DATABASE=sistema
TENANCY_USERNAME=root
TENANCY_PASSWORD=

Funcionalidades

Sistema Multi-tenant

O Siravel utiliza o pacote Tenancy for Laravel para fornecer isolamento completo entre tenants:

use Siravel\Services\BusinessService;

// Obter o negócio atual baseado no domínio
$business = app(BusinessService::class)->getCurrentBusiness();

// Alternar contexto de tenant
Business::set($business);

// Verificar features ativas para o tenant
if (Features::isActive('commerce')) {
    // Lógica de e-commerce
}

Sistema de Features

Features podem ser ativadas/desativadas globalmente ou por tenant:

use Siravel\Facades\Features;

// Verificar se uma feature está ativa
if (Features::isActive('blog')) {
    // Código do blog
}

// Ativar feature para um negócio
$business->features()->attach('commerce');

// Desativar feature
$business->features()->detach('travels');

Blade Directives

O Siravel adiciona diretivas Blade úteis:

{{-- Verificar feature ativa --}}
@feature('blog')
    <a href="{{ route('blog.index') }}">Blog</a>
@endfeature

{{-- Renderizar menu --}}
@menu('main-menu')

{{-- Renderizar widget --}}
@widget('sidebar-widget')

{{-- Verificar permissões --}}
@userCan('edit-posts')
    <button>Editar</button>
@enduserCan

Estrutura do Projeto

siravel/
├── bin/
│   └── code-analyser              # Script de análise de código
├── config/                         # Arquivos de configuração
├── database/
│   └── migrations/                 # Migrações do banco de dados
├── helpers/                        # Funções helper globais
│   ├── functions.php
│   ├── helpers.php
│   ├── types.php
│   ├── general.php
│   ├── blade.php
│   └── commerce_helpers.php
├── publishes/                      # Arquivos para publicação
│   ├── config/
│   ├── resources/
│   ├── routes/
│   └── migrations/
├── routes/                         # Definições de rotas
│   ├── web/
│   │   ├── admin.php
│   │   ├── features.php
│   │   └── public.php
│   └── api/
│       ├── siravel.php
│       └── v1.php
├── src/
│   ├── Builders/                   # Query Builders customizados
│   ├── Console/
│   │   └── Commands/              # Comandos Artisan
│   ├── Contracts/                 # Interfaces e Traits
│   ├── Entities/                  # DTOs e Entities
│   ├── Events/                    # Eventos do sistema
│   ├── Exceptions/                # Handlers de exceção
│   ├── Facades/                   # Facades do Laravel
│   ├── Features/                  # Módulos de features
│   │   ├── Blog/
│   │   ├── Commerce/
│   │   ├── Travels/
│   │   ├── Midias/
│   │   ├── Marketing/
│   │   ├── Gamification/
│   │   └── ...
│   ├── Http/
│   │   ├── Controllers/
│   │   │   ├── Admin/            # Controllers administrativos
│   │   │   ├── Api/              # Controllers de API
│   │   │   └── Features/         # Controllers de features
│   │   ├── Middleware/           # Middlewares customizados
│   │   └── Resources/            # API Resources
│   ├── Jobs/                      # Jobs assíncronos
│   ├── Listeners/                 # Event Listeners
│   ├── Models/                    # Eloquent Models
│   │   ├── Access/               # Autenticação
│   │   ├── Blog/                 # Blog
│   │   ├── Commerce/             # E-commerce
│   │   └── Negocios/             # Business/Organizações
│   ├── Observers/                 # Model Observers
│   ├── Policies/                  # Authorization Policies
│   ├── Providers/                 # Service Providers
│   ├── Repositories/              # Repository Pattern
│   ├── Services/                  # Business Logic Services
│   └── SiravelProvider.php       # Provider principal
└── tests/
    ├── Feature/                   # Testes de feature
    ├── Unit/                      # Testes unitários
    └── Services/                  # Testes de serviços

Uso

Criando um Negócio (Business)

use Siravel\Models\Negocios\Business;

$business = Business::create([
    'name' => 'Minha Empresa',
    'slug' => 'minha-empresa',
    'domain' => 'empresa.com.br',
    'settings' => [
        'theme' => 'corporate',
        'timezone' => 'America/Sao_Paulo',
    ],
]);

// Ativar features
$business->features()->attach(['blog', 'commerce']);

Trabalhando com o Blog

use Siravel\Models\Blog\Post;
use Siravel\Models\Blog\Category;

// Criar categoria
$category = Category::create([
    'name' => 'Tecnologia',
    'slug' => 'tecnologia',
]);

// Criar post
$post = Post::create([
    'title' => 'Título do Post',
    'slug' => 'titulo-do-post',
    'content' => 'Conteúdo do post...',
    'category_id' => $category->id,
    'published_at' => now(),
    'is_published' => true,
]);

// Buscar posts publicados
$posts = Post::published()->latest()->paginate(15);

E-commerce

use Siravel\Models\Commerce\Product;
use Siravel\Models\Commerce\Order;
use Siravel\Models\Commerce\Cart;

// Criar produto
$product = Product::create([
    'name' => 'Produto Exemplo',
    'slug' => 'produto-exemplo',
    'description' => 'Descrição do produto',
    'price' => 99.90,
    'stock' => 100,
]);

// Adicionar ao carrinho
$cart = Cart::addItem($product, $quantity = 2);

// Criar pedido
$order = Order::createFromCart($cart, $user);

Sistema de Páginas CMS

use Siravel\Models\Negocios\Page;
use Siravel\Models\Negocios\Menu;

// Criar página
$page = Page::create([
    'title' => 'Sobre Nós',
    'slug' => 'sobre',
    'content' => 'Conteúdo da página...',
    'template' => 'default',
    'is_published' => true,
]);

// Criar menu
$menu = Menu::create([
    'name' => 'Menu Principal',
    'slug' => 'main-menu',
    'items' => [
        ['label' => 'Home', 'url' => '/'],
        ['label' => 'Sobre', 'url' => '/sobre'],
        ['label' => 'Blog', 'url' => '/blog'],
    ],
]);

Features Disponíveis

1. Blog (blog)

Sistema completo de blog com posts, categorias, tags e comentários.

Models: Post, Article, Category, Comment Controllers: BlogController, PostController, ArticleController

2. Commerce (commerce)

Plataforma e-commerce com produtos, pedidos, assinaturas e pagamentos.

Models: Product, Order, Cart, Transaction, Coupon, Subscription Controllers: ProductController, OrderController, TransactionController

3. Travels (travels)

Sistema de reservas de viagens com integração HotelBeds.

Models: Travels, Bookings Integração: HotelBeds API Controllers: TravelsController, HotelsController, RoomsController

4. Midias (midias)

Gerenciamento de mídia, imagens e arquivos.

Controllers: ImagesController, FilesController Recursos: Upload, thumbnails, otimização de imagens

5. Marketing (marketing)

Ferramentas de marketing, promoções e campanhas.

Models: Promotion, Campaign Controllers: PromotionsController

6. Gamification (gamification)

Sistema de gamificação com pontos, badges e rankings.

7. Writelabel (writelabel)

CMS white-label customizável.

Models: Page, Menu, Widget, Faq, Member Controllers: PagesController, MenuController, FaqController

8. Productions (productions)

Gerenciamento de produção de mídia e conteúdo.

9. Casa (casa)

Gerenciamento de propriedades e imóveis.

10. Finder (finder)

Sistema de busca e descoberta.

11. Escritor (escritor)

Gerenciamento de documentos e escrita.

12. Bancario (bancario)

Funcionalidades bancárias e financeiras.

13. Fa (fa)

Análise financeira.

Helpers e Utilidades

Helpers de URL

// URL do storage
url_storage('images/logo.png');

// URL do frontend
url_frontend('/blog/post-slug');

// URL de login
url_frontend_sign_in();

// Asset versionado
versioned_asset('css/app.css');

Helpers de Usuário

// Usuário atual
$user = user();

// Verificar se está autenticado
if (signedInUser()) {
    // ...
}

// Verificar permissão
if (userCan('edit', $post)) {
    // ...
}

Helpers de Conteúdo

// Renderizar menu
menu('main-menu', 'components.menu');

// Renderizar widget
widget('sidebar-ads');

// Converter markdown para HTML
$html = markup($markdown);

// Ícone SVG
icon('user', ['class' => 'w-6 h-6']);

Helpers de Tipo

// Conversões seguras de tipo
$bool = to_bool($value);
$int = to_int($value);
$float = to_float($value);
$string = to_string($value);
$array = to_array($value);
$object = to_object($data, ClassName::class);

API

O Siravel fornece APIs RESTful para todas as features:

Autenticação

# Login
POST /api/v1/auth/login
{
    "email": "user@example.com",
    "password": "password"
}

# Registro
POST /api/v1/auth/register
{
    "name": "John Doe",
    "email": "john@example.com",
    "password": "password"
}

Blog API

# Listar posts
GET /api/v1/posts?page=1&per_page=15

# Obter post
GET /api/v1/posts/{id}

# Criar post (autenticado)
POST /api/v1/posts
{
    "title": "Título",
    "content": "Conteúdo",
    "category_id": 1
}

Commerce API

# Listar produtos
GET /api/v1/products

# Adicionar ao carrinho
POST /api/v1/cart/items
{
    "product_id": 1,
    "quantity": 2
}

# Criar pedido
POST /api/v1/orders
{
    "cart_id": 1,
    "payment_method": "credit_card"
}

Testes

Executar Testes

# Todos os testes
composer test

# Ou via PHPUnit
vendor/bin/phpunit

# Com cobertura
composer test-coverage

Estrutura de Testes

tests/
├── Feature/              # Testes de integração
│   ├── BlogTest.php
│   ├── CommerceTest.php
│   └── AuthTest.php
├── Unit/                 # Testes unitários
│   ├── Models/
│   └── Services/
└── Services/             # Testes de serviços
    ├── BusinessServiceTest.php
    └── FeatureServiceTest.php

Exemplo de Teste

namespace Tests\Feature;

use Tests\TestCase;
use Siravel\Models\Blog\Post;

class BlogTest extends TestCase
{
    public function test_can_create_post()
    {
        $post = Post::create([
            'title' => 'Test Post',
            'content' => 'Test Content',
        ]);

        $this->assertDatabaseHas('posts', [
            'title' => 'Test Post',
        ]);
    }
}

Análise de Código

PHP CS Fixer

# Verificar estilo de código
composer format

Psalm

# Análise estática
composer psalm

PHPStan

# Análise de código
vendor/bin/phpstan analyse

Comandos Artisan

# Instalar Siravel
php artisan sitec:siravel:install

# Backup do banco de dados
php artisan siravel:database:backup

# Criar negócio
php artisan siravel:business:create {name}

# Ativar feature
php artisan siravel:feature:enable {feature} {business?}

# Desativar feature
php artisan siravel:feature:disable {feature} {business?}

Arquitetura e Padrões

Service Layer

namespace App\Services;

use Siravel\Services\BaseService;

class CustomService extends BaseService
{
    public function processData($data)
    {
        // Lógica de negócio
    }
}

Repository Pattern

namespace App\Repositories;

use Siravel\Repositories\SiravelRepository;

class CustomRepository extends SiravelRepository
{
    protected $model = CustomModel::class;

    public function findByCustomCriteria($criteria)
    {
        return $this->model->where('field', $criteria)->get();
    }
}

Events & Listeners

// Event
namespace Siravel\Events;

class BusinessNewRegister
{
    public $business;

    public function __construct($business)
    {
        $this->business = $business;
    }
}

// Listener
Event::listen(BusinessNewRegister::class, function($event) {
    // Processar novo negócio
});

Dependências

Pacotes da SierraTecnologia

  • telefonica: Sistema de telefonia e comunicação
  • porteiro: Autenticação e controle de acesso
  • transmissor: Sistema de transmissão e notificações
  • bancario: Funcionalidades bancárias
  • locaravel: Localização e traduções

Pacotes Sugeridos

  • integrations: Integrações com serviços externos
  • stalker: Rastreamento e analytics
  • facilitador: Features base da plataforma
  • casa: Gerenciamento de propriedades

Contribuindo

Contribuições são bem-vindas! Por favor:

  1. Fork o projeto
  2. Crie uma branch para sua feature (git checkout -b feature/AmazingFeature)
  3. Commit suas mudanças (git commit -m 'Add some AmazingFeature')
  4. Push para a branch (git push origin feature/AmazingFeature)
  5. Abra um Pull Request

Guia de Contribuição

  • Siga os padrões PSR-12 de código
  • Adicione testes para novas funcionalidades
  • Atualize a documentação quando necessário
  • Mantenha o código limpo e bem documentado

Segurança

Se você descobrir algum problema de segurança, por favor envie um e-mail para help@sierratecnologia.com.br ao invés de usar o issue tracker.

Changelog

Consulte CHANGELOG.md para mais informações sobre as mudanças recentes.

Licença

Este pacote é um software de código aberto licenciado sob a Licença MIT.

Suporte

About SierraTecnologia

SierraTecnologia é uma empresa de tecnologia especializada em soluções empresariais complexas, desenvolvendo ferramentas e plataformas robustas para transformação digital. Nossa missão é fornecer tecnologia de ponta que permita às empresas crescerem e inovarem.

Desenvolvido com ❤️ pela SierraTecnologia