Add captura de urgencia, target, estructural y gustos en el form de fotos
This commit is contained in:
@@ -101,6 +101,16 @@ export async function guardarDetallesYFotos(leadId: string, formData: FormData):
|
|||||||
: 'media';
|
: 'media';
|
||||||
const m2Suelo = Number.isFinite(m2Raw) && m2Raw > 0 ? m2Raw : null;
|
const m2Suelo = Number.isFinite(m2Raw) && m2Raw > 0 ? m2Raw : null;
|
||||||
|
|
||||||
|
const urgenciaRaw = String(formData.get('urgencia') ?? '');
|
||||||
|
const urgencia = (['alta', 'media', 'baja'] as const).includes(urgenciaRaw as 'alta')
|
||||||
|
? (urgenciaRaw as 'alta' | 'media' | 'baja')
|
||||||
|
: null;
|
||||||
|
const targetEuros = Number(formData.get('presupuestoTarget'));
|
||||||
|
const presupuestoTarget =
|
||||||
|
Number.isFinite(targetEuros) && targetEuros > 0 ? Math.round(targetEuros * 100) : null;
|
||||||
|
const estructural = formData.get('estructural') === 'on';
|
||||||
|
const tasteText = String(formData.get('tasteText') ?? '').trim() || null;
|
||||||
|
|
||||||
const archivos = formData.getAll('fotos').filter((f): f is File => f instanceof File);
|
const archivos = formData.getAll('fotos').filter((f): f is File => f instanceof File);
|
||||||
const dataUris: string[] = [];
|
const dataUris: string[] = [];
|
||||||
for (const file of archivos.slice(0, MAX_FOTOS)) {
|
for (const file of archivos.slice(0, MAX_FOTOS)) {
|
||||||
@@ -121,6 +131,10 @@ export async function guardarDetallesYFotos(leadId: string, formData: FormData):
|
|||||||
calidadGlobal,
|
calidadGlobal,
|
||||||
m2Suelo,
|
m2Suelo,
|
||||||
provincia,
|
provincia,
|
||||||
|
urgencia,
|
||||||
|
presupuestoTarget,
|
||||||
|
estructural,
|
||||||
|
tasteText,
|
||||||
pipelineStage: 'fotos_subidas',
|
pipelineStage: 'fotos_subidas',
|
||||||
updatedAt: new Date(),
|
updatedAt: new Date(),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -10,6 +10,11 @@ const CALIDADES = [
|
|||||||
{ value: 'media', label: 'Media' },
|
{ value: 'media', label: 'Media' },
|
||||||
{ value: 'premium', label: 'Premium' },
|
{ value: 'premium', label: 'Premium' },
|
||||||
] as const;
|
] as const;
|
||||||
|
const URGENCIAS = [
|
||||||
|
{ value: 'alta', label: 'Cuanto antes' },
|
||||||
|
{ value: 'media', label: 'En unos meses' },
|
||||||
|
{ value: 'baja', label: 'Sin prisa' },
|
||||||
|
] as const;
|
||||||
|
|
||||||
const MAX_FOTOS = 4;
|
const MAX_FOTOS = 4;
|
||||||
|
|
||||||
@@ -144,6 +149,57 @@ export default function FotosUploader({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Urgencia + presupuesto objetivo */}
|
||||||
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
|
||||||
|
<div className="flex flex-col gap-2">
|
||||||
|
<label htmlFor="urgencia" className="text-sm font-semibold text-dark">
|
||||||
|
¿Para cuándo?
|
||||||
|
</label>
|
||||||
|
<select id="urgencia" name="urgencia" defaultValue="media" className={inputClass}>
|
||||||
|
{URGENCIAS.map((u) => (
|
||||||
|
<option key={u.value} value={u.value}>
|
||||||
|
{u.label}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col gap-2">
|
||||||
|
<label htmlFor="presupuestoTarget" className="text-sm font-semibold text-dark">
|
||||||
|
Presupuesto objetivo <span className="text-gray-400 font-normal">(opcional, €)</span>
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
id="presupuestoTarget"
|
||||||
|
name="presupuestoTarget"
|
||||||
|
type="number"
|
||||||
|
min="0"
|
||||||
|
step="100"
|
||||||
|
inputMode="numeric"
|
||||||
|
placeholder="8000"
|
||||||
|
className={inputClass}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Cambios estructurales */}
|
||||||
|
<label className="flex items-center gap-3 text-sm font-medium text-dark cursor-pointer">
|
||||||
|
<input type="checkbox" name="estructural" className="w-4 h-4 accent-black" />
|
||||||
|
Hay que mover sanitarios, tirar algún muro o cambiar la distribución
|
||||||
|
</label>
|
||||||
|
|
||||||
|
{/* Bloque abierto de gustos */}
|
||||||
|
<div className="flex flex-col gap-2">
|
||||||
|
<label htmlFor="tasteText" className="text-sm font-semibold text-dark">
|
||||||
|
Cuéntanos cómo lo imaginas
|
||||||
|
</label>
|
||||||
|
<textarea
|
||||||
|
id="tasteText"
|
||||||
|
name="tasteText"
|
||||||
|
rows={4}
|
||||||
|
placeholder="Estilo, colores, materiales que te gusten… y cualquier capricho que no quieras que falte (una isla, ducha de obra, encimera de cuarzo…)."
|
||||||
|
className={inputClass}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<SubmitButton disabled={false} />
|
<SubmitButton disabled={false} />
|
||||||
<p className="text-xs text-gray-400 text-center">
|
<p className="text-xs text-gray-400 text-center">
|
||||||
Calculamos un presupuesto orientativo con tus datos. Sin compromiso.
|
Calculamos un presupuesto orientativo con tus datos. Sin compromiso.
|
||||||
|
|||||||
Reference in New Issue
Block a user