Forráskód Böngészése

fix: remove obsolete proposal documentation and related test files

alvesantos 2 hete
szülő
commit
492186f798

BIN
docs/assets/proposta_comercial_v1.png


+ 0 - 79
docs/proposta_comercial_v1.md

@@ -1,79 +0,0 @@
-# Proposta Comercial
-
-- Data Criação do Documento: 17 de Agosto de 2026 - 09:20 A.M 
-- Data de Atualização do Documento: 17 de Agosto de 2026 - 09:20 A.M 
-- Autor: Gabriel Alves (Desenvolvedor)
-
----
-
-## Adicionar Tabs Pavão e Irrecusável
-
-![Imagem de Referência](./assets/proposta_comercial_v1.png)
-
-- Menu Pacotes deve ser alterado para Proposta Comercial em Franchisor e Franchisee
-- Titulo do DefaultHeaderPage deve ser alterado para Proposta Comercial em Franchisor e Franchisee
-- Os dados atuais em uma plano de Comercial, agora deve estar em uma tab chamada Dados
-- Nova Tab ao Criar / Editar uma nova proposta comercial:
-    - Pavão
-    - Irrecusável
-
-- As tabs ficarão: Dados, Pavão, Irrecusável
-
-**Campos de Pavão**:
-
-- Valor da Matricula (col-12)
-- dois checkbox abaixo:
-    - Incluso no valor do curso, Permite Parcelar (Se selecionar um, não pode selecionar o outro. Selecionar um dos dois é obrigatório)
-    - Se Permite Parcelar, dois novos campoes são abertos:
-        - Quantidade de Parcelas Máximas (Padrão 13)
-        - Valor da Parcela (Computed = Valor total da Matricula / Quantidade de Parcelas selecionadas)
-    - Se Incluso no Valor do curso, esses campos não devem existir, nem deve poder parcelar individualmente o valor da matrícula. 
-    - Se Incluso no Valor do curso tiver em R$1.000,00, automaticamente, se soma abaixo em Valor Total do Curso. Se tiver valor em Valor Total do Curso, deve ficar o valor atual + o valor da matricula.
-
-
-    
-- Section do Valor de Aulas
-    - Valor de Aulas
-    - Mesmos checkbox de Incluso no Valor do Curso e Permite Parcelar, seguindo as mesmas lógicas
-    - Ao lado do valor da parcela deve ter um novo campo de Desconto (%)
-
-- Section de Materiais
-    - Segue a mesma lógica da Tab de Dados Básicos, podendo adicionar quantos itens quiser
-    - Select de Produtos vindo de products
-    - Checkbox de Incluso no valor do Curso e Permite Parcelar, ao final da lista de produtos, abrindo os mesmos campos. Soma o valor dos itens para considerar o valor total dos campos de Qtd PArcelas Max e Valor da Parcela
-
-- Section Final de Valor Total do Curso
-    - Campo de Valor Total do Curso com os valores acumulados (Valor da Matricula + Valor de Aulas + Valor dos itens), se tiverem inclusos.
-    - Campo do Valor Total é editável, caso o usuário quiser mudar, é possível.
-    - Abaixo dois campos obrigatórios, Qtd de Parcelas Max começando com 13, Valor da Parcela, seguindo a mesma regra das demais.
-
-
-**Campos de Irrecusável**:
-
-Devem ter exatamente os mesmos campos de Pavão, mas adicionar um campo a mais textarea chamando Condição, que deve ser a condição que essa proposta é acionada. Campo livre para escrever.
-
-**Backend**:
-
-- Além da criação dos campos, devem ser separados em tabelas para melhor reutilização.
-
-Agora teremos nível da proposta.
-
-- Dados Básicos (Dados básicos da proposta, seguindo exatamente como está hoje em pacotes)
-
-Estrutura inicial pensada:
-
-proposals: com os dados da proposta básica, como é hoje em pacotes
-pavao_proposals: linka a proposal base, mas os campos são independentes. Ou seja, adicionado novamente o valor do curso e etc + os campos novos
-
-irrecusable_proposals: linka a proposal base, mas os campos são independentes. Da mesma maneira que o pavao. Uma proposta pode ter um pavao e uma irrecusavel para ela.
-
-*Extra*
-
-Isso tudo é pensado para Franchisor, mas Franchisee, também possui essa mesma lógica com um detalhe importante:
-
-Ao criar-se propostas comerciais em franchisor, elas são enviadas para suas unidades também. Ao criar novas unidades, varre-se as propostas existentes e "clona" em unidades, ao criar novas propostas, deve-se registrar nas unidades existentes.
-
-As unidades podem alterar as propostas criadas pela matriz, mas não deve refletir em todas, mas apenas na proposta daquela unidade específica.
-
-
-## Contrato com Estudante (Aguardando Definições)

+ 0 - 44
docs/proposta_comercial_v2_ajustes.md

@@ -1,44 +0,0 @@
-# Proposta Comercial — Ajustes v2
-
-- Data Criação do Documento: 18 de Agosto de 2026
-- Autor: Gabriel Alves (Desenvolvedor)
-- Complementa: [proposta_comercial_v1.md](./proposta_comercial_v1.md)
-
----
-
-## Motivo
-
-Na v1, a tab "Dados" (Dados Básicos da proposta) ainda carregava campos de valor (Matrícula, Total do Contrato, Desconto, Materiais), herdados do antigo módulo de Pacotes. Ficou definido que **valor não deve existir em Dados** — valor só existe dentro de Pavão e Irrecusável, que são as duas modalidades de precificação de uma proposta.
-
-## O que muda em Dados Básicos
-
-Dados Básicos passa a ter **apenas**:
-
-- Nome
-- Quantidade de Aulas
-- Duração da Aula
-
-Saem de Dados: Valor da Matrícula, Valor Total do Contrato, Desconto (%), Materiais. Esses campos e a tabela de materiais da proposta base (`class_package_products`/`class_package_unit_products`) foram removidos — valor e material só existem dentro de Pavão/Irrecusável (`pavao_proposals`/`irrecusable_proposals` e as tabelas `_unit` correspondentes, que já cobrem isso desde a v1).
-
-## Pavão e Irrecusável passam a ser opcionais
-
-Antes, toda proposta era obrigada a ter Pavão **e** Irrecusável. Agora uma proposta pode ter:
-
-- só Pavão,
-- só Irrecusável,
-- os dois,
-- ou nenhum ainda (proposta em rascunho, sem precificação definida).
-
-Cada tab tem um toggle "esta proposta possui Pavão/Irrecusável" — só quando ligado é que os campos daquela modalidade existem e são obrigatórios/validados.
-
-## Regra de negócio para o futuro módulo de Contrato com Aluno
-
-O módulo de Contrato ainda está "Aguardando Definições" (ver v1) e **não foi implementado nesta rodada** — o texto abaixo é o requisito de negócio já levantado, para guiar a implementação quando o Contrato for especificado:
-
-- Ao vincular uma proposta comercial a um contrato, o usuário escolhe **qual modalidade usar** — Pavão ou Irrecusável — dentre as que a proposta tiver disponíveis.
-- Os valores do contrato (Matrícula, Aulas, Materiais, Total) vêm **da modalidade escolhida**, nunca das duas somadas.
-- Para cada valor (Matrícula, Aulas, Materiais), a regra de parcelamento já cadastrada na proposta se aplica da mesma forma:
-  - **Incluso no Valor do Curso** → soma no Valor Total do Curso; gera conta a receber **só** do Valor Total (parcelado conforme os campos de parcelamento do Total), sem cobrança separada para aquele item.
-  - **Permite Parcelar** → **não** soma no Valor Total do Curso; gera conta a receber **separada**, parcelada com base na Quantidade de Parcelas Máximas daquele item — igual à lógica que os contratos já usam hoje para gerar contas a receber.
-- Essa lógica (incluso vs. parcela separada → conta a receber) vale igualmente para Matrícula, Aulas e Materiais.
-- É esperado que, ao detalhar o módulo de Contrato, sejam necessários campos adicionais nas tabelas de Pavão/Irrecusável (ex.: dia de vencimento, regra de geração de conta a receber) — a definir junto com a especificação do Contrato.

+ 0 - 163
tests/Unit/Http/Requests/Concerns/ValidatesProposalPricingTest.php

@@ -1,163 +0,0 @@
-<?php
-
-namespace Tests\Unit\Http\Requests\Concerns;
-
-use App\Http\Requests\Concerns\ValidatesProposalPricing;
-use Illuminate\Contracts\Validation\Validator as ValidatorContract;
-use Illuminate\Foundation\Http\FormRequest;
-use Illuminate\Support\Facades\Validator as ValidatorFacade;
-use Illuminate\Validation\Validator;
-use Tests\TestCase;
-
-class ValidatesProposalPricingTest extends TestCase
-{
-    public function test_it_rejects_the_registration_section_when_neither_option_is_selected(): void
-    {
-        $validator = $this->validatorFor([
-            'pavao' => [
-                'registration_included_in_course'   => false,
-                'registration_installments_allowed' => false,
-            ],
-        ]);
-
-        $this->assertSame(
-            ['Selecione exatamente uma opção: incluso no valor do curso ou permite parcelar.'],
-            $validator->errors()->get('pavao.registration_included_in_course'),
-        );
-    }
-
-    public function test_it_rejects_the_registration_section_when_both_options_are_selected(): void
-    {
-        $validator = $this->validatorFor([
-            'pavao' => [
-                'registration_included_in_course'   => true,
-                'registration_installments_allowed' => true,
-            ],
-        ]);
-
-        $this->assertTrue($validator->errors()->has('pavao.registration_included_in_course'));
-    }
-
-    public function test_it_accepts_the_registration_section_when_exactly_one_option_is_selected(): void
-    {
-        $validator = $this->validatorFor([
-            'pavao' => [
-                'registration_included_in_course'   => true,
-                'registration_installments_allowed' => false,
-            ],
-        ]);
-
-        $this->assertFalse($validator->errors()->has('pavao.registration_included_in_course'));
-    }
-
-    public function test_it_validates_the_classes_and_materials_sections_independently(): void
-    {
-        $validator = $this->validatorFor([
-            'pavao' => [
-                'registration_included_in_course'   => true,
-                'registration_installments_allowed' => false,
-                'classes_included_in_course'        => false,
-                'classes_installments_allowed'      => false,
-                'materials_included_in_course'      => true,
-                'materials_installments_allowed'    => true,
-            ],
-        ]);
-
-        $this->assertFalse($validator->errors()->has('pavao.registration_included_in_course'));
-        $this->assertTrue($validator->errors()->has('pavao.classes_included_in_course'));
-        $this->assertTrue($validator->errors()->has('pavao.materials_included_in_course'));
-    }
-
-    public function test_it_skips_a_block_that_was_not_sent(): void
-    {
-        $validator = $this->validatorFor([
-            'irrecusavel' => [
-                'registration_included_in_course'   => true,
-                'registration_installments_allowed' => false,
-                'classes_included_in_course'        => true,
-                'classes_installments_allowed'      => false,
-                'materials_included_in_course'      => true,
-                'materials_installments_allowed'    => false,
-            ],
-        ]);
-
-        $this->assertFalse($validator->errors()->has('pavao.registration_included_in_course'));
-        $this->assertFalse($validator->errors()->any());
-    }
-
-    public function test_it_validates_pavao_and_irrecusavel_blocks_independently(): void
-    {
-        $validator = $this->validatorFor([
-            'pavao' => [
-                'registration_included_in_course'   => true,
-                'registration_installments_allowed' => false,
-                'classes_included_in_course'        => true,
-                'classes_installments_allowed'      => false,
-                'materials_included_in_course'      => true,
-                'materials_installments_allowed'    => false,
-            ],
-            'irrecusavel' => [
-                'registration_included_in_course'   => false,
-                'registration_installments_allowed' => false,
-                'classes_included_in_course'        => true,
-                'classes_installments_allowed'      => false,
-                'materials_included_in_course'      => true,
-                'materials_installments_allowed'    => false,
-            ],
-        ]);
-
-        $this->assertFalse($validator->errors()->has('pavao.registration_included_in_course'));
-        $this->assertTrue($validator->errors()->has('irrecusavel.registration_included_in_course'));
-    }
-
-    public function test_it_accepts_an_explicitly_null_block_as_not_having_that_modality(): void
-    {
-        $validator = $this->validatorFor([
-            'pavao' => null,
-        ]);
-
-        $this->assertTrue($validator->passes());
-    }
-
-    public function test_it_requires_the_section_fields_once_the_block_is_sent(): void
-    {
-        $validator = $this->validatorFor([
-            'pavao' => [
-                'registration_value' => 100,
-            ],
-        ]);
-
-        $this->assertFalse($validator->passes());
-        $this->assertTrue($validator->errors()->has('pavao.registration_included_in_course'));
-        $this->assertTrue($validator->errors()->has('pavao.classes_included_in_course'));
-        $this->assertTrue($validator->errors()->has('pavao.materials_included_in_course'));
-    }
-
-    private function validatorFor(array $data): Validator
-    {
-        $request   = TestableProposalPricingRequest::create('/', 'POST', $data);
-        $validator = ValidatorFacade::make($request->all(), $request->rules());
-
-        $request->withValidator($validator);
-
-        return $validator;
-    }
-}
-
-class TestableProposalPricingRequest extends FormRequest
-{
-    use ValidatesProposalPricing;
-
-    public function rules(): array
-    {
-        return [
-            ...$this->proposalPricingRules('pavao'),
-            ...$this->proposalPricingRules('irrecusavel', withCondition: true),
-        ];
-    }
-
-    public function withValidator(ValidatorContract $validator): void
-    {
-        $this->validateProposalPricingSections($validator, ['pavao', 'irrecusavel']);
-    }
-}