Files
Investidor-V2/resources/js/components/acquisition-operation-link.tsx
T

144 lines
6.0 KiB
TypeScript

import {
acquisitionOperationChoices,
createAcquisitionRightLink,
linkedOperationRight,
linkedBeverageDeductionRight,
type AcquisitionRightLink,
} from '@/lib/iva-acquisition-right';
import type { Acquisition } from '@/lib/iva-acquisitions';
export function AcquisitionOperationLink({
draft,
row,
onChange,
}: {
draft: Record<string, unknown>;
row: Acquisition;
onChange: (patch: Partial<Acquisition>) => void;
}) {
const choices = acquisitionOperationChoices(draft),
link = row.deductionLink;
const adopt = (id: string) =>
onChange({ deductionLink: createAcquisitionRightLink(draft, id) });
const patch = (value: Partial<AcquisitionRightLink>) => {
if (link) onChange({ deductionLink: { ...link, ...value } });
};
const result = link
? row.bc?.expense === 'beverages' &&
row.bc.facts.beverageSpecial === 'yes' &&
['deduction', 'refund'].includes(row.bc.beveragePath)
? linkedBeverageDeductionRight(
draft,
link,
row.bc.facts.notCoastalFishing === 'yes',
)
: linkedOperationRight(draft, link)
: null;
return (
<fieldset className="space-y-2 rounded border p-3">
<legend>Aquisição → direito à dedução — L2-A</legend>
<p>
Reutilize a classificação existente. A ligação conserva
montantes, documento e escolhas da aquisição; não cria outra
compra. Importações, despesas especiais e afectação parcial
conservam enquadramento próprio.
</p>
{choices.length === 1 && !link ? (
<button type="button" onClick={() => adopt(choices[0].id)}>
Reutilizar operação existente: {choices[0].label}
</button>
) : (
<label>
Operação de destino
<select
value={link?.operationId ?? ''}
onChange={(e) =>
e.target.value
? adopt(e.target.value)
: onChange({ deductionLink: undefined })
}
>
<option value="">Sem vínculo L2-A</option>
{choices.map((c) => (
<option key={c.id} value={c.id}>
{c.label}
</option>
))}
</select>
</label>
)}
{!choices.length && (
<p>
Não há operação classificada nesta oportunidade. A compra e
o histórico permanecem disponíveis.
</p>
)}
{link && (
<>
<p>
{row.bc?.beveragePath === 'refund' &&
result?.status === 'eligible'
? 'Condições da operação13(2) identificadas;via de restituição escolhida,sem dedução desta parcela.'
: result?.reason}
</p>
<small>{result?.source}</small>
<label className="block">
Afectação exclusiva à operação ligada
<select
value={link.scopeConfirmed}
onChange={(e) =>
patch({
scopeConfirmed: e.target
.value as AcquisitionRightLink['scopeConfirmed'],
})
}
>
<option value="">Por confirmar</option>
<option value="yes">Sim</option>
<option value="no">Não / por rever</option>
</select>
</label>
<label className="block">
Motivo ou referência da afectação
<input
value={link.allocationRef}
onChange={(e) =>
patch({ allocationRef: e.target.value })
}
/>
</label>
{result?.status === 'eligible' && (
<label className="block">
Aquisição fora dos pagamentos
excluídos15(6)(c)/19(2)
<select
value={link.noExcludedPayments}
onChange={(e) =>
patch({
noExcludedPayments: e.target
.value as AcquisitionRightLink['noExcludedPayments'],
})
}
>
<option value="">Por indicar</option>
<option value="yes">Sim</option>
<option value="no">Não</option>
</select>
</label>
)}
{result?.status === 'indeterminate' &&
choices.some((c) => c.id === link.operationId) && (
<button
type="button"
onClick={() => adopt(link.operationId)}
>
Adoptar explicitamente a classificação actual e
rever afectação
</button>
)}
</>
)}
</fieldset>
);
}