Compare commits

..

No commits in common. "9320ce76a1564b5db68d79d8cca591b6ea9bfe33" and "652f9a7e767fbdeb90e8e39477a00a55db06cb42" have entirely different histories.

10 changed files with 94 additions and 172 deletions

View File

@ -44,15 +44,7 @@ class ImportRuleController extends Controller
'is_active' => 'boolean', 'is_active' => 'boolean',
'created_by' => 'nullable|string|max:255', 'created_by' => 'nullable|string|max:255',
]); ]);
ImportRule::create( ImportRule::create($request->all());
[
'category_id'=>$request->category_id,
'pattern'=>$request->pattern,
'description'=>$request->description,
'is_active'=>1,
]
);
return redirect()->route('import_rules.index'); // Redirect to the index after storing the rule return redirect()->route('import_rules.index'); // Redirect to the index after storing the rule
} }

View File

@ -358,63 +358,42 @@ class MovimentiController extends Controller
public function importmappedCsv(Request $request) public function importmappedCsv(Request $request)
{ {
$this->prepareMapping($request['mapping']); //$request->mov_data
$filename = Storage::path($request->filename); $mapped=$request['mapping'];
foreach( $mapped as $key => $value)
(new FastExcel)->configureCsv(';')->import($filename, function($line) {
$data = $this->mapCsvLineToDb($line);
// dd($data);
if (isset($data['mov_data'])) {
Movimenti::create($data);
}
});
return redirect(Route('movimenti'));
}
/**
* Prepara la mappatura tra i campi CSV e i campi DB
*/
private function prepareMapping($mapping)
{ {
foreach ($mapping as $key => $value) { if($value!=null)
if ($value != null) {
$this->map[$key] = $value;
}
}
}
/**
* Mappa una riga del CSV ai campi del database
*/
private function mapCsvLineToDb($line)
{ {
if (isset($line[$this->map['mov_data']])) { $this->map[$key]=$value;
$data = [ $collection = collect($this->map);
'mov_data' => $this->parseDate($line[$this->map['mov_data']]), }
'mov_descrizione' => $line[$this->map['mov_descrizione']] ?? null, }
'mov_importo_dare' => Movimenti::cleanImporto($line[$this->map['mov_importo_dare']]?? null) , //dd ($this->map,$collection);
'mov_importo_avere' => Movimenti::cleanImporto($line[$this->map['mov_importo_avere']] ?? null),
'mov_fk_categoria' => Movimenti::setCategoriesFromCsv($line[$this->map['mov_descrizione']] ?? ''), $mappdCvs=(new FastExcel)->configureCsv(';')->import(
Storage::path($request->filename), function($line){
if(isset($line[$this->map['mov_data']]))
{
Movimenti::create (
['mov_data' => DateTime::createFromFormat(
'd/m/Y',$line[$this->map['mov_data']]),
'mov_descrizione' => $line[$this->map['mov_descrizione']],
'mov_importo_dare' => $line[$this->map['mov_importo_dare']],
'mov_importo_avere' => $line[$this->map['mov_importo_avere']],
'mov_fk_categoria' => '1',
'mov_fk_tags' => 1, 'mov_fk_tags' => 1,
'mov_inserito_da' => Auth::id(), 'mov_inserito_da' => Auth::id(),
'conto_id_da' => 1, 'conto_id_da' => 1
'conto_id_a' => 1, ,'conto_id_a' => 1,
]; ]
return $data; );
} };
return null; // Se non c'è la data, non importa la riga });
// dd($map,$mapped,$request,$collection);
} // dd($request);
return redirect(Route('movimenti'));
/**
* Converte la data dal formato d/m/Y a Y-m-d
*/
private function parseDate($dateString)
{
$date = DateTime::createFromFormat('d/m/Y', $dateString);
return $date ? $date->format('Y-m-d') : null;
} }
public function importFile() public function importFile()
@ -449,5 +428,4 @@ class MovimentiController extends Controller
$mov=Movimenti::getMovimentoById($id); $mov=Movimenti::getMovimentoById($id);
return json_encode($mov); return json_encode($mov);
} }
} }

View File

@ -8,13 +8,7 @@ use Illuminate\Database\Eloquent\Model;
class ImportRule extends Model class ImportRule extends Model
{ {
use HasFactory; use HasFactory;
protected $fillable = [
'category_id',
'pattern',
'description',
'is_active',
'created_by',
];
// In MovimentiController o direttamente nel model Movimenti // In MovimentiController o direttamente nel model Movimenti

View File

@ -10,8 +10,7 @@ use Rap2hpoutre\FastExcel\FastExcel;
use App\Models\Categorie; use App\Models\Categorie;
use App\Models\Conto; use App\Models\Conto;
use App\Models\User; use App\Models\User;
use App\Models\ImportRule; //use Illuminate\Support\Facades\Schema;
class Movimenti extends Model class Movimenti extends Model
{ {
@ -34,8 +33,7 @@ class Movimenti extends Model
public static $query= 'SELECT public static $query= 'SELECT
a.id, a.id,
a.mov_data, a.mov_data,
a.mov_importo_dare, a.mov_importo,
a.mov_importo_avere,
a.mov_descrizione, a.mov_descrizione,
c.cat_name, c.cat_name,
t.tag_name, t.tag_name,
@ -188,8 +186,7 @@ JOIN categories as c ON a.mov_fk_categoria=c.id';
'mov_data' => $request['mov_data'], 'mov_data' => $request['mov_data'],
'mov_fk_categoria'=>$request['mov_fk_categoria'], 'mov_fk_categoria'=>$request['mov_fk_categoria'],
'mov_descrizione'=>$request['mov_descrizione'], 'mov_descrizione'=>$request['mov_descrizione'],
'mov_importo_dare' => $request['mov_importo_dare'], 'mov_importo'=>$request['mov_importo'],
'mov_importo_avere' => $request['mov_importo_avere'],
'mov_fk_tags'=>$request['mov_fk_tags'], 'mov_fk_tags'=>$request['mov_fk_tags'],
'mov_inserito_da'=>$request['userid'], 'mov_inserito_da'=>$request['userid'],
]); ]);
@ -206,8 +203,7 @@ JOIN categories as c ON a.mov_fk_categoria=c.id';
$expression= DB::raw('SELECT $expression= DB::raw('SELECT
a.id, a.id,
a.mov_data, a.mov_data,
a.mov_importo_dare, a.mov_importo,
a.mov_importo_avere,
a.mov_descrizione, a.mov_descrizione,
c.cat_name, c.cat_name,
t.tag_name, t.tag_name,
@ -226,8 +222,7 @@ JOIN categories as c ON a.mov_fk_categoria=c.id';
$expression=DB::raw(' SELECT a.id, $expression=DB::raw(' SELECT a.id,
a.mov_data, a.mov_data,
a.mov_importo_dare, a.mov_importo,
a.mov_importo_avere,
a.mov_descrizione, a.mov_descrizione,
c.cat_name, c.cat_name,
t.tag_name, t.tag_name,
@ -246,8 +241,7 @@ JOIN categories as c ON a.mov_fk_categoria=c.id';
$expression=DB::raw('SELECT $expression=DB::raw('SELECT
a.id, a.id,
a.mov_data, a.mov_data,
a.mov_importo_dare, a.mov_importo,
a.mov_importo_avere,
a.mov_descrizione, a.mov_descrizione,
c.cat_name, c.cat_name,
t.tag_name, t.tag_name,
@ -363,40 +357,41 @@ JOIN categories as c ON a.mov_fk_categoria=c.id';
]; ];
} }
// Test applicazione regole
public function setCategoriaMovimento($movimento)
{
$rules= \App\Models\ImportRule::all();
foreach ($rules as $role)
{
if (preg_match("/$role->parola/i","$movimento->descrizione"))
{
$movimento->catemov_fk_categoria=$role->categoria_id;
}
else
{
$movimento->catemov_fk_categoria=1;
}
}
}
// Ritorna la categoria suggerita in base alla descrizione del movimento da utilizzare sul db
public static function getSuggestedCategory($descrizione) public static function getSuggestedCategory($descrizione)
{ {
$rule = ImportRule::whereRaw('? LIKE CONCAT("%", pattern, "%")', [$descrizione])->first(); $rule = ImportRule::whereRaw('? LIKE CONCAT("%", pattern, "%")', [$descrizione])->first();
return $rule ? $rule->category_id : 1; return $rule ? $rule->category_id : null;
}
public static function setCategoriesFromCsv($descrizione)
{
$rules = ImportRule::all();
$categoria = 1; // Default category
foreach ($rules as $rule) {
if (preg_match("/$rule->pattern/i", $descrizione)) {
$categoria = $rule->category_id;
break;
}
}
return $categoria;
} }
// Ritorna gli anni presenti nei movimenti
public static function getYearsFromMovimenti() public static function getYearsFromMovimenti()
{ {
return self::selectRaw('YEAR(mov_data) as anno') $anni=DB::table('movimentis')->select(DB::raw('DISTINCT YEAR(mov_data) as anno'))->get();
->distinct() // dd($anni); // for test purposes
->orderBy('anno', 'desc') return $anni;
->get();
} }
@ -415,27 +410,24 @@ JOIN categories as c ON a.mov_fk_categoria=c.id';
} }
} }
// Ritorna la somma delle entrate per un anno specifico
public static function getEntrate($year) public static function getEntrate($year)
{ {
return self::whereYear('mov_data', $year) $entrate_anno=DB::table('movimentis')
->sum('mov_importo_avere'); ->where('mov_importo','>',0)
->whereYear('mov_data', '=' , $year)
->sum('mov_importo');
//->get();
return $entrate_anno;
} }
// Ritorna la somma delle uscite per un anno specifico
public static function getUscite($year) public static function getUscite($year)
{ {
return self::whereYear('mov_data', $year) $uscite_anno=DB::table('movimentis')
->sum('mov_importo_dare'); ->where('mov_importo','<',0)
} ->whereYear('mov_data', '=' , $year)
->sum('mov_importo');
public static function cleanImporto($importo){ //->get();
// Rimuove i punti e sostituisce la virgola con un punto return ($uscite_anno);
$importo = str_replace('.', '', $importo);
$importo = str_replace(',', '.', $importo);
$importo = str_replace('-', '', $importo);
$importo = str_replace('+', '', $importo);
return $importo;
} }
} }

View File

@ -65,14 +65,6 @@ return [
'replace_placeholders' => true, 'replace_placeholders' => true,
], ],
'app' => [
'driver' => 'single',
'path' => storage_path('logs/gestionale2025.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => env('LOG_DAILY_DAYS', 14),
'replace_placeholders' => true,
],
'daily' => [ 'daily' => [
'driver' => 'daily', 'driver' => 'daily',
'path' => storage_path('logs/laravel.log'), 'path' => storage_path('logs/laravel.log'),

View File

@ -20,8 +20,8 @@ class CreateMovimentisTable extends Migration
$table->unsignedBigInteger('mov_fk_categoria'); $table->unsignedBigInteger('mov_fk_categoria');
$table->foreign('mov_fk_categoria')->references('id')->on('categories'); $table->foreign('mov_fk_categoria')->references('id')->on('categories');
$table->longText('mov_descrizione'); $table->longText('mov_descrizione');
$table->decimal('mov_importo_dare',8,2)->nullable(); $table->decimal('mov_importo_dare',8,2);
$table->decimal('mov_importo_avere',8,2)->nullable(); $table->decimal('mov_importo_avere',8,2);
$table->unsignedBigInteger('mov_inserito_da'); $table->unsignedBigInteger('mov_inserito_da');
$table->foreign('mov_inserito_da')->references('id')->on('users'); $table->foreign('mov_inserito_da')->references('id')->on('users');
$table->unsignedBigInteger('mov_fk_tags'); $table->unsignedBigInteger('mov_fk_tags');

View File

@ -17,9 +17,9 @@ class CategorieSeeder extends Seeder
// Inserisce le categorie necessarie // Inserisce le categorie necessarie
DB::table('categories')->insert( DB::table('categories')->insert(
[ [
'cat_name'=>'Da Selezionare', 'cat_name'=>'Automobili',
'cat_uscita'=>1, 'cat_uscita'=>1,
'cat_entrata'=>1, 'cat_entrata'=>0,
] ]
); );
DB::table('categories')->insert( DB::table('categories')->insert(
@ -30,23 +30,9 @@ class CategorieSeeder extends Seeder
); );
DB::table('categories')->insert( DB::table('categories')->insert(
[ [
'cat_name'=>'Automobili', 'cat_name'=>'Utenze',
'cat_uscita'=>1, 'cat_uscita'=>1,
'cat_entrata'=>0] 'cat_entrata'=>0]
); );
DB::table('categories')->insert(
[
'cat_name'=>'Alimentari',
'cat_uscita'=>1,
'cat_entrata'=>0,
]
);
DB::table('categories')->insert(
[
'cat_name'=>'Utenze',
'cat_uscita'=>1,
'cat_entrata'=>0,
]
);
} }
} }

View File

@ -91,7 +91,6 @@ $.getJSON("/admin/service/contolist", {}, function(contis) {
}); });
}); });
// Modifica movimento
$(document).on('click', '.open_modal_modifica', function() { $(document).on('click', '.open_modal_modifica', function() {
var url = "/admin/movimenti/modify"; var url = "/admin/movimenti/modify";
var riga_id = $(this).val(); var riga_id = $(this).val();
@ -136,9 +135,9 @@ $(document).on('click', '.open_modal_modifica', function() {
); );
}); });
$('.modal-title').text('Modifica movimento'); $('.modal-title').text('Modifica movimento');
$('#data').val(data[0].mov_data.substring(0,10)); $('#data').val(data[0].mov_data);
$('#descrizione').val(data[0].mov_descrizione); $('#descrizione').val(data[0].mov_descrizione);
$('#importo').val(data[0].mov_importo_dare); $('#importo').val(data[0].mov_importo);
$('#myModal').modal('show'); $('#myModal').modal('show');
// $('.panel-heading').text('Modifica movimento'); // $('.panel-heading').text('Modifica movimento');

View File

@ -32,8 +32,7 @@
<tr> <tr>
<th>Data</th> <th>Data</th>
<th>Categoria</th> <th>Categoria</th>
<th>Conto Dare</th> <th>Conto</th>
<th>Conto Avere</th>
<th>Descrizione</th> <th>Descrizione</th>
<th>Importo Dare</th> <th>Importo Dare</th>
<th>Importo Avere</th> <th>Importo Avere</th>
@ -43,13 +42,13 @@
<tbody> <tbody>
@foreach( $movimenti as $movimento ) @foreach( $movimenti as $movimento )
<tr> <tr>
<td>{{ $movimento->mov_data}}</td> <td>{{ $movimento->mov_data}}</td>
<td>{{ $movimento->cat_name }}</td> <td>{{ $movimento->cat_name }}</td>
<td>{{ $movimento->nomeContoDare ?? '' }}</td> <td>{{ $movimento->nomeConto }}</td>
<td>{{ $movimento->nomeContoAvere ?? '' }}</td>
<td>{{ $movimento->mov_descrizione }}</td> <td>{{ $movimento->mov_descrizione }}</td>
<td>{{ $movimento->mov_importo_dare .""}}</td> <td>&euro; {{ $movimento->mov_importo_dare }}</td>
<td>{{ $movimento->mov_importo_avere."" }}</td> <td>&euro; {{ $movimento->mov_importo_avere }}</td>
<td> <td>
<button class="btn btn-warning btn-detail open_modal_modifica" value="{{ $movimento->id }}"><i class="fa-solid fa-pencil"></i></button>&nbsp; <button class="btn btn-warning btn-detail open_modal_modifica" value="{{ $movimento->id }}"><i class="fa-solid fa-pencil"></i></button>&nbsp;
<a class="btn btn-danger" href="/admin/movimenti/delete?id={{ $movimento->id }}"><i class="fa-solid fa-trash-can"></i></a>&nbsp; <a class="btn btn-danger" href="/admin/movimenti/delete?id={{ $movimento->id }}"><i class="fa-solid fa-trash-can"></i></a>&nbsp;
@ -72,8 +71,6 @@
</div> </div>
</div> </div>
</div> </div>
<!-- MODAL NEW --> <!-- MODAL NEW -->
<div class="modal fade " id="myModal" tabindex="-1" role="dialog" <div class="modal fade " id="myModal" tabindex="-1" role="dialog"
aria-labelledby="myModalLabel" aria-hidden="true"> aria-labelledby="myModalLabel" aria-hidden="true">
@ -113,10 +110,10 @@
<div class="col-xs-5"> <div class="col-xs-5">
<label for="importo" class="form-label">Importo</label> <label for="importo" class="form-label">Importo</label>
<div class="input-group"> <div class="input-group">
<span class="input-group-addon"> <i class="fa fa-eur"></i></span> <span class="input-group-addon"> <i class="fa fa-eur"></i>
<input type="number" step="0.01" min="-999999" </span> <input type="number" step="0.01" min="-999999"
max="999999" class="form-control" id="importo" size="50" max="999999" class="form-control" id="importo" size="50"
name="mov_importo_dare" aria-describedby="importo"> name="mov_importo" aria-describedby="importo">
</div> </div>
</div> </div>
<div class="col-xs-7"> <div class="col-xs-7">

View File

@ -98,23 +98,15 @@ Route::middleware([
Route::get('admin/movimenti/importgen', [MovimentiController::class,'importFileGen'])->name('importGen'); Route::get('admin/movimenti/importgen', [MovimentiController::class,'importFileGen'])->name('importGen');
Route::post('admin/movimenti/importgen', [MovimentiController::class,'importGenericCsv']); Route::post('admin/movimenti/importgen', [MovimentiController::class,'importGenericCsv']);
Route::post('admin/movimenti/importmapped', [MovimentiController::class,'importmappedCsv'])->name('conti.map.store'); Route::post('admin/movimenti/importmapped', [MovimentiController::class,'importmappedCsv'])->name('conti.map.store');
Route::get('/admin/movimenti/giroconto', [MovimentiController::class,'giroconto'])->name('giroconto');
Route::post('/admin/movimenti/giroconto', [MovimentiController::class,'girocontoPost']);
Route::get('/admin/movimenti/import_rules', [ImportRuleController::class, 'index'])->name('import_rules.index'); Route::get('/admin/movimenti/import_rules', [ImportRuleController::class, 'index'])->name('import_rules.index');
Route::get('/admin/movimenti/import_rules/create', [ImportRuleController::class, 'create'])->name('import_rules.create'); Route::get('/admin/movimenti/import_rules/create', [ImportRuleController::class, 'create'])->name('import_rules.create');
Route::post('/admin/movimenti/import_rules', [ImportRuleController::class, 'store'])->name('import_rules.store'); Route::post('/admin/movimenti/import_rules', [ImportRuleController::class, 'store'])->name('import_rules.store');
Route::get('/admin/movimenti/import_rules/{import_rule}', [ImportRuleController::class, 'show'])->name('import_rules.show');
Route::get('/admin/movimenti/import_rules/{import_rule}/edit', [ImportRuleController::class, 'edit'])->name('import_rules.edit');
Route::put('/admin/movimenti/import_rules/{import_rule}', [ImportRuleController::class, 'update'])->name('import_rules.update');
Route::delete('/admin/movimenti/import_rules/{import_rule}', [ImportRuleController::class, 'destroy'])->name('import_rules.destroy');
Route::resource('admin/conti', ContoController::class); Route::resource('admin/conti', ContoController::class);
Route::get('/admin/movimenti/giroconto', [MovimentiController::class,'giroconto'])->name('giroconto');
Route::post('/admin/movimenti/giroconto', [MovimentiController::class,'girocontoPost']);
// CATEGORIE // CATEGORIE
Route::get('admin/categorie', [CategorieController::class,'listCategorie'])->name('categorie'); Route::get('admin/categorie', [CategorieController::class,'listCategorie'])->name('categorie');
Route::post('admin/categorie', [CategorieController::class,'insCategorie']); Route::post('admin/categorie', [CategorieController::class,'insCategorie']);