Azienda.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. <?php
  2. namespace App\Http\Livewire;
  3. use Livewire\Component;
  4. use Livewire\WithFileUploads;
  5. use Illuminate\Support\Str;
  6. use App\Models\Azienda as AziendaModel;
  7. use App\Services\LogoUploadServices;
  8. use Illuminate\Support\Facades\Log;
  9. use App\Http\Middleware\TenantMiddleware;
  10. class Azienda extends Component
  11. {
  12. use WithFileUploads;
  13. public $update = false;
  14. public $azienda;
  15. public $ragione_sociale;
  16. public $nome_associazione;
  17. public $tipologia;
  18. public $logo;
  19. public $temp_logo;
  20. public $sede_legale_nazione;
  21. public $sede_legale_provincia;
  22. public $sede_legale_comune;
  23. public $sede_legale_indirizzo;
  24. public $sede_legale_cap;
  25. public $same_address = false;
  26. public $sede_operativa_nazione;
  27. public $sede_operativa_provincia;
  28. public $sede_operativa_comune;
  29. public $sede_operativa_indirizzo;
  30. public $sede_operativa_cap;
  31. public $email;
  32. public $pec;
  33. public $telefono;
  34. public $cellulare;
  35. public $partita_iva;
  36. public $codice_fiscale;
  37. public $codice_sdi;
  38. public $chiusura_anno_fiscale;
  39. public $scadenza_abbonamenti;
  40. public $scadenza_pagamenti_uscita;
  41. public $search = '';
  42. public $selectedDisciplines = [];
  43. public $disciplineId = '';
  44. public $discipline = [];
  45. public $activeTab = 'generale';
  46. protected $rules = [
  47. 'ragione_sociale' => 'required|string|max:255',
  48. 'email' => 'required|email|max:255',
  49. 'pec' => 'required|email|max:255',
  50. 'cellulare' => 'required|string|max:20',
  51. ];
  52. public function resetFields()
  53. {
  54. $this->ragione_sociale = null;
  55. $this->nome_associazione = null;
  56. $this->tipologia = null;
  57. $this->discipline = null;
  58. $this->temp_logo = null;
  59. $this->sede_legale_nazione = null;
  60. $this->sede_legale_provincia = null;
  61. $this->sede_legale_comune = null;
  62. $this->sede_legale_indirizzo = null;
  63. $this->sede_legale_cap = null;
  64. $this->same_address = false;
  65. $this->sede_operativa_nazione = null;
  66. $this->sede_operativa_provincia = null;
  67. $this->sede_operativa_comune = null;
  68. $this->sede_operativa_indirizzo = null;
  69. $this->sede_operativa_cap = null;
  70. $this->email = null;
  71. $this->pec = null;
  72. $this->telefono = null;
  73. $this->cellulare = null;
  74. $this->partita_iva = null;
  75. $this->codice_fiscale = null;
  76. $this->codice_sdi = null;
  77. }
  78. public function boot()
  79. {
  80. app(TenantMiddleware::class)->setupTenantConnection();
  81. }
  82. public function mount()
  83. {
  84. $this->azienda = AziendaModel::first();
  85. if ($this->azienda) {
  86. $this->ragione_sociale = $this->azienda->ragione_sociale;
  87. $this->nome_associazione = $this->azienda->nome_associazione;
  88. $this->tipologia = $this->azienda->tipologia;
  89. $this->discipline = $this->azienda->discipline;
  90. $this->logo = $this->azienda->logo;
  91. $this->sede_legale_nazione = $this->azienda->sede_legale_nazione;
  92. $this->sede_legale_provincia = $this->azienda->sede_legale_provincia;
  93. $this->sede_legale_comune = $this->azienda->sede_legale_comune;
  94. $this->sede_legale_indirizzo = $this->azienda->sede_legale_indirizzo;
  95. $this->sede_legale_cap = $this->azienda->sede_legale_cap;
  96. $this->sede_operativa_nazione = $this->azienda->sede_operativa_nazione;
  97. $this->sede_operativa_provincia = $this->azienda->sede_operativa_provincia;
  98. $this->sede_operativa_comune = $this->azienda->sede_operativa_comune;
  99. $this->sede_operativa_indirizzo = $this->azienda->sede_operativa_indirizzo;
  100. $this->sede_operativa_cap = $this->azienda->sede_operativa_cap;
  101. $this->email = $this->azienda->email;
  102. $this->pec = $this->azienda->pec;
  103. $this->telefono = $this->azienda->telefono;
  104. $this->cellulare = $this->azienda->cellulare;
  105. $this->partita_iva = $this->azienda->partita_iva;
  106. $this->codice_fiscale = $this->azienda->codice_fiscale;
  107. $this->codice_sdi = $this->azienda->codice_sdi;
  108. if (
  109. $this->sede_legale_nazione == $this->sede_operativa_nazione &&
  110. $this->sede_legale_provincia == $this->sede_operativa_provincia &&
  111. $this->sede_legale_comune == $this->sede_operativa_comune &&
  112. $this->sede_legale_indirizzo == $this->sede_operativa_indirizzo &&
  113. $this->sede_legale_cap == $this->sede_operativa_cap
  114. ) {
  115. $this->same_address = true;
  116. }
  117. Log::info('Azienda disciplines: ' . json_encode($this->azienda->discipline));
  118. if ($this->azienda && $this->azienda->discipline) {
  119. $this->selectedDisciplines = array_map('trim', array: explode(';', $this->azienda->discipline));
  120. }
  121. } else {
  122. $this->update = true;
  123. $this->resetFields();
  124. }
  125. $this->loadDisciplines();
  126. }
  127. public function render()
  128. {
  129. return view('livewire.azienda');
  130. }
  131. public function updatedSameAddress()
  132. {
  133. if ($this->same_address) {
  134. $this->sede_operativa_nazione = $this->sede_legale_nazione;
  135. $this->sede_operativa_provincia = $this->sede_legale_provincia;
  136. $this->sede_operativa_comune = $this->sede_legale_comune;
  137. $this->sede_operativa_indirizzo = $this->sede_legale_indirizzo;
  138. $this->sede_operativa_cap = $this->sede_legale_cap;
  139. } else {
  140. $this->sede_operativa_nazione = null;
  141. $this->sede_operativa_provincia = null;
  142. $this->sede_operativa_comune = null;
  143. $this->sede_operativa_indirizzo = null;
  144. $this->sede_operativa_cap = null;
  145. }
  146. }
  147. public function updatedSedeOperativaNazione()
  148. {
  149. $this->checkAddressDifference();
  150. }
  151. public function updatedSedeOperativaProvincia()
  152. {
  153. $this->checkAddressDifference();
  154. }
  155. public function updatedSedeOperativaComune()
  156. {
  157. $this->checkAddressDifference();
  158. }
  159. public function updatedSedeOperativaIndirizzo()
  160. {
  161. $this->checkAddressDifference();
  162. }
  163. public function updatedSedeOperativaCap()
  164. {
  165. $this->checkAddressDifference();
  166. }
  167. public function checkAddressDifference()
  168. {
  169. if (
  170. $this->sede_legale_nazione == $this->sede_operativa_nazione &&
  171. $this->sede_legale_provincia == $this->sede_operativa_provincia &&
  172. $this->sede_legale_comune == $this->sede_operativa_comune &&
  173. $this->sede_legale_indirizzo == $this->sede_operativa_indirizzo &&
  174. $this->sede_legale_cap == $this->sede_operativa_cap
  175. ) {
  176. $this->same_address = true;
  177. } else {
  178. $this->same_address = false;
  179. }
  180. }
  181. public function setTab($tab)
  182. {
  183. $this->activeTab = $tab;
  184. }
  185. public function edit()
  186. {
  187. $this->update = true;
  188. }
  189. public function save()
  190. {
  191. $this->validate();
  192. Log::info('Saving discipline: ' . json_encode(implode('; ', $this->selectedDisciplines)));
  193. try {
  194. $data = [
  195. 'ragione_sociale' => $this->ragione_sociale,
  196. 'nome_associazione' => $this->nome_associazione,
  197. 'tipologia' => $this->tipologia,
  198. 'discipline' => implode('; ', $this->selectedDisciplines),
  199. 'sede_legale_nazione' => $this->sede_legale_nazione,
  200. 'sede_legale_provincia' => $this->sede_legale_provincia,
  201. 'sede_legale_comune' => $this->sede_legale_comune,
  202. 'sede_legale_indirizzo' => $this->sede_legale_indirizzo,
  203. 'sede_legale_cap' => $this->sede_legale_cap,
  204. 'sede_operativa_nazione' => $this->sede_operativa_nazione,
  205. 'sede_operativa_provincia' => $this->sede_operativa_provincia,
  206. 'sede_operativa_comune' => $this->sede_operativa_comune,
  207. 'sede_operativa_indirizzo' => $this->sede_operativa_indirizzo,
  208. 'sede_operativa_cap' => $this->sede_operativa_cap,
  209. 'same_address' => $this->same_address,
  210. 'email' => $this->email,
  211. 'pec' => $this->pec,
  212. 'telefono' => $this->telefono,
  213. 'cellulare' => $this->cellulare,
  214. 'partita_iva' => $this->partita_iva,
  215. 'codice_fiscale' => $this->codice_fiscale,
  216. 'codice_sdi' => $this->codice_sdi,
  217. ];
  218. // Create or update azienda first
  219. if ($this->azienda) {
  220. $this->azienda->update($data);
  221. } else {
  222. $this->azienda = AziendaModel::create($data);
  223. }
  224. // Handle logo upload using the service
  225. if ($this->temp_logo) {
  226. try {
  227. Log::info('Starting logo upload with service');
  228. $logoService = app(LogoUploadServices::class);
  229. $logoPath = $logoService->uploadLogo($this->temp_logo, $this->azienda);
  230. Log::info('Logo uploaded successfully to: ' . $logoPath);
  231. // Reset temp logo after successful upload
  232. $this->temp_logo = null;
  233. } catch (\Exception $e) {
  234. Log::error('Error uploading logo via service: ' . $e->getMessage());
  235. session()->flash('error', 'Errore durante il caricamento del logo: ' . $e->getMessage());
  236. return;
  237. }
  238. }
  239. session()->flash('message', $this->azienda->wasRecentlyCreated ?
  240. 'Dati societari creati con successo' :
  241. 'Dati societari aggiornati con successo'
  242. );
  243. $this->update = false;
  244. } catch (\Exception $ex) {
  245. Log::error('Error in save method: ' . $ex->getMessage());
  246. session()->flash('error', 'Errore: ' . $ex->getMessage());
  247. }
  248. }
  249. public function getSelectedDisciplineNamesProperty()
  250. {
  251. if (empty($this->selectedDisciplines)) {
  252. return [];
  253. }
  254. Log::info('Selected disciplines: ' . json_encode($this->selectedDisciplines));
  255. return \App\Models\Discipline::whereIn('id', $this->selectedDisciplines)
  256. ->pluck('name')
  257. ->toArray();
  258. }
  259. public function cancel()
  260. {
  261. $this->resetFields();
  262. $this->mount();
  263. $this->update = false;
  264. }
  265. public function loadDisciplines()
  266. {
  267. $this->discipline = \App\Models\Discipline::select('id', 'name')->get();
  268. }
  269. public function addDiscipline()
  270. {
  271. if (!empty($this->disciplineId)) {
  272. $discipline = \App\Models\Discipline::find($this->disciplineId);
  273. if ($discipline && !in_array($discipline->name, $this->selectedDisciplines)) {
  274. $this->selectedDisciplines[] = $discipline->name;
  275. $this->disciplineId = '';
  276. }
  277. }
  278. }
  279. public function removeDiscipline($index)
  280. {
  281. if (isset($this->selectedDisciplines[$index])) {
  282. unset($this->selectedDisciplines[$index]);
  283. $this->selectedDisciplines = array_values($this->selectedDisciplines);
  284. }
  285. }
  286. public function updatedSearch()
  287. {
  288. $this->loadDisciplines();
  289. }
  290. public function removeLogo()
  291. {
  292. if ($this->azienda) {
  293. try {
  294. $logoService = app(LogoUploadServices::class);
  295. if ($logoService->deleteLogo($this->azienda)) {
  296. $this->logo = null;
  297. session()->flash('message', 'Logo rimosso con successo!');
  298. Log::info('Logo removed successfully for azienda: ' . $this->azienda->id);
  299. } else {
  300. session()->flash('error', 'Nessun logo da rimuovere.');
  301. }
  302. } catch (\Exception $e) {
  303. Log::error('Error removing logo: ' . $e->getMessage());
  304. session()->flash('error', 'Errore durante la rimozione del logo: ' . $e->getMessage());
  305. }
  306. }
  307. }
  308. /**
  309. * Get logo URL for display
  310. */
  311. public function getLogoUrlProperty()
  312. {
  313. if ($this->azienda && $this->azienda->logo) {
  314. $logoService = app(LogoUploadServices::class);
  315. return $logoService->getLogoUrl($this->azienda);
  316. }
  317. return null;
  318. }
  319. /**
  320. * Check if logo exists
  321. */
  322. public function getHasLogoProperty()
  323. {
  324. if ($this->azienda) {
  325. $logoService = app(LogoUploadServices::class);
  326. return $logoService->logoExists($this->azienda);
  327. }
  328. return false;
  329. }
  330. }