📋 Commit iniziale con: - ✅ Documentazione unificata in docs/ - ✅ Codice Laravel in netgescon-laravel/ - ✅ Script automazione in scripts/ - ✅ Configurazione sync rsync - ✅ Struttura organizzata e pulita 🔄 Versione: 2025.07.19-1644 🎯 Sistema pronto per Git distribuito
210 lines
14 KiB
PHP
210 lines
14 KiB
PHP
<x-app-layout>
|
|
<x-slot name="header">
|
|
<h2 class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight">
|
|
{{ __('Registrazione Movimento Contabile') }}
|
|
</h2>
|
|
</x-slot>
|
|
|
|
<div class="py-12">
|
|
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
|
|
<div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg">
|
|
<div class="p-6 text-gray-900 dark:text-gray-100">
|
|
|
|
<div class="flex justify-between items-center mb-6">
|
|
<h3 class="text-2xl font-bold text-gray-800 dark:text-gray-200">Nuova Registrazione Contabile</h3>
|
|
<a href="{{ route('admin.contabilita.index') }}"
|
|
class="bg-gray-500 hover:bg-gray-700 text-white font-bold py-2 px-4 rounded">
|
|
Torna alla Dashboard
|
|
</a>
|
|
</div>
|
|
|
|
<form method="POST" action="{{ route('admin.contabilita.store-registrazione') }}" id="registrazione-form">
|
|
@csrf
|
|
|
|
<!-- Sezione Dati Generali -->
|
|
<div class="bg-blue-50 dark:bg-blue-900/20 p-6 rounded-lg mb-6">
|
|
<h4 class="text-lg font-medium text-gray-900 dark:text-gray-100 mb-4">Dati Generali Documento</h4>
|
|
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
|
<!-- Stabile -->
|
|
<div>
|
|
<x-input-label for="stabile_id" :value="__('Stabile')" />
|
|
<select id="stabile_id" name="stabile_id" class="mt-1 block w-full border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm" required>
|
|
<option value="">Seleziona stabile</option>
|
|
@foreach($stabili as $stabile)
|
|
<option value="{{ $stabile->id_stabile }}" {{ old('stabile_id') == $stabile->id_stabile ? 'selected' : '' }}>
|
|
{{ $stabile->denominazione }}
|
|
</option>
|
|
@endforeach
|
|
</select>
|
|
<x-input-error class="mt-2" :messages="$errors->get('stabile_id')" />
|
|
</div>
|
|
|
|
<!-- Gestione -->
|
|
<div>
|
|
<x-input-label for="gestione_id" :value="__('Gestione')" />
|
|
<select id="gestione_id" name="gestione_id" class="mt-1 block w-full border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm" required>
|
|
<option value="">Seleziona gestione</option>
|
|
</select>
|
|
<x-input-error class="mt-2" :messages="$errors->get('gestione_id')" />
|
|
</div>
|
|
|
|
<!-- Tipo Movimento -->
|
|
<div>
|
|
<x-input-label for="tipo_movimento" :value="__('Tipo Movimento')" />
|
|
<select id="tipo_movimento" name="tipo_movimento" class="mt-1 block w-full border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm" required>
|
|
<option value="">Seleziona tipo</option>
|
|
<option value="entrata" {{ old('tipo_movimento') == 'entrata' ? 'selected' : '' }}>Entrata</option>
|
|
<option value="uscita" {{ old('tipo_movimento') == 'uscita' ? 'selected' : '' }}>Uscita</option>
|
|
</select>
|
|
<x-input-error class="mt-2" :messages="$errors->get('tipo_movimento')" />
|
|
</div>
|
|
|
|
<!-- Data Documento -->
|
|
<div>
|
|
<x-input-label for="data_documento" :value="__('Data Documento')" />
|
|
<x-text-input id="data_documento" name="data_documento" type="date" class="mt-1 block w-full"
|
|
:value="old('data_documento', date('Y-m-d'))" required />
|
|
<x-input-error class="mt-2" :messages="$errors->get('data_documento')" />
|
|
</div>
|
|
|
|
<!-- Numero Documento -->
|
|
<div>
|
|
<x-input-label for="numero_documento" :value="__('Numero Documento')" />
|
|
<x-text-input id="numero_documento" name="numero_documento" type="text" class="mt-1 block w-full"
|
|
:value="old('numero_documento')" required />
|
|
<x-input-error class="mt-2" :messages="$errors->get('numero_documento')" />
|
|
</div>
|
|
|
|
<!-- Fornitore -->
|
|
<div>
|
|
<x-input-label for="fornitore_id" :value="__('Fornitore')" />
|
|
<select id="fornitore_id" name="fornitore_id" class="mt-1 block w-full border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm">
|
|
<option value="">Seleziona fornitore</option>
|
|
@foreach($fornitori as $fornitore)
|
|
<option value="{{ $fornitore->id_fornitore }}" {{ old('fornitore_id') == $fornitore->id_fornitore ? 'selected' : '' }}>
|
|
{{ $fornitore->ragione_sociale }}
|
|
</option>
|
|
@endforeach
|
|
</select>
|
|
<x-input-error class="mt-2" :messages="$errors->get('fornitore_id')" />
|
|
</div>
|
|
|
|
<!-- Descrizione -->
|
|
<div class="md:col-span-2">
|
|
<x-input-label for="descrizione" :value="__('Descrizione')" />
|
|
<x-text-input id="descrizione" name="descrizione" type="text" class="mt-1 block w-full"
|
|
:value="old('descrizione')" required />
|
|
<x-input-error class="mt-2" :messages="$errors->get('descrizione')" />
|
|
</div>
|
|
|
|
<!-- Importo Totale -->
|
|
<div>
|
|
<x-input-label for="importo_totale" :value="__('Importo Totale')" />
|
|
<x-text-input id="importo_totale" name="importo_totale" type="number" step="0.01" class="mt-1 block w-full"
|
|
:value="old('importo_totale')" required />
|
|
<x-input-error class="mt-2" :messages="$errors->get('importo_totale')" />
|
|
</div>
|
|
|
|
<!-- Ritenuta d'Acconto -->
|
|
<div>
|
|
<x-input-label for="ritenuta_acconto" :value="__('Ritenuta d\'Acconto')" />
|
|
<x-text-input id="ritenuta_acconto" name="ritenuta_acconto" type="number" step="0.01" class="mt-1 block w-full"
|
|
:value="old('ritenuta_acconto', '0')" />
|
|
<x-input-error class="mt-2" :messages="$errors->get('ritenuta_acconto')" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Sezione Dettaglio Spese -->
|
|
<div class="bg-green-50 dark:bg-green-900/20 p-6 rounded-lg mb-6">
|
|
<div class="flex justify-between items-center mb-4">
|
|
<h4 class="text-lg font-medium text-gray-900 dark:text-gray-100">Dettaglio Spese</h4>
|
|
<button type="button" id="aggiungi-dettaglio" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
|
|
Aggiungi Voce
|
|
</button>
|
|
</div>
|
|
|
|
<div id="dettagli-container">
|
|
<!-- I dettagli verranno aggiunti dinamicamente qui -->
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Pulsanti -->
|
|
<div class="flex items-center justify-end space-x-4">
|
|
<x-secondary-button type="button" onclick="window.location='{{ route('admin.contabilita.index') }}'">
|
|
{{ __('Annulla') }}
|
|
</x-secondary-button>
|
|
<x-primary-button>
|
|
{{ __('Registra Movimento') }}
|
|
</x-primary-button>
|
|
</div>
|
|
</form>
|
|
|
|
@if ($errors->any())
|
|
<div class="mt-4 text-red-600 dark:text-red-400">
|
|
<ul>
|
|
@foreach ($errors->all() as $error)
|
|
<li>{{ $error }}</li>
|
|
@endforeach
|
|
</ul>
|
|
</div>
|
|
@endif
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
let dettaglioIndex = 0;
|
|
|
|
document.getElementById('aggiungi-dettaglio').addEventListener('click', function() {
|
|
aggiungiDettaglio();
|
|
});
|
|
|
|
function aggiungiDettaglio() {
|
|
const container = document.getElementById('dettagli-container');
|
|
const dettaglioHtml = `
|
|
<div class="dettaglio-item border border-gray-300 dark:border-gray-600 p-4 rounded-lg mb-4" data-index="${dettaglioIndex}">
|
|
<div class="grid grid-cols-1 md:grid-cols-4 gap-4">
|
|
<div>
|
|
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300">Voce Spesa</label>
|
|
<select name="dettagli[${dettaglioIndex}][voce_spesa_id]" class="mt-1 block w-full border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm" required>
|
|
<option value="">Seleziona voce</option>
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300">Importo</label>
|
|
<input type="number" step="0.01" name="dettagli[${dettaglioIndex}][importo]" class="mt-1 block w-full border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm" required>
|
|
</div>
|
|
<div>
|
|
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300">Tabella Millesimale</label>
|
|
<select name="dettagli[${dettaglioIndex}][tabella_millesimale_id]" class="mt-1 block w-full border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm">
|
|
<option value="">Seleziona tabella</option>
|
|
</select>
|
|
</div>
|
|
<div class="flex items-end">
|
|
<button type="button" onclick="rimuoviDettaglio(${dettaglioIndex})" class="bg-red-500 hover:bg-red-700 text-white font-bold py-2 px-4 rounded">
|
|
Rimuovi
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
`;
|
|
container.insertAdjacentHTML('beforeend', dettaglioHtml);
|
|
dettaglioIndex++;
|
|
}
|
|
|
|
function rimuoviDettaglio(index) {
|
|
const item = document.querySelector(`[data-index="${index}"]`);
|
|
if (item) {
|
|
item.remove();
|
|
}
|
|
}
|
|
|
|
// Aggiungi il primo dettaglio automaticamente
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
aggiungiDettaglio();
|
|
});
|
|
</script>
|
|
</x-app-layout>
|