# Fornecedores — Arquitetura

> Módulo CMS que cadastra os fornecedores do sistema. Segue o padrão
> Controller -> Repository -> Model do legado.

---

## 1. Fluxo da requisição

### 1.1 Listagem (AJAX + view SQL)

```
DataTables (assets/js/custom/config/fornecedor/datatable.js)
   ▼  GET /cms/datatable/fornecedor
Prefecture\DatatableController@get_fornecedor
   │  DB::table('fornecedores')->get()      ← view SQL
   │  struct_views($supplier, 'supplier')    ← flags edit/delete/active/inactivate
   ▼  Yajra DataTables JSON
```

### 1.2 Cadastro / edição

```
Navegador
   ▼
routes/basepro.php:349-355
   ▼
Prefecture\SupplierController
   ├─ index()  → view 'prefecture.configurations.fornecedor.index'
   ├─ create() → view 'prefecture.configurations.fornecedor.create'
   ├─ edit($id)→ view 'prefecture.configurations.fornecedor.edit'
   ├─ store(SupplierRequest)
   │      ├─ $request->merge(phone/whatsapp só com dígitos)
   │      └─ $this->supplier->upInsert($request)      → SupplierRepository
   ├─ update(SupplierRequest, $id)
   │      ├─ $request->merge(phone/whatsapp só com dígitos)
   │      └─ $this->supplier->upInsert($request, $id)
   ├─ destroy($id)  →  $this->supplier->destroy($id)   → JSON
   └─ switchFornecedorAtivo(Request)
          ├─ desativa o fornecedor ativo anterior
          └─ ativa o selecionado (contents_id)
   ▼
SupplierRepository (extends App\Repositories\Repository)
   ├─ structureUpInsert(): filtra os campos
   │     name, slug, email, site, phone, address, locale, image, icon, whatsapp
   ├─ upInsert(): gera o slug e salva os uploads
   │     image → storage/app/public/img/images_fornecedores/
   │     icon  → storage/app/public/img/icons_fornecedores/
   └─ parent::upInsert() → DB::transaction + updateOrCreate
   ▼
App\Http\Model\Prefecture\Supplier  →  tabela suppliers
```

### 1.3 Diagrama de classes

```
                ISupplierRepository                IArchiveRepository
                (Contracts)                       (Contracts)
                      │                                  │
        SupplierRepository                        ArchiveRepository
        (Eloquent/Prefecture/Supplier)          (Eloquent/Prefecture/Archive)
                      │                                  │
                      ▼                                  ▼
   App\Http\Model\Prefecture\Supplier          App\Prefecture\Archive
                 (tabela suppliers)                (tabela archives)
                      │
                      └── é consultado por:
                            Admin\MainController@about      (página Suporte)
                            vendor/adminlte/page.blade.php (rodapé do CMS)
                            FooterServiceProvider           (rodapé do portal)
```

---

## 2. Classes envolvidas

| Classe | Caminho | Papel |
|---|---|---|
| `Prefecture\SupplierController` | `v6/app/Http/Controllers/Prefecture/SupplierController.php` | CRUD + alternância do fornecedor ativo |
| `App\Repositories\Contracts\ISupplierRepository` | `v6/app/Repositories/Contracts/ISupplierRepository.php` | contrato do CRUD |
| `SupplierRepository` | `v6/app/Repositories/Eloquent/Prefecture/Supplier/SupplierRepository.php` | implementação (upload + slug) |
| `App\Http\Model\Prefecture\Supplier` | `v6/app/Http/Model/Prefecture/Supplier.php` | model da tabela `suppliers` |
| `App\Http\Requests\SupplierRequest` | `v6/app/Http/Requests/SupplierRequest.php` | validação do formulário |
| `Repository` (abstrata) | `v6/app/Repositories/Repository.php` | `upInsert()`, `destroy()` |
| `AppTrait` | `v6/app/Http/Traits/AppTrait.php` | `filter_request()`, `traitRequest()` |
| `FileTrait` | `v6/app/Http/Traits/FileTrait.php` | `saveUpload()`, `getFileName()`, `compress()` |
| `Prefecture\DatatableController` | `v6/app/Http/Controllers/Prefecture/DatatableController.php` | `get_fornecedor()` |
| `Admin\MainController` | `v6/app/Http/Controllers/Admin/MainController.php` | página "Suporte" (consome o fornecedor ativo) |

---

## 3. Dependências externas

| Pacote | Versão | Uso |
|---|---|---|
| `laravel/framework` | `5.5.*` | Eloquent, DI, Storage, Blade |
| `laravelcollective/html` | `^5.5` | `Form::` nos Blades |
| `yajra/laravel-datatables` | `^1.5` | JSON da listagem |
| `intervention/image` | (via `FileTrait`) | compressão/rec das imagens enviadas |
| `laralabs/toaster` | `^2.0` | mensagens de flash |

---

## 4. A "cadeia do fornecedor ativo"

O conceito de fornecedor ativo atravessa **três** módulos:

```
suppliers.fornecedor_ativo = true
        │
        ├─► /cms/suporte          (módulo "suporte")
        │      Admin\MainController@about → admin.layouts.about
        │
        └─► rodapé do CMS         (layout AdminLTE)
               vendor/adminlte/page.blade.php:419-437
```

A troca é feita em `POST /cms/fornecedores_switch`
(`supplier.switchFornecedorAtivo`).

> A rota `/cms/fornecedores_switch` **não tem nome** e **não tem
> middleware** — é o ponto de escrita mais exposto do CMS.

---

## 5. Onde o módulo é consumido

| Consumidor | Dependência | Onde |
|---|---|---|
| Menu do AdminLTE | `route('supplier.index')` + `$modulos['fornecedores']` | `v6/resources/views/vendor/adminlte/page.blade.php:275-282` |
| Página de Suporte | `Supplier::where('fornecedor_ativo', true)->first()` | `v6/resources/views/admin/layouts/about.blade.php` |
| Rodapé do CMS | `Supplier` (ativo) | `v6/resources/views/vendor/adminlte/page.blade.php:419,424,437` |

> O `modulos.status` do módulo `fornecedores` **é** respeitado no menu do
> AdminLTE (ao contrário de "Logs do sistema" e "Manual do Sistema").

---

## 6. Mapa de arquivos

```
app/Http/Controllers/Prefecture/SupplierController.php
app/Http/Model/Prefecture/Supplier.php
app/Http/Requests/SupplierRequest.php
app/Repositories/Contracts/ISupplierRepository.php
app/Repositories/Eloquent/Prefecture/Supplier/SupplierRepository.php
app/Repositories/Repository.php
app/Http/Traits/AppTrait.php
app/Http/Traits/FileTrait.php

resources/views/prefecture/configurations/fornecedor/
├── index.blade.php
├── create.blade.php
├── edit.blade.php
└── form.blade.php

public/assets/js/custom/config/fornecedor/datatable.js
public/assets/js/custom/utilities/table.js
public/assets/js/custom/utilities/functions.js

database/migrations/2021_01_25_160407_create_suppliers_table.php
database/migrations/2022_05_09_112612_add_column_to_suppliers_table.php
database/migrations/2025_05_06_082956_update_suppliers_address_values.php
database/seeds/SuplierTableSeeder.php
routes/basepro.php:349-355
```
