From 7ecf9ec79ae968cc36e9a0a34a70f8513cc012cf Mon Sep 17 00:00:00 2001 From: nala Date: Sat, 24 Oct 2026 20:30:54 +0200 Subject: [PATCH] feat(iva): distinguish offer requests emergency drafts and conditional scenarios --- .../simulation-offer-preparations.tsx | 22 ++++++- resources/js/lib/iva-offer-preparations.ts | 34 ++++++++++- tests/Feature/IvaOfferPathsDraftTest.php | 57 +++++++++++++++++++ tests/frontend/fixtures/iva-g6e-inputs.json | 1 + tests/frontend/fixtures/iva-offer-paths.json | 1 + tests/frontend/iva-offer-paths.test.mjs | 33 +++++++++++ 6 files changed, 143 insertions(+), 5 deletions(-) create mode 100644 tests/Feature/IvaOfferPathsDraftTest.php create mode 100644 tests/frontend/fixtures/iva-g6e-inputs.json create mode 100644 tests/frontend/fixtures/iva-offer-paths.json create mode 100644 tests/frontend/iva-offer-paths.test.mjs diff --git a/resources/js/components/simulation-offer-preparations.tsx b/resources/js/components/simulation-offer-preparations.tsx index dace96c3..f768ccac 100644 --- a/resources/js/components/simulation-offer-preparations.tsx +++ b/resources/js/components/simulation-offer-preparations.tsx @@ -1,5 +1,5 @@ import { useState } from 'react'; -import { newOfferPreparation,offerPreparationBook,offerPreparationSource,offerReusableData,recordOfferPreparations,reuseOfferData,saveOfferPreparationBook,type OfferPreparation,type OfferPreparationBook } from '@/lib/iva-offer-preparations'; +import { newOfferPreparation,offerPreparationBook,offerPreparationSource,offerReusableData,recordOfferPreparations,reuseOfferData,saveOfferPreparationBook,emptyOfferRequest,recordOfferRequest,offerRequestLabels,offerScenarios,type OfferRequest,type OfferPreparation,type OfferPreparationBook } from '@/lib/iva-offer-preparations'; export function SimulationOfferPreparations({draft,onChange}:{draft:Record;onChange:(field:string,value:string)=>void}) { const [error,setError]=useState('');let book:OfferPreparationBook;let reusable:ReturnType; @@ -10,7 +10,7 @@ export function SimulationOfferPreparations({draft,onChange}:{draft:Record; return
Ofertas a instituições e para calamidades — preparar rascunhos

Prepare apenas as ofertas relevantes para a oportunidade {String(draft.context_opportunity||'entrada geral')}. Pode guardar dados incompletos e reutilizar referências existentes. A reutilização preenche apenas campos vazios; as suas edições mantêm-se.

-

O procedimento de aplicação do benefício está em pesquisa. Este rascunho não concede isenção, não calcula IVA nem altera a dedução no campo11. Os restantes enquadramentos continuam disponíveis.

+

O procedimento de aplicação do benefício está em pesquisa. Prepare o pedido e compare o cenário normal com uma hipótese condicionada à isenção. Apresentar o pedido não concede isenção. Estes cenários não alteram a dedução no campo11; os restantes enquadramentos continuam disponíveis.

{error&&

{error}

} {' '} @@ -21,6 +21,24 @@ export function SimulationOfferPreparations({draft,onChange}:{draft:RecordReferência reutilizada: {row.reusedFrom.key}. A origem foi conservada; a aquisição/importação original não foi alterada.

}
{(['description','period','currency','amount','counterparty','documentRef','documentDate','beneficiary','purpose','evidence'] as const).map((key,index)=>)}
{row.branch==='P084'?
Condições próprias da oferta à instituição{question(row,'nationalInstitution','A instituição beneficiária é nacional')}{question(row,'publicSocialInstitution','A instituição tem interesse público e relevantes fins sociais')}{question(row,'goodsSuitable','Os bens são inteiramente adequados à natureza da instituição')}{question(row,'publicInterestUse','A instituição utilizará os bens em actividades de evidente interesse público')}
:
Finalidade própria da oferta para calamidade{question(row,'mitigation','Os bens destinam-se a ofertas para atenuar os efeitos da calamidade identificada')}
} + {row.branch==='P085'&&