Skip to content

Commit f25c1da

Browse files
committed
fix: import attività
1 parent 052b8f5 commit f25c1da

1 file changed

Lines changed: 170 additions & 17 deletions

File tree

  • modules/interventi/src/Import

modules/interventi/src/Import/CSV.php

Lines changed: 170 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
use Modules\Anagrafiche\Anagrafica;
2525
use Modules\Anagrafiche\Tipo as TipoAnagrafica;
2626
use Modules\Impianti\Impianto;
27+
use Modules\Interventi\Components\Riga;
2728
use Modules\Interventi\Components\Sessione;
2829
use Modules\Interventi\Intervento;
2930
use Modules\Interventi\Stato;
31+
use Modules\Iva\Aliquota;
3032
use Modules\TipiIntervento\Tipo as TipoIntervento;
3133

3234
/**
@@ -54,12 +56,17 @@ public function getAvailableFields()
5456
[
5557
'field' => 'partita_iva',
5658
'label' => 'Partita IVA cliente',
57-
'required' => false, // Almeno uno tra partita IVA e codice fiscale deve essere presente
59+
'required' => false, // Se non trova corrispondenza, verrà creata una nuova anagrafica
5860
],
5961
[
6062
'field' => 'codice_fiscale',
6163
'label' => 'Codice Fiscale cliente',
62-
'required' => false, // Almeno uno tra partita IVA e codice fiscale deve essere presente
64+
'required' => false, // Se non trova corrispondenza, verrà creata una nuova anagrafica
65+
],
66+
[
67+
'field' => 'ragione_sociale',
68+
'label' => 'Ragione Sociale cliente',
69+
'required' => false, // Se non trova corrispondenza, verrà creata una nuova anagrafica
6370
],
6471
[
6572
'field' => 'data',
@@ -69,12 +76,10 @@ public function getAvailableFields()
6976
[
7077
'field' => 'data_richiesta',
7178
'label' => 'Data richiesta',
72-
'required' => true,
7379
],
7480
[
7581
'field' => 'ora_inizio',
7682
'label' => 'Ora inizio',
77-
'required' => true,
7883
],
7984
[
8085
'field' => 'ora_fine',
@@ -83,7 +88,6 @@ public function getAvailableFields()
8388
[
8489
'field' => 'tecnico',
8590
'label' => 'Tecnico',
86-
'required' => true,
8791
],
8892
[
8993
'field' => 'tipo',
@@ -110,6 +114,21 @@ public function getAvailableFields()
110114
'field' => 'stato',
111115
'label' => 'Stato',
112116
],
117+
[
118+
'field' => 'descrizione_riga',
119+
'label' => 'Descrizione riga',
120+
'required' => false,
121+
],
122+
[
123+
'field' => 'imponibile',
124+
'label' => 'Imponibile riga',
125+
'required' => false,
126+
],
127+
[
128+
'field' => 'aliquota_iva',
129+
'label' => 'Aliquota IVA (%)',
130+
'required' => false,
131+
],
113132
];
114133
}
115134

@@ -136,19 +155,15 @@ public function init()
136155
public function import($record, $update_record = true, $add_record = true)
137156
{
138157
try {
139-
$database = database();
140158
$primary_key = $this->getPrimaryKey();
141159

142160
// Validazione dei campi obbligatori
143-
if (empty($record['codice']) || empty($record['data']) || empty($record['data_richiesta'])
144-
|| empty($record['ora_inizio']) || empty($record['tecnico']) || empty($record['richiesta'])) {
161+
if (empty($record['codice']) || empty($record['data']) || empty($record['richiesta'])) {
145162
return false;
146163
}
147164

148-
// Verifica che almeno uno tra partita IVA e codice fiscale sia presente
149-
if (empty($record['partita_iva']) && empty($record['codice_fiscale'])) {
150-
return false;
151-
}
165+
// Nota: Non è più necessario verificare la presenza di partita IVA, codice fiscale o ragione sociale
166+
// perché se non vengono trovate corrispondenze, verrà creata automaticamente una nuova anagrafica
152167

153168
// Ricerca dell'anagrafica cliente
154169
$anagrafica = $this->trovaAnagrafica($record);
@@ -203,6 +218,9 @@ public function import($record, $update_record = true, $add_record = true)
203218
// Crea la sessione di lavoro
204219
$this->creaSessione($intervento, $record);
205220

221+
// Crea la riga dell'intervento se specificata
222+
$this->creaRigaIntervento($intervento, $record);
223+
206224
return true;
207225
} catch (\Exception $e) {
208226
// Registra l'errore in un log
@@ -220,31 +238,45 @@ public function import($record, $update_record = true, $add_record = true)
220238
public static function getExample()
221239
{
222240
return [
223-
['Codice', 'Partita IVA Cliente', 'Codice Fiscale Cliente', 'Data', 'Data richiesta', 'Ora inizio', 'Ora fine', 'Tecnico', 'Tipo', 'Note', 'Impianto', 'Richiesta', 'Descrizione', 'Stato'],
224-
['00001/2024', '123456789', '123456789', '07/11/2024', '03/11/2025', '8:30', '9:30', 'Stefano Bianchi', '', '', '12345-85A22', 'Manutenzione ordinaria', 'eseguito intervento di manutenzione', 'Da programmare'],
225-
['0002/2024', '123456789', '123456789', '08/11/2024', '04/11/2025', '11:20', '', 'Stefano Bianchi', '', '', '12345-85B23', 'Manutenzione ordinaria', 'eseguito intervento di manutenzione', ''],
241+
['Codice', 'Partita IVA Cliente', 'Codice Fiscale Cliente', 'Ragione Sociale Cliente', 'Data', 'Data richiesta', 'Ora inizio', 'Ora fine', 'Tecnico', 'Tipo', 'Note', 'Impianto', 'Richiesta', 'Descrizione', 'Stato', 'Descrizione riga', 'Imponibile riga', 'Aliquota IVA (%)'],
242+
['00001/2024', '123456789', '123456789', 'Acme S.r.l.', '07/11/2024', '03/11/2025', '8:30', '9:30', 'Stefano Bianchi', '', '', '12345-85A22', 'Manutenzione ordinaria', 'eseguito intervento di manutenzione', 'Da programmare', 'Servizio di manutenzione', '100.00', '22'],
243+
['0002/2024', '', '', 'Beta Company S.p.A.', '08/11/2024', '04/11/2025', '11:20', '', 'Stefano Bianchi', '', '', '12345-85B23', 'Manutenzione ordinaria', 'eseguito intervento di manutenzione', '', 'Controllo impianto', '150.00', '22'],
244+
['0003/2024', '', '', '', '09/11/2024', '05/11/2025', '14:00', '15:00', 'Stefano Bianchi', '', '', '', 'Intervento urgente', 'riparazione guasto', 'Completato', 'Riparazione urgente', '200.00', '22'],
226245
];
227246
}
228247

229248
/**
230-
* Trova l'anagrafica cliente in base alla partita IVA o al codice fiscale.
249+
* Trova l'anagrafica cliente in base alla partita IVA, al codice fiscale o alla ragione sociale.
250+
* Se non trova nessuna corrispondenza, crea una nuova anagrafica.
231251
*
232252
* @param array $record Record da processare
233253
*
234-
* @return Anagrafica|null Anagrafica trovata o null se non trovata
254+
* @return Anagrafica|null Anagrafica trovata o creata, null in caso di errore
235255
*/
236256
protected function trovaAnagrafica($record)
237257
{
238258
$anagrafica = null;
239259

260+
// Ricerca per partita IVA
240261
if (!empty($record['partita_iva'])) {
241262
$anagrafica = Anagrafica::where('piva', '=', $record['partita_iva'])->first();
242263
}
243264

265+
// Ricerca per codice fiscale se non trovata con partita IVA
244266
if (empty($anagrafica) && !empty($record['codice_fiscale'])) {
245267
$anagrafica = Anagrafica::where('codice_fiscale', '=', $record['codice_fiscale'])->first();
246268
}
247269

270+
// Ricerca per ragione sociale se non trovata con partita IVA o codice fiscale
271+
if (empty($anagrafica) && !empty($record['ragione_sociale'])) {
272+
$anagrafica = Anagrafica::where('ragione_sociale', '=', $record['ragione_sociale'])->first();
273+
}
274+
275+
// Se non trova nessuna anagrafica, ne crea una nuova
276+
if (empty($anagrafica)) {
277+
$anagrafica = $this->creaAnagrafica($record);
278+
}
279+
248280
return $anagrafica;
249281
}
250282

@@ -392,4 +424,125 @@ protected function creaSessione($intervento, $record)
392424
return null;
393425
}
394426
}
427+
428+
/**
429+
* Crea una nuova anagrafica in base ai dati del record.
430+
*
431+
* @param array $record Record da processare
432+
*
433+
* @return Anagrafica|null Anagrafica creata o null in caso di errore
434+
*/
435+
protected function creaAnagrafica($record)
436+
{
437+
try {
438+
// Determina la ragione sociale da utilizzare
439+
$ragione_sociale = '';
440+
if (!empty($record['ragione_sociale'])) {
441+
$ragione_sociale = $record['ragione_sociale'];
442+
} elseif (!empty($record['partita_iva'])) {
443+
$ragione_sociale = 'Cliente P.IVA '.$record['partita_iva'];
444+
} elseif (!empty($record['codice_fiscale'])) {
445+
$ragione_sociale = 'Cliente C.F. '.$record['codice_fiscale'];
446+
} else {
447+
$ragione_sociale = 'Cliente importato '.date('Y-m-d H:i:s');
448+
}
449+
450+
// Crea la nuova anagrafica
451+
$anagrafica = Anagrafica::build($ragione_sociale);
452+
453+
// Imposta partita IVA se presente
454+
if (!empty($record['partita_iva'])) {
455+
$anagrafica->piva = $record['partita_iva'];
456+
}
457+
458+
// Imposta codice fiscale se presente
459+
if (!empty($record['codice_fiscale'])) {
460+
$anagrafica->codice_fiscale = $record['codice_fiscale'];
461+
}
462+
463+
// Assegna il tipo "Cliente" all'anagrafica
464+
$tipo_cliente = TipoAnagrafica::where('name', 'Cliente')->first();
465+
if (!empty($tipo_cliente)) {
466+
$anagrafica->tipologie = [$tipo_cliente->id];
467+
}
468+
469+
// Salva l'anagrafica
470+
$anagrafica->save();
471+
472+
return $anagrafica;
473+
} catch (\Exception $e) {
474+
// Registra l'errore
475+
error_log('Errore durante la creazione dell\'anagrafica: '.$e->getMessage());
476+
477+
return null;
478+
}
479+
}
480+
481+
/**
482+
* Trova l'aliquota IVA in base alla percentuale.
483+
*
484+
* @param float $percentuale Percentuale dell'aliquota IVA
485+
*
486+
* @return Aliquota|null Aliquota trovata o null se non trovata
487+
*/
488+
protected function trovaAliquotaIva($percentuale)
489+
{
490+
if (empty($percentuale)) {
491+
return Aliquota::find(setting('Iva predefinita'));
492+
}
493+
494+
// Cerca l'aliquota IVA per percentuale
495+
$aliquota = Aliquota::where('percentuale', $percentuale)->first();
496+
497+
// Se non trova l'aliquota, usa quella predefinita
498+
if (empty($aliquota)) {
499+
$aliquota = Aliquota::find(setting('Iva predefinita'));
500+
}
501+
502+
return $aliquota;
503+
}
504+
505+
/**
506+
* Crea una riga per l'intervento se specificata.
507+
*
508+
* @param Intervento $intervento Intervento associato
509+
* @param array $record Record da processare
510+
*
511+
* @return Riga|null Riga creata o null se non creata
512+
*/
513+
protected function creaRigaIntervento($intervento, $record)
514+
{
515+
// Verifica se sono presenti i dati per creare una riga
516+
if (empty($record['descrizione_riga']) && empty($record['imponibile'])) {
517+
return null;
518+
}
519+
520+
try {
521+
// Crea una nuova riga per l'intervento
522+
$riga = Riga::build($intervento);
523+
524+
// Imposta la descrizione della riga
525+
$riga->descrizione = $record['descrizione_riga'] ?: 'Riga importata';
526+
527+
// Imposta la quantità a 1
528+
$riga->qta = 1;
529+
530+
// Trova l'aliquota IVA
531+
$aliquota = $this->trovaAliquotaIva($record['aliquota_iva']);
532+
533+
// Imposta il prezzo unitario e l'IVA
534+
$prezzo_unitario = !empty($record['imponibile']) ? floatval($record['imponibile']) : 0;
535+
$riga->setPrezzoUnitario($prezzo_unitario, $aliquota->id);
536+
537+
// Salva la riga
538+
$riga->save();
539+
540+
return $riga;
541+
} catch (\Exception $e) {
542+
// Registra l'errore ma continua con l'importazione
543+
error_log('Errore durante la creazione della riga dell\'intervento: '.$e->getMessage());
544+
545+
return null;
546+
}
547+
}
395548
}

0 commit comments

Comments
 (0)