diff --git a/docs/CAREERJET_GAP_ANALYSIS.md b/docs/CAREERJET_GAP_ANALYSIS.md index a6ac2c7..6e5983f 100644 --- a/docs/CAREERJET_GAP_ANALYSIS.md +++ b/docs/CAREERJET_GAP_ANALYSIS.md @@ -171,12 +171,12 @@ Mapear o que já existe no GoHorseJobs e o que ainda falta para alcançar um flu --- ### 2) Pré-visualização -- [ ] Exibir versão final da vaga com todos os metadados selecionados. -- [ ] Indicar claramente campos ocultos (ex.: dados de empresa) antes de prosseguir. -- [ ] Permitir voltar para edição sem perda de dados. +- [x] Exibir versão final da vaga com todos os metadados selecionados. +- [x] Indicar claramente campos ocultos (ex.: dados de empresa) antes de prosseguir. +- [x] Permitir voltar para edição sem perda de dados. ### 3) Informações de faturamento -- [ ] Capturar dados fiscais (pessoa/empresa, documento, endereço de cobrança). +- [x] Capturar dados fiscais (pessoa/empresa, documento, endereço de cobrança). - [ ] Exibir plano/preço por país e duração (ex.: **US$130/30 dias** para EUA, quando aplicável). - [ ] Validar consistência entre país da vaga e país de faturamento conforme regra de negócio. diff --git a/frontend/src/app/post-job/page.tsx b/frontend/src/app/post-job/page.tsx index 2e30ba4..1f1a8ee 100644 --- a/frontend/src/app/post-job/page.tsx +++ b/frontend/src/app/post-job/page.tsx @@ -54,7 +54,7 @@ const getCurrencySymbol = (code: string): string => { export default function PostJobPage() { const router = useRouter(); - const [step, setStep] = useState<1 | 2 | 3>(1); + const [step, setStep] = useState<1 | 2 | 3 | 4>(1); const { locale, setLocale } = useTranslation(); const lang = useMemo(() => (locale === "pt-BR" ? "pt" : locale), [locale]); @@ -87,6 +87,14 @@ export default function PostJobPage() { employeeCount: "", foundedYear: "", description: "", + hidePublicProfile: false, + }); + + const [billing, setBilling] = useState({ + legalType: "company", + document: "", + billingCountry: "", + address: "", }); const [showPassword, setShowPassword] = useState(false); @@ -213,6 +221,12 @@ export default function PostJobPage() { return false; } + if (!billing.document || !billing.billingCountry || !billing.address) { + toast.error("Preencha os dados obrigatórios de faturamento."); + setStep(4); + return false; + } + return true; }; @@ -242,6 +256,8 @@ export default function PostJobPage() { setStep(2); } else if (step === 2) { setStep(3); + } else if (step === 3) { + setStep(4); } }; @@ -307,6 +323,10 @@ export default function PostJobPage() { category: job.jobCategory || null, resumeRequirement: job.resumeRequirement, applicationChannel: job.applicationChannel, + applicationEmail: job.applicationEmail || null, + applicationUrl: job.applicationUrl || null, + applicationPhone: job.applicationPhone || null, + hideCompanyData: company.hidePublicProfile, }, benefits: { selected: job.benefits, @@ -368,7 +388,7 @@ export default function PostJobPage() { {/* Progress Steps */}
- {[1, 2, 3].map((s) => ( + {[1, 2, 3, 4].map((s) => (
= s ? "text-primary" : "text-muted-foreground"}`} @@ -377,7 +397,10 @@ export default function PostJobPage() { {s}
- {s === 1 ? t.steps.data : s === 2 ? "Formulário" : t.steps.confirm} + {s === 1 && "Dados"} + {s === 2 && "Formulário"} + {s === 3 && "Pré-visualização"} + {s === 4 && "Faturamento"}
))} @@ -388,12 +411,14 @@ export default function PostJobPage() { {step === 1 && t.cardTitle.step1} {step === 2 && "Configure o Formulário"} - {step === 3 && t.cardTitle.step2} + {step === 3 && "Pré-visualização"} + {step === 4 && t.cardTitle.step2} {step === 1 && t.cardDesc.step1} {step === 2 && "Defina as perguntas que os candidatos deverão responder."} - {step === 3 && t.cardDesc.step2} + {step === 3 && "Confira como o anúncio será exibido antes de prosseguir."} + {step === 4 && "Informe os dados fiscais para finalizar a publicação."} @@ -574,6 +599,20 @@ export default function PostJobPage() { /> +
+ setCompany({ ...company, hidePublicProfile: e.target.checked })} + className="mt-1" + /> +
+ +

Quando ativo, nome, site e descrição da empresa não aparecem na vaga pública.

+
+
+ {/* Separator */}

@@ -886,24 +925,24 @@ export default function PostJobPage() {

Crie formulários inteligentes: Faça perguntas específicas para filtrar os melhores candidatos.

- - - +

)} - {/* Step 3: Confirm */} + {/* Step 3: Preview */} {step === 3 && (
@@ -934,6 +973,10 @@ export default function PostJobPage() {

Currículo: {job.resumeRequirement}

Área: {job.jobCategory || "Não informado"}

Benefícios: {job.benefits.length > 0 ? job.benefits.join(", ") : "Não informado"}

+

Visibilidade da empresa: {company.hidePublicProfile ? "Oculta na vaga pública" : "Visível"}

+ {company.hidePublicProfile && ( +

Campos ocultos: nome da empresa, site e descrição.

+ )}

{t.common.type}: { (job.employmentType ? (t.options.contract[job.employmentType as keyof typeof t.options.contract] || job.employmentType) : t.options.any) } / { @@ -946,6 +989,68 @@ export default function PostJobPage() { + +

+
+ )} + + {/* Step 4: Billing + Publish */} + {step === 4 && ( +
+
+
+ + +
+
+ + setBilling({ ...billing, document: e.target.value })} + placeholder={billing.legalType === "company" ? "CNPJ" : "CPF/NIF"} + /> +
+
+
+ + +
+
+ +