feat: Implement Ata de Registro de Preços management and linking to objetos and pedidos

This commit is contained in:
2025-12-02 23:29:42 -03:00
parent 8a50fb6f61
commit 4d29501849
7 changed files with 200 additions and 20 deletions

View File

@@ -30,6 +30,8 @@
quantidade: number;
modalidade: 'dispensa' | 'inexgibilidade' | 'adesao' | 'consumo';
acaoId?: Id<'acoes'>;
ataId?: Id<'atas'>;
ataNumero?: string; // For display
};
let selectedItems = $state<SelectedItem[]>([]);
@@ -42,19 +44,28 @@
quantidade: number;
modalidade: 'dispensa' | 'inexgibilidade' | 'adesao' | 'consumo';
acaoId: string; // using string to handle empty select
ataId: string; // using string to handle empty select
}>({
objeto: null,
quantidade: 1,
modalidade: 'consumo',
acaoId: ''
acaoId: '',
ataId: ''
});
function openItemModal(objeto: Doc<'objetos'>) {
let availableAtas = $state<Doc<'atas'>[]>([]);
async function openItemModal(objeto: Doc<'objetos'>) {
// Fetch linked Atas for this object
const linkedAtas = await client.query(api.objetos.getAtas, { objetoId: objeto._id });
availableAtas = linkedAtas;
itemConfig = {
objeto,
quantidade: 1,
modalidade: 'consumo',
acaoId: ''
acaoId: '',
ataId: ''
};
showItemModal = true;
searchQuery = ''; // Clear search
@@ -63,18 +74,23 @@
function closeItemModal() {
showItemModal = false;
itemConfig.objeto = null;
availableAtas = [];
}
function confirmAddItem() {
if (!itemConfig.objeto) return;
const selectedAta = availableAtas.find((a) => a._id === itemConfig.ataId);
selectedItems = [
...selectedItems,
{
objeto: itemConfig.objeto,
quantidade: itemConfig.quantidade,
modalidade: itemConfig.modalidade,
acaoId: itemConfig.acaoId ? (itemConfig.acaoId as Id<'acoes'>) : undefined
acaoId: itemConfig.acaoId ? (itemConfig.acaoId as Id<'acoes'>) : undefined,
ataId: itemConfig.ataId ? (itemConfig.ataId as Id<'atas'>) : undefined,
ataNumero: selectedAta?.numero
}
];
checkExisting();
@@ -191,7 +207,8 @@
valorEstimado: item.objeto.valorEstimado,
quantidade: item.quantidade,
modalidade: item.modalidade,
acaoId: item.acaoId
acaoId: item.acaoId,
ataId: item.ataId
})
)
);
@@ -287,6 +304,10 @@
<span class="ml-2 font-semibold text-gray-600">Ação:</span>
{getAcaoNome(item.acaoId)}
{/if}
{#if item.ataNumero}
<span class="ml-2 font-semibold text-gray-600">Ata:</span>
{item.ataNumero}
{/if}
</div>
</div>
<button
@@ -410,6 +431,24 @@
</select>
</div>
{#if availableAtas.length > 0}
<div class="mb-4">
<label class="mb-1 block text-sm font-bold text-gray-700" for="itemAta">
Ata de Registro de Preços (Opcional)
</label>
<select
id="itemAta"
class="w-full rounded border px-3 py-2"
bind:value={itemConfig.ataId}
>
<option value="">Selecione uma ata...</option>
{#each availableAtas as ata (ata._id)}
<option value={ata._id}>Ata {ata.numero} ({ata.numeroSei})</option>
{/each}
</select>
</div>
{/if}
<div class="mb-6">
<label class="mb-1 block text-sm font-bold text-gray-700" for="itemAcao">
Ação (Opcional)