@@ -42,6 +42,109 @@ public function fattura()
4242 return $ this ->document ();
4343 }
4444
45+ /**
46+ * Azione personalizzata per la copia dell'oggetto (dopo la copia).
47+ * Aggiunge la descrizione aggiuntiva personalizzata se impostata.
48+ */
49+ protected function customAfterDataCopiaIn ($ original )
50+ {
51+ // Chiama il metodo parent per mantenere la compatibilità
52+ parent ::customAfterDataCopiaIn ($ original );
53+
54+ // Verifica se l'impostazione "Descrizione aggiuntiva personalizzata in fatturazione" è configurata
55+ $ descrizione_aggiuntiva = setting ('Descrizione aggiuntiva personalizzata in fatturazione ' );
56+
57+ if ($ descrizione_aggiuntiva ) {
58+ // Sostituisce i placeholder con i valori effettivi dalla riga originale
59+ $ descrizione_personalizzata = $ this ->replacePlaceholders ($ descrizione_aggiuntiva , $ original );
60+
61+ // Aggiunge la descrizione personalizzata alla descrizione esistente
62+ if ($ descrizione_personalizzata ) {
63+ $ this ->descrizione = $ this ->descrizione . "\n" . $ descrizione_personalizzata ;
64+ }
65+ }
66+ }
67+
68+ /**
69+ * Sostituisce i placeholder nella descrizione con i valori dalla riga originale.
70+ *
71+ * @param string $text Testo con placeholder da sostituire
72+ * @param mixed $original Riga originale da cui prendere i valori
73+ * @return string Testo con placeholder sostituiti
74+ */
75+ private function replacePlaceholders ($ text , $ original )
76+ {
77+ // Trova tutti i placeholder nel formato {campo}
78+ preg_match_all ('/\{([^}]+)\}/ ' , $ text , $ matches );
79+
80+ if (empty ($ matches [1 ])) {
81+ return $ text ;
82+ }
83+
84+ $ result = $ text ;
85+
86+ foreach ($ matches [1 ] as $ field ) {
87+ $ placeholder = '{ ' . $ field . '} ' ;
88+ $ value = '' ;
89+
90+ // Prova ad accedere al campo dalla riga originale
91+ if (isset ($ original ->$ field )) {
92+ $ value = $ original ->$ field ;
93+ }
94+ // Se il campo non esiste direttamente, prova con getAttributes()
95+ elseif (method_exists ($ original , 'getAttributes ' )) {
96+ $ attributes = $ original ->getAttributes ();
97+ if (isset ($ attributes [$ field ])) {
98+ $ value = $ attributes [$ field ];
99+ }
100+ }
101+
102+ // Formatta il valore se è una data
103+ if ($ value ) {
104+ $ value = $ this ->formatFieldValue ($ field , $ value );
105+ }
106+
107+ // Sostituisce il placeholder con il valore trovato
108+ $ result = str_replace ($ placeholder , $ value , $ result );
109+ }
110+
111+ return $ result ;
112+ }
113+
114+ /**
115+ * Formatta il valore del campo in base al tipo.
116+ * Se il campo è una data, la formatta usando Translator.
117+ *
118+ * @param string $field Nome del campo
119+ * @param mixed $value Valore del campo
120+ * @return string Valore formattato
121+ */
122+ private function formatFieldValue ($ field , $ value )
123+ {
124+ if ($ this ->isDateFormat ($ value )) {
125+ // Usa Translator per formattare la data
126+ return \Translator::dateToLocale ($ value );
127+ }
128+
129+ return $ value ;
130+ }
131+
132+ /**
133+ * Verifica se un valore ha il formato di una data.
134+ *
135+ * @param mixed $value Valore da verificare
136+ * @return bool True se il valore è una data
137+ */
138+ private function isDateFormat ($ value )
139+ {
140+ if (!is_string ($ value ) || empty ($ value )) {
141+ return false ;
142+ }
143+
144+ // Verifica formati data comuni: YYYY-MM-DD, YYYY-MM-DD HH:MM:SS
145+ return preg_match ('/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}:\d{2})?$/ ' , $ value ) === 1 ;
146+ }
147+
45148 /**
46149 * Restituisce i dati aggiuntivi per la fattura elettronica dell'elemento.
47150 *
0 commit comments