1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-06-05 22:09:38 +02:00

style: formattazione stile codice

This commit is contained in:
valentina
2025-05-15 15:58:36 +02:00
parent ccc0b32762
commit 4c606b0d63
159 changed files with 1469 additions and 1494 deletions

View File

@@ -20,8 +20,8 @@
include_once __DIR__.'/core.php'; include_once __DIR__.'/core.php';
use Util\Query;
use Models\Module; use Models\Module;
use Util\Query;
// Informazioni fondamentali // Informazioni fondamentali
$columns = (array) filter('columns', null, true); $columns = (array) filter('columns', null, true);
@@ -186,7 +186,7 @@ if (!empty($query)) {
elseif ($field == '_img_') { elseif ($field == '_img_') {
$module = Module::where('id', $id_module)->first(); $module = Module::where('id', $id_module)->first();
if (!empty($r['_img_'])) { if (!empty($r['_img_'])) {
$fileinfo = \Uploads::fileInfo($r['_img_']); $fileinfo = Uploads::fileInfo($r['_img_']);
$directory = '/'.$module->upload_directory.'/'; $directory = '/'.$module->upload_directory.'/';
$image = $directory.$r['_img_']; $image = $directory.$r['_img_'];

View File

@@ -153,7 +153,7 @@ if (!API\Response::isAPIRequest()) {
$handler->registerErrorHandler([]); $handler->registerErrorHandler([]);
// $handler->registerExceptionHandler(); // Handled by Whoops above // $handler->registerExceptionHandler(); // Handled by Whoops above
} }
$handler->registerFatalHandler(\Psr\Log\LogLevel::ERROR); $handler->registerFatalHandler(Psr\Log\LogLevel::ERROR);
// Database // Database
$dbo = $database = database(); $dbo = $database = database();

View File

@@ -192,10 +192,8 @@ if (empty($record) || !$has_access) {
// Successivo // Successivo
$next = $posizioni[$key + 1]['id']; $next = $posizioni[$key + 1]['id'];
echo '<span class="d-sm-inline">'; echo '<span class="d-sm-inline">';
echo ' echo '
<a class="btn btn-default'.($prev ? '' : ' disabled').'" href="'.base_path().'/editor.php?id_module='.$id_module.'&id_record='.$prev.'"> <a class="btn btn-default'.($prev ? '' : ' disabled').'" href="'.base_path().'/editor.php?id_module='.$id_module.'&id_record='.$prev.'">
<i class="fa fa-arrow-circle-left"></i> <i class="fa fa-arrow-circle-left"></i>
@@ -205,10 +203,8 @@ if (empty($record) || !$has_access) {
</a> </a>
</span>'; </span>';
echo '<div class="extra-buttons d-sm-inline">'; echo '<div class="extra-buttons d-sm-inline">';
// Pulsanti personalizzati // Pulsanti personalizzati
$buttons = $structure->filepath('buttons.php'); $buttons = $structure->filepath('buttons.php');

View File

@@ -215,8 +215,8 @@ if (empty($creation) && (!file_exists('config.inc.php') || !$valid_config)) {
<h3 class="card-title">'.tr('Configurazione incompleta').'</h3> <h3 class="card-title">'.tr('Configurazione incompleta').'</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<p>'.tr("Mancano alcuni parametri necessari nella configurazione").'.</p> <p>'.tr('Mancano alcuni parametri necessari nella configurazione').'.</p>
<p>'.tr("Verifica che il file _FILE_ contenga tutti i parametri di connessione al database", [ <p>'.tr('Verifica che il file _FILE_ contenga tutti i parametri di connessione al database', [
'_FILE_' => '<b>config.inc.php</b>', '_FILE_' => '<b>config.inc.php</b>',
]).'.</p> ]).'.</p>
<p>'.tr("Se il problema persiste, contatta l'assistenza").'.</p> <p>'.tr("Se il problema persiste, contatta l'assistenza").'.</p>

View File

@@ -96,7 +96,7 @@ if (filter('action') == 'do_update') {
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="alert alert-light border-left border-danger"> <div class="alert alert-light border-left border-danger">
<h5 class="text-danger font-weight-bold"><i class="fa fa-info-circle mr-2"></i>'.tr("Messaggio di errore").'</h5> <h5 class="text-danger font-weight-bold"><i class="fa fa-info-circle mr-2"></i>'.tr('Messaggio di errore').'</h5>
<p class="mb-0 font-weight-bold">'.$error_message.'</p> <p class="mb-0 font-weight-bold">'.$error_message.'</p>
</div>'; </div>';
@@ -107,14 +107,14 @@ if (filter('action') == 'do_update') {
<div class="card-header"> <div class="card-header">
<div class="d-flex justify-content-between align-items-center"> <div class="d-flex justify-content-between align-items-center">
<h5 class="mb-0 font-weight-bold"><i class="fa fa-database mr-2"></i>'.tr("Query SQL che ha causato l'errore").'</h5> <h5 class="mb-0 font-weight-bold"><i class="fa fa-database mr-2"></i>'.tr("Query SQL che ha causato l'errore").'</h5>
<button type="button" class="btn btn-sm btn-danger copy-query-btn" data-query="'.htmlspecialchars($error_query).'"> <button type="button" class="btn btn-sm btn-danger copy-query-btn" data-query="'.htmlspecialchars((string) $error_query).'">
<i class="fa fa-copy mr-1"></i>'.tr("Copia query").' <i class="fa fa-copy mr-1"></i>'.tr('Copia query').'
</button> </button>
</div> </div>
</div> </div>
<div class="card-body p-0"> <div class="card-body p-0">
<div class="p-3 bg-light code-container"> <div class="p-3 bg-light code-container">
<pre class="mb-0" style="white-space: pre-wrap; word-wrap: break-word;"><code>'.htmlspecialchars($error_query).'</code></pre> <pre class="mb-0" style="white-space: pre-wrap; word-wrap: break-word;"><code>'.htmlspecialchars((string) $error_query).'</code></pre>
</div> </div>
</div> </div>
</div> </div>
@@ -130,7 +130,7 @@ if (filter('action') == 'do_update') {
// Show feedback // Show feedback
var $btn = $(this); var $btn = $(this);
var originalText = $btn.html(); var originalText = $btn.html();
$btn.html(\'<i class="fa fa-check mr-1"></i>'.tr("Copiato!").'\'); $btn.html(\'<i class="fa fa-check mr-1"></i>'.tr('Copiato!').'\');
$btn.addClass("btn-success").removeClass("btn-outline-light"); $btn.addClass("btn-success").removeClass("btn-outline-light");
setTimeout(function() { setTimeout(function() {
@@ -238,7 +238,7 @@ if (filter('action') == 'do_update') {
<p><strong>'.tr("Benvenuto! Procediamo con l'installazione del database").'.</strong></p>'; <p><strong>'.tr("Benvenuto! Procediamo con l'installazione del database").'.</strong></p>';
} else { } else {
echo ' echo '
<p>'.tr("È necessario aggiornare il database alla nuova versione").'.</p>'; <p>'.tr('È necessario aggiornare il database alla nuova versione').'.</p>';
} }
// Prepara l'HTML per l'elenco degli aggiornamenti, ma non lo mostra ancora // Prepara l'HTML per l'elenco degli aggiornamenti, ma non lo mostra ancora
@@ -256,7 +256,7 @@ if (filter('action') == 'do_update') {
$column_updates = array_chunk($updates, $updates_per_column); $column_updates = array_chunk($updates, $updates_per_column);
// Per ogni colonna // Per ogni colonna
for ($col = 0; $col < count($column_updates); $col++) { for ($col = 0; $col < count($column_updates); ++$col) {
$updates_html .= ' $updates_html .= '
<div class="col-md-3"> <div class="col-md-3">
<ul class="list-unstyled mb-0">'; <ul class="list-unstyled mb-0">';

View File

@@ -40,7 +40,7 @@ if ($source->isArticolo()) {
$articolo_riga = Articolo::find($source->idarticolo); $articolo_riga = Articolo::find($source->idarticolo);
echo $articolo_riga->codice.' - '.$source->descrizione; echo $articolo_riga->codice.' - '.$source->descrizione;
} else { } else {
echo nl2br($source->descrizione); echo nl2br((string) $source->descrizione);
} }
echo ' echo '
</h3> </h3>

View File

@@ -92,7 +92,7 @@ if (Auth::check()) {
$array = $_SESSION['module_'.$id_module]; $array = $_SESSION['module_'.$id_module];
if (!empty($array)) { if (!empty($array)) {
foreach ($array as $field => $value) { foreach ($array as $field => $value) {
if (!empty($value) && str_contains($field, 'search_')) { if (!empty($value) && str_contains((string) $field, 'search_')) {
echo ' echo '
search.push("'.$field.'"); search.push("'.$field.'");
search["'.$field.'"] = "'.addslashes((string) $value).'";'; search["'.$field.'"] = "'.addslashes((string) $value).'";';
@@ -395,11 +395,9 @@ echo '
<body class="sidebar-mini layout-fixed '.(!empty($hide_sidebar) ? ' sidebar-collapse' : '').(!Auth::check() ? ' hold-transition login-page' : '').'"> <body class="sidebar-mini layout-fixed '.(!empty($hide_sidebar) ? ' sidebar-collapse' : '').(!Auth::check() ? ' hold-transition login-page' : '').'">
<div class="'.(!Auth::check() ? '' : 'wrapper').'">'; <div class="'.(!Auth::check() ? '' : 'wrapper').'">';
$isInstallation = (!$dbo->isInstalled() || !$dbo->isConnected() || Update::isUpdateAvailable()); $isInstallation = (!$dbo->isInstalled() || !$dbo->isConnected() || Update::isUpdateAvailable());
if (Auth::check()) { if (Auth::check()) {
$calendar_color_label = ($_SESSION['period_start'] != date('Y').'-01-01' || $_SESSION['period_end'] != date('Y').'-12-31') ? 'danger' : 'secondary'; $calendar_color_label = ($_SESSION['period_start'] != date('Y').'-01-01' || $_SESSION['period_end'] != date('Y').'-12-31') ? 'danger' : 'secondary';
echo ' echo '
@@ -715,8 +713,8 @@ if (Auth::check()) {
} }
// Non mostrare la card nella pagina di login quando ci sono solo errori // Non mostrare la card nella pagina di login quando ci sono solo errori
if ((!empty($messages['warning']) || (!empty($messages['error']) && ($pageTitle != tr('Login')))) && if ((!empty($messages['warning']) || (!empty($messages['error']) && ($pageTitle != tr('Login'))))
!($pageTitle == tr('Login') && empty($messages['warning']) && !empty($messages['error']))) { && !($pageTitle == tr('Login') && empty($messages['warning']) && !empty($messages['error']))) {
echo ' echo '
<div class="card card-warning card-center card-center-large"> <div class="card card-warning card-center card-center-large">
<div class="card-header with-border text-center"> <div class="card-header with-border text-center">
@@ -746,7 +744,7 @@ if (!empty($messages['error']) && (Auth::check() || $pageTitle != tr('Login')))
foreach ($messages['error'] as $value) { foreach ($messages['error'] as $value) {
// Rimuovi il codice errore dal messaggio // Rimuovi il codice errore dal messaggio
$value = preg_replace('/\[uid: ([a-z0-9]+)\]/i', '', $value); $value = preg_replace('/\[uid: ([a-z0-9]+)\]/i', '', (string) $value);
if ($is_admin) { if ($is_admin) {
// Visualizzazione migliorata per amministratori // Visualizzazione migliorata per amministratori
@@ -793,9 +791,9 @@ if (!empty($messages['warning'])) {
} }
// Chiusura della card informazioni - non mostrare nella pagina di login quando ci sono solo errori // Chiusura della card informazioni - non mostrare nella pagina di login quando ci sono solo errori
if (!Auth::check() && if (!Auth::check()
(!empty($messages['info']) || !empty($messages['warning']) || && (!empty($messages['info']) || !empty($messages['warning'])
(!empty($messages['error']) && $pageTitle != tr('Login')))) { || (!empty($messages['error']) && $pageTitle != tr('Login')))) {
echo ' echo '
</div> </div>
</div>'; </div>';

View File

@@ -105,7 +105,6 @@ $pageTitle = (!$dbo->isInstalled() || !$dbo->isConnected()) ? tr('Installazione'
include_once App::filepath('include|custom|', 'top.php'); include_once App::filepath('include|custom|', 'top.php');
// Controllo se è una beta e in caso mostro un warning // Controllo se è una beta e in caso mostro un warning
if (Update::isBeta()) { if (Update::isBeta()) {
echo ' echo '
@@ -177,7 +176,6 @@ if (!empty(flash()->getMessage('error'))) {
</script>'; </script>';
} }
if ($dbo->isInstalled() && $dbo->isConnected() && !Update::isUpdateAvailable()) { if ($dbo->isInstalled() && $dbo->isConnected() && !Update::isUpdateAvailable()) {
echo ' echo '
<form action="?op=login" method="post" autocomplete="off"> <form action="?op=login" method="post" autocomplete="off">

View File

@@ -24,12 +24,12 @@
* @since 2.4.2 * @since 2.4.2
*/ */
use Common\Components\Accounting; use Common\Components\Accounting;
use Intervention\Image\ImageManager;
use Modules\Contratti\Contratto; use Modules\Contratti\Contratto;
use Modules\DDT\DDT; use Modules\DDT\DDT;
use Modules\Fatture\Fattura; use Modules\Fatture\Fattura;
use Modules\Interventi\Intervento; use Modules\Interventi\Intervento;
use Modules\Ordini\Ordine; use Modules\Ordini\Ordine;
use Intervention\Image\ImageManager;
/** /**
* Esegue una somma precisa tra due interi/array. * Esegue una somma precisa tra due interi/array.
@@ -429,6 +429,7 @@ function hasArticoliFiglio($id_articolo)
* *
* @return ImageManager * @return ImageManager
*/ */
function getImageManager() { function getImageManager()
{
return extension_loaded('gd') ? ImageManager::gd() : ImageManager::imagick(); return extension_loaded('gd') ? ImageManager::gd() : ImageManager::imagick();
} }

View File

@@ -111,7 +111,7 @@ function setting($name, $again = false)
$user = Auth::user(); $user = Auth::user();
if ($user) { if ($user) {
$user_options = json_decode($user->options ?: '', true) ?: []; $user_options = json_decode((string) $user->options ?: '', true) ?: [];
} }
if ($user_options['settings'][$setting->id] !== null) { if ($user_options['settings'][$setting->id] !== null) {

View File

@@ -29,7 +29,6 @@ class OSMFilesystem extends Filesystem
'php' => 'application/php', 'php' => 'application/php',
'php5' => 'application/php', 'php5' => 'application/php',
'phtml' => 'application/php', 'phtml' => 'application/php',
]; ];
public function upload($directory, $filename, $contents) public function upload($directory, $filename, $contents)

View File

@@ -70,7 +70,7 @@ switch (filter('op')) {
foreach ($queries as $query) { foreach ($queries as $query) {
try { try {
$dbo->query($query); $dbo->query($query);
$executed++; ++$executed;
} catch (Exception $e) { } catch (Exception $e) {
$errors[] = $query.' - '.$e->getMessage(); $errors[] = $query.' - '.$e->getMessage();
} }

View File

@@ -25,7 +25,8 @@ echo '<div class="module-aggiornamenti px-3">';
$query_conflitti = []; $query_conflitti = [];
function saveQueriesToSession($queries) { function saveQueriesToSession($queries)
{
$_SESSION['query_conflitti'] = $queries; $_SESSION['query_conflitti'] = $queries;
} }
@@ -148,7 +149,6 @@ $results_settings = settings_diff($data_settings, $settings);
$results_settings_added = settings_diff($settings, $data_settings); $results_settings_added = settings_diff($settings, $data_settings);
if (!empty($results) || !empty($results_added) || !empty($results_settings) || !empty($results_settings_added)) { if (!empty($results) || !empty($results_added) || !empty($results_settings) || !empty($results_settings_added)) {
if ($results) { if ($results) {
echo ' echo '
<div class="row align-items-center"> <div class="row align-items-center">
@@ -296,13 +296,10 @@ if (!empty($results) || !empty($results_added) || !empty($results_settings) || !
if ($results_added) { if ($results_added) {
foreach ($results_added as $table => $errors) { foreach ($results_added as $table => $errors) {
if (($results[$table] && array_keys($results[$table]) != array_keys($errors)) || (empty($results[$table]) && !empty($errors))) { if (($results[$table] && array_keys($results[$table]) != array_keys($errors)) || (empty($results[$table]) && !empty($errors))) {
$has_content = false; $has_content = false;
$table_not_expected = array_key_exists('current', $errors) && $errors['current'] == null; $table_not_expected = array_key_exists('current', $errors) && $errors['current'] == null;
$has_keys = false; $has_keys = false;
foreach ($errors as $name => $diff) { foreach ($errors as $name => $diff) {
if ($name != 'foreign_keys' && !isset($results[$table][$name]) && isset($diff['key'])) { if ($name != 'foreign_keys' && !isset($results[$table][$name]) && isset($diff['key'])) {
@@ -311,10 +308,8 @@ if (!empty($results) || !empty($results_added) || !empty($results_settings) || !
} }
} }
$foreign_keys = $errors['foreign_keys'] ?: []; $foreign_keys = $errors['foreign_keys'] ?: [];
if ($table_not_expected || $has_keys || !empty($foreign_keys)) { if ($table_not_expected || $has_keys || !empty($foreign_keys)) {
echo ' echo '
<h5 class="table-name">'.$table.'</h5>'; <h5 class="table-name">'.$table.'</h5>';
@@ -381,14 +376,11 @@ if (!empty($results) || !empty($results_added) || !empty($results_settings) || !
<tbody>'; <tbody>';
foreach ($foreign_keys as $name => $diff) { foreach ($foreign_keys as $name => $diff) {
$query = 'ALTER TABLE `'.$table.'` ADD FOREIGN KEY (`'.$name.'`) REFERENCES '; $query = 'ALTER TABLE `'.$table.'` ADD FOREIGN KEY (`'.$name.'`) REFERENCES ';
if (isset($diff['referenced_table']) && isset($diff['referenced_column'])) { if (isset($diff['referenced_table']) && isset($diff['referenced_column'])) {
$query .= '`'.$diff['referenced_table']['current'].'`(`'.$diff['referenced_column']['current'].'`)'; $query .= '`'.$diff['referenced_table']['current'].'`(`'.$diff['referenced_column']['current'].'`)';
} else { } else {
$query .= 'altra_tabella(id)'; $query .= 'altra_tabella(id)';
} }
$query .= ' ON DELETE CASCADE ON UPDATE CASCADE'; $query .= ' ON DELETE CASCADE ON UPDATE CASCADE';
@@ -423,7 +415,7 @@ if (!empty($results) || !empty($results_added) || !empty($results_settings) || !
$campi_non_previsti[] = [ $campi_non_previsti[] = [
'tabella' => $table, 'tabella' => $table,
'campo' => $name, 'campo' => $name,
'valore' => isset($diff['expected']) ? $diff['expected'] : '' 'valore' => $diff['expected'] ?? '',
]; ];
} }
} }
@@ -452,7 +444,7 @@ if (!empty($results) || !empty($results_added) || !empty($results_settings) || !
} else { } else {
$class = 'warning'; $class = 'warning';
$query = "UPDATE `zz_settings` SET `tipo` = ".prepare($setting['expected'])." WHERE `nome` = ".prepare($key); $query = 'UPDATE `zz_settings` SET `tipo` = '.prepare($setting['expected']).' WHERE `nome` = '.prepare($key);
$query_conflitti[] = $query.';'; $query_conflitti[] = $query.';';
} }
@@ -500,7 +492,6 @@ if (!empty($results) || !empty($results_added) || !empty($results_settings) || !
</table>'; </table>';
} }
if (!empty($campi_non_previsti)) { if (!empty($campi_non_previsti)) {
echo ' echo '
<h4 class="table-title">Campi non previsti</h4> <h4 class="table-title">Campi non previsti</h4>
@@ -534,7 +525,6 @@ if (!empty($results) || !empty($results_added) || !empty($results_settings) || !
</div>'; </div>';
} }
if (!empty($query_conflitti)) { if (!empty($query_conflitti)) {
echo ' echo '
<script> <script>

View File

@@ -349,7 +349,7 @@ if (filter('op') == 'aggiungi-allegato' || filter('op') == 'modifica-allegato')
$nome = $upload->name; $nome = $upload->name;
$logo_stampe = ['logo stampe', 'logo_stampe', 'logo stampe.jpg', 'logo stampe.png']; $logo_stampe = ['logo stampe', 'logo_stampe', 'logo stampe.jpg', 'logo stampe.png'];
if (in_array(strtolower($nome), $logo_stampe)) { if (in_array(strtolower((string) $nome), $logo_stampe)) {
$nome = 'Logo stampe'; $nome = 'Logo stampe';
$uploads = $structure->uploads($id_record)->where('filename', $upload->filename); $uploads = $structure->uploads($id_record)->where('filename', $upload->filename);
foreach ($uploads as $logo) { foreach ($uploads as $logo) {
@@ -359,7 +359,7 @@ if (filter('op') == 'aggiungi-allegato' || filter('op') == 'modifica-allegato')
} }
$filigrana_stampe = ['filigrana stampe', 'filigrana_stampe', 'filigrana stampe.jpg', 'filigrana stampe.png']; $filigrana_stampe = ['filigrana stampe', 'filigrana_stampe', 'filigrana stampe.jpg', 'filigrana stampe.png'];
if (in_array(strtolower($nome), $filigrana_stampe)) { if (in_array(strtolower((string) $nome), $filigrana_stampe)) {
$nome = 'Filigrana stampe'; $nome = 'Filigrana stampe';
$uploads = $structure->uploads($id_record)->where('filename', $upload->filename); $uploads = $structure->uploads($id_record)->where('filename', $upload->filename);
foreach ($uploads as $filigrana) { foreach ($uploads as $filigrana) {

View File

@@ -116,8 +116,8 @@ switch ($resource) {
LEFT JOIN `co_pagamenti_lang` co_pagamenti_lang ON (`co_pagamenti`.`id` = `co_pagamenti_lang`.`id_record` AND `co_pagamenti_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).") LEFT JOIN `co_pagamenti_lang` co_pagamenti_lang ON (`co_pagamenti`.`id` = `co_pagamenti_lang`.`id_record` AND `co_pagamenti_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).")
LEFT JOIN `co_banche` banca_acquisti ON `co_pagamenti`.`idconto_acquisti` = `banca_acquisti`.`id_pianodeiconti3` AND `banca_acquisti`.`id_anagrafica` = '.prepare($id_azienda).' AND `banca_acquisti`.`deleted_at` IS NULL AND `banca_acquisti`.`predefined` = 1 LEFT JOIN `co_banche` banca_acquisti ON `co_pagamenti`.`idconto_acquisti` = `banca_acquisti`.`id_pianodeiconti3` AND `banca_acquisti`.`id_anagrafica` = '.prepare($id_azienda).' AND `banca_acquisti`.`deleted_at` IS NULL AND `banca_acquisti`.`predefined` = 1
LEFT JOIN an_relazioni ON an_anagrafiche.idrelazione=an_relazioni.id LEFT JOIN an_relazioni ON an_anagrafiche.idrelazione=an_relazioni.id
LEFT JOIN `an_relazioni_lang` ON (`an_relazioni`.`id`=`an_relazioni_lang`.`id_record` AND `an_relazioni_lang`.`id_lang`= ".prepare(Models\Locale::getDefault()->id).") LEFT JOIN `an_relazioni_lang` ON (`an_relazioni`.`id`=`an_relazioni_lang`.`id_record` AND `an_relazioni_lang`.`id_lang`= ".prepare(Models\Locale::getDefault()->id).')
|where| ".Modules::getAdditionalsQuery(Module::where('name', 'Anagrafiche')->first()->id).' |where| '.Modules::getAdditionalsQuery(Module::where('name', 'Anagrafiche')->first()->id).'
ORDER BY ORDER BY
`ragione_sociale`'; `ragione_sociale`';

View File

@@ -145,6 +145,4 @@ $operations['search_coordinates'] = [
], ],
]; ];
return $operations; return $operations;

View File

@@ -779,7 +779,7 @@ if (!empty($elementi)) {
'_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'], '_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'],
'_DATE_' => Translator::dateToLocale($elemento['data']), '_DATE_' => Translator::dateToLocale($elemento['data']),
'_DELETED_AT_' => (!empty($elemento['deleted_at']) ? tr('Eliminato il:').' '.Translator::dateToLocale($elemento['deleted_at']) : ''), '_DELETED_AT_' => (!empty($elemento['deleted_at']) ? tr('Eliminato il:').' '.Translator::dateToLocale($elemento['deleted_at']) : ''),
'_STATO_' => (!empty($elemento['stato_documento']) ? "(".$elemento['stato_documento'].")" : ''), '_STATO_' => (!empty($elemento['stato_documento']) ? '('.$elemento['stato_documento'].')' : ''),
]); ]);
// se non è un preventivo è un ddt o una fattura // se non è un preventivo è un ddt o una fattura

View File

@@ -251,6 +251,7 @@ class CSV extends CSVImporter
* @param array $record Record da importare * @param array $record Record da importare
* @param bool $update_record Se true, aggiorna i record esistenti * @param bool $update_record Se true, aggiorna i record esistenti
* @param bool $add_record Se true, aggiunge nuovi record * @param bool $add_record Se true, aggiunge nuovi record
*
* @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata * @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata
*/ */
public function import($record, $update_record = true, $add_record = true) public function import($record, $update_record = true, $add_record = true)
@@ -353,10 +354,24 @@ class CSV extends CSVImporter
return true; return true;
} }
/**
* Restituisce un esempio di file CSV per l'importazione.
*
* @return array
*/
public static function getExample()
{
return [
['Codice', 'Ragione sociale', 'Nome', 'Cognome', 'Codice destinatario', 'Provincia', 'Città', 'Telefono', 'Indirizzo', 'CAP', 'Cellulare', 'Fax', 'Email', 'PEC', 'Sito Web', 'Codice fiscale', 'Data di nascita', 'Luogo di nascita', 'Sesso', 'Partita IVA', 'IBAN', 'Note', 'Nazione', 'ID Agente', 'ID pagamento', 'Tipo', 'Tipologia', 'Split Payment', 'Settore merceologico'],
['001', 'Mario Rossi', '', '', '12345', 'PD', 'Este', '+39 0429 60 25 12', 'Via Rovigo, 51', '35042', '+39 321 12 34 567', '', 'email@anagrafica.it', 'email@pec.it', 'www.sito.it', '', '', '', '', '123456789', 'IT60 X054 2811 1010 0000 0123 456', 'Note dell\'anagrafica di esempio', 'Italia', '', '', 'Cliente', 'Privato', '0', 'Tessile'],
];
}
/** /**
* Processa le tipologie dell'anagrafica. * Processa le tipologie dell'anagrafica.
* *
* @param array $record Record da processare * @param array $record Record da processare
*
* @return array Array di ID delle tipologie * @return array Array di ID delle tipologie
*/ */
private function processaTipologie($record) private function processaTipologie($record)
@@ -400,6 +415,7 @@ class CSV extends CSVImporter
* Processa il settore merceologico. * Processa il settore merceologico.
* *
* @param array $record Record da processare * @param array $record Record da processare
*
* @return string|null ID del settore merceologico * @return string|null ID del settore merceologico
*/ */
private function processaSettore($record) private function processaSettore($record)
@@ -409,7 +425,7 @@ class CSV extends CSVImporter
} }
$database = database(); $database = database();
$settore = trim($record['id_settore']); $settore = trim((string) $record['id_settore']);
$result = $database->fetchArray('SELECT `an_settori`.`id` FROM `an_settori` $result = $database->fetchArray('SELECT `an_settori`.`id` FROM `an_settori`
LEFT JOIN `an_settori_lang` ON (`an_settori`.`id` = `an_settori_lang`.`id_record` LEFT JOIN `an_settori_lang` ON (`an_settori`.`id` = `an_settori_lang`.`id_record`
@@ -438,6 +454,7 @@ class CSV extends CSVImporter
* *
* @param array $record Record da processare * @param array $record Record da processare
* @param Anagrafica $anagrafica Anagrafica associata * @param Anagrafica $anagrafica Anagrafica associata
*
* @return string|null ID della banca * @return string|null ID della banca
*/ */
private function processaIBAN($record, $anagrafica) private function processaIBAN($record, $anagrafica)
@@ -447,7 +464,7 @@ class CSV extends CSVImporter
} }
$database = database(); $database = database();
$iban = trim($record['codiceiban']); $iban = trim((string) $record['codiceiban']);
$result = $database->fetchOne('SELECT `co_banche`.`id` FROM `co_banche` $result = $database->fetchOne('SELECT `co_banche`.`id` FROM `co_banche`
WHERE LOWER(`iban`) = LOWER('.prepare($iban).') WHERE LOWER(`iban`) = LOWER('.prepare($iban).')
@@ -458,7 +475,7 @@ class CSV extends CSVImporter
if (empty($id_banca)) { if (empty($id_banca)) {
$database->query('INSERT INTO `co_banche` (`iban`, `nome`, `id_anagrafica`) $database->query('INSERT INTO `co_banche` (`iban`, `nome`, `id_anagrafica`)
VALUES ('.prepare($iban).', "Banca da importazione '.addslashes($anagrafica->ragione_sociale).'", '.$anagrafica->id.')'); VALUES ('.prepare($iban).', "Banca da importazione '.addslashes((string) $anagrafica->ragione_sociale).'", '.$anagrafica->id.')');
$id_banca = $database->lastInsertedID(); $id_banca = $database->lastInsertedID();
} }
@@ -470,6 +487,7 @@ class CSV extends CSVImporter
* *
* @param array $record Record da processare * @param array $record Record da processare
* @param string $primary_key Chiave primaria * @param string $primary_key Chiave primaria
*
* @return array Dati della sede legale * @return array Dati della sede legale
*/ */
private function estraiDatiSede(&$record, $primary_key) private function estraiDatiSede(&$record, $primary_key)
@@ -501,17 +519,4 @@ class CSV extends CSVImporter
return $dati_sede; return $dati_sede;
} }
/**
* Restituisce un esempio di file CSV per l'importazione.
*
* @return array
*/
public static function getExample()
{
return [
['Codice', 'Ragione sociale', 'Nome', 'Cognome', 'Codice destinatario', 'Provincia', 'Città', 'Telefono', 'Indirizzo', 'CAP', 'Cellulare', 'Fax', 'Email', 'PEC', 'Sito Web', 'Codice fiscale', 'Data di nascita', 'Luogo di nascita', 'Sesso', 'Partita IVA', 'IBAN', 'Note', 'Nazione', 'ID Agente', 'ID pagamento', 'Tipo', 'Tipologia', 'Split Payment', 'Settore merceologico'],
['001', 'Mario Rossi', '', '', '12345', 'PD', 'Este', '+39 0429 60 25 12', 'Via Rovigo, 51', '35042', '+39 321 12 34 567', '', 'email@anagrafica.it', 'email@pec.it', 'www.sito.it', '', '', '', '', '123456789', 'IT60 X054 2811 1010 0000 0123 456', 'Note dell\'anagrafica di esempio', 'Italia', '', '', 'Cliente', 'Privato', '0', 'Tessile'],
];
}
} }

View File

@@ -63,7 +63,7 @@ switch (post('op')) {
} }
if (post('genera_barcode')) { if (post('genera_barcode')) {
$codice = '200'.str_pad($articolo->id, 9, '0', STR_PAD_LEFT); $codice = '200'.str_pad((string) $articolo->id, 9, '0', STR_PAD_LEFT);
$barcode = (new Picqer\Barcode\Types\TypeEan13())->getBarcode($codice)->getBarcode(); $barcode = (new Picqer\Barcode\Types\TypeEan13())->getBarcode($codice)->getBarcode();
} }
$articolo->barcode = $barcode ?: post('barcode'); $articolo->barcode = $barcode ?: post('barcode');

View File

@@ -582,7 +582,6 @@ $operations['add_price_list'] = [
], ],
]; ];
$operations['change_active'] = [ $operations['change_active'] = [
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Attiva/disattiva articoli').'</span>', 'text' => '<span><i class="fa fa-refresh"></i> '.tr('Attiva/disattiva articoli').'</span>',
'data' => [ 'data' => [
@@ -629,8 +628,6 @@ $operations['create_estimate'] = [
], ],
]; ];
$operations['generate_barcode_bulk'] = [ $operations['generate_barcode_bulk'] = [
'text' => '<span><i class="fa fa-magic"></i> '.tr('Genera barcode').'</span>', 'text' => '<span><i class="fa fa-magic"></i> '.tr('Genera barcode').'</span>',
'data' => [ 'data' => [
@@ -677,6 +674,4 @@ $operations['print_labels'] = [
], ],
]; ];
return $operations; return $operations;

View File

@@ -443,7 +443,7 @@ if (!empty($elementi)) {
'_DOC_' => $elemento['tipo_documento'], '_DOC_' => $elemento['tipo_documento'],
'_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'], '_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'],
'_DATE_' => Translator::dateToLocale($elemento['data']), '_DATE_' => Translator::dateToLocale($elemento['data']),
'_STATO_' => (!empty($elemento['stato_documento']) ? "(".$elemento['stato_documento'].")" : ''), '_STATO_' => (!empty($elemento['stato_documento']) ? '('.$elemento['stato_documento'].')' : ''),
]); ]);
// se non è un preventivo è un ddt o una fattura // se non è un preventivo è un ddt o una fattura

View File

@@ -138,7 +138,7 @@ echo '
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-map-marker mr-1"></i> '.tr('Ubicazione').'</td> <td><i class="fa fa-map-marker mr-1"></i> '.tr('Ubicazione').'</td>
<td class="text-right font-weight-bold">'.($articolo->ubicazione ? $articolo->ubicazione : '<span class="text-muted">-</span>').'</td> <td class="text-right font-weight-bold">'.($articolo->ubicazione ?: '<span class="text-muted">-</span>').'</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-balance-scale mr-1"></i> '.tr('Peso lordo').'</td> <td><i class="fa fa-balance-scale mr-1"></i> '.tr('Peso lordo').'</td>

View File

@@ -24,8 +24,6 @@ $record['abilita_serial'] = ($record['serial'] > 0) ? 1 : $record['abilita_seria
if (empty($record['abilita_serial'])) { if (empty($record['abilita_serial'])) {
echo ' echo '
<script>$("li.btn-default.nav-item:has(#link-tab_'.$plugin['id'].')").addClass("disabled");</script>'; <script>$("li.btn-default.nav-item:has(#link-tab_'.$plugin['id'].')").addClass("disabled");</script>';
} }
// Visualizzo, in base alle impostazioni scelte, se il magazzino verrà movimentato // Visualizzo, in base alle impostazioni scelte, se il magazzino verrà movimentato

View File

@@ -319,171 +319,13 @@ class CSV extends CSVImporter
} }
} }
/**
* Processa la categoria dell'articolo.
*
* @param array $record Record da processare
* @return Categoria|null Categoria processata
*/
protected function processaCategoria($record)
{
if (empty($record['categoria'])) {
return null;
}
$categoria = Categoria::where('id', '=', (new Categoria())->getByField('title', strtolower((string) $record['categoria'])))->where('is_articolo', '=', 0)->first();
if (empty($categoria)) {
$categoria = Categoria::build();
$categoria->setTranslation('title', $record['categoria']);
$categoria->is_articolo = 1;
$categoria->save();
}
return $categoria;
}
/**
* Processa la sottocategoria dell'articolo.
*
* @param array $record Record da processare
* @param Categoria|null $categoria Categoria padre
* @return Categoria|null Sottocategoria processata
*/
protected function processaSottocategoria($record, $categoria)
{
if (empty($record['sottocategoria']) || empty($categoria)) {
return null;
}
$sottocategoria = Categoria::where('id', '=', (new Categoria())->getByField('title', strtolower((string) $record['sottocategoria'])))->first();
if (empty($sottocategoria)) {
$sottocategoria = Categoria::build();
$sottocategoria->setTranslation('title', $record['sottocategoria']);
$sottocategoria->parent()->associate($categoria);
$sottocategoria->save();
}
return $sottocategoria;
}
/**
* Processa la marca dell'articolo.
*
* @param array $record Record da processare
* @return Marca|null Marca processata
*/
protected function processaMarca($record)
{
if (empty($record['marca'])) {
return null;
}
$marca = Marca::where('name', $record['marca'])->first();
if (empty($marca)) {
$marca = Marca::build($record['marca']);
$marca->save();
}
return $marca;
}
/**
* Processa l'unità di misura dell'articolo.
*
* @param array $record Record da processare
* @return void
*/
protected function processaUnitaMisura($record)
{
if (empty($record['um'])) {
return;
}
$database = database();
$um = $database->fetchOne('SELECT id FROM `mg_unitamisura` WHERE `valore`='.prepare($record['um']));
if (empty($um)) {
$database->query('INSERT INTO `mg_unitamisura` (`valore`) VALUES ('.prepare($record['um']).')');
}
}
/**
* Processa l'immagine dell'articolo.
*
* @param Articolo $articolo Articolo da aggiornare
* @param string $url URL dell'immagine
* @param array $record Record da processare
* @return void
*/
protected function processaImmagine($articolo, $url, $record)
{
if (empty($url) || empty($record['import_immagine'])) {
return;
}
try {
$file_content = @file_get_contents($url);
if (empty($file_content)) {
return;
}
$database = database();
/**
* Import immagine options:
*
* - 1: Permette di importare l'immagine come principale dell'articolo mantenendo gli altri allegati già presenti.
* - 2: Permette di importare l'immagine come principale dell'articolo rimuovendo tutti gli allegati presenti.
* - 3: Permette di importare l'immagine come allegato dell'articolo.
* - 4: Permette di importare l'immagine come allegato dell'articolo rimuovendo tutti gli allegati presenti.
*/
if ($record['import_immagine'] == 2 || $record['import_immagine'] == 4) {
\Uploads::deleteLinked([
'id_module' => Module::where('name', 'Articoli')->first()->id,
'id_record' => $articolo->id,
]);
$database->update('mg_articoli', [
'immagine' => '',
], [
'id' => $articolo->id,
]);
}
$name = 'immagine_'.$articolo->id.'.'.Upload::getExtensionFromMimeType($file_content);
$upload = \Uploads::upload($file_content, [
'name' => 'Immagine',
'category' => 'Immagini',
'original_name' => $name,
'id_module' => Module::where('name', 'Articoli')->first()->id,
'id_record' => $articolo->id,
], [
'thumbnails' => true,
]);
if ($upload && !empty($upload->filename) && ($record['import_immagine'] == 1 || $record['import_immagine'] == 2)) {
$database->update('mg_articoli', [
'immagine' => $upload->filename,
], [
'id' => $articolo->id,
]);
}
} catch (\Exception $e) {
// Registra l'errore ma continua con l'importazione
error_log('Errore durante l\'importazione dell\'immagine: ' . $e->getMessage());
}
}
/** /**
* Importa un record nel database. * Importa un record nel database.
* *
* @param array $record Record da importare * @param array $record Record da importare
* @param bool $update_record Se true, aggiorna i record esistenti * @param bool $update_record Se true, aggiorna i record esistenti
* @param bool $add_record Se true, aggiunge nuovi record * @param bool $add_record Se true, aggiunge nuovi record
*
* @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata * @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata
*/ */
public function import($record, $update_record = true, $add_record = true) public function import($record, $update_record = true, $add_record = true)
@@ -557,7 +399,7 @@ class CSV extends CSVImporter
$nome_sede = $record['nome_sede'] ?? ''; $nome_sede = $record['nome_sede'] ?? '';
// Aggiornamento dettaglio prezzi // Aggiornamento dettaglio prezzi
$dettagli['anagrafica_listino'] = $dettagli['anagrafica_listino'] ?? $record['anagrafica_listino']; $dettagli['anagrafica_listino'] ??= $record['anagrafica_listino'];
$dettagli['partita_iva'] = $record['p_iva'] ?? ''; $dettagli['partita_iva'] = $record['p_iva'] ?? '';
$dettagli['qta_minima'] = $record['qta_minima'] ?? ''; $dettagli['qta_minima'] = $record['qta_minima'] ?? '';
$dettagli['qta_massima'] = $record['qta_massima'] ?? ''; $dettagli['qta_massima'] = $record['qta_massima'] ?? '';
@@ -618,10 +460,183 @@ class CSV extends CSVImporter
} catch (\Exception $e) { } catch (\Exception $e) {
// Registra l'errore in un log // Registra l'errore in un log
error_log('Errore durante l\'importazione dell\'articolo: '.$e->getMessage()); error_log('Errore durante l\'importazione dell\'articolo: '.$e->getMessage());
return false; return false;
} }
} }
public static function getExample()
{
return [
['Codice', 'Immagine', 'Import immagine', 'Descrizione', 'Quantità', 'Data inventario', 'Unità misura', 'Prezzo acquisto', 'Prezzo vendita', 'Peso', 'Volume', 'Categoria', 'Sottocategoria', 'marca', 'Modello', 'Barcode', 'Fornitore predefinito', 'Partita IVA', 'Codice IVA vendita', 'Ubicazione', 'Note', 'Anagrafica listino', 'Codice fornitore', 'Barcode fornitore', 'Descrizione fornitore', 'Qta minima', 'Qta massima', 'Prezzo listino', 'Sconto listino', 'Cliente/Fornitore listino', 'Sede'],
['OSM-BUDGET', 'https://openstamanager.com/moduli/budget/budget.webp', '2', 'Modulo Budget per OpenSTAManager', '1', '28/11/2023', 'PZ', '90.00', '180.00', '', '', 'Software gestionali', 'Moduli aggiuntivi', 'DevCode', 'Budget', '4006381333931', 'DevCode s.r.l.', '05024030289', '', '', 'Nota ad uso interno', 'DevCode s.r.l.', 'DEV-BUDGET', '0123456789012', 'Strumento gestionale utilizzato per pianificare e monitorare le entrate e uscite aziendali', '1', '10', '180.00', '20', 'Fornitore', 'Sede'],
];
}
/**
* Processa la categoria dell'articolo.
*
* @param array $record Record da processare
*
* @return Categoria|null Categoria processata
*/
protected function processaCategoria($record)
{
if (empty($record['categoria'])) {
return null;
}
$categoria = Categoria::where('id', '=', (new Categoria())->getByField('title', strtolower((string) $record['categoria'])))->where('is_articolo', '=', 0)->first();
if (empty($categoria)) {
$categoria = Categoria::build();
$categoria->setTranslation('title', $record['categoria']);
$categoria->is_articolo = 1;
$categoria->save();
}
return $categoria;
}
/**
* Processa la sottocategoria dell'articolo.
*
* @param array $record Record da processare
* @param Categoria|null $categoria Categoria padre
*
* @return Categoria|null Sottocategoria processata
*/
protected function processaSottocategoria($record, $categoria)
{
if (empty($record['sottocategoria']) || empty($categoria)) {
return null;
}
$sottocategoria = Categoria::where('id', '=', (new Categoria())->getByField('title', strtolower((string) $record['sottocategoria'])))->first();
if (empty($sottocategoria)) {
$sottocategoria = Categoria::build();
$sottocategoria->setTranslation('title', $record['sottocategoria']);
$sottocategoria->parent()->associate($categoria);
$sottocategoria->save();
}
return $sottocategoria;
}
/**
* Processa la marca dell'articolo.
*
* @param array $record Record da processare
*
* @return Marca|null Marca processata
*/
protected function processaMarca($record)
{
if (empty($record['marca'])) {
return null;
}
$marca = Marca::where('name', $record['marca'])->first();
if (empty($marca)) {
$marca = Marca::build($record['marca']);
$marca->save();
}
return $marca;
}
/**
* Processa l'unità di misura dell'articolo.
*
* @param array $record Record da processare
*
* @return void
*/
protected function processaUnitaMisura($record)
{
if (empty($record['um'])) {
return;
}
$database = database();
$um = $database->fetchOne('SELECT id FROM `mg_unitamisura` WHERE `valore`='.prepare($record['um']));
if (empty($um)) {
$database->query('INSERT INTO `mg_unitamisura` (`valore`) VALUES ('.prepare($record['um']).')');
}
}
/**
* Processa l'immagine dell'articolo.
*
* @param Articolo $articolo Articolo da aggiornare
* @param string $url URL dell'immagine
* @param array $record Record da processare
*
* @return void
*/
protected function processaImmagine($articolo, $url, $record)
{
if (empty($url) || empty($record['import_immagine'])) {
return;
}
try {
$file_content = @file_get_contents($url);
if (empty($file_content)) {
return;
}
$database = database();
/*
* Import immagine options:
*
* - 1: Permette di importare l'immagine come principale dell'articolo mantenendo gli altri allegati già presenti.
* - 2: Permette di importare l'immagine come principale dell'articolo rimuovendo tutti gli allegati presenti.
* - 3: Permette di importare l'immagine come allegato dell'articolo.
* - 4: Permette di importare l'immagine come allegato dell'articolo rimuovendo tutti gli allegati presenti.
*/
if ($record['import_immagine'] == 2 || $record['import_immagine'] == 4) {
\Uploads::deleteLinked([
'id_module' => Module::where('name', 'Articoli')->first()->id,
'id_record' => $articolo->id,
]);
$database->update('mg_articoli', [
'immagine' => '',
], [
'id' => $articolo->id,
]);
}
$name = 'immagine_'.$articolo->id.'.'.Upload::getExtensionFromMimeType($file_content);
$upload = \Uploads::upload($file_content, [
'name' => 'Immagine',
'category' => 'Immagini',
'original_name' => $name,
'id_module' => Module::where('name', 'Articoli')->first()->id,
'id_record' => $articolo->id,
], [
'thumbnails' => true,
]);
if ($upload && !empty($upload->filename) && ($record['import_immagine'] == 1 || $record['import_immagine'] == 2)) {
$database->update('mg_articoli', [
'immagine' => $upload->filename,
], [
'id' => $articolo->id,
]);
}
} catch (\Exception $e) {
// Registra l'errore ma continua con l'importazione
error_log('Errore durante l\'importazione dell\'immagine: '.$e->getMessage());
}
}
/** /**
* Aggiorna la giacenza dell'articolo. * Aggiorna la giacenza dell'articolo.
* *
@@ -629,6 +644,7 @@ class CSV extends CSVImporter
* @param float $nuova_qta Nuova quantità * @param float $nuova_qta Nuova quantità
* @param string $nome_sede Nome della sede * @param string $nome_sede Nome della sede
* @param array $record Record da processare * @param array $record Record da processare
*
* @return void * @return void
*/ */
protected function aggiornaGiacenza($articolo, $nuova_qta, $nome_sede, $record) protected function aggiornaGiacenza($articolo, $nuova_qta, $nome_sede, $record)
@@ -663,14 +679,6 @@ class CSV extends CSVImporter
} }
} }
public static function getExample()
{
return [
['Codice', 'Immagine', 'Import immagine', 'Descrizione', 'Quantità', 'Data inventario', 'Unità misura', 'Prezzo acquisto', 'Prezzo vendita', 'Peso', 'Volume', 'Categoria', 'Sottocategoria', 'marca', 'Modello', 'Barcode', 'Fornitore predefinito', 'Partita IVA', 'Codice IVA vendita', 'Ubicazione', 'Note', 'Anagrafica listino', 'Codice fornitore', 'Barcode fornitore', 'Descrizione fornitore', 'Qta minima', 'Qta massima', 'Prezzo listino', 'Sconto listino', 'Cliente/Fornitore listino', 'Sede'],
['OSM-BUDGET', 'https://openstamanager.com/moduli/budget/budget.webp', '2', 'Modulo Budget per OpenSTAManager', '1', '28/11/2023', 'PZ', '90.00', '180.00', '', '', 'Software gestionali', 'Moduli aggiuntivi', 'DevCode', 'Budget', '4006381333931', 'DevCode s.r.l.', '05024030289', '', '', 'Nota ad uso interno', 'DevCode s.r.l.', 'DEV-BUDGET', '0123456789012', 'Strumento gestionale utilizzato per pianificare e monitorare le entrate e uscite aziendali', '1', '10', '180.00', '20', 'Fornitore', 'Sede'],
];
}
protected function aggiornaDettaglioPrezzi(Articolo $articolo, $dettagli) protected function aggiornaDettaglioPrezzi(Articolo $articolo, $dettagli)
{ {
// Listini // Listini
@@ -699,17 +707,11 @@ class CSV extends CSVImporter
} }
$dettagli['dir'] = strtolower((string) $dettagli['dir']); $dettagli['dir'] = strtolower((string) $dettagli['dir']);
switch ($dettagli['dir']) { $dettagli['dir'] = match ($dettagli['dir']) {
case 'fornitore': 'fornitore' => 'uscita',
$dettagli['dir'] = 'uscita'; 'cliente' => 'entrata',
break; default => null,
case 'cliente': };
$dettagli['dir'] = 'entrata';
break;
default:
$dettagli['dir'] = null;
break;
}
// Aggiungo Listino // Aggiungo Listino
if (!empty($anagrafica) && !empty($dettagli['dir']) && $dettagli['prezzo_listino']) { if (!empty($anagrafica) && !empty($dettagli['dir']) && $dettagli['prezzo_listino']) {

View File

@@ -188,7 +188,7 @@ if (string_starts_with($backup_dir, base_dir())) {
echo ' echo '
<div class="alert alert-warning mt-3"> <div class="alert alert-warning mt-3">
<i class="fa fa-warning"></i> '.tr('Per motivi di sicurezza si consiglia di modificare il percorso della cartella di backup al di fuori della cartella di OSM, possibilmente in una unità esterna.').' <i class="fa fa-warning"></i> '.tr('Per motivi di sicurezza si consiglia di modificare il percorso della cartella di backup al di fuori della cartella di OSM, possibilmente in una unità esterna.').'
<p class="mt-2">'.tr('Puoi modificare il percorso di backup da:').' <a href="'.base_path().'/controller.php?id_module='.\Models\Module::where('name', 'Impostazioni')->first()->id.'&search=Adattatore archiviazione backup#" class="btn btn-sm btn-info"><i class="fa fa-cog"></i> '.tr('Menu <b>Strumenti</b> &rarr; <b>Impostazioni</b> &rarr; sezione <b>Backup</b> &rarr; impostazione <b>Adattatore archiviazione backup</b>').'</a> <p class="mt-2">'.tr('Puoi modificare il percorso di backup da:').' <a href="'.base_path().'/controller.php?id_module='.Models\Module::where('name', 'Impostazioni')->first()->id.'&search=Adattatore archiviazione backup#" class="btn btn-sm btn-info"><i class="fa fa-cog"></i> '.tr('Menu <b>Strumenti</b> &rarr; <b>Impostazioni</b> &rarr; sezione <b>Backup</b> &rarr; impostazione <b>Adattatore archiviazione backup</b>').'</a>
</p> </p>
</div>'; </div>';
} }

View File

@@ -18,11 +18,11 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
use GuzzleHttp\Client;
use Modules\Anagrafiche\Anagrafica; use Modules\Anagrafiche\Anagrafica;
use Modules\Anagrafiche\Nazione; use Modules\Anagrafiche\Nazione;
use Modules\Banche\Banca; use Modules\Banche\Banca;
use Modules\Banche\IBAN; use Modules\Banche\IBAN;
use GuzzleHttp\Client;
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
@@ -128,7 +128,7 @@ switch (filter('op')) {
]); ]);
echo $response->getBody()->getContents(); echo $response->getBody()->getContents();
} catch (\Exception $e) { } catch (Exception $e) {
http_response_code(500); http_response_code(500);
echo json_encode(['error' => 'Errore durante la connessione a ibanapi.com: '.$e->getMessage()]); echo json_encode(['error' => 'Errore durante la connessione a ibanapi.com: '.$e->getMessage()]);
exit; exit;
@@ -147,16 +147,16 @@ switch (filter('op')) {
$response = $client->request('POST', $endpoint, [ $response = $client->request('POST', $endpoint, [
'form_params' => [ 'form_params' => [
'iban' => $iban, 'iban' => $iban,
'api_key' => $api_key 'api_key' => $api_key,
], ],
'headers' => [ 'headers' => [
'Accept' => 'application/json' 'Accept' => 'application/json',
], ],
'http_errors' => false, 'http_errors' => false,
]); ]);
echo $response->getBody()->getContents(); echo $response->getBody()->getContents();
} catch (\Exception $e) { } catch (Exception $e) {
http_response_code(500); http_response_code(500);
echo json_encode(['error' => 'Errore durante la connessione a ibanapi.com: '.$e->getMessage()]); echo json_encode(['error' => 'Errore durante la connessione a ibanapi.com: '.$e->getMessage()]);
exit; exit;

View File

@@ -290,7 +290,7 @@ echo '
+ "<div class='card h-100'>" + "<div class='card h-100'>"
+ "<div class='card-body p-1 d-flex align-items-center'>" + "<div class='card-body p-1 d-flex align-items-center'>"
+ "<span class='small' style='font-size:9pt'>" + label + "</span>" + "<span class='small' style='font-size:9pt'>" + label + "</span>"
+ "<span class='badge badge-" + badgeClass + " ml-auto small' style='font-size: 0.75rem;'>" + (status ? '<?php echo tr("Attivo"); ?>' : '<?php echo tr("Non attivo"); ?>') + "</span>" + "<span class='badge badge-" + badgeClass + " ml-auto small' style='font-size: 0.75rem;'>" + (status ? '<?php echo tr('Attivo'); ?>' : '<?php echo tr('Non attivo'); ?>') + "</span>"
+ "</div></div></div>"; + "</div></div></div>";
} }

View File

@@ -60,7 +60,7 @@ $endpoint = setting('Endpoint ibanapi.com');
<div class="row"> <div class="row">
<div class="col-md-8"> <div class="col-md-8">
{[ "type": "text", "label": "<?php echo tr('IBAN'); ?>", "name": "iban", "required": "1", "class": "alphanumeric-mask", "maxlength": 32, "value": "$iban$", "icon-after": "<?=(!empty($ibanapi_key) && !empty($endpoint)?'<a class=\'fa fa-search clickable\' id=\'check-iban\'></a>':'<span class=\'tip\' title=\'Da impostazioni sezione API è possibile attivare la verifica iban tramite ibanapi.com\'><i class=\'fa fa-search text-danger clickable\'></i></span>')?>" ]} {[ "type": "text", "label": "<?php echo tr('IBAN'); ?>", "name": "iban", "required": "1", "class": "alphanumeric-mask", "maxlength": 32, "value": "$iban$", "icon-after": "<?php echo !empty($ibanapi_key) && !empty($endpoint) ? '<a class=\'fa fa-search clickable\' id=\'check-iban\'></a>' : '<span class=\'tip\' title=\'Da impostazioni sezione API è possibile attivare la verifica iban tramite ibanapi.com\'><i class=\'fa fa-search text-danger clickable\'></i></span>'; ?>" ]}
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
@@ -365,7 +365,7 @@ if (!empty($numero_documenti)) {
+ "<div class='card h-100'>" + "<div class='card h-100'>"
+ "<div class='card-body p-1 d-flex align-items-center'>" + "<div class='card-body p-1 d-flex align-items-center'>"
+ "<span class='small' style='font-size:9pt'>" + label + "</span>" + "<span class='small' style='font-size:9pt'>" + label + "</span>"
+ "<span class='badge badge-" + badgeClass + " ml-auto small' style='font-size: 0.75rem;'>" + (status ? '<?php echo tr("Attivo"); ?>' : '<?php echo tr("Non attivo"); ?>') + "</span>" + "<span class='badge badge-" + badgeClass + " ml-auto small' style='font-size: 0.75rem;'>" + (status ? '<?php echo tr('Attivo'); ?>' : '<?php echo tr('Non attivo'); ?>') + "</span>"
+ "</div></div></div>"; + "</div></div></div>";
} }

View File

@@ -27,8 +27,8 @@ switch (filter('op')) {
$nota = filter('nota'); $nota = filter('nota');
$colore = filter('colore'); $colore = filter('colore');
$id_original = filter('id_original') ?: null; $id_original = filter('id_original') ?: null;
$is_articolo = filter('is_articolo_add') ?: filter('is_articolo') ?: 0; $is_articolo = (filter('is_articolo_add') ?: filter('is_articolo')) ?: 0;
$is_impianto = filter('is_impianto_add') ?: filter('is_impianto') ?: 0; $is_impianto = (filter('is_impianto_add') ?: filter('is_impianto')) ?: 0;
// Verifica che almeno uno dei due flag sia selezionato // Verifica che almeno uno dei due flag sia selezionato
if ($is_articolo == 0 && $is_impianto == 0) { if ($is_articolo == 0 && $is_impianto == 0) {
@@ -92,8 +92,8 @@ switch (filter('op')) {
$nota = filter('nota'); $nota = filter('nota');
$colore = filter('colore'); $colore = filter('colore');
$id_original = filter('id_original') ?: null; $id_original = filter('id_original') ?: null;
$is_articolo = filter('is_articolo_add') ?: filter('is_articolo') ?: 0; $is_articolo = (filter('is_articolo_add') ?: filter('is_articolo')) ?: 0;
$is_impianto = filter('is_impianto_add') ?: filter('is_impianto') ?: 0; $is_impianto = (filter('is_impianto_add') ?: filter('is_impianto')) ?: 0;
// Verifica che almeno uno dei due flag sia selezionato // Verifica che almeno uno dei due flag sia selezionato
if ($is_articolo == 0 && $is_impianto == 0) { if ($is_articolo == 0 && $is_impianto == 0) {

View File

@@ -38,10 +38,10 @@ if (isset($id_original)) {
<input type="hidden" name="backto" value="record-edit"> <input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="id_original" value="<?php echo $id_original; ?>"> <input type="hidden" name="id_original" value="<?php echo $id_original; ?>">
<input type="hidden" name="op" value="<?php echo $id_record ? 'update' : 'add'; ?>"> <input type="hidden" name="op" value="<?php echo $id_record ? 'update' : 'add'; ?>">
<?php if (!empty($id_original)) : ?> <?php if (!empty($id_original)) { ?>
<input type="hidden" name="is_articolo" value="<?php echo $id_original ? Categoria::find($id_original)->is_articolo : 1; ?>"> <input type="hidden" name="is_articolo" value="<?php echo $id_original ? Categoria::find($id_original)->is_articolo : 1; ?>">
<input type="hidden" name="is_impianto" value="<?php echo $id_original ? Categoria::find($id_original)->is_impianto : 0; ?>"> <input type="hidden" name="is_impianto" value="<?php echo $id_original ? Categoria::find($id_original)->is_impianto : 0; ?>">
<?php endif; ?> <?php } ?>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">

View File

@@ -18,7 +18,6 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
use Models\Module;
use Modules\Articoli\Articolo; use Modules\Articoli\Articolo;
use Modules\Articoli\Categoria; use Modules\Articoli\Categoria;
@@ -41,7 +40,7 @@ foreach ($subcategorie as $sub) {
'.($sub->is_impianto ? '<span class="badge badge-primary"><i class="fa fa-check"></i></span>' : '<span class="badge badge-secondary"><i class="fa fa-times"></i></span>').' '.($sub->is_impianto ? '<span class="badge badge-primary"><i class="fa fa-check"></i></span>' : '<span class="badge badge-secondary"><i class="fa fa-times"></i></span>').'
</td> </td>
<td class="align-middle"> <td class="align-middle">
<small>'.nl2br(htmlentities(substr($sub->getTranslation('note'), 0, 100))).(strlen($sub->getTranslation('note')) > 100 ? '...' : '').'</small> <small>'.nl2br(htmlentities(substr((string) $sub->getTranslation('note'), 0, 100))).(strlen((string) $sub->getTranslation('note')) > 100 ? '...' : '').'</small>
</td> </td>
<td class="text-center align-middle"> <td class="text-center align-middle">
<div class="btn-group"> <div class="btn-group">

View File

@@ -40,7 +40,7 @@ if ($main_check) {
'label' => tr('Descrizione'), 'label' => tr('Descrizione'),
'name' => 'content_edit', 'name' => 'content_edit',
'required' => 1, 'required' => 1,
'value' => htmlentities($record->content), 'value' => htmlentities((string) $record->content),
]); ]);
?> ?>
</div> </div>

View File

@@ -141,7 +141,7 @@ echo '
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
{[ "type": "select", "multiple": "1", "label": "<?php echo tr('Impianti'); ?>", "name": "matricolaimpianto[]", "ajax-source": "impianti-cliente", "select-options": {"idanagrafica": <?php echo ($record['idanagrafica'] ?: '""'); ?>, "idsede_destinazione": "", "idcontratto": ""}, "value": "$idimpianti$", "icon-after": "add|<?php echo Module::where('name', 'Impianti')->first()->id; ?>|<?php echo 'id_anagrafica='.$record['idanagrafica']; ?>||<?php echo (empty($block_edit)) ? '' : 'disabled'; ?>" ]} {[ "type": "select", "multiple": "1", "label": "<?php echo tr('Impianti'); ?>", "name": "matricolaimpianto[]", "ajax-source": "impianti-cliente", "select-options": {"idanagrafica": <?php echo $record['idanagrafica'] ?: '""'; ?>, "idsede_destinazione": "", "idcontratto": ""}, "value": "$idimpianti$", "icon-after": "add|<?php echo Module::where('name', 'Impianti')->first()->id; ?>|<?php echo 'id_anagrafica='.$record['idanagrafica']; ?>||<?php echo (empty($block_edit)) ? '' : 'disabled'; ?>" ]}
</div> </div>
<div class="col-md-2"> <div class="col-md-2">
@@ -637,7 +637,7 @@ if (!empty($elementi)) {
'_DOC_' => $elemento['tipo_documento'], '_DOC_' => $elemento['tipo_documento'],
'_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'], '_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'],
'_DATE_' => Translator::dateToLocale($elemento['data']), '_DATE_' => Translator::dateToLocale($elemento['data']),
'_STATO_' => (!empty($elemento['stato_documento']) ? "(".$elemento['stato_documento'].")" : ''), '_STATO_' => (!empty($elemento['stato_documento']) ? '('.$elemento['stato_documento'].')' : ''),
]); ]);
echo ' echo '

View File

@@ -38,7 +38,7 @@ if (!empty($riga_id)) {
// Caso singola riga // Caso singola riga
$riga = Riga::find($riga_id) ?: Articolo::find($riga_id); $riga = Riga::find($riga_id) ?: Articolo::find($riga_id);
$riga = $riga ?: Sconto::find($riga_id); $riga = $riga ?: Sconto::find($riga_id);
$righe_totali++; ++$righe_totali;
if (!empty($riga) && !empty($riga->idiva) && !empty($riga->aliquota)) { if (!empty($riga) && !empty($riga->idiva) && !empty($riga->aliquota)) {
$aliquote_iva[$riga->idiva] = [ $aliquote_iva[$riga->idiva] = [
@@ -46,19 +46,19 @@ if (!empty($riga_id)) {
'codice' => $riga->aliquota->codice, 'codice' => $riga->aliquota->codice,
'descrizione' => $riga->aliquota->getTranslation('title'), 'descrizione' => $riga->aliquota->getTranslation('title'),
'percentuale' => $riga->aliquota->percentuale, 'percentuale' => $riga->aliquota->percentuale,
'count' => 1 'count' => 1,
]; ];
} else { } else {
// Riga senza aliquota IVA o con aliquota non valida // Riga senza aliquota IVA o con aliquota non valida
$righe_senza_iva[] = [ $righe_senza_iva[] = [
'id' => $riga->id, 'id' => $riga->id,
'descrizione' => $riga->descrizione, 'descrizione' => $riga->descrizione,
'idiva' => $riga->idiva ?: 'N/D' 'idiva' => $riga->idiva ?: 'N/D',
]; ];
} }
} elseif (!empty($righe_ids)) { } elseif (!empty($righe_ids)) {
// Caso multiple righe // Caso multiple righe
$righe_array = explode(',', $righe_ids); $righe_array = explode(',', (string) $righe_ids);
$righe_totali = count($righe_array); $righe_totali = count($righe_array);
foreach ($righe_array as $id_riga) { foreach ($righe_array as $id_riga) {
@@ -72,16 +72,16 @@ if (!empty($riga_id)) {
'codice' => $riga->aliquota->codice, 'codice' => $riga->aliquota->codice,
'descrizione' => $riga->aliquota->getTranslation('title'), 'descrizione' => $riga->aliquota->getTranslation('title'),
'percentuale' => $riga->aliquota->percentuale, 'percentuale' => $riga->aliquota->percentuale,
'count' => 0 'count' => 0,
]; ];
} }
$aliquote_iva[$riga->idiva]['count']++; ++$aliquote_iva[$riga->idiva]['count'];
} elseif (!empty($riga)) { } elseif (!empty($riga)) {
// Riga senza aliquota IVA o con aliquota non valida // Riga senza aliquota IVA o con aliquota non valida
$righe_senza_iva[] = [ $righe_senza_iva[] = [
'id' => $riga->id, 'id' => $riga->id,
'descrizione' => $riga->descrizione, 'descrizione' => $riga->descrizione,
'idiva' => $riga->idiva ?: 'N/D' 'idiva' => $riga->idiva ?: 'N/D',
]; ];
} }
} }
@@ -92,20 +92,20 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
?> ?>
<form id="modifica-iva-form"> <form id="modifica-iva-form">
<?php if (count($aliquote_iva) > 0): ?> <?php if (count($aliquote_iva) > 0) { ?>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<div class="alert alert-info"> <div class="alert alert-info">
<p><strong><?= tr('Aliquote IVA attuali') ?></strong></p> <p><strong><?php echo tr('Aliquote IVA attuali'); ?></strong></p>
<ul class="list-unstyled"> <ul class="list-unstyled">
<?php foreach ($aliquote_iva as $aliquota): ?> <?php foreach ($aliquote_iva as $aliquota) { ?>
<li> <li>
<strong><?= $aliquota['codice'] ?></strong> - <?= $aliquota['descrizione'] ?> (<?= $aliquota['percentuale'] ?>%) <strong><?php echo $aliquota['codice']; ?></strong> - <?php echo $aliquota['descrizione']; ?> (<?php echo $aliquota['percentuale']; ?>%)
<?php if (count($aliquote_iva) > 1): ?> <?php if (count($aliquote_iva) > 1) { ?>
<span class="badge"><?= $aliquota['count'] ?> <?= tr('righe') ?></span> <span class="badge"><?php echo $aliquota['count']; ?> <?php echo tr('righe'); ?></span>
<?php endif; ?> <?php } ?>
</li> </li>
<?php endforeach; ?> <?php } ?>
</ul> </ul>
</div> </div>
</div> </div>
@@ -117,38 +117,38 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
<div class="col-md-5"> <div class="col-md-5">
<div class="panel panel-success"> <div class="panel panel-success">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title"><?= tr('Aliquota da applicare') ?></h4> <h4 class="panel-title"><?php echo tr('Aliquota da applicare'); ?></h4>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?= tr('eliminata') ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?= prepare(Models\Locale::getDefault()->id) ?>) ORDER BY `title` ASC" ]} {[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?php echo tr('eliminata'); ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?php echo prepare(Models\Locale::getDefault()->id); ?>) ORDER BY `title` ASC" ]}
<input type="hidden" name="riga_id" value="<?= get('riga_id') ?>"> <input type="hidden" name="riga_id" value="<?php echo get('riga_id'); ?>">
<input type="hidden" name="righe" value="<?= $_GET['righe'] ?>"> <input type="hidden" name="righe" value="<?php echo $_GET['righe']; ?>">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php elseif ($show_form): ?> <?php } elseif ($show_form) { ?>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<div class="alert alert-info"> <div class="alert alert-info">
<p><strong><?= tr('Aliquote IVA attuali') ?></strong></p> <p><strong><?php echo tr('Aliquote IVA attuali'); ?></strong></p>
<?php if (count($aliquote_iva) > 0): ?> <?php if (count($aliquote_iva) > 0) { ?>
<ul class="list-unstyled"> <ul class="list-unstyled">
<?php foreach ($aliquote_iva as $aliquota): ?> <?php foreach ($aliquote_iva as $aliquota) { ?>
<li> <li>
<strong><?= $aliquota['codice'] ?></strong> - <?= $aliquota['descrizione'] ?> (<?= $aliquota['percentuale'] ?>%) <strong><?php echo $aliquota['codice']; ?></strong> - <?php echo $aliquota['descrizione']; ?> (<?php echo $aliquota['percentuale']; ?>%)
<span class="badge"><?= $aliquota['count'] ?> <?= tr('righe') ?></span> <span class="badge"><?php echo $aliquota['count']; ?> <?php echo tr('righe'); ?></span>
</li> </li>
<?php endforeach; ?> <?php } ?>
</ul> </ul>
<?php endif; ?> <?php } ?>
<?php if (count($righe_senza_iva) > 0): ?> <?php if (count($righe_senza_iva) > 0) { ?>
<p><strong><?= tr('Righe senza aliquota IVA valida') ?>:</strong> <span class="badge"><?= count($righe_senza_iva) ?></span></p> <p><strong><?php echo tr('Righe senza aliquota IVA valida'); ?>:</strong> <span class="badge"><?php echo count($righe_senza_iva); ?></span></p>
<?php endif; ?> <?php } ?>
<p class="text-muted"><?= tr('Totale righe selezionate') ?>: <?= $righe_totali ?></p> <p class="text-muted"><?php echo tr('Totale righe selezionate'); ?>: <?php echo $righe_totali; ?></p>
</div> </div>
</div> </div>
@@ -159,31 +159,31 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
<div class="col-md-5"> <div class="col-md-5">
<div class="panel panel-success"> <div class="panel panel-success">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title"><?= tr('Aliquota da applicare') ?></h4> <h4 class="panel-title"><?php echo tr('Aliquota da applicare'); ?></h4>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?= tr('eliminata') ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?= prepare(Models\Locale::getDefault()->id) ?>) ORDER BY `title` ASC" ]} {[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?php echo tr('eliminata'); ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?php echo prepare(Models\Locale::getDefault()->id); ?>) ORDER BY `title` ASC" ]}
<input type="hidden" name="riga_id" value="<?= get('riga_id') ?>"> <input type="hidden" name="riga_id" value="<?php echo get('riga_id'); ?>">
<input type="hidden" name="righe" value="<?= $_GET['righe'] ?>"> <input type="hidden" name="righe" value="<?php echo $_GET['righe']; ?>">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php else: ?> <?php } else { ?>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="alert alert-warning"> <div class="alert alert-warning">
<p><?= tr('Nessuna riga selezionata') ?></p> <p><?php echo tr('Nessuna riga selezionata'); ?></p>
</div> </div>
</div> </div>
</div> </div>
<?php endif; ?> <?php } ?>
<!-- PULSANTI --> <!-- PULSANTI -->
<div class="row"> <div class="row">
<div class="col-md-12 text-right"> <div class="col-md-12 text-right">
<button type="button" class="btn btn-primary" onclick="salvaIva()"> <button type="button" class="btn btn-primary" onclick="salvaIva()">
<i class="fa fa-save"></i> <?= tr('Salva') ?> <i class="fa fa-save"></i> <?php echo tr('Salva'); ?>
</button> </button>
</div> </div>
</div> </div>
@@ -216,7 +216,7 @@ function salvaIva() {
renderMessages(); renderMessages();
}, },
error: function() { error: function() {
alert(<?= json_encode(tr('Errore durante il salvataggio')) ?>); alert(<?php echo json_encode(tr('Errore durante il salvataggio')); ?>);
} }
}); });
} else { } else {
@@ -237,7 +237,7 @@ function salvaIva() {
renderMessages(); renderMessages();
}, },
error: function() { error: function() {
alert(<?= json_encode(tr('Errore durante il salvataggio')) ?>); alert(<?php echo json_encode(tr('Errore durante il salvataggio')); ?>);
} }
}); });
} }

View File

@@ -95,7 +95,7 @@ foreach ($righe as $riga) {
<td>'; <td>';
// Descrizione // Descrizione
$descrizione = nl2br($riga->descrizione); $descrizione = nl2br((string) $riga->descrizione);
if ($riga->isArticolo()) { if ($riga->isArticolo()) {
$descrizione = Modules::link('Articoli', $riga->idarticolo, $riga->codice.' - '.$descrizione); $descrizione = Modules::link('Articoli', $riga->idarticolo, $riga->codice.' - '.$descrizione);
} }
@@ -123,7 +123,7 @@ foreach ($righe as $riga) {
if (!empty($riga->note)) { if (!empty($riga->note)) {
echo ' echo '
<br><span class="text-xs">'.nl2br($riga->note).'</small>'; <br><span class="text-xs">'.nl2br((string) $riga->note).'</small>';
} }
echo ' echo '
</td> </td>

View File

@@ -66,7 +66,7 @@ foreach ($moduli as $module_id => $note) {
</tr>'; </tr>';
foreach ($note as $nota) { foreach ($note as $nota) {
$class = (strtotime($nota->notification_date) < strtotime(date('Y-m-d')) && !empty($nota->notification_date)) ? 'danger' : ''; $class = (strtotime((string) $nota->notification_date) < strtotime(date('Y-m-d')) && !empty($nota->notification_date)) ? 'danger' : '';
$documento = ''; $documento = '';
if ($modulo->getTranslation('title') == 'Attività') { if ($modulo->getTranslation('title') == 'Attività') {

View File

@@ -179,7 +179,6 @@ switch (post('op')) {
break; break;
} }
$operations['change_status'] = [ $operations['change_status'] = [
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Cambia stato'), 'text' => '<span><i class="fa fa-refresh"></i> '.tr('Cambia stato'),
'data' => [ 'data' => [
@@ -201,7 +200,6 @@ $operations['delete_bulk'] = [
], ],
]; ];
$operations['create_invoice'] = [ $operations['create_invoice'] = [
'text' => '<span><i class="fa fa-file-code-o"></i> '.tr('Fattura _TYPE_', ['_TYPE_' => strtolower((string) $module->getTranslation('title'))]), 'text' => '<span><i class="fa fa-file-code-o"></i> '.tr('Fattura _TYPE_', ['_TYPE_' => strtolower((string) $module->getTranslation('title'))]),
'data' => [ 'data' => [
@@ -216,5 +214,4 @@ $operations['create_invoice'] = [
], ],
]; ];
return $operations; return $operations;

View File

@@ -681,7 +681,7 @@ if (!empty($elementi)) {
'_DOC_' => $elemento['tipo_documento'], '_DOC_' => $elemento['tipo_documento'],
'_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'], '_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'],
'_DATE_' => Translator::dateToLocale($elemento['data']), '_DATE_' => Translator::dateToLocale($elemento['data']),
'_STATO_' => (!empty($elemento['stato_documento']) ? "(".$elemento['stato_documento'].")" : ''), '_STATO_' => (!empty($elemento['stato_documento']) ? '('.$elemento['stato_documento'].')' : ''),
]); ]);
echo ' echo '

View File

@@ -38,7 +38,7 @@ if (!empty($riga_id)) {
// Caso singola riga // Caso singola riga
$riga = Riga::find($riga_id) ?: Articolo::find($riga_id); $riga = Riga::find($riga_id) ?: Articolo::find($riga_id);
$riga = $riga ?: Sconto::find($riga_id); $riga = $riga ?: Sconto::find($riga_id);
$righe_totali++; ++$righe_totali;
if (!empty($riga) && !empty($riga->idiva) && !empty($riga->aliquota)) { if (!empty($riga) && !empty($riga->idiva) && !empty($riga->aliquota)) {
$aliquote_iva[$riga->idiva] = [ $aliquote_iva[$riga->idiva] = [
@@ -46,19 +46,19 @@ if (!empty($riga_id)) {
'codice' => $riga->aliquota->codice, 'codice' => $riga->aliquota->codice,
'descrizione' => $riga->aliquota->getTranslation('title'), 'descrizione' => $riga->aliquota->getTranslation('title'),
'percentuale' => $riga->aliquota->percentuale, 'percentuale' => $riga->aliquota->percentuale,
'count' => 1 'count' => 1,
]; ];
} else { } else {
// Riga senza aliquota IVA o con aliquota non valida // Riga senza aliquota IVA o con aliquota non valida
$righe_senza_iva[] = [ $righe_senza_iva[] = [
'id' => $riga->id, 'id' => $riga->id,
'descrizione' => $riga->descrizione, 'descrizione' => $riga->descrizione,
'idiva' => $riga->idiva ?: 'N/D' 'idiva' => $riga->idiva ?: 'N/D',
]; ];
} }
} elseif (!empty($righe_ids)) { } elseif (!empty($righe_ids)) {
// Caso multiple righe // Caso multiple righe
$righe_array = explode(',', $righe_ids); $righe_array = explode(',', (string) $righe_ids);
$righe_totali = count($righe_array); $righe_totali = count($righe_array);
foreach ($righe_array as $id_riga) { foreach ($righe_array as $id_riga) {
@@ -72,16 +72,16 @@ if (!empty($riga_id)) {
'codice' => $riga->aliquota->codice, 'codice' => $riga->aliquota->codice,
'descrizione' => $riga->aliquota->getTranslation('title'), 'descrizione' => $riga->aliquota->getTranslation('title'),
'percentuale' => $riga->aliquota->percentuale, 'percentuale' => $riga->aliquota->percentuale,
'count' => 0 'count' => 0,
]; ];
} }
$aliquote_iva[$riga->idiva]['count']++; ++$aliquote_iva[$riga->idiva]['count'];
} elseif (!empty($riga)) { } elseif (!empty($riga)) {
// Riga senza aliquota IVA o con aliquota non valida // Riga senza aliquota IVA o con aliquota non valida
$righe_senza_iva[] = [ $righe_senza_iva[] = [
'id' => $riga->id, 'id' => $riga->id,
'descrizione' => $riga->descrizione, 'descrizione' => $riga->descrizione,
'idiva' => $riga->idiva ?: 'N/D' 'idiva' => $riga->idiva ?: 'N/D',
]; ];
} }
} }
@@ -92,20 +92,20 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
?> ?>
<form id="modifica-iva-form"> <form id="modifica-iva-form">
<?php if (count($aliquote_iva) > 0): ?> <?php if (count($aliquote_iva) > 0) { ?>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<div class="alert alert-info"> <div class="alert alert-info">
<p><strong><?= tr('Aliquote IVA attuali') ?></strong></p> <p><strong><?php echo tr('Aliquote IVA attuali'); ?></strong></p>
<ul class="list-unstyled"> <ul class="list-unstyled">
<?php foreach ($aliquote_iva as $aliquota): ?> <?php foreach ($aliquote_iva as $aliquota) { ?>
<li> <li>
<strong><?= $aliquota['codice'] ?></strong> - <?= $aliquota['descrizione'] ?> (<?= $aliquota['percentuale'] ?>%) <strong><?php echo $aliquota['codice']; ?></strong> - <?php echo $aliquota['descrizione']; ?> (<?php echo $aliquota['percentuale']; ?>%)
<?php if (count($aliquote_iva) > 1): ?> <?php if (count($aliquote_iva) > 1) { ?>
<span class="badge"><?= $aliquota['count'] ?> <?= tr('righe') ?></span> <span class="badge"><?php echo $aliquota['count']; ?> <?php echo tr('righe'); ?></span>
<?php endif; ?> <?php } ?>
</li> </li>
<?php endforeach; ?> <?php } ?>
</ul> </ul>
</div> </div>
</div> </div>
@@ -117,38 +117,38 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
<div class="col-md-5"> <div class="col-md-5">
<div class="panel panel-success"> <div class="panel panel-success">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title"><?= tr('Aliquota da applicare') ?></h4> <h4 class="panel-title"><?php echo tr('Aliquota da applicare'); ?></h4>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?= tr('eliminata') ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?= prepare(Models\Locale::getDefault()->id) ?>) ORDER BY `title` ASC" ]} {[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?php echo tr('eliminata'); ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?php echo prepare(Models\Locale::getDefault()->id); ?>) ORDER BY `title` ASC" ]}
<input type="hidden" name="riga_id" value="<?= get('riga_id') ?>"> <input type="hidden" name="riga_id" value="<?php echo get('riga_id'); ?>">
<input type="hidden" name="righe" value="<?= $_GET['righe'] ?>"> <input type="hidden" name="righe" value="<?php echo $_GET['righe']; ?>">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php elseif ($show_form): ?> <?php } elseif ($show_form) { ?>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<div class="alert alert-info"> <div class="alert alert-info">
<p><strong><?= tr('Aliquote IVA attuali') ?></strong></p> <p><strong><?php echo tr('Aliquote IVA attuali'); ?></strong></p>
<?php if (count($aliquote_iva) > 0): ?> <?php if (count($aliquote_iva) > 0) { ?>
<ul class="list-unstyled"> <ul class="list-unstyled">
<?php foreach ($aliquote_iva as $aliquota): ?> <?php foreach ($aliquote_iva as $aliquota) { ?>
<li> <li>
<strong><?= $aliquota['codice'] ?></strong> - <?= $aliquota['descrizione'] ?> (<?= $aliquota['percentuale'] ?>%) <strong><?php echo $aliquota['codice']; ?></strong> - <?php echo $aliquota['descrizione']; ?> (<?php echo $aliquota['percentuale']; ?>%)
<span class="badge"><?= $aliquota['count'] ?> <?= tr('righe') ?></span> <span class="badge"><?php echo $aliquota['count']; ?> <?php echo tr('righe'); ?></span>
</li> </li>
<?php endforeach; ?> <?php } ?>
</ul> </ul>
<?php endif; ?> <?php } ?>
<?php if (count($righe_senza_iva) > 0): ?> <?php if (count($righe_senza_iva) > 0) { ?>
<p><strong><?= tr('Righe senza aliquota IVA valida') ?>:</strong> <span class="badge"><?= count($righe_senza_iva) ?></span></p> <p><strong><?php echo tr('Righe senza aliquota IVA valida'); ?>:</strong> <span class="badge"><?php echo count($righe_senza_iva); ?></span></p>
<?php endif; ?> <?php } ?>
<p class="text-muted"><?= tr('Totale righe selezionate') ?>: <?= $righe_totali ?></p> <p class="text-muted"><?php echo tr('Totale righe selezionate'); ?>: <?php echo $righe_totali; ?></p>
</div> </div>
</div> </div>
@@ -159,31 +159,31 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
<div class="col-md-5"> <div class="col-md-5">
<div class="panel panel-success"> <div class="panel panel-success">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title"><?= tr('Aliquota da applicare') ?></h4> <h4 class="panel-title"><?php echo tr('Aliquota da applicare'); ?></h4>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?= tr('eliminata') ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?= prepare(Models\Locale::getDefault()->id) ?>) ORDER BY `title` ASC" ]} {[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?php echo tr('eliminata'); ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?php echo prepare(Models\Locale::getDefault()->id); ?>) ORDER BY `title` ASC" ]}
<input type="hidden" name="riga_id" value="<?= get('riga_id') ?>"> <input type="hidden" name="riga_id" value="<?php echo get('riga_id'); ?>">
<input type="hidden" name="righe" value="<?= $_GET['righe'] ?>"> <input type="hidden" name="righe" value="<?php echo $_GET['righe']; ?>">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php else: ?> <?php } else { ?>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="alert alert-warning"> <div class="alert alert-warning">
<p><?= tr('Nessuna riga selezionata') ?></p> <p><?php echo tr('Nessuna riga selezionata'); ?></p>
</div> </div>
</div> </div>
</div> </div>
<?php endif; ?> <?php } ?>
<!-- PULSANTI --> <!-- PULSANTI -->
<div class="row"> <div class="row">
<div class="col-md-12 text-right"> <div class="col-md-12 text-right">
<button type="button" class="btn btn-primary" onclick="salvaIva()"> <button type="button" class="btn btn-primary" onclick="salvaIva()">
<i class="fa fa-save"></i> <?= tr('Salva') ?> <i class="fa fa-save"></i> <?php echo tr('Salva'); ?>
</button> </button>
</div> </div>
</div> </div>
@@ -216,7 +216,7 @@ function salvaIva() {
renderMessages(); renderMessages();
}, },
error: function() { error: function() {
alert(<?= json_encode(tr('Errore durante il salvataggio')) ?>); alert(<?php echo json_encode(tr('Errore durante il salvataggio')); ?>);
} }
}); });
} else { } else {
@@ -237,7 +237,7 @@ function salvaIva() {
renderMessages(); renderMessages();
}, },
error: function() { error: function() {
alert(<?= json_encode(tr('Errore durante il salvataggio')) ?>); alert(<?php echo json_encode(tr('Errore durante il salvataggio')); ?>);
} }
}); });
} }

View File

@@ -105,7 +105,7 @@ foreach ($righe as $riga) {
if ($riga->isArticolo()) { if ($riga->isArticolo()) {
echo Modules::link('Articoli', $riga->idarticolo, $riga->codice.' - '.$riga->descrizione); echo Modules::link('Articoli', $riga->idarticolo, $riga->codice.' - '.$riga->descrizione);
} else { } else {
echo nl2br($riga->descrizione); echo nl2br((string) $riga->descrizione);
} }
if ($riga->isArticolo() && !empty($riga->abilita_serial)) { if ($riga->isArticolo() && !empty($riga->abilita_serial)) {
@@ -128,7 +128,7 @@ foreach ($righe as $riga) {
if (!empty($riga->note)) { if (!empty($riga->note)) {
echo ' echo '
<br><span class="text-xs">'.nl2br($riga->note).'</small>'; <br><span class="text-xs">'.nl2br((string) $riga->note).'</small>';
} }
echo ' echo '
</td>'; </td>';

View File

@@ -19,26 +19,25 @@
*/ */
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
use Modules\DDT\Causale;
switch (filter('op')) { switch (filter('op')) {
case 'update': case 'update':
$dbo->update('zz_default_description', [ $dbo->update('zz_default_description', [
'name' => filter('name'), 'name' => filter('name'),
'descrizione' => filter('descrizione'), 'descrizione' => filter('descrizione'),
'note' => filter('note') 'note' => filter('note'),
], [ ], [
'id' => $id_record 'id' => $id_record,
]); ]);
$dbo->delete('zz_default_description_module', [ $dbo->delete('zz_default_description_module', [
'id_description' => $id_record 'id_description' => $id_record,
]); ]);
$id_moduli = (array) post('id_moduli'); $id_moduli = (array) post('id_moduli');
foreach ($id_moduli as $id_modulo) { foreach ($id_moduli as $id_modulo) {
$dbo->insert('zz_default_description_module', [ $dbo->insert('zz_default_description_module', [
'id_description' => $id_record, 'id_description' => $id_record,
'id_module' => $id_modulo 'id_module' => $id_modulo,
]); ]);
} }
@@ -50,7 +49,7 @@ switch (filter('op')) {
$dbo->insert('zz_default_description', [ $dbo->insert('zz_default_description', [
'name' => filter('name'), 'name' => filter('name'),
'descrizione' => filter('descrizione'), 'descrizione' => filter('descrizione'),
'note' => filter('note') 'note' => filter('note'),
]); ]);
$id_record = $dbo->lastInsertedId(); $id_record = $dbo->lastInsertedId();
@@ -58,7 +57,7 @@ switch (filter('op')) {
foreach ($id_moduli as $id_modulo) { foreach ($id_moduli as $id_modulo) {
$dbo->insert('zz_default_description_module', [ $dbo->insert('zz_default_description_module', [
'id_description' => $id_record, 'id_description' => $id_record,
'id_module' => $id_modulo 'id_module' => $id_modulo,
]); ]);
} }
@@ -68,7 +67,7 @@ switch (filter('op')) {
case 'delete': case 'delete':
$dbo->delete('zz_default_description', [ $dbo->delete('zz_default_description', [
'id' => $id_record 'id' => $id_record,
]); ]);
flash()->info(tr('Risposta predefinita eliminata!')); flash()->info(tr('Risposta predefinita eliminata!'));

View File

@@ -18,8 +18,6 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
use Modules\DDT\Causale;
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
if (!empty($id_record)) { if (!empty($id_record)) {

View File

@@ -22,17 +22,17 @@ include_once __DIR__.'/../../core.php';
use Carbon\Carbon; use Carbon\Carbon;
use Models\Module; use Models\Module;
use Models\OperationLog;
use Modules\Aggiornamenti\Controlli\DatiFattureElettroniche; use Modules\Aggiornamenti\Controlli\DatiFattureElettroniche;
use Modules\Anagrafiche\Anagrafica; use Modules\Anagrafiche\Anagrafica;
use Modules\Emails\Template;
use Modules\Fatture\Export\CSV; use Modules\Fatture\Export\CSV;
use Modules\Fatture\Fattura; use Modules\Fatture\Fattura;
use Modules\Fatture\Stato; use Modules\Fatture\Stato;
use Notifications\EmailNotification;
use Plugins\ExportFE\FatturaElettronica; use Plugins\ExportFE\FatturaElettronica;
use Plugins\ExportFE\Interaction; use Plugins\ExportFE\Interaction;
use Plugins\ReceiptFE\Ricevuta; use Plugins\ReceiptFE\Ricevuta;
use Modules\Emails\Template;
use Notifications\EmailNotification;
use Models\OperationLog;
use Util\Zip; use Util\Zip;
$anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita')); $anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita'));
@@ -216,8 +216,8 @@ switch (post('op')) {
$dst = $fe->getFilename(); $dst = $fe->getFilename();
$src = $dbo->selectOne('zz_files', 'filename', ['original' => $dst])['filename']; $src = $dbo->selectOne('zz_files', 'filename', ['original' => $dst])['filename'];
} else { } else {
$src = basename($fattura->uploads()->where('name', 'Fattura Elettronica')->first()->filename); $src = basename((string) $fattura->uploads()->where('name', 'Fattura Elettronica')->first()->filename);
$dst = basename($fattura->uploads()->where('name', 'Fattura Elettronica')->first()->original_name); $dst = basename((string) $fattura->uploads()->where('name', 'Fattura Elettronica')->first()->original_name);
} }
$file = slashes('files/'.$module->attachments_directory.'/'.$src); $file = slashes('files/'.$module->attachments_directory.'/'.$src);
@@ -275,8 +275,8 @@ switch (post('op')) {
foreach ($fatture as $r) { foreach ($fatture as $r) {
$fattura = Fattura::find($r['id']); $fattura = Fattura::find($r['id']);
$zz_file = $dbo->table('zz_files')->where('id_module', '=', $id_module)->where('id_record', '=', $fattura->id)->where('name', 'like', 'Ricevuta%')->first(); $zz_file = $dbo->table('zz_files')->where('id_module', '=', $id_module)->where('id_record', '=', $fattura->id)->where('name', 'like', 'Ricevuta%')->first();
$src = basename($fattura->uploads()->where('id', $zz_file->id)->first()->filename); $src = basename((string) $fattura->uploads()->where('id', $zz_file->id)->first()->filename);
$dst = basename($fattura->uploads()->where('id', $zz_file->id)->first()->original_name); $dst = basename((string) $fattura->uploads()->where('id', $zz_file->id)->first()->original_name);
$file = slashes($module->upload_directory.'/'.$src); $file = slashes($module->upload_directory.'/'.$src);
$dest = slashes($dir.'tmp/'.$dst); $dest = slashes($dir.'tmp/'.$dst);
@@ -320,22 +320,22 @@ switch (post('op')) {
// + 1 giorno // + 1 giorno
if (post('skip_time') == 'Giorno') { if (post('skip_time') == 'Giorno') {
$data = date('Y-m-d', strtotime('+1 day', strtotime($fattura->data))); $data = date('Y-m-d', strtotime('+1 day', strtotime((string) $fattura->data)));
} }
// + 1 settimana // + 1 settimana
if (post('skip_time') == 'Settimana') { if (post('skip_time') == 'Settimana') {
$data = date('Y-m-d', strtotime('+1 week', strtotime($fattura->data))); $data = date('Y-m-d', strtotime('+1 week', strtotime((string) $fattura->data)));
} }
// + 1 mese // + 1 mese
if (post('skip_time') == 'Mese') { if (post('skip_time') == 'Mese') {
$data = date('Y-m-d', strtotime('+1 month', strtotime($fattura->data))); $data = date('Y-m-d', strtotime('+1 month', strtotime((string) $fattura->data)));
} }
// + 1 anno // + 1 anno
if (post('skip_time') == 'Anno') { if (post('skip_time') == 'Anno') {
$data = date('Y-m-d', strtotime('+1 year', strtotime($fattura->data))); $data = date('Y-m-d', strtotime('+1 year', strtotime((string) $fattura->data)));
} }
$new = $fattura->replicate(); $new = $fattura->replicate();
@@ -628,7 +628,7 @@ switch (post('op')) {
// Se non ci sono destinatari, salta questa fattura // Se non ci sono destinatari, salta questa fattura
if (empty($emails)) { if (empty($emails)) {
$failed_count++; ++$failed_count;
$failed_emails[] = $fattura->numero_esterno; $failed_emails[] = $fattura->numero_esterno;
continue; continue;
} }
@@ -669,10 +669,10 @@ switch (post('op')) {
if ($email_success) { if ($email_success) {
OperationLog::setInfo('id_email', $mail->id); OperationLog::setInfo('id_email', $mail->id);
$list[] = $fattura->numero_esterno; $list[] = $fattura->numero_esterno;
$success_count++; ++$success_count;
} else { } else {
$mail->delete(); $mail->delete();
$failed_count++; ++$failed_count;
$failed_emails[] = $fattura->numero_esterno; $failed_emails[] = $fattura->numero_esterno;
} }
} }
@@ -800,14 +800,10 @@ $operations['copy_bulk'] = [
], ],
]; ];
$operations['delete_bulk'] = [ $operations['delete_bulk'] = [
'text' => '<span><i class="fa fa-trash"></i> '.tr('Elimina').'</span>', 'text' => '<span><i class="fa fa-trash"></i> '.tr('Elimina').'</span>',
]; ];
if ($dir == 'entrata') { if ($dir == 'entrata') {
$operations['change_status'] = [ $operations['change_status'] = [
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Emetti fatture').'</span>', 'text' => '<span><i class="fa fa-refresh"></i> '.tr('Emetti fatture').'</span>',
@@ -875,7 +871,6 @@ $operations['export_xml_bulk'] = [
], ],
]; ];
if ($module->name == 'Fatture di vendita') { if ($module->name == 'Fatture di vendita') {
$operations['generate_xml'] = [ $operations['generate_xml'] = [
'text' => '<span><i class="fa fa-file-code-o"></i> '.tr('Genera fatture elettroniche').'</span>', 'text' => '<span><i class="fa fa-file-code-o"></i> '.tr('Genera fatture elettroniche').'</span>',
@@ -899,7 +894,6 @@ $operations['send-invoices'] = [
], ],
]; ];
$operations['registrazione_contabile'] = [ $operations['registrazione_contabile'] = [
'text' => '<span><i class="fa fa-calculator"></i> '.tr('Registrazione contabile').'</span>', 'text' => '<span><i class="fa fa-calculator"></i> '.tr('Registrazione contabile').'</span>',
'data' => [ 'data' => [
@@ -923,7 +917,4 @@ if (Interaction::isEnabled()) {
]; ];
} }
return $operations; return $operations;

View File

@@ -195,7 +195,7 @@ if ($dir == 'entrata') {
$carbonDate = Carbon::createFromFormat($dateFormat, setting('Data inizio verifica contatore fattura di vendita')); $carbonDate = Carbon::createFromFormat($dateFormat, setting('Data inizio verifica contatore fattura di vendita'));
$data_inizio_verifica_contatore = (($carbonDate !== false) ? strtotime($carbonDate->format('Y-m-d')) : null); $data_inizio_verifica_contatore = (($carbonDate !== false) ? strtotime($carbonDate->format('Y-m-d')) : null);
} }
$data = ($fattura->data ? strtotime($fattura->data) : ''); $data = ($fattura->data ? strtotime((string) $fattura->data) : '');
if ($data >= $data_inizio_verifica_contatore || empty($data_inizio_verifica_contatore)) { if ($data >= $data_inizio_verifica_contatore || empty($data_inizio_verifica_contatore)) {
$numero_previsto = verifica_numero_fattura($fattura); $numero_previsto = verifica_numero_fattura($fattura);
} }
@@ -503,8 +503,6 @@ if ($fattura->stato->id != $id_stato_bozza && $fattura->stato->id != $id_stato_a
</div> </div>
<div class="clearfix"></div>'; <div class="clearfix"></div>';
foreach ($scadenze as $scadenza) { foreach ($scadenze as $scadenza) {
$pagamento_iniziato = !empty(floatval($scadenza->pagato)) || $scadenza->da_pagare == 0; $pagamento_iniziato = !empty(floatval($scadenza->pagato)) || $scadenza->da_pagare == 0;

View File

@@ -38,7 +38,7 @@ if (!empty($riga_id)) {
// Caso singola riga // Caso singola riga
$riga = Riga::find($riga_id) ?: Articolo::find($riga_id); $riga = Riga::find($riga_id) ?: Articolo::find($riga_id);
$riga = $riga ?: Sconto::find($riga_id); $riga = $riga ?: Sconto::find($riga_id);
$righe_totali++; ++$righe_totali;
if (!empty($riga) && !empty($riga->idiva) && !empty($riga->aliquota)) { if (!empty($riga) && !empty($riga->idiva) && !empty($riga->aliquota)) {
$aliquote_iva[$riga->idiva] = [ $aliquote_iva[$riga->idiva] = [
@@ -46,19 +46,19 @@ if (!empty($riga_id)) {
'codice' => $riga->aliquota->codice, 'codice' => $riga->aliquota->codice,
'descrizione' => $riga->aliquota->getTranslation('title'), 'descrizione' => $riga->aliquota->getTranslation('title'),
'percentuale' => $riga->aliquota->percentuale, 'percentuale' => $riga->aliquota->percentuale,
'count' => 1 'count' => 1,
]; ];
} else { } else {
// Riga senza aliquota IVA o con aliquota non valida // Riga senza aliquota IVA o con aliquota non valida
$righe_senza_iva[] = [ $righe_senza_iva[] = [
'id' => $riga->id, 'id' => $riga->id,
'descrizione' => $riga->descrizione, 'descrizione' => $riga->descrizione,
'idiva' => $riga->idiva ?: 'N/D' 'idiva' => $riga->idiva ?: 'N/D',
]; ];
} }
} elseif (!empty($righe_ids)) { } elseif (!empty($righe_ids)) {
// Caso multiple righe // Caso multiple righe
$righe_array = explode(',', $righe_ids); $righe_array = explode(',', (string) $righe_ids);
$righe_totali = count($righe_array); $righe_totali = count($righe_array);
foreach ($righe_array as $id_riga) { foreach ($righe_array as $id_riga) {
@@ -72,16 +72,16 @@ if (!empty($riga_id)) {
'codice' => $riga->aliquota->codice, 'codice' => $riga->aliquota->codice,
'descrizione' => $riga->aliquota->getTranslation('title'), 'descrizione' => $riga->aliquota->getTranslation('title'),
'percentuale' => $riga->aliquota->percentuale, 'percentuale' => $riga->aliquota->percentuale,
'count' => 0 'count' => 0,
]; ];
} }
$aliquote_iva[$riga->idiva]['count']++; ++$aliquote_iva[$riga->idiva]['count'];
} elseif (!empty($riga)) { } elseif (!empty($riga)) {
// Riga senza aliquota IVA o con aliquota non valida // Riga senza aliquota IVA o con aliquota non valida
$righe_senza_iva[] = [ $righe_senza_iva[] = [
'id' => $riga->id, 'id' => $riga->id,
'descrizione' => $riga->descrizione, 'descrizione' => $riga->descrizione,
'idiva' => $riga->idiva ?: 'N/D' 'idiva' => $riga->idiva ?: 'N/D',
]; ];
} }
} }
@@ -92,20 +92,20 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
?> ?>
<form id="modifica-iva-form"> <form id="modifica-iva-form">
<?php if (count($aliquote_iva) > 0): ?> <?php if (count($aliquote_iva) > 0) { ?>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<div class="alert alert-info"> <div class="alert alert-info">
<p><strong><?= tr('Aliquote IVA attuali') ?></strong></p> <p><strong><?php echo tr('Aliquote IVA attuali'); ?></strong></p>
<ul class="list-unstyled"> <ul class="list-unstyled">
<?php foreach ($aliquote_iva as $aliquota): ?> <?php foreach ($aliquote_iva as $aliquota) { ?>
<li> <li>
<strong><?= $aliquota['codice'] ?></strong> - <?= $aliquota['descrizione'] ?> (<?= $aliquota['percentuale'] ?>%) <strong><?php echo $aliquota['codice']; ?></strong> - <?php echo $aliquota['descrizione']; ?> (<?php echo $aliquota['percentuale']; ?>%)
<?php if (count($aliquote_iva) > 1): ?> <?php if (count($aliquote_iva) > 1) { ?>
<span class="badge"><?= $aliquota['count'] ?> <?= tr('righe') ?></span> <span class="badge"><?php echo $aliquota['count']; ?> <?php echo tr('righe'); ?></span>
<?php endif; ?> <?php } ?>
</li> </li>
<?php endforeach; ?> <?php } ?>
</ul> </ul>
</div> </div>
</div> </div>
@@ -117,38 +117,38 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
<div class="col-md-5"> <div class="col-md-5">
<div class="panel panel-success"> <div class="panel panel-success">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title"><?= tr('Aliquota da applicare') ?></h4> <h4 class="panel-title"><?php echo tr('Aliquota da applicare'); ?></h4>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?= tr('eliminata') ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?= prepare(Models\Locale::getDefault()->id) ?>) ORDER BY `title` ASC" ]} {[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?php echo tr('eliminata'); ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?php echo prepare(Models\Locale::getDefault()->id); ?>) ORDER BY `title` ASC" ]}
<input type="hidden" name="riga_id" value="<?= get('riga_id') ?>"> <input type="hidden" name="riga_id" value="<?php echo get('riga_id'); ?>">
<input type="hidden" name="righe" value="<?= $_GET['righe'] ?>"> <input type="hidden" name="righe" value="<?php echo $_GET['righe']; ?>">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php elseif ($show_form): ?> <?php } elseif ($show_form) { ?>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<div class="alert alert-info"> <div class="alert alert-info">
<p><strong><?= tr('Aliquote IVA attuali') ?></strong></p> <p><strong><?php echo tr('Aliquote IVA attuali'); ?></strong></p>
<?php if (count($aliquote_iva) > 0): ?> <?php if (count($aliquote_iva) > 0) { ?>
<ul class="list-unstyled"> <ul class="list-unstyled">
<?php foreach ($aliquote_iva as $aliquota): ?> <?php foreach ($aliquote_iva as $aliquota) { ?>
<li> <li>
<strong><?= $aliquota['codice'] ?></strong> - <?= $aliquota['descrizione'] ?> (<?= $aliquota['percentuale'] ?>%) <strong><?php echo $aliquota['codice']; ?></strong> - <?php echo $aliquota['descrizione']; ?> (<?php echo $aliquota['percentuale']; ?>%)
<span class="badge"><?= $aliquota['count'] ?> <?= tr('righe') ?></span> <span class="badge"><?php echo $aliquota['count']; ?> <?php echo tr('righe'); ?></span>
</li> </li>
<?php endforeach; ?> <?php } ?>
</ul> </ul>
<?php endif; ?> <?php } ?>
<?php if (count($righe_senza_iva) > 0): ?> <?php if (count($righe_senza_iva) > 0) { ?>
<p><strong><?= tr('Righe senza aliquota IVA valida') ?>:</strong> <span class="badge"><?= count($righe_senza_iva) ?></span></p> <p><strong><?php echo tr('Righe senza aliquota IVA valida'); ?>:</strong> <span class="badge"><?php echo count($righe_senza_iva); ?></span></p>
<?php endif; ?> <?php } ?>
<p class="text-muted"><?= tr('Totale righe selezionate') ?>: <?= $righe_totali ?></p> <p class="text-muted"><?php echo tr('Totale righe selezionate'); ?>: <?php echo $righe_totali; ?></p>
</div> </div>
</div> </div>
@@ -159,31 +159,31 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
<div class="col-md-5"> <div class="col-md-5">
<div class="panel panel-success"> <div class="panel panel-success">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title"><?= tr('Aliquota da applicare') ?></h4> <h4 class="panel-title"><?php echo tr('Aliquota da applicare'); ?></h4>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?= tr('eliminata') ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?= prepare(Models\Locale::getDefault()->id) ?>) ORDER BY `title` ASC" ]} {[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?php echo tr('eliminata'); ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?php echo prepare(Models\Locale::getDefault()->id); ?>) ORDER BY `title` ASC" ]}
<input type="hidden" name="riga_id" value="<?= get('riga_id') ?>"> <input type="hidden" name="riga_id" value="<?php echo get('riga_id'); ?>">
<input type="hidden" name="righe" value="<?= $_GET['righe'] ?>"> <input type="hidden" name="righe" value="<?php echo $_GET['righe']; ?>">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php else: ?> <?php } else { ?>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="alert alert-warning"> <div class="alert alert-warning">
<p><?= tr('Nessuna riga selezionata') ?></p> <p><?php echo tr('Nessuna riga selezionata'); ?></p>
</div> </div>
</div> </div>
</div> </div>
<?php endif; ?> <?php } ?>
<!-- PULSANTI --> <!-- PULSANTI -->
<div class="row"> <div class="row">
<div class="col-md-12 text-right"> <div class="col-md-12 text-right">
<button type="button" class="btn btn-primary" onclick="salvaIva()"> <button type="button" class="btn btn-primary" onclick="salvaIva()">
<i class="fa fa-save"></i> <?= tr('Salva') ?> <i class="fa fa-save"></i> <?php echo tr('Salva'); ?>
</button> </button>
</div> </div>
</div> </div>
@@ -216,7 +216,7 @@ function salvaIva() {
renderMessages(); renderMessages();
}, },
error: function() { error: function() {
alert(<?= json_encode(tr('Errore durante il salvataggio')) ?>); alert(<?php echo json_encode(tr('Errore durante il salvataggio')); ?>);
} }
}); });
} else { } else {
@@ -237,7 +237,7 @@ function salvaIva() {
renderMessages(); renderMessages();
}, },
error: function() { error: function() {
alert(<?= json_encode(tr('Errore durante il salvataggio')) ?>); alert(<?php echo json_encode(tr('Errore durante il salvataggio')); ?>);
} }
}); });
} }

View File

@@ -152,7 +152,7 @@ foreach ($righe as $riga) {
if ($riga->isArticolo()) { if ($riga->isArticolo()) {
echo Modules::link('Articoli', $riga->idarticolo, $riga->codice.' - '.$riga->descrizione); echo Modules::link('Articoli', $riga->idarticolo, $riga->codice.' - '.$riga->descrizione);
} else { } else {
echo nl2br($riga->descrizione); echo nl2br((string) $riga->descrizione);
} }
if ($riga->isArticolo() && !empty($riga->articolo->deleted_at)) { if ($riga->isArticolo() && !empty($riga->articolo->deleted_at)) {
@@ -186,9 +186,9 @@ foreach ($righe as $riga) {
} }
if (!empty($riga->note)) { if (!empty($riga->note)) {
if (strlen($riga->note) > 50) { if (strlen((string) $riga->note) > 50) {
$prima_parte = substr($riga->note, 0, (strpos($riga->note, ' ', 50) < 60) && (!str_starts_with($riga->note, ' ')) ? strpos($riga->note, ' ', 50) : 50); $prima_parte = substr((string) $riga->note, 0, (strpos((string) $riga->note, ' ', 50) < 60) && (!str_starts_with((string) $riga->note, ' ')) ? strpos((string) $riga->note, ' ', 50) : 50);
$seconda_parte = substr($riga->note, (strpos($riga->note, ' ', 50) < 60) && (!str_starts_with($riga->note, ' ')) ? strpos($riga->note, ' ', 50) : 50); $seconda_parte = substr((string) $riga->note, (strpos((string) $riga->note, ' ', 50) < 60) && (!str_starts_with((string) $riga->note, ' ')) ? strpos((string) $riga->note, ' ', 50) : 50);
$stringa_modificata = '<span class="text-xs">'.$prima_parte.'</small> $stringa_modificata = '<span class="text-xs">'.$prima_parte.'</small>
<span id="read-more-target-'.$riga->id.'" class="read-more-target"><span class="text-xs">'.$seconda_parte.'</small></span><a href="#read-more-target-'.$riga->id.'" class="read-more-trigger">...</a>'; <span id="read-more-target-'.$riga->id.'" class="read-more-target"><span class="text-xs">'.$seconda_parte.'</small></span><a href="#read-more-target-'.$riga->id.'" class="read-more-trigger">...</a>';
} else { } else {

View File

@@ -54,7 +54,7 @@ switch ($resource) {
$where[] = 'my_impianti.idanagrafica='.prepare($superselect['idanagrafica']); $where[] = 'my_impianti.idanagrafica='.prepare($superselect['idanagrafica']);
} }
if (isset($superselect['idsede_destinazione']) && $superselect['idsede_destinazione'] != "") { if (isset($superselect['idsede_destinazione']) && $superselect['idsede_destinazione'] != '') {
$where[] = 'my_impianti.idsede='.prepare($superselect['idsede_destinazione'] ?: 0); $where[] = 'my_impianti.idsede='.prepare($superselect['idsede_destinazione'] ?: 0);
} }

View File

@@ -105,6 +105,4 @@ $operations['export_csv'] = [
], ],
]; ];
return $operations; return $operations;

View File

@@ -170,7 +170,7 @@ if (!empty($elementi)) {
'_DOC_' => $elemento['tipo_documento'], '_DOC_' => $elemento['tipo_documento'],
'_NUM_' => $elemento['numero'], '_NUM_' => $elemento['numero'],
'_DATE_' => Translator::dateToLocale($elemento['data']), '_DATE_' => Translator::dateToLocale($elemento['data']),
'_STATO_' => (!empty($elemento['stato_documento']) ? "(".$elemento['stato_documento'].")" : ''), '_STATO_' => (!empty($elemento['stato_documento']) ? '('.$elemento['stato_documento'].')' : ''),
]); ]);
if ($elemento['tipo_documento'] == 'Attività') { if ($elemento['tipo_documento'] == 'Attività') {

View File

@@ -37,7 +37,7 @@ class Impianto extends Model
return $this->belongsTo(Anagrafica::class, 'idanagrafica'); return $this->belongsTo(Anagrafica::class, 'idanagrafica');
} }
public static function build($matricola = null, $nome = null, ?\Modules\Articoli\Categoria $categoria = null, $anagrafica = null) public static function build($matricola = null, $nome = null, ?Categoria $categoria = null, $anagrafica = null)
{ {
$model = new static(); $model = new static();
$model->is_impianto = 1; $model->is_impianto = 1;
@@ -53,6 +53,6 @@ class Impianto extends Model
public function categoria() public function categoria()
{ {
return $this->belongsTo(\Modules\Articoli\Categoria::class, 'id_categoria'); return $this->belongsTo(Categoria::class, 'id_categoria');
} }
} }

View File

@@ -113,6 +113,7 @@ class CSV extends CSVImporter
* @param array $record Record da importare * @param array $record Record da importare
* @param bool $update_record Se true, aggiorna i record esistenti * @param bool $update_record Se true, aggiorna i record esistenti
* @param bool $add_record Se true, aggiunge nuovi record * @param bool $add_record Se true, aggiunge nuovi record
*
* @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata * @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata
*/ */
public function import($record, $update_record = true, $add_record = true) public function import($record, $update_record = true, $add_record = true)
@@ -180,14 +181,33 @@ class CSV extends CSVImporter
} catch (\Exception $e) { } catch (\Exception $e) {
// Registra l'errore in un log // Registra l'errore in un log
error_log('Errore durante l\'importazione dell\'impianto: '.$e->getMessage()); error_log('Errore durante l\'importazione dell\'impianto: '.$e->getMessage());
return false; return false;
} }
} }
/**
* Restituisce un esempio di file CSV per l'importazione.
*
* @return array
*/
public static function getExample()
{
return [
['Matricola', 'Immagine', 'Import immagine', 'Nome', 'Partita IVA Cliente', 'Codice Fiscale Cliente', 'Categoria', 'Sottocategoria', 'Sede', 'Descrizione', 'Data installazione', 'Marca', 'Modello'],
['00001', 'https://openstamanager.com/moduli/budget/budget.webp', '2', 'Lavatrice Samsung', '12345678901', '', 'Elettrodomestici', 'Lavatrici', 'Sede Principale', 'Lavatrice a carica frontale 8kg', '2023-01-01', 'Samsung', 'WW80TA046AX'],
['00002', 'https://openstamanager.com/moduli/3cx/3cx.webp', '2', 'Caldaia Ariston', '', 'RSSMRA80A01H501U', 'Riscaldamento', 'Caldaie', 'Sede Secondaria', 'Caldaia a condensazione 24kW', '2023-03-06', 'Ariston', 'Genus One Net'],
['00003', 'https://openstamanager.com/moduli/disponibilita-tecnici/tecnici.webp', '2', 'Forno Electrolux', '98765432109', '', 'Elettrodomestici', 'Forni', 'Sede Principale', 'Forno elettrico multifunzione', '2023-04-01', 'Electrolux', 'EOC6P77WX'],
['00004', 'https://openstamanager.com/moduli/distinta-base/distinta.webp', '2', 'Lavastoviglie Bosch', '12345678901', '', 'Elettrodomestici', 'Lavastoviglie', 'Sede Principale', 'Lavastoviglie da incasso 60cm', '2023-08-06', 'Bosch', 'SMV4HCX48E'],
['00005', '', '', 'Condizionatore Daikin', '', 'VRDLGI75M15F205Z', 'Climatizzazione', 'Split', 'Sede Principale', 'Condizionatore inverter 12000 BTU', '2023-05-15', 'Daikin', 'FTXM35R'],
];
}
/** /**
* Trova l'anagrafica cliente in base alla partita IVA o al codice fiscale. * Trova l'anagrafica cliente in base alla partita IVA o al codice fiscale.
* *
* @param array $record Record da importare * @param array $record Record da importare
*
* @return Anagrafica|null * @return Anagrafica|null
*/ */
protected function trovaAnagrafica($record) protected function trovaAnagrafica($record)
@@ -210,6 +230,7 @@ class CSV extends CSVImporter
* *
* @param array $record Record da importare * @param array $record Record da importare
* @param string $primary_key Chiave primaria * @param string $primary_key Chiave primaria
*
* @return Impianto|null * @return Impianto|null
*/ */
protected function trovaImpianto($record, $primary_key) protected function trovaImpianto($record, $primary_key)
@@ -225,6 +246,7 @@ class CSV extends CSVImporter
* Processa la categoria dell'impianto. * Processa la categoria dell'impianto.
* *
* @param array $record Record da importare * @param array $record Record da importare
*
* @return Categoria|null * @return Categoria|null
*/ */
protected function processaCategoria($record) protected function processaCategoria($record)
@@ -249,6 +271,7 @@ class CSV extends CSVImporter
* *
* @param array $record Record da importare * @param array $record Record da importare
* @param Categoria|null $categoria Categoria padre * @param Categoria|null $categoria Categoria padre
*
* @return Categoria|null * @return Categoria|null
*/ */
protected function processaSottocategoria($record, $categoria) protected function processaSottocategoria($record, $categoria)
@@ -274,6 +297,7 @@ class CSV extends CSVImporter
* *
* @param array $record Record da importare * @param array $record Record da importare
* @param object $database Connessione al database * @param object $database Connessione al database
*
* @return int|null * @return int|null
*/ */
protected function processaMarca($record, $database) protected function processaMarca($record, $database)
@@ -401,21 +425,4 @@ class CSV extends CSVImporter
error_log('Errore durante l\'importazione dell\'immagine: '.$e->getMessage()); error_log('Errore durante l\'importazione dell\'immagine: '.$e->getMessage());
} }
} }
/**
* Restituisce un esempio di file CSV per l'importazione.
*
* @return array
*/
public static function getExample()
{
return [
['Matricola', 'Immagine', 'Import immagine', 'Nome', 'Partita IVA Cliente', 'Codice Fiscale Cliente', 'Categoria', 'Sottocategoria', 'Sede', 'Descrizione', 'Data installazione', 'Marca', 'Modello'],
['00001', 'https://openstamanager.com/moduli/budget/budget.webp', '2', 'Lavatrice Samsung', '12345678901', '', 'Elettrodomestici', 'Lavatrici', 'Sede Principale', 'Lavatrice a carica frontale 8kg', '2023-01-01', 'Samsung', 'WW80TA046AX'],
['00002', 'https://openstamanager.com/moduli/3cx/3cx.webp', '2', 'Caldaia Ariston', '', 'RSSMRA80A01H501U', 'Riscaldamento', 'Caldaie', 'Sede Secondaria', 'Caldaia a condensazione 24kW', '2023-03-06', 'Ariston', 'Genus One Net'],
['00003', 'https://openstamanager.com/moduli/disponibilita-tecnici/tecnici.webp', '2', 'Forno Electrolux', '98765432109', '', 'Elettrodomestici', 'Forni', 'Sede Principale', 'Forno elettrico multifunzione', '2023-04-01', 'Electrolux', 'EOC6P77WX'],
['00004', 'https://openstamanager.com/moduli/distinta-base/distinta.webp', '2', 'Lavastoviglie Bosch', '12345678901', '', 'Elettrodomestici', 'Lavastoviglie', 'Sede Principale', 'Lavastoviglie da incasso 60cm', '2023-08-06', 'Bosch', 'SMV4HCX48E'],
['00005', '', '', 'Condizionatore Daikin', '', 'VRDLGI75M15F205Z', 'Climatizzazione', 'Split', 'Sede Principale', 'Condizionatore inverter 12000 BTU', '2023-05-15', 'Daikin', 'FTXM35R'],
];
}
} }

View File

@@ -63,7 +63,7 @@ switch (filter('op')) {
VALUES ("example-'.strtolower((string) $import->getTranslation('title')).'", "example-'.strtolower((string) $import->getTranslation('title')).'.csv", '.$id_module.', NULL, '.$id_import.', '.filesize($filepath).', 1, "'.basename($filepath).'", '.Auth::user()->id.', NOW())'); VALUES ("example-'.strtolower((string) $import->getTranslation('title')).'", "example-'.strtolower((string) $import->getTranslation('title')).'.csv", '.$id_module.', NULL, '.$id_import.', '.filesize($filepath).', 1, "'.basename($filepath).'", '.Auth::user()->id.', NOW())');
echo base_path().'/'.$file; echo base_path().'/'.$file;
} catch (\Exception $e) { } catch (Exception $e) {
// Log dell'errore // Log dell'errore
error_log('Errore durante la generazione del file di esempio: '.$e->getMessage()); error_log('Errore durante la generazione del file di esempio: '.$e->getMessage());
@@ -112,7 +112,7 @@ switch (filter('op')) {
if (!isset($page) || empty($page)) { if (!isset($page) || empty($page)) {
if (!$csv->areRequiredFieldsMapped()) { if (!$csv->areRequiredFieldsMapped()) {
// Verifica se è il caso speciale delle anagrafiche (telefono o partita IVA) // Verifica se è il caso speciale delle anagrafiche (telefono o partita IVA)
$is_anagrafica_import = strpos(get_class($csv), 'Anagrafiche') !== false; $is_anagrafica_import = str_contains($csv::class, 'Anagrafiche');
$error_message = $is_anagrafica_import ? $error_message = $is_anagrafica_import ?
tr('Alcuni campi obbligatori non sono stati mappati. La ragione sociale è obbligatoria e almeno uno tra telefono e partita IVA deve essere mappato.') : tr('Alcuni campi obbligatori non sono stati mappati. La ragione sociale è obbligatoria e almeno uno tra telefono e partita IVA deve essere mappato.') :
tr('Alcuni campi obbligatori non sono stati mappati'); tr('Alcuni campi obbligatori non sono stati mappati');

View File

@@ -69,9 +69,8 @@ if (empty($id_record)) {
// Caso speciale per anagrafiche: telefono e partita IVA (almeno uno dei due è obbligatorio) // Caso speciale per anagrafiche: telefono e partita IVA (almeno uno dei due è obbligatorio)
foreach ($fields as $key => $value) { foreach ($fields as $key => $value) {
if (($value['field'] === 'telefono' || $value['field'] === 'piva') && if (($value['field'] === 'telefono' || $value['field'] === 'piva')
isset($value['required']) && $value['required'] === false) { && isset($value['required']) && $value['required'] === false) {
// Sposta questi campi tra quelli obbligatori // Sposta questi campi tra quelli obbligatori
foreach ($campi_opzionali as $index => $campo) { foreach ($campi_opzionali as $index => $campo) {
if ($campo['id'] === $key + 1) { if ($campo['id'] === $key + 1) {
@@ -86,9 +85,7 @@ if (empty($id_record)) {
} }
// Ordina i campi opzionali in ordine alfabetico // Ordina i campi opzionali in ordine alfabetico
usort($campi_opzionali, function($a, $b) { usort($campi_opzionali, fn ($a, $b) => strcmp((string) $a['text'], (string) $b['text']));
return strcmp($a['text'], $b['text']);
});
// Unisci i campi, prima gli obbligatori e poi gli opzionali ordinati alfabeticamente // Unisci i campi, prima gli obbligatori e poi gli opzionali ordinati alfabeticamente
$campi_disponibili = array_merge($campi_obbligatori, array_values($campi_opzionali)); $campi_disponibili = array_merge($campi_obbligatori, array_values($campi_opzionali));
@@ -102,17 +99,17 @@ if (empty($id_record)) {
<i class="fa fa-info-circle"></i> <strong>'.tr('Informazioni importanti:').'</strong> <i class="fa fa-info-circle"></i> <strong>'.tr('Informazioni importanti:').'</strong>
<div style="margin-top: 8px;">'.tr('I campi con * sono obbligatori e devono essere mappati nel file CSV.').'</div>'; <div style="margin-top: 8px;">'.tr('I campi con * sono obbligatori e devono essere mappati nel file CSV.').'</div>';
if ($import_selezionato === 'Modules\Anagrafiche\Import\CSV') { if ($import_selezionato === Modules\Anagrafiche\Import\CSV::class) {
echo '<div style="margin-top: 8px;"><i class="fa fa-exclamation-triangle"></i> <strong>'.tr('Requisiti:').'</strong> '.tr('Mappare almeno uno tra Telefono e Partita IVA.').'</div> echo '<div style="margin-top: 8px;"><i class="fa fa-exclamation-triangle"></i> <strong>'.tr('Requisiti:').'</strong> '.tr('Mappare almeno uno tra Telefono e Partita IVA.').'</div>
<div style="margin-top: 8px;"><i class="fa fa-magic"></i> <strong>'.tr('Automatismi:').'</strong> '.tr('I campi Tipo anagrafica e Settore merceologico vengono generati automaticamente se mappati.').'</div>'; <div style="margin-top: 8px;"><i class="fa fa-magic"></i> <strong>'.tr('Automatismi:').'</strong> '.tr('I campi Tipo anagrafica e Settore merceologico vengono generati automaticamente se mappati.').'</div>';
} }
if ($import_selezionato === 'Modules\Articoli\Import\CSV') { if ($import_selezionato === Modules\Articoli\Import\CSV::class) {
echo '<div style="margin-top: 8px;"><i class="fa fa-exclamation-triangle"></i> <strong>'.tr('Formato numeri:').'</strong> '.tr('Gli importi inseriti devono avere come separatore il punto e presentare due decimali.').'</div> echo '<div style="margin-top: 8px;"><i class="fa fa-exclamation-triangle"></i> <strong>'.tr('Formato numeri:').'</strong> '.tr('Gli importi inseriti devono avere come separatore il punto e presentare due decimali.').'</div>
<div style="margin-top: 8px;"><i class="fa fa-link"></i> <strong>'.tr('Associazione anagrafiche:').'</strong> '.tr('L\'importazione dell\'anagrafica collegata all\'articolo avviene utilizzando come chiave primaria la Partita IVA, e in seguito la ragione sociale se non viene trovata corrispondenza. È opportuno pertanto indicare nel file CSV di importazione la partita IVA dell\'anagrafica per associare correttamente l\'anagrafica cliente/fornitore del listino.').'</div>'; <div style="margin-top: 8px;"><i class="fa fa-link"></i> <strong>'.tr('Associazione anagrafiche:').'</strong> '.tr('L\'importazione dell\'anagrafica collegata all\'articolo avviene utilizzando come chiave primaria la Partita IVA, e in seguito la ragione sociale se non viene trovata corrispondenza. È opportuno pertanto indicare nel file CSV di importazione la partita IVA dell\'anagrafica per associare correttamente l\'anagrafica cliente/fornitore del listino.').'</div>';
} }
if ($import_selezionato === 'Modules\Interventi\Import\CSV') { if ($import_selezionato === Modules\Interventi\Import\CSV::class) {
echo '<div class="alert alert-info" style="background-color: #17a2b8; color: white; border: none; padding: 10px 15px;"> echo '<div class="alert alert-info" style="background-color: #17a2b8; color: white; border: none; padding: 10px 15px;">
<div style="margin-top: 8px;"><i class="fa fa-link"></i> <strong>'.tr('Anagrafiche:').'</strong> '.tr('La ricerca dell\'anagrafica da collegare all\'attività avviene sulla base della partita IVA o del codice fiscale mappato. Per procedere all\'importazione dell\'attività è pertanto necessario che almeno uno dei due valori siano censiti in anagrafica.').'</div> <div style="margin-top: 8px;"><i class="fa fa-link"></i> <strong>'.tr('Anagrafiche:').'</strong> '.tr('La ricerca dell\'anagrafica da collegare all\'attività avviene sulla base della partita IVA o del codice fiscale mappato. Per procedere all\'importazione dell\'attività è pertanto necessario che almeno uno dei due valori siano censiti in anagrafica.').'</div>
<div style="margin-top: 8px;"><i class="fa fa-cogs"></i> <strong>'.tr('Impianti:').'</strong> '.tr('Per procedere all\'importazione di attività collegate ad impianti è necessario che la matricola indicata sia già censita in impianti. Procedere quindi prima all\'importazione degli impianti e successivamente delle attività.').'</div> <div style="margin-top: 8px;"><i class="fa fa-cogs"></i> <strong>'.tr('Impianti:').'</strong> '.tr('Per procedere all\'importazione di attività collegate ad impianti è necessario che la matricola indicata sia già censita in impianti. Procedere quindi prima all\'importazione degli impianti e successivamente delle attività.').'</div>
@@ -120,7 +117,7 @@ if (empty($id_record)) {
</div>'; </div>';
} }
if ($import_selezionato === 'Modules\Impianti\Import\CSV') { if ($import_selezionato === Modules\Impianti\Import\CSV::class) {
echo '<div class="alert alert-info" style="background-color: #17a2b8; color: white; border: none; padding: 10px 15px;"> echo '<div class="alert alert-info" style="background-color: #17a2b8; color: white; border: none; padding: 10px 15px;">
<div style="margin-top: 8px;"><i class="fa fa-link"></i> <strong>'.tr('Anagrafiche:').'</strong> '.tr('La ricerca dell\'anagrafica da collegare all\'impianto avviene sulla base della partita IVA o del codice fiscale mappato. Per procedere all\'importazione dell\'impianto è pertanto necessario che almeno uno dei due valori siano censiti in anagrafica.').'</div> <div style="margin-top: 8px;"><i class="fa fa-link"></i> <strong>'.tr('Anagrafiche:').'</strong> '.tr('La ricerca dell\'anagrafica da collegare all\'impianto avviene sulla base della partita IVA o del codice fiscale mappato. Per procedere all\'importazione dell\'impianto è pertanto necessario che almeno uno dei due valori siano censiti in anagrafica.').'</div>
<div style="margin-top: 8px;"><i class="fa fa-exclamation-triangle"></i> <strong>'.tr('Requisiti:').'</strong> '.tr('I campi Matricola e Nome sono obbligatori. Inoltre, è necessario mappare almeno uno tra Partita IVA cliente e Codice Fiscale cliente.').'</div> <div style="margin-top: 8px;"><i class="fa fa-exclamation-triangle"></i> <strong>'.tr('Requisiti:').'</strong> '.tr('I campi Matricola e Nome sono obbligatori. Inoltre, è necessario mappare almeno uno tra Partita IVA cliente e Codice Fiscale cliente.').'</div>
@@ -128,14 +125,13 @@ if (empty($id_record)) {
</div>'; </div>';
} }
if ($import_selezionato === 'Modules\ListiniCliente\Import\CSV') { if ($import_selezionato === Modules\ListiniCliente\Import\CSV::class) {
echo '<div class="alert alert-info" style="background-color: #17a2b8; color: white; border: none; padding: 10px 15px;"> echo '<div class="alert alert-info" style="background-color: #17a2b8; color: white; border: none; padding: 10px 15px;">
<div style="margin-top: 8px;"><i class="fa fa-exclamation-triangle"></i> <strong>'.tr('Requisiti:').'</strong> '.tr('I campi Nome listino, Codice articolo e Prezzo unitario sono obbligatori.').'</div> <div style="margin-top: 8px;"><i class="fa fa-exclamation-triangle"></i> <strong>'.tr('Requisiti:').'</strong> '.tr('I campi Nome listino, Codice articolo e Prezzo unitario sono obbligatori.').'</div>
<div style="margin-top: 8px;"><i class="fa fa-magic"></i> <strong>'.tr('Automatismi:').'</strong> '.tr('Se il listino o l\'articolo non esistono, l\'importazione verrà saltata.').'</div> <div style="margin-top: 8px;"><i class="fa fa-magic"></i> <strong>'.tr('Automatismi:').'</strong> '.tr('Se il listino o l\'articolo non esistono, l\'importazione verrà saltata.').'</div>
</div>'; </div>';
} }
echo '</div><div class="alert alert-warning" style="background-color: #ffc107; color: #212529; border: none; padding: 10px 15px;"> echo '</div><div class="alert alert-warning" style="background-color: #ffc107; color: #212529; border: none; padding: 10px 15px;">
<i class="fa fa-warning"></i> <strong>'.tr('ATTENZIONE:').'</strong> <i class="fa fa-warning"></i> <strong>'.tr('ATTENZIONE:').'</strong>
<div style="margin-top: 8px;">'.tr('Per record esistenti, tutti i campi mappati sovrascriveranno i dati attuali, anche se vuoti nel CSV. Non mappare le colonne che non si desidera modificare.').'</div> <div style="margin-top: 8px;">'.tr('Per record esistenti, tutti i campi mappati sovrascriveranno i dati attuali, anche se vuoti nel CSV. Non mappare le colonne che non si desidera modificare.').'</div>

View File

@@ -66,7 +66,7 @@ switch (filter('op')) {
} }
$results[$setting->sezione][] = [ $results[$setting->sezione][] = [
'id' => $setting->id, 'id' => $setting->id,
'nome' => $setting->nome 'nome' => $setting->nome,
]; ];
} }

View File

@@ -41,8 +41,6 @@ use Modules\TipiIntervento\Tipo as TipoSessione;
use Plugins\ComponentiImpianti\Componente; use Plugins\ComponentiImpianti\Componente;
use Plugins\ListinoClienti\DettaglioPrezzo; use Plugins\ListinoClienti\DettaglioPrezzo;
use Plugins\PianificazioneInterventi\Promemoria; use Plugins\PianificazioneInterventi\Promemoria;
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Imagick\Driver;
$id_modulo_impianti = Module::where('name', 'Impianti')->first()->id; $id_modulo_impianti = Module::where('name', 'Impianti')->first()->id;
$plugin_impianti = Plugin::where('name', 'Impianti')->first()->id; $plugin_impianti = Plugin::where('name', 'Impianti')->first()->id;
@@ -405,13 +403,13 @@ switch (post('op')) {
foreach ($sessioni as $sessione) { foreach ($sessioni as $sessione) {
// Se è la prima sessione che copio importo la data con quella della richiesta // Se è la prima sessione che copio importo la data con quella della richiesta
if ($numero_sessione == 0) { if ($numero_sessione == 0) {
$orario_inizio = date('Y-m-d', strtotime((string) $data_ricorrenza)).' '.date('H:i:s', strtotime($sessione->orario_inizio)); $orario_inizio = date('Y-m-d', strtotime((string) $data_ricorrenza)).' '.date('H:i:s', strtotime((string) $sessione->orario_inizio));
} else { } else {
$diff = strtotime($sessione->orario_inizio) - strtotime((string) $inizio_old); $diff = strtotime((string) $sessione->orario_inizio) - strtotime((string) $inizio_old);
$orario_inizio = date('Y-m-d H:i:s', strtotime($new_sessione->orario_inizio) + $diff); $orario_inizio = date('Y-m-d H:i:s', strtotime((string) $new_sessione->orario_inizio) + $diff);
} }
$diff_fine = strtotime($sessione->orario_fine) - strtotime($sessione->orario_inizio); $diff_fine = strtotime((string) $sessione->orario_fine) - strtotime((string) $sessione->orario_inizio);
$orario_fine = date('Y-m-d H:i:s', strtotime($orario_inizio) + $diff_fine); $orario_fine = date('Y-m-d H:i:s', strtotime($orario_inizio) + $diff_fine);
$new_sessione = $sessione->replicate(); $new_sessione = $sessione->replicate();
@@ -1110,13 +1108,13 @@ switch (post('op')) {
foreach ($sessioni as $sessione) { foreach ($sessioni as $sessione) {
// Se è la prima sessione che copio importo la data con quella della richiesta // Se è la prima sessione che copio importo la data con quella della richiesta
if ($numero_sessione == 0) { if ($numero_sessione == 0) {
$orario_inizio = date('Y-m-d', strtotime($data_richiesta)).' '.date('H:i:s', strtotime($sessione->orario_inizio)); $orario_inizio = date('Y-m-d', strtotime($data_richiesta)).' '.date('H:i:s', strtotime((string) $sessione->orario_inizio));
} else { } else {
$diff = strtotime($sessione->orario_inizio) - strtotime((string) $inizio_old); $diff = strtotime((string) $sessione->orario_inizio) - strtotime((string) $inizio_old);
$orario_inizio = date('Y-m-d H:i:s', strtotime($new_sessione->orario_inizio) + $diff); $orario_inizio = date('Y-m-d H:i:s', strtotime((string) $new_sessione->orario_inizio) + $diff);
} }
$diff_fine = strtotime($sessione->orario_fine) - strtotime($sessione->orario_inizio); $diff_fine = strtotime((string) $sessione->orario_fine) - strtotime((string) $sessione->orario_inizio);
$orario_fine = date('Y-m-d H:i:s', strtotime($orario_inizio) + $diff_fine); $orario_fine = date('Y-m-d H:i:s', strtotime($orario_inizio) + $diff_fine);
$new_sessione = $sessione->replicate(); $new_sessione = $sessione->replicate();

View File

@@ -66,7 +66,6 @@ $anagrafica = $dbo->fetchOne('SELECT idtipointervento_default, idzona FROM an_an
$id_tipo = $anagrafica['idtipointervento_default']; $id_tipo = $anagrafica['idtipointervento_default'];
$id_zona = $anagrafica['idzona']; $id_zona = $anagrafica['idzona'];
// Trasformazione di un Promemoria dei Contratti in Intervento // Trasformazione di un Promemoria dei Contratti in Intervento
if (!empty($id_contratto) && !empty($id_promemoria_contratto)) { if (!empty($id_contratto) && !empty($id_promemoria_contratto)) {
$contratto = $dbo->fetchOne('SELECT *, (SELECT idzona FROM an_anagrafiche WHERE idanagrafica = co_contratti.idanagrafica) AS idzona FROM co_contratti WHERE id = '.prepare($id_contratto)); $contratto = $dbo->fetchOne('SELECT *, (SELECT idzona FROM an_anagrafiche WHERE idanagrafica = co_contratti.idanagrafica) AS idzona FROM co_contratti WHERE id = '.prepare($id_contratto));

View File

@@ -265,13 +265,13 @@ switch (post('op')) {
foreach ($sessioni as $sessione) { foreach ($sessioni as $sessione) {
// Se è la prima sessione che copio importo la data con quella della richiesta // Se è la prima sessione che copio importo la data con quella della richiesta
if ($numero_sessione == 0) { if ($numero_sessione == 0) {
$orario_inizio = date('Y-m-d', strtotime($data_richiesta)).' '.date('H:i:s', strtotime($sessione->orario_inizio)); $orario_inizio = date('Y-m-d', strtotime($data_richiesta)).' '.date('H:i:s', strtotime((string) $sessione->orario_inizio));
} else { } else {
$diff = strtotime($sessione->orario_inizio) - strtotime((string) $inizio_old); $diff = strtotime((string) $sessione->orario_inizio) - strtotime((string) $inizio_old);
$orario_inizio = date('Y-m-d H:i:s', strtotime($new_sessione->orario_inizio) + $diff); $orario_inizio = date('Y-m-d H:i:s', strtotime((string) $new_sessione->orario_inizio) + $diff);
} }
$diff_fine = strtotime($sessione->orario_fine) - strtotime($sessione->orario_inizio); $diff_fine = strtotime((string) $sessione->orario_fine) - strtotime((string) $sessione->orario_inizio);
$orario_fine = date('Y-m-d H:i:s', strtotime($orario_inizio) + $diff_fine); $orario_fine = date('Y-m-d H:i:s', strtotime($orario_inizio) + $diff_fine);
$new_sessione = $sessione->replicate(); $new_sessione = $sessione->replicate();
@@ -531,6 +531,4 @@ $operations['print_summary'] = [
], ],
]; ];
return $operations; return $operations;

View File

@@ -779,7 +779,7 @@ if (!empty($elementi)) {
'_DOC_' => $fattura['tipo_documento'], '_DOC_' => $fattura['tipo_documento'],
'_NUM_' => !empty($fattura['numero_esterno']) ? $fattura['numero_esterno'] : $fattura['numero'], '_NUM_' => !empty($fattura['numero_esterno']) ? $fattura['numero_esterno'] : $fattura['numero'],
'_DATE_' => Translator::dateToLocale($fattura['data']), '_DATE_' => Translator::dateToLocale($fattura['data']),
'_STATO_' => (!empty($elemento['stato_documento']) ? "(".$elemento['stato_documento'].")" : ''), '_STATO_' => (!empty($elemento['stato_documento']) ? '('.$elemento['stato_documento'].')' : ''),
]); ]);
$modulo = ($fattura['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto'; $modulo = ($fattura['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto';

View File

@@ -38,7 +38,7 @@ if (!empty($riga_id)) {
// Caso singola riga // Caso singola riga
$riga = Riga::find($riga_id) ?: Articolo::find($riga_id); $riga = Riga::find($riga_id) ?: Articolo::find($riga_id);
$riga = $riga ?: Sconto::find($riga_id); $riga = $riga ?: Sconto::find($riga_id);
$righe_totali++; ++$righe_totali;
if (!empty($riga) && !empty($riga->idiva) && !empty($riga->aliquota)) { if (!empty($riga) && !empty($riga->idiva) && !empty($riga->aliquota)) {
$aliquote_iva[$riga->idiva] = [ $aliquote_iva[$riga->idiva] = [
@@ -46,19 +46,19 @@ if (!empty($riga_id)) {
'codice' => $riga->aliquota->codice, 'codice' => $riga->aliquota->codice,
'descrizione' => $riga->aliquota->getTranslation('title'), 'descrizione' => $riga->aliquota->getTranslation('title'),
'percentuale' => $riga->aliquota->percentuale, 'percentuale' => $riga->aliquota->percentuale,
'count' => 1 'count' => 1,
]; ];
} else { } else {
// Riga senza aliquota IVA o con aliquota non valida // Riga senza aliquota IVA o con aliquota non valida
$righe_senza_iva[] = [ $righe_senza_iva[] = [
'id' => $riga->id, 'id' => $riga->id,
'descrizione' => $riga->descrizione, 'descrizione' => $riga->descrizione,
'idiva' => $riga->idiva ?: 'N/D' 'idiva' => $riga->idiva ?: 'N/D',
]; ];
} }
} elseif (!empty($righe_ids)) { } elseif (!empty($righe_ids)) {
// Caso multiple righe // Caso multiple righe
$righe_array = explode(',', $righe_ids); $righe_array = explode(',', (string) $righe_ids);
$righe_totali = count($righe_array); $righe_totali = count($righe_array);
foreach ($righe_array as $id_riga) { foreach ($righe_array as $id_riga) {
@@ -72,16 +72,16 @@ if (!empty($riga_id)) {
'codice' => $riga->aliquota->codice, 'codice' => $riga->aliquota->codice,
'descrizione' => $riga->aliquota->getTranslation('title'), 'descrizione' => $riga->aliquota->getTranslation('title'),
'percentuale' => $riga->aliquota->percentuale, 'percentuale' => $riga->aliquota->percentuale,
'count' => 0 'count' => 0,
]; ];
} }
$aliquote_iva[$riga->idiva]['count']++; ++$aliquote_iva[$riga->idiva]['count'];
} elseif (!empty($riga)) { } elseif (!empty($riga)) {
// Riga senza aliquota IVA o con aliquota non valida // Riga senza aliquota IVA o con aliquota non valida
$righe_senza_iva[] = [ $righe_senza_iva[] = [
'id' => $riga->id, 'id' => $riga->id,
'descrizione' => $riga->descrizione, 'descrizione' => $riga->descrizione,
'idiva' => $riga->idiva ?: 'N/D' 'idiva' => $riga->idiva ?: 'N/D',
]; ];
} }
} }
@@ -92,20 +92,20 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
?> ?>
<form id="modifica-iva-form"> <form id="modifica-iva-form">
<?php if (count($aliquote_iva) > 0): ?> <?php if (count($aliquote_iva) > 0) { ?>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<div class="alert alert-info"> <div class="alert alert-info">
<p><strong><?= tr('Aliquote IVA attuali') ?></strong></p> <p><strong><?php echo tr('Aliquote IVA attuali'); ?></strong></p>
<ul class="list-unstyled"> <ul class="list-unstyled">
<?php foreach ($aliquote_iva as $aliquota): ?> <?php foreach ($aliquote_iva as $aliquota) { ?>
<li> <li>
<strong><?= $aliquota['codice'] ?></strong> - <?= $aliquota['descrizione'] ?> (<?= $aliquota['percentuale'] ?>%) <strong><?php echo $aliquota['codice']; ?></strong> - <?php echo $aliquota['descrizione']; ?> (<?php echo $aliquota['percentuale']; ?>%)
<?php if (count($aliquote_iva) > 1): ?> <?php if (count($aliquote_iva) > 1) { ?>
<span class="badge"><?= $aliquota['count'] ?> <?= tr('righe') ?></span> <span class="badge"><?php echo $aliquota['count']; ?> <?php echo tr('righe'); ?></span>
<?php endif; ?> <?php } ?>
</li> </li>
<?php endforeach; ?> <?php } ?>
</ul> </ul>
</div> </div>
</div> </div>
@@ -117,38 +117,38 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
<div class="col-md-5"> <div class="col-md-5">
<div class="panel panel-success"> <div class="panel panel-success">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title"><?= tr('Aliquota da applicare') ?></h4> <h4 class="panel-title"><?php echo tr('Aliquota da applicare'); ?></h4>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?= tr('eliminata') ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?= prepare(Models\Locale::getDefault()->id) ?>) ORDER BY `title` ASC" ]} {[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?php echo tr('eliminata'); ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?php echo prepare(Models\Locale::getDefault()->id); ?>) ORDER BY `title` ASC" ]}
<input type="hidden" name="riga_id" value="<?= get('riga_id') ?>"> <input type="hidden" name="riga_id" value="<?php echo get('riga_id'); ?>">
<input type="hidden" name="righe" value="<?= $_GET['righe'] ?>"> <input type="hidden" name="righe" value="<?php echo $_GET['righe']; ?>">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php elseif ($show_form): ?> <?php } elseif ($show_form) { ?>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<div class="alert alert-info"> <div class="alert alert-info">
<p><strong><?= tr('Aliquote IVA attuali') ?></strong></p> <p><strong><?php echo tr('Aliquote IVA attuali'); ?></strong></p>
<?php if (count($aliquote_iva) > 0): ?> <?php if (count($aliquote_iva) > 0) { ?>
<ul class="list-unstyled"> <ul class="list-unstyled">
<?php foreach ($aliquote_iva as $aliquota): ?> <?php foreach ($aliquote_iva as $aliquota) { ?>
<li> <li>
<strong><?= $aliquota['codice'] ?></strong> - <?= $aliquota['descrizione'] ?> (<?= $aliquota['percentuale'] ?>%) <strong><?php echo $aliquota['codice']; ?></strong> - <?php echo $aliquota['descrizione']; ?> (<?php echo $aliquota['percentuale']; ?>%)
<span class="badge"><?= $aliquota['count'] ?> <?= tr('righe') ?></span> <span class="badge"><?php echo $aliquota['count']; ?> <?php echo tr('righe'); ?></span>
</li> </li>
<?php endforeach; ?> <?php } ?>
</ul> </ul>
<?php endif; ?> <?php } ?>
<?php if (count($righe_senza_iva) > 0): ?> <?php if (count($righe_senza_iva) > 0) { ?>
<p><strong><?= tr('Righe senza aliquota IVA valida') ?>:</strong> <span class="badge"><?= count($righe_senza_iva) ?></span></p> <p><strong><?php echo tr('Righe senza aliquota IVA valida'); ?>:</strong> <span class="badge"><?php echo count($righe_senza_iva); ?></span></p>
<?php endif; ?> <?php } ?>
<p class="text-muted"><?= tr('Totale righe selezionate') ?>: <?= $righe_totali ?></p> <p class="text-muted"><?php echo tr('Totale righe selezionate'); ?>: <?php echo $righe_totali; ?></p>
</div> </div>
</div> </div>
@@ -159,31 +159,31 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
<div class="col-md-5"> <div class="col-md-5">
<div class="panel panel-success"> <div class="panel panel-success">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title"><?= tr('Aliquota da applicare') ?></h4> <h4 class="panel-title"><?php echo tr('Aliquota da applicare'); ?></h4>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?= tr('eliminata') ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?= prepare(Models\Locale::getDefault()->id) ?>) ORDER BY `title` ASC" ]} {[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?php echo tr('eliminata'); ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?php echo prepare(Models\Locale::getDefault()->id); ?>) ORDER BY `title` ASC" ]}
<input type="hidden" name="riga_id" value="<?= get('riga_id') ?>"> <input type="hidden" name="riga_id" value="<?php echo get('riga_id'); ?>">
<input type="hidden" name="righe" value="<?= $_GET['righe'] ?>"> <input type="hidden" name="righe" value="<?php echo $_GET['righe']; ?>">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php else: ?> <?php } else { ?>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="alert alert-warning"> <div class="alert alert-warning">
<p><?= tr('Nessuna riga selezionata') ?></p> <p><?php echo tr('Nessuna riga selezionata'); ?></p>
</div> </div>
</div> </div>
</div> </div>
<?php endif; ?> <?php } ?>
<!-- PULSANTI --> <!-- PULSANTI -->
<div class="row"> <div class="row">
<div class="col-md-12 text-right"> <div class="col-md-12 text-right">
<button type="button" class="btn btn-primary" onclick="salvaIva()"> <button type="button" class="btn btn-primary" onclick="salvaIva()">
<i class="fa fa-save"></i> <?= tr('Salva') ?> <i class="fa fa-save"></i> <?php echo tr('Salva'); ?>
</button> </button>
</div> </div>
</div> </div>
@@ -216,7 +216,7 @@ function salvaIva() {
renderMessages(); renderMessages();
}, },
error: function() { error: function() {
alert(<?= json_encode(tr('Errore durante il salvataggio')) ?>); alert(<?php echo json_encode(tr('Errore durante il salvataggio')); ?>);
} }
}); });
} else { } else {
@@ -237,7 +237,7 @@ function salvaIva() {
renderMessages(); renderMessages();
}, },
error: function() { error: function() {
alert(<?= json_encode(tr('Errore durante il salvataggio')) ?>); alert(<?php echo json_encode(tr('Errore durante il salvataggio')); ?>);
} }
}); });
} }

View File

@@ -243,7 +243,7 @@ if (!function_exists('aggiungi_sessioni_in_fattura')) {
$riga = Riga::build($fattura); $riga = Riga::build($fattura);
foreach ($gruppo as $sessione) { foreach ($gruppo as $sessione) {
$dateValue = date('d/m/Y', strtotime($sessione->orario_fine)); $dateValue = date('d/m/Y', strtotime((string) $sessione->orario_fine));
if (!in_array($dateValue, $date)) { if (!in_array($dateValue, $date)) {
$date[] = $dateValue; $date[] = $dateValue;
} }
@@ -293,7 +293,7 @@ if (!function_exists('aggiungi_sessioni_in_fattura')) {
$riga = Riga::build($fattura); $riga = Riga::build($fattura);
foreach ($gruppo as $sessione) { foreach ($gruppo as $sessione) {
$dateValue = date('d/m/Y', strtotime($sessione->orario_fine)); $dateValue = date('d/m/Y', strtotime((string) $sessione->orario_fine));
if (!in_array($dateValue, $date)) { if (!in_array($dateValue, $date)) {
$date[] = $dateValue; $date[] = $dateValue;
} }
@@ -334,7 +334,7 @@ if (!function_exists('aggiungi_sessioni_in_fattura')) {
} }
foreach ($gruppo as $sessione) { foreach ($gruppo as $sessione) {
$dateValue = date('d/m/Y', strtotime($sessione->orario_fine)); $dateValue = date('d/m/Y', strtotime((string) $sessione->orario_fine));
if (!in_array($dateValue, $date)) { if (!in_array($dateValue, $date)) {
$date[] = $dateValue; $date[] = $dateValue;
} }

View File

@@ -106,7 +106,7 @@ foreach ($righe as $riga) {
if (!empty($riga->note)) { if (!empty($riga->note)) {
echo ' echo '
<br><span class="text-xs">'.nl2br($riga->note).'</small>'; <br><span class="text-xs">'.nl2br((string) $riga->note).'</small>';
} }
echo ' echo '
</td> </td>

View File

@@ -130,6 +130,7 @@ class CSV extends CSVImporter
* @param array $record Record da importare * @param array $record Record da importare
* @param bool $update_record Se true, aggiorna i record esistenti * @param bool $update_record Se true, aggiorna i record esistenti
* @param bool $add_record Se true, aggiunge nuovi record * @param bool $add_record Se true, aggiunge nuovi record
*
* @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata * @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata
*/ */
public function import($record, $update_record = true, $add_record = true) public function import($record, $update_record = true, $add_record = true)
@@ -139,8 +140,8 @@ class CSV extends CSVImporter
$primary_key = $this->getPrimaryKey(); $primary_key = $this->getPrimaryKey();
// Validazione dei campi obbligatori // Validazione dei campi obbligatori
if (empty($record['codice']) || empty($record['data']) || empty($record['data_richiesta']) || if (empty($record['codice']) || empty($record['data']) || empty($record['data_richiesta'])
empty($record['ora_inizio']) || empty($record['tecnico']) || empty($record['richiesta'])) { || empty($record['ora_inizio']) || empty($record['tecnico']) || empty($record['richiesta'])) {
return false; return false;
} }
@@ -206,14 +207,30 @@ class CSV extends CSVImporter
} catch (\Exception $e) { } catch (\Exception $e) {
// Registra l'errore in un log // Registra l'errore in un log
error_log('Errore durante l\'importazione dell\'intervento: '.$e->getMessage()); error_log('Errore durante l\'importazione dell\'intervento: '.$e->getMessage());
return false; return false;
} }
} }
/**
* Restituisce un esempio di file CSV per l'importazione.
*
* @return array
*/
public static function getExample()
{
return [
['Codice', 'Partita IVA Cliente', 'Codice Fiscale Cliente', 'Data', 'Data richiesta', 'Ora inizio', 'Ora fine', 'Tecnico', 'Tipo', 'Note', 'Impianto', 'Richiesta', 'Descrizione', 'Stato'],
['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'],
['0002/2024', '123456789', '123456789', '08/11/2024', '04/11/2025', '11:20', '', 'Stefano Bianchi', '', '', '12345-85B23', 'Manutenzione ordinaria', 'eseguito intervento di manutenzione', ''],
];
}
/** /**
* Trova l'anagrafica cliente in base alla partita IVA o al codice fiscale. * Trova l'anagrafica cliente in base alla partita IVA o al codice fiscale.
* *
* @param array $record Record da processare * @param array $record Record da processare
*
* @return Anagrafica|null Anagrafica trovata o null se non trovata * @return Anagrafica|null Anagrafica trovata o null se non trovata
*/ */
protected function trovaAnagrafica($record) protected function trovaAnagrafica($record)
@@ -235,6 +252,7 @@ class CSV extends CSVImporter
* Trova l'impianto in base alla matricola. * Trova l'impianto in base alla matricola.
* *
* @param string $matricola Matricola dell'impianto * @param string $matricola Matricola dell'impianto
*
* @return Impianto|null Impianto trovato o null se non trovato * @return Impianto|null Impianto trovato o null se non trovato
*/ */
protected function trovaImpianto($matricola) protected function trovaImpianto($matricola)
@@ -250,6 +268,7 @@ class CSV extends CSVImporter
* Trova o crea il tipo di intervento. * Trova o crea il tipo di intervento.
* *
* @param array $record Record da processare * @param array $record Record da processare
*
* @return TipoIntervento Tipo di intervento * @return TipoIntervento Tipo di intervento
*/ */
protected function trovaTipoIntervento($record) protected function trovaTipoIntervento($record)
@@ -265,6 +284,7 @@ class CSV extends CSVImporter
* Trova o crea lo stato dell'intervento. * Trova o crea lo stato dell'intervento.
* *
* @param array $record Record da processare * @param array $record Record da processare
*
* @return Stato Stato dell'intervento * @return Stato Stato dell'intervento
*/ */
protected function trovaStatoIntervento($record) protected function trovaStatoIntervento($record)
@@ -281,6 +301,7 @@ class CSV extends CSVImporter
* *
* @param Intervento $intervento Intervento da aggiornare * @param Intervento $intervento Intervento da aggiornare
* @param array $record Record da processare * @param array $record Record da processare
*
* @return void * @return void
*/ */
protected function aggiornaIntervento($intervento, $record) protected function aggiornaIntervento($intervento, $record)
@@ -305,6 +326,7 @@ class CSV extends CSVImporter
* *
* @param Intervento $intervento Intervento da collegare * @param Intervento $intervento Intervento da collegare
* @param Impianto $impianto Impianto da collegare * @param Impianto $impianto Impianto da collegare
*
* @return void * @return void
*/ */
protected function collegaImpianto($intervento, $impianto) protected function collegaImpianto($intervento, $impianto)
@@ -328,6 +350,7 @@ class CSV extends CSVImporter
* *
* @param Intervento $intervento Intervento associato * @param Intervento $intervento Intervento associato
* @param array $record Record da processare * @param array $record Record da processare
*
* @return Sessione|null Sessione creata o null se non creata * @return Sessione|null Sessione creata o null se non creata
*/ */
protected function creaSessione($intervento, $record) protected function creaSessione($intervento, $record)
@@ -365,21 +388,8 @@ class CSV extends CSVImporter
} catch (\Exception $e) { } catch (\Exception $e) {
// Registra l'errore ma continua con l'importazione // Registra l'errore ma continua con l'importazione
error_log('Errore durante la creazione della sessione: '.$e->getMessage()); error_log('Errore durante la creazione della sessione: '.$e->getMessage());
return null; return null;
} }
} }
/**
* Restituisce un esempio di file CSV per l'importazione.
*
* @return array
*/
public static function getExample()
{
return [
['Codice', 'Partita IVA Cliente', 'Codice Fiscale Cliente', 'Data', 'Data richiesta', 'Ora inizio', 'Ora fine', 'Tecnico', 'Tipo', 'Note', 'Impianto', 'Richiesta', 'Descrizione', 'Stato'],
['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'],
['0002/2024', '123456789', '123456789', '08/11/2024', '04/11/2025', '11:20', '', 'Stefano Bianchi', '', '', '12345-85B23', 'Manutenzione ordinaria', 'eseguito intervento di manutenzione', ''],
];
}
} }

View File

@@ -29,7 +29,7 @@ switch (post('op')) {
$query = $lista->query; $query = $lista->query;
if (check_query($query)) { if (check_query($query)) {
$lista->query = html_entity_decode($query); $lista->query = html_entity_decode((string) $query);
} }
$lista->save(); $lista->save();

View File

@@ -72,6 +72,7 @@ class CSV extends CSVImporter
* @param array $record Record da importare * @param array $record Record da importare
* @param bool $update_record Se true, aggiorna i record esistenti * @param bool $update_record Se true, aggiorna i record esistenti
* @param bool $add_record Se true, aggiunge nuovi record * @param bool $add_record Se true, aggiunge nuovi record
*
* @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata * @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata
*/ */
public function import($record, $update_record = true, $add_record = true) public function import($record, $update_record = true, $add_record = true)
@@ -110,15 +111,32 @@ class CSV extends CSVImporter
} catch (\Exception $e) { } catch (\Exception $e) {
// Registra l'errore in un log // Registra l'errore in un log
error_log('Errore durante l\'importazione dell\'articolo nel listino: '.$e->getMessage()); error_log('Errore durante l\'importazione dell\'articolo nel listino: '.$e->getMessage());
return false; return false;
} }
} }
/**
* Restituisce un esempio di file CSV per l'importazione.
*
* @return array
*/
public static function getExample()
{
return [
['Nome listino', 'Codice articolo', 'Data scadenza', 'Prezzo unitario', 'Sconto percentuale'],
['Listino 1', '1234', '2024-12-31', '100', '10'],
['Listino 1', '5678', '', '100', '50'],
['Listino 1', '9101', '2024-07-31', '100', ''],
];
}
/** /**
* Trova il listino in base al nome. * Trova il listino in base al nome.
* *
* @param array $record Record da importare * @param array $record Record da importare
* @param object $database Connessione al database * @param object $database Connessione al database
*
* @return array|null * @return array|null
*/ */
protected function trovaListino($record, $database) protected function trovaListino($record, $database)
@@ -128,6 +146,7 @@ class CSV extends CSVImporter
} }
$result = $database->fetchOne('SELECT id FROM mg_listini WHERE nome = '.prepare($record['nome_listino'])); $result = $database->fetchOne('SELECT id FROM mg_listini WHERE nome = '.prepare($record['nome_listino']));
return !empty($result) ? $result : null; return !empty($result) ? $result : null;
} }
@@ -136,6 +155,7 @@ class CSV extends CSVImporter
* *
* @param array $record Record da importare * @param array $record Record da importare
* @param object $database Connessione al database * @param object $database Connessione al database
*
* @return array|null * @return array|null
*/ */
protected function trovaArticolo($record, $database) protected function trovaArticolo($record, $database)
@@ -145,6 +165,7 @@ class CSV extends CSVImporter
} }
$result = $database->fetchOne('SELECT `id` FROM `mg_articoli` WHERE `codice` = '.prepare($record['codice'])); $result = $database->fetchOne('SELECT `id` FROM `mg_articoli` WHERE `codice` = '.prepare($record['codice']));
return !empty($result) ? $result : null; return !empty($result) ? $result : null;
} }
@@ -153,6 +174,7 @@ class CSV extends CSVImporter
* *
* @param int $id_articolo ID dell'articolo * @param int $id_articolo ID dell'articolo
* @param int $id_listino ID del listino * @param int $id_listino ID del listino
*
* @return Articolo|null * @return Articolo|null
*/ */
protected function trovaArticoloListino($id_articolo, $id_listino) protected function trovaArticoloListino($id_articolo, $id_listino)
@@ -183,19 +205,4 @@ class CSV extends CSVImporter
$articolo_listino->sconto_percentuale = $record['sconto_percentuale'] ?: 0; $articolo_listino->sconto_percentuale = $record['sconto_percentuale'] ?: 0;
$articolo_listino->save(); $articolo_listino->save();
} }
/**
* Restituisce un esempio di file CSV per l'importazione.
*
* @return array
*/
public static function getExample()
{
return [
['Nome listino', 'Codice articolo', 'Data scadenza', 'Prezzo unitario', 'Sconto percentuale'],
['Listino 1', '1234', '2024-12-31', '100', '10'],
['Listino 1', '5678', '', '100', '50'],
['Listino 1', '9101', '2024-07-31', '100', ''],
];
}
} }

View File

@@ -28,9 +28,8 @@ switch (post('op')) {
$nome = filter('name'); $nome = filter('name');
$link = filter('link'); $link = filter('link');
$id_original = filter('id_original') ?: null; $id_original = filter('id_original') ?: null;
$is_articolo = filter('is_articolo_add') ?: filter('is_articolo') ?: 0; $is_articolo = (filter('is_articolo_add') ?: filter('is_articolo')) ?: 0;
$is_impianto = filter('is_impianto_add') ?: filter('is_impianto') ?: 0; $is_impianto = (filter('is_impianto_add') ?: filter('is_impianto')) ?: 0;
// Verifica che almeno uno dei due flag sia selezionato // Verifica che almeno uno dei due flag sia selezionato
if ($is_articolo == 0 && $is_impianto == 0) { if ($is_articolo == 0 && $is_impianto == 0) {
@@ -60,7 +59,6 @@ switch (post('op')) {
$marca->save(); $marca->save();
} }
// Aggiorna i flag delle sottocategorie se è un parent // Aggiorna i flag delle sottocategorie se è un parent
$modello = Marca::where('parent', '=', $id_record)->get(); $modello = Marca::where('parent', '=', $id_record)->get();
if (!empty($modello)) { if (!empty($modello)) {
@@ -129,8 +127,8 @@ switch (post('op')) {
$nome = filter('name'); $nome = filter('name');
$link = filter('link'); $link = filter('link');
$id_original = filter('id_original') ?: null; $id_original = filter('id_original') ?: null;
$is_articolo = filter('is_articolo_add') ?: filter('is_articolo') ?: 0; $is_articolo = (filter('is_articolo_add') ?: filter('is_articolo')) ?: 0;
$is_impianto = filter('is_impianto_add') ?: filter('is_impianto') ?: 0; $is_impianto = (filter('is_impianto_add') ?: filter('is_impianto')) ?: 0;
// Verifica che almeno uno dei due flag sia selezionato // Verifica che almeno uno dei due flag sia selezionato
if ($is_articolo == 0 && $is_impianto == 0) { if ($is_articolo == 0 && $is_impianto == 0) {

View File

@@ -37,10 +37,10 @@ if (!empty($id_record)) {
<input type="hidden" name="backto" value="record-edit"> <input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="id_original" value="<?php echo $id_original; ?>"> <input type="hidden" name="id_original" value="<?php echo $id_original; ?>">
<input type="hidden" name="op" value="<?php echo $id_record ? 'update' : 'add'; ?>"> <input type="hidden" name="op" value="<?php echo $id_record ? 'update' : 'add'; ?>">
<?php if (!empty($id_original)) : ?> <?php if (!empty($id_original)) { ?>
<input type="hidden" name="is_articolo" value="<?php echo $id_original ? Marca::find($id_original)->is_articolo : 1; ?>"> <input type="hidden" name="is_articolo" value="<?php echo $id_original ? Marca::find($id_original)->is_articolo : 1; ?>">
<input type="hidden" name="is_impianto" value="<?php echo $id_original ? Marca::find($id_original)->is_impianto : 0; ?>"> <input type="hidden" name="is_impianto" value="<?php echo $id_original ? Marca::find($id_original)->is_impianto : 0; ?>">
<?php endif; ?> <?php } ?>
<div class="row"> <div class="row">
<div class="col-md-4"> <div class="col-md-4">

View File

@@ -1,4 +1,5 @@
<?php <?php
/* /*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione * OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l. * Copyright (C) DevCode s.r.l.

View File

@@ -199,7 +199,7 @@ switch (filter('op')) {
$lista = Lista::find($id_list); $lista = Lista::find($id_list);
$query = $lista->query; $query = $lista->query;
if (check_query($query)) { if (check_query($query)) {
$lista->query = html_entity_decode($query); $lista->query = html_entity_decode((string) $query);
} }
$lista->save(); $lista->save();

View File

@@ -257,5 +257,4 @@ if ($module->name == 'Ordini cliente') {
} }
} }
return $operations; return $operations;

View File

@@ -594,7 +594,7 @@ if (!empty($elementi)) {
'_DOC_' => $elemento['tipo_documento'], '_DOC_' => $elemento['tipo_documento'],
'_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'], '_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'],
'_DATE_' => Translator::dateToLocale($elemento['data']), '_DATE_' => Translator::dateToLocale($elemento['data']),
'_STATO_' => (!empty($elemento['stato_documento']) ? "(".$elemento['stato_documento'].")" : ''), '_STATO_' => (!empty($elemento['stato_documento']) ? '('.$elemento['stato_documento'].')' : ''),
]); ]);
echo ' echo '

View File

@@ -38,7 +38,7 @@ if (!empty($riga_id)) {
// Caso singola riga // Caso singola riga
$riga = Riga::find($riga_id) ?: Articolo::find($riga_id); $riga = Riga::find($riga_id) ?: Articolo::find($riga_id);
$riga = $riga ?: Sconto::find($riga_id); $riga = $riga ?: Sconto::find($riga_id);
$righe_totali++; ++$righe_totali;
if (!empty($riga) && !empty($riga->idiva) && !empty($riga->aliquota)) { if (!empty($riga) && !empty($riga->idiva) && !empty($riga->aliquota)) {
$aliquote_iva[$riga->idiva] = [ $aliquote_iva[$riga->idiva] = [
@@ -46,19 +46,19 @@ if (!empty($riga_id)) {
'codice' => $riga->aliquota->codice, 'codice' => $riga->aliquota->codice,
'descrizione' => $riga->aliquota->getTranslation('title'), 'descrizione' => $riga->aliquota->getTranslation('title'),
'percentuale' => $riga->aliquota->percentuale, 'percentuale' => $riga->aliquota->percentuale,
'count' => 1 'count' => 1,
]; ];
} else { } else {
// Riga senza aliquota IVA o con aliquota non valida // Riga senza aliquota IVA o con aliquota non valida
$righe_senza_iva[] = [ $righe_senza_iva[] = [
'id' => $riga->id, 'id' => $riga->id,
'descrizione' => $riga->descrizione, 'descrizione' => $riga->descrizione,
'idiva' => $riga->idiva ?: 'N/D' 'idiva' => $riga->idiva ?: 'N/D',
]; ];
} }
} elseif (!empty($righe_ids)) { } elseif (!empty($righe_ids)) {
// Caso multiple righe // Caso multiple righe
$righe_array = explode(',', $righe_ids); $righe_array = explode(',', (string) $righe_ids);
$righe_totali = count($righe_array); $righe_totali = count($righe_array);
foreach ($righe_array as $id_riga) { foreach ($righe_array as $id_riga) {
@@ -72,16 +72,16 @@ if (!empty($riga_id)) {
'codice' => $riga->aliquota->codice, 'codice' => $riga->aliquota->codice,
'descrizione' => $riga->aliquota->getTranslation('title'), 'descrizione' => $riga->aliquota->getTranslation('title'),
'percentuale' => $riga->aliquota->percentuale, 'percentuale' => $riga->aliquota->percentuale,
'count' => 0 'count' => 0,
]; ];
} }
$aliquote_iva[$riga->idiva]['count']++; ++$aliquote_iva[$riga->idiva]['count'];
} elseif (!empty($riga)) { } elseif (!empty($riga)) {
// Riga senza aliquota IVA o con aliquota non valida // Riga senza aliquota IVA o con aliquota non valida
$righe_senza_iva[] = [ $righe_senza_iva[] = [
'id' => $riga->id, 'id' => $riga->id,
'descrizione' => $riga->descrizione, 'descrizione' => $riga->descrizione,
'idiva' => $riga->idiva ?: 'N/D' 'idiva' => $riga->idiva ?: 'N/D',
]; ];
} }
} }
@@ -92,20 +92,20 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
?> ?>
<form id="modifica-iva-form"> <form id="modifica-iva-form">
<?php if (count($aliquote_iva) > 0): ?> <?php if (count($aliquote_iva) > 0) { ?>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<div class="alert alert-info"> <div class="alert alert-info">
<p><strong><?= tr('Aliquote IVA attuali') ?></strong></p> <p><strong><?php echo tr('Aliquote IVA attuali'); ?></strong></p>
<ul class="list-unstyled"> <ul class="list-unstyled">
<?php foreach ($aliquote_iva as $aliquota): ?> <?php foreach ($aliquote_iva as $aliquota) { ?>
<li> <li>
<strong><?= $aliquota['codice'] ?></strong> - <?= $aliquota['descrizione'] ?> (<?= $aliquota['percentuale'] ?>%) <strong><?php echo $aliquota['codice']; ?></strong> - <?php echo $aliquota['descrizione']; ?> (<?php echo $aliquota['percentuale']; ?>%)
<?php if (count($aliquote_iva) > 1): ?> <?php if (count($aliquote_iva) > 1) { ?>
<span class="badge"><?= $aliquota['count'] ?> <?= tr('righe') ?></span> <span class="badge"><?php echo $aliquota['count']; ?> <?php echo tr('righe'); ?></span>
<?php endif; ?> <?php } ?>
</li> </li>
<?php endforeach; ?> <?php } ?>
</ul> </ul>
</div> </div>
</div> </div>
@@ -117,38 +117,38 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
<div class="col-md-5"> <div class="col-md-5">
<div class="panel panel-success"> <div class="panel panel-success">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title"><?= tr('Aliquota da applicare') ?></h4> <h4 class="panel-title"><?php echo tr('Aliquota da applicare'); ?></h4>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?= tr('eliminata') ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?= prepare(Models\Locale::getDefault()->id) ?>) ORDER BY `title` ASC" ]} {[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?php echo tr('eliminata'); ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?php echo prepare(Models\Locale::getDefault()->id); ?>) ORDER BY `title` ASC" ]}
<input type="hidden" name="riga_id" value="<?= get('riga_id') ?>"> <input type="hidden" name="riga_id" value="<?php echo get('riga_id'); ?>">
<input type="hidden" name="righe" value="<?= $_GET['righe'] ?>"> <input type="hidden" name="righe" value="<?php echo $_GET['righe']; ?>">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php elseif ($show_form): ?> <?php } elseif ($show_form) { ?>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<div class="alert alert-info"> <div class="alert alert-info">
<p><strong><?= tr('Aliquote IVA attuali') ?></strong></p> <p><strong><?php echo tr('Aliquote IVA attuali'); ?></strong></p>
<?php if (count($aliquote_iva) > 0): ?> <?php if (count($aliquote_iva) > 0) { ?>
<ul class="list-unstyled"> <ul class="list-unstyled">
<?php foreach ($aliquote_iva as $aliquota): ?> <?php foreach ($aliquote_iva as $aliquota) { ?>
<li> <li>
<strong><?= $aliquota['codice'] ?></strong> - <?= $aliquota['descrizione'] ?> (<?= $aliquota['percentuale'] ?>%) <strong><?php echo $aliquota['codice']; ?></strong> - <?php echo $aliquota['descrizione']; ?> (<?php echo $aliquota['percentuale']; ?>%)
<span class="badge"><?= $aliquota['count'] ?> <?= tr('righe') ?></span> <span class="badge"><?php echo $aliquota['count']; ?> <?php echo tr('righe'); ?></span>
</li> </li>
<?php endforeach; ?> <?php } ?>
</ul> </ul>
<?php endif; ?> <?php } ?>
<?php if (count($righe_senza_iva) > 0): ?> <?php if (count($righe_senza_iva) > 0) { ?>
<p><strong><?= tr('Righe senza aliquota IVA valida') ?>:</strong> <span class="badge"><?= count($righe_senza_iva) ?></span></p> <p><strong><?php echo tr('Righe senza aliquota IVA valida'); ?>:</strong> <span class="badge"><?php echo count($righe_senza_iva); ?></span></p>
<?php endif; ?> <?php } ?>
<p class="text-muted"><?= tr('Totale righe selezionate') ?>: <?= $righe_totali ?></p> <p class="text-muted"><?php echo tr('Totale righe selezionate'); ?>: <?php echo $righe_totali; ?></p>
</div> </div>
</div> </div>
@@ -159,31 +159,31 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
<div class="col-md-5"> <div class="col-md-5">
<div class="panel panel-success"> <div class="panel panel-success">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title"><?= tr('Aliquota da applicare') ?></h4> <h4 class="panel-title"><?php echo tr('Aliquota da applicare'); ?></h4>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?= tr('eliminata') ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?= prepare(Models\Locale::getDefault()->id) ?>) ORDER BY `title` ASC" ]} {[ "type": "select", "label": "", "name": "iva_id", "required": 1, "values": "query=SELECT `co_iva`.`id`, IF(`deleted_at` IS NOT NULL, CONCAT(`codice`, ' - ', `title`, ' (<?php echo tr('eliminata'); ?>)'), CONCAT(`codice`, ' - ', `title`)) AS `descrizione` FROM `co_iva` LEFT JOIN `co_iva_lang` ON (`co_iva`.`id` = `co_iva_lang`.`id_record` AND `co_iva_lang`.`id_lang` = <?php echo prepare(Models\Locale::getDefault()->id); ?>) ORDER BY `title` ASC" ]}
<input type="hidden" name="riga_id" value="<?= get('riga_id') ?>"> <input type="hidden" name="riga_id" value="<?php echo get('riga_id'); ?>">
<input type="hidden" name="righe" value="<?= $_GET['righe'] ?>"> <input type="hidden" name="righe" value="<?php echo $_GET['righe']; ?>">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php else: ?> <?php } else { ?>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="alert alert-warning"> <div class="alert alert-warning">
<p><?= tr('Nessuna riga selezionata') ?></p> <p><?php echo tr('Nessuna riga selezionata'); ?></p>
</div> </div>
</div> </div>
</div> </div>
<?php endif; ?> <?php } ?>
<!-- PULSANTI --> <!-- PULSANTI -->
<div class="row"> <div class="row">
<div class="col-md-12 text-right"> <div class="col-md-12 text-right">
<button type="button" class="btn btn-primary" onclick="salvaIva()"> <button type="button" class="btn btn-primary" onclick="salvaIva()">
<i class="fa fa-save"></i> <?= tr('Salva') ?> <i class="fa fa-save"></i> <?php echo tr('Salva'); ?>
</button> </button>
</div> </div>
</div> </div>
@@ -216,7 +216,7 @@ function salvaIva() {
renderMessages(); renderMessages();
}, },
error: function() { error: function() {
alert(<?= json_encode(tr('Errore durante il salvataggio')) ?>); alert(<?php echo json_encode(tr('Errore durante il salvataggio')); ?>);
} }
}); });
} else { } else {
@@ -237,7 +237,7 @@ function salvaIva() {
renderMessages(); renderMessages();
}, },
error: function() { error: function() {
alert(<?= json_encode(tr('Errore durante il salvataggio')) ?>); alert(<?php echo json_encode(tr('Errore durante il salvataggio')); ?>);
} }
}); });
} }

View File

@@ -128,7 +128,7 @@ foreach ($righe as $riga) {
} }
} }
} else { } else {
echo nl2br($riga->descrizione); echo nl2br((string) $riga->descrizione);
} }
if ($riga->isArticolo() && !empty($riga->abilita_serial)) { if ($riga->isArticolo() && !empty($riga->abilita_serial)) {
@@ -151,7 +151,7 @@ foreach ($righe as $riga) {
if (!empty($riga->note)) { if (!empty($riga->note)) {
echo ' echo '
<br><span class="text-xs">'.nl2br($riga->note).'</small>'; <br><span class="text-xs">'.nl2br((string) $riga->note).'</small>';
} }
echo ' echo '
</td>'; </td>';

View File

@@ -40,7 +40,7 @@ $conto_bloccato = [
'Iva su vendite', 'Iva su vendite',
'Iva su acquisti', 'Iva su acquisti',
'Iva indetraibile', 'Iva indetraibile',
'Compensazione per autofattura' 'Compensazione per autofattura',
]; ];
$conto_bloccato = in_array($info['descrizione'], $conto_bloccato); $conto_bloccato = in_array($info['descrizione'], $conto_bloccato);
@@ -71,12 +71,12 @@ if (!$conto_bloccato && $lvl == 3) {
</div> </div>
<div class="col-md-8"> <div class="col-md-8">
<?php if ($conto_bloccato): ?> <?php if ($conto_bloccato) { ?>
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": <?php echo json_encode($info['descrizione']); ?>, "readonly": 1, "help": "<?php echo tr('Questo è un conto speciale utilizzato dal sistema. La descrizione non può essere modificata.'); ?>" ]} {[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": <?php echo json_encode($info['descrizione']); ?>, "readonly": 1, "help": "<?php echo tr('Questo è un conto speciale utilizzato dal sistema. La descrizione non può essere modificata.'); ?>" ]}
<input type="hidden" name="conto_bloccato" value="1"> <input type="hidden" name="conto_bloccato" value="1">
<?php else: ?> <?php } else { ?>
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": <?php echo json_encode($info['descrizione']); ?> ]} {[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": <?php echo json_encode($info['descrizione']); ?> ]}
<?php endif; ?> <?php } ?>
</div> </div>
</div> </div>
<div class="row"> <div class="row">

View File

@@ -71,6 +71,7 @@ class CSV extends CSVImporter
* @param array $record Record da importare * @param array $record Record da importare
* @param bool $update_record Se true, aggiorna i record esistenti * @param bool $update_record Se true, aggiorna i record esistenti
* @param bool $add_record Se true, aggiunge nuovi record * @param bool $add_record Se true, aggiunge nuovi record
*
* @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata * @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata
*/ */
public function import($record, $update_record = true, $add_record = true) public function import($record, $update_record = true, $add_record = true)
@@ -111,19 +112,35 @@ class CSV extends CSVImporter
} catch (\Exception $e) { } catch (\Exception $e) {
// Registra l'errore in un log // Registra l'errore in un log
error_log('Errore durante l\'importazione del piano dei conti: '.$e->getMessage()); error_log('Errore durante l\'importazione del piano dei conti: '.$e->getMessage());
return false; return false;
} }
} }
/**
* Restituisce un esempio di file CSV per l'importazione.
*
* @return array
*/
public static function getExample()
{
return [
['Sezione', 'Conto', 'Descrizione', 'Direzione'],
['Economico', '600.000010', 'Costi merci c/acquisto di rivendita', 'uscita'],
['Patrimoniale', '110.000010', 'Riepilogativo clienti', ''],
];
}
/** /**
* Analizza il numero di conto e lo divide in parti. * Analizza il numero di conto e lo divide in parti.
* *
* @param array $record Record da importare * @param array $record Record da importare
*
* @return array|null Array con le parti del conto o null se il formato non è valido * @return array|null Array con le parti del conto o null se il formato non è valido
*/ */
protected function parseNumeroConto($record) protected function parseNumeroConto($record)
{ {
if (empty($record['numero']) || strpos($record['numero'], '.') === false) { if (empty($record['numero']) || !str_contains((string) $record['numero'], '.')) {
return null; return null;
} }
@@ -143,6 +160,7 @@ class CSV extends CSVImporter
* *
* @param array $record Record da importare * @param array $record Record da importare
* @param object $database Connessione al database * @param object $database Connessione al database
*
* @return array|null * @return array|null
*/ */
protected function trovaConto1($record, $database) protected function trovaConto1($record, $database)
@@ -152,6 +170,7 @@ class CSV extends CSVImporter
} }
$result = $database->fetchOne('SELECT id FROM co_pianodeiconti1 WHERE LOWER(descrizione)=LOWER('.prepare($record['idpianodeiconti1']).')'); $result = $database->fetchOne('SELECT id FROM co_pianodeiconti1 WHERE LOWER(descrizione)=LOWER('.prepare($record['idpianodeiconti1']).')');
return !empty($result) ? $result : null; return !empty($result) ? $result : null;
} }
@@ -160,6 +179,7 @@ class CSV extends CSVImporter
* *
* @param string $codice_conto2 Codice del conto di secondo livello * @param string $codice_conto2 Codice del conto di secondo livello
* @param object $database Connessione al database * @param object $database Connessione al database
*
* @return array|null * @return array|null
*/ */
protected function trovaConto2($codice_conto2, $database) protected function trovaConto2($codice_conto2, $database)
@@ -169,6 +189,7 @@ class CSV extends CSVImporter
} }
$result = $database->fetchOne('SELECT id FROM co_pianodeiconti2 WHERE numero='.prepare($codice_conto2)); $result = $database->fetchOne('SELECT id FROM co_pianodeiconti2 WHERE numero='.prepare($codice_conto2));
return !empty($result) ? $result : null; return !empty($result) ? $result : null;
} }
@@ -178,6 +199,7 @@ class CSV extends CSVImporter
* @param string $codice_conto3 Codice del conto di terzo livello * @param string $codice_conto3 Codice del conto di terzo livello
* @param int $idpianodeiconti2 ID del conto di secondo livello * @param int $idpianodeiconti2 ID del conto di secondo livello
* @param object $database Connessione al database * @param object $database Connessione al database
*
* @return array|null * @return array|null
*/ */
protected function trovaConto3($codice_conto3, $idpianodeiconti2, $database) protected function trovaConto3($codice_conto3, $idpianodeiconti2, $database)
@@ -187,6 +209,7 @@ class CSV extends CSVImporter
} }
$result = $database->fetchOne('SELECT id FROM co_pianodeiconti3 WHERE numero='.prepare($codice_conto3).' AND idpianodeiconti2='.prepare($idpianodeiconti2)); $result = $database->fetchOne('SELECT id FROM co_pianodeiconti3 WHERE numero='.prepare($codice_conto3).' AND idpianodeiconti2='.prepare($idpianodeiconti2));
return !empty($result) ? $result : null; return !empty($result) ? $result : null;
} }
@@ -256,18 +279,4 @@ class CSV extends CSVImporter
} }
} }
} }
/**
* Restituisce un esempio di file CSV per l'importazione.
*
* @return array
*/
public static function getExample()
{
return [
['Sezione', 'Conto', 'Descrizione', 'Direzione'],
['Economico', '600.000010', 'Costi merci c/acquisto di rivendita', 'uscita'],
['Patrimoniale', '110.000010', 'Riepilogativo clienti', ''],
];
}
} }

View File

@@ -165,7 +165,6 @@ switch (post('op')) {
break; break;
} }
$operations['change_status'] = [ $operations['change_status'] = [
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Cambia stato'), 'text' => '<span><i class="fa fa-refresh"></i> '.tr('Cambia stato'),
'data' => [ 'data' => [
@@ -190,5 +189,4 @@ $operations['create_invoice'] = [
], ],
]; ];
return $operations; return $operations;

View File

@@ -484,7 +484,7 @@ if (!empty($elementi)) {
'_DOC_' => $elemento['tipo_documento'], '_DOC_' => $elemento['tipo_documento'],
'_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'], '_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'],
'_DATE_' => Translator::dateToLocale($elemento['data']), '_DATE_' => Translator::dateToLocale($elemento['data']),
'_STATO_' => (!empty($elemento['stato_documento']) ? "(".$elemento['stato_documento'].")" : ''), '_STATO_' => (!empty($elemento['stato_documento']) ? '('.$elemento['stato_documento'].')' : ''),
]); ]);
echo ' echo '

View File

@@ -38,7 +38,7 @@ if (!empty($riga_id)) {
// Caso singola riga // Caso singola riga
$riga = Riga::find($riga_id) ?: Articolo::find($riga_id); $riga = Riga::find($riga_id) ?: Articolo::find($riga_id);
$riga = $riga ?: Sconto::find($riga_id); $riga = $riga ?: Sconto::find($riga_id);
$righe_totali++; ++$righe_totali;
if (!empty($riga) && !empty($riga->idiva) && !empty($riga->aliquota)) { if (!empty($riga) && !empty($riga->idiva) && !empty($riga->aliquota)) {
$aliquote_iva[$riga->idiva] = [ $aliquote_iva[$riga->idiva] = [
@@ -46,19 +46,19 @@ if (!empty($riga_id)) {
'codice' => $riga->aliquota->codice, 'codice' => $riga->aliquota->codice,
'descrizione' => $riga->aliquota->getTranslation('title'), 'descrizione' => $riga->aliquota->getTranslation('title'),
'percentuale' => $riga->aliquota->percentuale, 'percentuale' => $riga->aliquota->percentuale,
'count' => 1 'count' => 1,
]; ];
} else { } else {
// Riga senza aliquota IVA o con aliquota non valida // Riga senza aliquota IVA o con aliquota non valida
$righe_senza_iva[] = [ $righe_senza_iva[] = [
'id' => $riga->id, 'id' => $riga->id,
'descrizione' => $riga->descrizione, 'descrizione' => $riga->descrizione,
'idiva' => $riga->idiva ?: 'N/D' 'idiva' => $riga->idiva ?: 'N/D',
]; ];
} }
} elseif (!empty($righe_ids)) { } elseif (!empty($righe_ids)) {
// Caso multiple righe // Caso multiple righe
$righe_array = explode(',', $righe_ids); $righe_array = explode(',', (string) $righe_ids);
$righe_totali = count($righe_array); $righe_totali = count($righe_array);
foreach ($righe_array as $id_riga) { foreach ($righe_array as $id_riga) {
@@ -72,16 +72,16 @@ if (!empty($riga_id)) {
'codice' => $riga->aliquota->codice, 'codice' => $riga->aliquota->codice,
'descrizione' => $riga->aliquota->getTranslation('title'), 'descrizione' => $riga->aliquota->getTranslation('title'),
'percentuale' => $riga->aliquota->percentuale, 'percentuale' => $riga->aliquota->percentuale,
'count' => 0 'count' => 0,
]; ];
} }
$aliquote_iva[$riga->idiva]['count']++; ++$aliquote_iva[$riga->idiva]['count'];
} elseif (!empty($riga)) { } elseif (!empty($riga)) {
// Riga senza aliquota IVA o con aliquota non valida // Riga senza aliquota IVA o con aliquota non valida
$righe_senza_iva[] = [ $righe_senza_iva[] = [
'id' => $riga->id, 'id' => $riga->id,
'descrizione' => $riga->descrizione, 'descrizione' => $riga->descrizione,
'idiva' => $riga->idiva ?: 'N/D' 'idiva' => $riga->idiva ?: 'N/D',
]; ];
} }
} }
@@ -92,20 +92,20 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
?> ?>
<form id="modifica-iva-form"> <form id="modifica-iva-form">
<?php if (count($aliquote_iva) > 0): ?> <?php if (count($aliquote_iva) > 0) { ?>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<div class="alert alert-info"> <div class="alert alert-info">
<p><strong><?= tr('Aliquote IVA attuali') ?></strong></p> <p><strong><?php echo tr('Aliquote IVA attuali'); ?></strong></p>
<ul class="list-unstyled"> <ul class="list-unstyled">
<?php foreach ($aliquote_iva as $aliquota): ?> <?php foreach ($aliquote_iva as $aliquota) { ?>
<li> <li>
<strong><?= $aliquota['codice'] ?></strong> - <?= $aliquota['descrizione'] ?> (<?= $aliquota['percentuale'] ?>%) <strong><?php echo $aliquota['codice']; ?></strong> - <?php echo $aliquota['descrizione']; ?> (<?php echo $aliquota['percentuale']; ?>%)
<?php if (count($aliquote_iva) > 1): ?> <?php if (count($aliquote_iva) > 1) { ?>
<span class="badge"><?= $aliquota['count'] ?> <?= tr('righe') ?></span> <span class="badge"><?php echo $aliquota['count']; ?> <?php echo tr('righe'); ?></span>
<?php endif; ?> <?php } ?>
</li> </li>
<?php endforeach; ?> <?php } ?>
</ul> </ul>
</div> </div>
</div> </div>
@@ -117,38 +117,38 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
<div class="col-md-5"> <div class="col-md-5">
<div class="panel panel-success"> <div class="panel panel-success">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title"><?= tr('Aliquota da applicare') ?></h4> <h4 class="panel-title"><?php echo tr('Aliquota da applicare'); ?></h4>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{[ "type": "select", "label": "", "name": "iva_id", "required": 1, "ajax-source": "iva" ]} {[ "type": "select", "label": "", "name": "iva_id", "required": 1, "ajax-source": "iva" ]}
<input type="hidden" name="riga_id" value="<?= get('riga_id') ?>"> <input type="hidden" name="riga_id" value="<?php echo get('riga_id'); ?>">
<input type="hidden" name="righe" value="<?= $_GET['righe'] ?>"> <input type="hidden" name="righe" value="<?php echo $_GET['righe']; ?>">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php elseif ($show_form): ?> <?php } elseif ($show_form) { ?>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<div class="alert alert-info"> <div class="alert alert-info">
<p><strong><?= tr('Aliquote IVA attuali') ?></strong></p> <p><strong><?php echo tr('Aliquote IVA attuali'); ?></strong></p>
<?php if (count($aliquote_iva) > 0): ?> <?php if (count($aliquote_iva) > 0) { ?>
<ul class="list-unstyled"> <ul class="list-unstyled">
<?php foreach ($aliquote_iva as $aliquota): ?> <?php foreach ($aliquote_iva as $aliquota) { ?>
<li> <li>
<strong><?= $aliquota['codice'] ?></strong> - <?= $aliquota['descrizione'] ?> (<?= $aliquota['percentuale'] ?>%) <strong><?php echo $aliquota['codice']; ?></strong> - <?php echo $aliquota['descrizione']; ?> (<?php echo $aliquota['percentuale']; ?>%)
<span class="badge"><?= $aliquota['count'] ?> <?= tr('righe') ?></span> <span class="badge"><?php echo $aliquota['count']; ?> <?php echo tr('righe'); ?></span>
</li> </li>
<?php endforeach; ?> <?php } ?>
</ul> </ul>
<?php endif; ?> <?php } ?>
<?php if (count($righe_senza_iva) > 0): ?> <?php if (count($righe_senza_iva) > 0) { ?>
<p><strong><?= tr('Righe senza aliquota IVA valida') ?>:</strong> <span class="badge"><?= count($righe_senza_iva) ?></span></p> <p><strong><?php echo tr('Righe senza aliquota IVA valida'); ?>:</strong> <span class="badge"><?php echo count($righe_senza_iva); ?></span></p>
<?php endif; ?> <?php } ?>
<p class="text-muted"><?= tr('Totale righe selezionate') ?>: <?= $righe_totali ?></p> <p class="text-muted"><?php echo tr('Totale righe selezionate'); ?>: <?php echo $righe_totali; ?></p>
</div> </div>
</div> </div>
@@ -159,31 +159,31 @@ $show_form = count($aliquote_iva) > 0 || count($righe_senza_iva) > 0 || (!empty(
<div class="col-md-5"> <div class="col-md-5">
<div class="panel panel-success"> <div class="panel panel-success">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title"><?= tr('Aliquota da applicare') ?></h4> <h4 class="panel-title"><?php echo tr('Aliquota da applicare'); ?></h4>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{[ "type": "select", "label": "", "name": "iva_id", "required": 1, "ajax-source": "iva" ]} {[ "type": "select", "label": "", "name": "iva_id", "required": 1, "ajax-source": "iva" ]}
<input type="hidden" name="riga_id" value="<?= get('riga_id') ?>"> <input type="hidden" name="riga_id" value="<?php echo get('riga_id'); ?>">
<input type="hidden" name="righe" value="<?= get('righe') ?>"> <input type="hidden" name="righe" value="<?php echo get('righe'); ?>">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php else: ?> <?php } else { ?>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="alert alert-warning"> <div class="alert alert-warning">
<p><?= tr('Nessuna riga selezionata') ?></p> <p><?php echo tr('Nessuna riga selezionata'); ?></p>
</div> </div>
</div> </div>
</div> </div>
<?php endif; ?> <?php } ?>
<!-- PULSANTI --> <!-- PULSANTI -->
<div class="row"> <div class="row">
<div class="col-md-12 text-right"> <div class="col-md-12 text-right">
<button type="button" class="btn btn-primary" onclick="salvaIva()"> <button type="button" class="btn btn-primary" onclick="salvaIva()">
<i class="fa fa-save"></i> <?= tr('Salva') ?> <i class="fa fa-save"></i> <?php echo tr('Salva'); ?>
</button> </button>
</div> </div>
</div> </div>
@@ -216,7 +216,7 @@ function salvaIva() {
renderMessages(); renderMessages();
}, },
error: function() { error: function() {
alert(<?= json_encode(tr('Errore durante il salvataggio')) ?>); alert(<?php echo json_encode(tr('Errore durante il salvataggio')); ?>);
} }
}); });
} else { } else {
@@ -237,7 +237,7 @@ function salvaIva() {
renderMessages(); renderMessages();
}, },
error: function() { error: function() {
alert(<?= json_encode(tr('Errore durante il salvataggio')) ?>); alert(<?php echo json_encode(tr('Errore durante il salvataggio')); ?>);
} }
}); });
} }

View File

@@ -105,7 +105,7 @@ foreach ($righe as $key => $riga) {
<td '.$colspan_titolo.'>'; <td '.$colspan_titolo.'>';
// Descrizione // Descrizione
$descrizione = nl2br($riga->descrizione); $descrizione = nl2br((string) $riga->descrizione);
if ($riga->isArticolo()) { if ($riga->isArticolo()) {
$descrizione = Modules::link('Articoli', $riga->idarticolo, $riga->codice.' - '.$descrizione); $descrizione = Modules::link('Articoli', $riga->idarticolo, $riga->codice.' - '.$descrizione);
} }
@@ -119,7 +119,7 @@ foreach ($righe as $key => $riga) {
if (!empty($riga->note)) { if (!empty($riga->note)) {
echo ' echo '
<br><span class="text-xs">'.nl2br($riga->note).'</small>'; <br><span class="text-xs">'.nl2br((string) $riga->note).'</small>';
} }
echo ' echo '
</td> </td>

View File

@@ -102,6 +102,7 @@ class CSV extends CSVImporter
* @param array $record Record da importare * @param array $record Record da importare
* @param bool $update_record Se true, aggiorna i record esistenti * @param bool $update_record Se true, aggiorna i record esistenti
* @param bool $add_record Se true, aggiunge nuovi record * @param bool $add_record Se true, aggiunge nuovi record
*
* @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata * @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata
*/ */
public function import($record, $update_record = true, $add_record = true) public function import($record, $update_record = true, $add_record = true)
@@ -110,9 +111,9 @@ class CSV extends CSVImporter
$database = database(); $database = database();
// Validazione dei campi obbligatori // Validazione dei campi obbligatori
if (empty($record['numero']) || empty($record['nome']) || empty($record['ragione_sociale']) || if (empty($record['numero']) || empty($record['nome']) || empty($record['ragione_sociale'])
empty($record['data_bozza']) || empty($record['codice']) || empty($record['qta']) || || empty($record['data_bozza']) || empty($record['codice']) || empty($record['qta'])
empty($record['prezzo_unitario'])) { || empty($record['prezzo_unitario'])) {
return false; return false;
} }
@@ -139,15 +140,31 @@ class CSV extends CSVImporter
} catch (\Exception $e) { } catch (\Exception $e) {
// Registra l'errore in un log // Registra l'errore in un log
error_log('Errore durante l\'importazione del preventivo: '.$e->getMessage()); error_log('Errore durante l\'importazione del preventivo: '.$e->getMessage());
return false; return false;
} }
} }
/**
* Restituisce un esempio di file CSV per l'importazione.
*
* @return array
*/
public static function getExample()
{
return [
['Numero', 'Nome Preventivo', 'Descrizione Preventivo', 'Cliente', 'Tipo Attività', 'Data', 'Codice Articolo', 'Quantità riga', 'Data prevista evasione riga', 'Prezzo unitario riga'],
['15', 'Preventivo Materiali', 'Preventivo iniziale', 'Rossi', 'Generico', '27/04/2024', '001', '2', '30/04/2024', '50'],
['15', 'Preventivo Materiali', 'Preventivo iniziale', 'Rossi', 'Generico', '27/04/2024', '043', '1', '10/05/2024', '100'],
];
}
/** /**
* Trova il preventivo esistente in base al numero. * Trova il preventivo esistente in base al numero.
* *
* @param array $record Record da importare * @param array $record Record da importare
* @param object $database Connessione al database * @param object $database Connessione al database
*
* @return Preventivo|null * @return Preventivo|null
*/ */
protected function trovaPreventivo($record, $database) protected function trovaPreventivo($record, $database)
@@ -157,6 +174,7 @@ class CSV extends CSVImporter
} }
$id_preventivo = $database->fetchOne('SELECT id FROM `co_preventivi` WHERE `numero`='.prepare($record['numero'])); $id_preventivo = $database->fetchOne('SELECT id FROM `co_preventivi` WHERE `numero`='.prepare($record['numero']));
return !empty($id_preventivo) ? Preventivo::find($id_preventivo['id']) : null; return !empty($id_preventivo) ? Preventivo::find($id_preventivo['id']) : null;
} }
@@ -164,6 +182,7 @@ class CSV extends CSVImporter
* Crea un nuovo preventivo. * Crea un nuovo preventivo.
* *
* @param array $record Record da importare * @param array $record Record da importare
*
* @return Preventivo|null * @return Preventivo|null
*/ */
protected function creaPreventivo($record) protected function creaPreventivo($record)
@@ -188,6 +207,7 @@ class CSV extends CSVImporter
return $preventivo; return $preventivo;
} catch (\Exception $e) { } catch (\Exception $e) {
error_log('Errore durante la creazione del preventivo: '.$e->getMessage()); error_log('Errore durante la creazione del preventivo: '.$e->getMessage());
return null; return null;
} }
} }
@@ -196,6 +216,7 @@ class CSV extends CSVImporter
* Trova o crea l'anagrafica cliente. * Trova o crea l'anagrafica cliente.
* *
* @param array $record Record da importare * @param array $record Record da importare
*
* @return Anagrafica|null * @return Anagrafica|null
*/ */
protected function trovaOCreaAnagrafica($record) protected function trovaOCreaAnagrafica($record)
@@ -220,6 +241,7 @@ class CSV extends CSVImporter
* Trova il tipo di intervento. * Trova il tipo di intervento.
* *
* @param array $record Record da importare * @param array $record Record da importare
*
* @return TipoSessione * @return TipoSessione
*/ */
protected function trovaTipoIntervento($record) protected function trovaTipoIntervento($record)
@@ -232,6 +254,7 @@ class CSV extends CSVImporter
* *
* @param Preventivo $preventivo Preventivo * @param Preventivo $preventivo Preventivo
* @param array $record Record da importare * @param array $record Record da importare
*
* @return bool * @return bool
*/ */
protected function aggiungiArticoloAlPreventivo($preventivo, $record) protected function aggiungiArticoloAlPreventivo($preventivo, $record)
@@ -260,9 +283,11 @@ class CSV extends CSVImporter
$riga_articolo->qta = $record['qta']; $riga_articolo->qta = $record['qta'];
$riga_articolo->save(); $riga_articolo->save();
return true; return true;
} catch (\Exception $e) { } catch (\Exception $e) {
error_log('Errore durante l\'aggiunta dell\'articolo al preventivo: '.$e->getMessage()); error_log('Errore durante l\'aggiunta dell\'articolo al preventivo: '.$e->getMessage());
return false; return false;
} }
} }
@@ -271,6 +296,7 @@ class CSV extends CSVImporter
* Converte una stringa data in un oggetto Carbon. * Converte una stringa data in un oggetto Carbon.
* *
* @param string $data_string Stringa data * @param string $data_string Stringa data
*
* @return Carbon * @return Carbon
*/ */
protected function parseData($data_string) protected function parseData($data_string)
@@ -285,21 +311,8 @@ class CSV extends CSVImporter
// Fallback alla data corrente // Fallback alla data corrente
error_log('Errore nel parsing della data: '.$e->getMessage()); error_log('Errore nel parsing della data: '.$e->getMessage());
return Carbon::now(); return Carbon::now();
} }
} }
/**
* Restituisce un esempio di file CSV per l'importazione.
*
* @return array
*/
public static function getExample()
{
return [
['Numero', 'Nome Preventivo', 'Descrizione Preventivo', 'Cliente', 'Tipo Attività', 'Data', 'Codice Articolo', 'Quantità riga', 'Data prevista evasione riga', 'Prezzo unitario riga'],
['15', 'Preventivo Materiali', 'Preventivo iniziale', 'Rossi', 'Generico', '27/04/2024', '001', '2', '30/04/2024', '50'],
['15', 'Preventivo Materiali', 'Preventivo iniziale', 'Rossi', 'Generico', '27/04/2024', '043', '1', '10/05/2024', '100'],
];
}
} }

View File

@@ -40,7 +40,7 @@ if (!empty($rs)) {
$data_accettazione = ($preventivo->data_accettazione != '0000-00-00') ? Translator::dateToLocale($preventivo->data_accettazione) : ''; $data_accettazione = ($preventivo->data_accettazione != '0000-00-00') ? Translator::dateToLocale($preventivo->data_accettazione) : '';
$data_conclusione = ($preventivo->data_conclusione != '0000-00-00') ? Translator::dateToLocale($preventivo->data_conclusione) : ''; $data_conclusione = ($preventivo->data_conclusione != '0000-00-00') ? Translator::dateToLocale($preventivo->data_conclusione) : '';
if ($data_conclusione != '' && strtotime($preventivo->data_conclusione) < strtotime(date('Y-m-d'))) { if ($data_conclusione != '' && strtotime((string) $preventivo->data_conclusione) < strtotime(date('Y-m-d'))) {
$attr = ' class="danger"'; $attr = ' class="danger"';
} else { } else {
$attr = ''; $attr = '';

View File

@@ -43,7 +43,7 @@ if (!empty($rs)) {
$data_conclusione = ($preventivo->data_conclusione != '0000-00-00') ? Translator::dateToLocale($preventivo->data_conclusione) : ''; $data_conclusione = ($preventivo->data_conclusione != '0000-00-00') ? Translator::dateToLocale($preventivo->data_conclusione) : '';
$stato_preventivo = Stato::find($preventivo->idstato)->getTranslation('title'); $stato_preventivo = Stato::find($preventivo->idstato)->getTranslation('title');
if (strtotime($preventivo->data_conclusione) < strtotime(date('Y-m-d')) && $data_conclusione != '') { if (strtotime((string) $preventivo->data_conclusione) < strtotime(date('Y-m-d')) && $data_conclusione != '') {
$attr = ' class="danger"'; $attr = ' class="danger"';
} else { } else {
$attr = ''; $attr = '';

View File

@@ -194,7 +194,6 @@ $operations['change-bank'] = [
], ],
]; ];
$operations['change_distinta'] = [ $operations['change_distinta'] = [
'text' => '<span><i class="fa fa-edit"></i> '.tr('Info distinta'), 'text' => '<span><i class="fa fa-edit"></i> '.tr('Info distinta'),
'data' => [ 'data' => [
@@ -207,7 +206,6 @@ $operations['change_distinta'] = [
], ],
]; ];
$operations['send_reminder'] = [ $operations['send_reminder'] = [
'text' => '<span><i class="fa fa-envelope"></i> '.tr('Invia mail sollecito').'</span>', 'text' => '<span><i class="fa fa-envelope"></i> '.tr('Invia mail sollecito').'</span>',
'data' => [ 'data' => [

View File

@@ -38,28 +38,28 @@ switch (post('op')) {
$records = array_filter((array) $id_records); $records = array_filter((array) $id_records);
// Default query for when there are no valid records // Default query for when there are no valid records
$query = "SELECT DISTINCT `zz_groups`.`id`, `title` AS descrizione FROM `zz_groups` $query = 'SELECT DISTINCT `zz_groups`.`id`, `title` AS descrizione FROM `zz_groups`
LEFT JOIN `zz_groups_lang` ON (`zz_groups`.`id` = `zz_groups_lang`.`id_record` LEFT JOIN `zz_groups_lang` ON (`zz_groups`.`id` = `zz_groups_lang`.`id_record`
AND `zz_groups_lang`.`id_lang` = ".prepare(Models\Locale::getDefault()->id).") AND `zz_groups_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).')
WHERE `zz_groups`.`id` = 1 WHERE `zz_groups`.`id` = 1
ORDER BY `zz_groups`.`id` ASC"; ORDER BY `zz_groups`.`id` ASC';
// If we have valid records, use the full query with IN clause // If we have valid records, use the full query with IN clause
if (!empty($records)) { if (!empty($records)) {
$records_list = implode(',', $records); $records_list = implode(',', $records);
$query = "SELECT DISTINCT `zz_groups`.`id`, `title` AS descrizione FROM `zz_groups` $query = 'SELECT DISTINCT `zz_groups`.`id`, `title` AS descrizione FROM `zz_groups`
LEFT JOIN `zz_groups_lang` ON (`zz_groups`.`id` = `zz_groups_lang`.`id_record` LEFT JOIN `zz_groups_lang` ON (`zz_groups`.`id` = `zz_groups_lang`.`id_record`
AND `zz_groups_lang`.`id_lang` = ".prepare(Models\Locale::getDefault()->id).") AND `zz_groups_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).")
WHERE `zz_groups`.`id` = 1 WHERE `zz_groups`.`id` = 1
OR `zz_groups`.`id` IN ( OR `zz_groups`.`id` IN (
SELECT DISTINCT `idgruppo` FROM `zz_permissions` SELECT DISTINCT `idgruppo` FROM `zz_permissions`
WHERE `permessi` IN ('r', 'rw') WHERE `permessi` IN ('r', 'rw')
AND `idmodule` IN ( AND `idmodule` IN (
SELECT DISTINCT `id_module` FROM `zz_segments` SELECT DISTINCT `id_module` FROM `zz_segments`
WHERE `id` IN (".$records_list.") WHERE `id` IN (".$records_list.')
) )
) )
ORDER BY `zz_groups`.`id` ASC"; ORDER BY `zz_groups`.`id` ASC';
} }
$msg = '{[ "type": "select", "multiple":"1", "label": "<small>'.tr('Seleziona i gruppi che avranno accesso ai segmenti selezionati:').'</small>", "values": "query='.$query.'", "name": "gruppi[]" ]}'; $msg = '{[ "type": "select", "multiple":"1", "label": "<small>'.tr('Seleziona i gruppi che avranno accesso ai segmenti selezionati:').'</small>", "values": "query='.$query.'", "name": "gruppi[]" ]}';

View File

@@ -124,10 +124,10 @@ echo '
// Add the additional options // Add the additional options
$additional_options = [ $additional_options = [
"font-size" => "Dimensione del font", 'font-size' => 'Dimensione del font',
"header-font-size" => "Dimensione del font dell'intestazione", 'header-font-size' => "Dimensione del font dell'intestazione",
"orientation" => "Orientamento pagina", 'orientation' => 'Orientamento pagina',
"format" => "Formato pagina" 'format' => 'Formato pagina',
]; ];
$available_options = array_merge($available_options, $additional_options); $available_options = array_merge($available_options, $additional_options);

View File

@@ -183,7 +183,7 @@ if (!empty($elementi)) {
$file = $dbo->selectOne('zz_files', '*', [ $file = $dbo->selectOne('zz_files', '*', [
'id_module' => $id_module, 'id_module' => $id_module,
'id_record' => $elemento['id'] 'id_record' => $elemento['id'],
]); ]);
echo ' echo '

View File

@@ -250,7 +250,7 @@ switch (filter('op')) {
} }
// Individuazione dello spostamento da effettuare // Individuazione dello spostamento da effettuare
$pieces = explode('_', $widget->location); $pieces = explode('_', (string) $widget->location);
$location = $pieces[0].'_'.($pieces[1] == 'right' ? 'top' : 'right'); $location = $pieces[0].'_'.($pieces[1] == 'right' ? 'top' : 'right');
// Abilitazione del widget indicato // Abilitazione del widget indicato

View File

@@ -23,8 +23,8 @@ namespace Modules\TipiIntervento;
use Common\SimpleModelTrait; use Common\SimpleModelTrait;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Modules\Anagrafiche\Anagrafica; use Modules\Anagrafiche\Anagrafica;
use Modules\Preventivi\Preventivo;
use Modules\Interventi\Intervento; use Modules\Interventi\Intervento;
use Modules\Preventivi\Preventivo;
use Traits\RecordTrait; use Traits\RecordTrait;
class Tipo extends Model class Tipo extends Model
@@ -89,7 +89,6 @@ class Tipo extends Model
$this->fixTecnici(); $this->fixTecnici();
} }
public function preventivi() public function preventivi()
{ {
return $this->hasMany(Preventivo::class, 'idtipointervento'); return $this->hasMany(Preventivo::class, 'idtipointervento');

View File

@@ -317,7 +317,7 @@ switch (filter('op')) {
$id = filter('id'); $id = filter('id');
$valore = filter('valore', null, 1); $valore = filter('valore', null, 1);
$user_options = json_decode($user->options, true) ?: []; $user_options = json_decode((string) $user->options, true) ?: [];
$user_options['settings'][$id] = $valore; $user_options['settings'][$id] = $valore;
$user->options = json_encode($user_options); $user->options = json_encode($user_options);

View File

@@ -21,8 +21,6 @@
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
use Models\Group; use Models\Group;
use Models\Module;
use Models\User;
$group = Group::find($id_record); $group = Group::find($id_record);
$record = $group->toArray(); $record = $group->toArray();

View File

@@ -26,7 +26,7 @@ include_once __DIR__.'/../../core.php';
$sezione = filter('sezione'); $sezione = filter('sezione');
$impostazioni = Setting::where('sezione', $sezione)->where('is_user_setting', 1) $impostazioni = Setting::where('sezione', $sezione)->where('is_user_setting', 1)
->get(); ->get();
$user_options = json_decode($user->options, true) ?: []; $user_options = json_decode((string) $user->options, true) ?: [];
foreach ($impostazioni as $impostazione) { foreach ($impostazioni as $impostazione) {
echo ' echo '

View File

@@ -20,9 +20,9 @@
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
use Models\User;
use Models\Upload;
use Models\Module; use Models\Module;
use Models\Upload;
use Models\User;
Permissions::check('rw'); Permissions::check('rw');

View File

@@ -18,10 +18,10 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
use Doctrine\SqlFormatter\SqlFormatter;
use Models\Clause; use Models\Clause;
use Models\Module; use Models\Module;
use Models\View; use Models\View;
use Doctrine\SqlFormatter\SqlFormatter;
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';

View File

@@ -1,4 +1,5 @@
<?php <?php
/* /*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione * OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l. * Copyright (C) DevCode s.r.l.
@@ -474,7 +475,7 @@ foreach ($interventi as $intervento) {
->get(); ->get();
foreach ($sessioni as $sessione) { foreach ($sessioni as $sessione) {
$mese = date('Y-m', strtotime($sessione->orario_inizio)); $mese = date('Y-m', strtotime((string) $sessione->orario_inizio));
if (!isset($interventi_per_mese[$mese])) { if (!isset($interventi_per_mese[$mese])) {
$interventi_per_mese[$mese] = [ $interventi_per_mese[$mese] = [
'ore' => 0, 'ore' => 0,

View File

@@ -712,7 +712,7 @@ class FatturaElettronica implements \Stringable
// $result['CodiceFiscale'] = str_replace($anagrafica->nazione->iso2, '', $result['CodiceFiscale']); // $result['CodiceFiscale'] = str_replace($anagrafica->nazione->iso2, '', $result['CodiceFiscale']);
// Rimuovo eventuali idicazioni relative all'iso2 della nazione, solo se la stringa inizia con quest'ultima. // Rimuovo eventuali idicazioni relative all'iso2 della nazione, solo se la stringa inizia con quest'ultima.
$result['CodiceFiscale'] = preg_replace('/^'.preg_quote($anagrafica->nazione->iso2, '/').'/', '', (string) $anagrafica['codice_fiscale']); $result['CodiceFiscale'] = preg_replace('/^'.preg_quote((string) $anagrafica->nazione->iso2, '/').'/', '', (string) $anagrafica['codice_fiscale']);
} }
// Partita IVA: se privato estero non va considerato il codice fiscale ma la partita iva con 9 zeri // Partita IVA: se privato estero non va considerato il codice fiscale ma la partita iva con 9 zeri
@@ -1690,7 +1690,7 @@ class FatturaElettronica implements \Stringable
// BIC senza parte per filiale (causa errori di validazione) // BIC senza parte per filiale (causa errori di validazione)
if (!empty($banca->bic)) { if (!empty($banca->bic)) {
$pagamento['BIC'] = substr($banca->bic, 0, 8); $pagamento['BIC'] = substr((string) $banca->bic, 0, 8);
} }
$result[]['DettaglioPagamento'] = $pagamento; $result[]['DettaglioPagamento'] = $pagamento;

View File

@@ -19,7 +19,6 @@
*/ */
use Carbon\Carbon; use Carbon\Carbon;
use Models\Module;
use Modules\Fatture\Fattura; use Modules\Fatture\Fattura;
use Modules\Pagamenti\Pagamento; use Modules\Pagamenti\Pagamento;
use Plugins\ImportFE\FatturaElettronica; use Plugins\ImportFE\FatturaElettronica;
@@ -314,8 +313,6 @@ if (!empty($pagamenti)) {
echo ' echo '
</div>'; </div>';
// Tipo del documento // Tipo del documento
$query = "SELECT `co_tipidocumento`.`id`, CONCAT('(', `codice_tipo_documento_fe`, ') ', `title`) AS descrizione FROM `co_tipidocumento` LEFT JOIN `co_tipidocumento_lang` ON (`co_tipidocumento_lang`.`id_record` = `co_tipidocumento`.`id` AND `co_tipidocumento_lang`.`id_lang` = ".prepare(Models\Locale::getDefault()->id).") WHERE `dir` = 'uscita'"; $query = "SELECT `co_tipidocumento`.`id`, CONCAT('(', `codice_tipo_documento_fe`, ') ', `title`) AS descrizione FROM `co_tipidocumento` LEFT JOIN `co_tipidocumento_lang` ON (`co_tipidocumento_lang`.`id_record` = `co_tipidocumento`.`id` AND `co_tipidocumento_lang`.`id_lang` = ".prepare(Models\Locale::getDefault()->id).") WHERE `dir` = 'uscita'";
$query_tipo = $query.' AND `codice_tipo_documento_fe` = '.prepare($dati_generali['TipoDocumento']); $query_tipo = $query.' AND `codice_tipo_documento_fe` = '.prepare($dati_generali['TipoDocumento']);
@@ -563,7 +560,6 @@ if (!empty($righe)) {
} }
$idconto_acquisto = $database->fetchOne('SELECT `idconto_acquisto` FROM `mg_articoli` WHERE `id` = '.prepare($id_articolo))['idconto_acquisto']; $idconto_acquisto = $database->fetchOne('SELECT `idconto_acquisto` FROM `mg_articoli` WHERE `id` = '.prepare($id_articolo))['idconto_acquisto'];
} }
$idconto_acquisto = $is_autofattura ? setting('Conto per autofattura') : $idconto_acquisto; $idconto_acquisto = $is_autofattura ? setting('Conto per autofattura') : $idconto_acquisto;
@@ -772,10 +768,10 @@ if (!empty($righe)) {
FROM `or_ordini` FROM `or_ordini`
INNER JOIN `or_righe_ordini` ON `or_righe_ordini`.`idordine` = `or_ordini`.`id` INNER JOIN `or_righe_ordini` ON `or_righe_ordini`.`idordine` = `or_ordini`.`id`
WHERE WHERE
`or_ordini`.`idanagrafica` = ".prepare($anagrafica->id)." AND `or_ordini`.`idanagrafica` = ".prepare($anagrafica->id).' AND
`or_ordini`.`numero` = ".prepare($riferimento['numero'])." AND `or_ordini`.`numero` = '.prepare($riferimento['numero'])." AND
DATE_FORMAT(`or_ordini`.`data`, '%d/%m/%Y') = ".prepare($riferimento['data'])." DATE_FORMAT(`or_ordini`.`data`, '%d/%m/%Y') = ".prepare($riferimento['data']).'
GROUP BY `or_ordini`.`id`"; GROUP BY `or_ordini`.`id`';
$ordini = $database->fetchArray($query); $ordini = $database->fetchArray($query);

View File

@@ -19,7 +19,6 @@
*/ */
use Carbon\Carbon; use Carbon\Carbon;
use Models\Module;
use Modules\Fatture\Fattura; use Modules\Fatture\Fattura;
use Modules\Pagamenti\Pagamento; use Modules\Pagamenti\Pagamento;
use Plugins\ImportFE\FatturaElettronica; use Plugins\ImportFE\FatturaElettronica;
@@ -294,8 +293,6 @@ if (!empty($pagamenti)) {
echo ' echo '
</div>'; </div>';
// Tipo del documento // Tipo del documento
$query = "SELECT `co_tipidocumento`.`id`, CONCAT('(', `codice_tipo_documento_fe`, ') ', `title`) AS descrizione FROM `co_tipidocumento` LEFT JOIN `co_tipidocumento_lang` ON (`co_tipidocumento_lang`.`id_record` = `co_tipidocumento`.`id` AND `co_tipidocumento_lang`.`id_lang` = ".prepare(Models\Locale::getDefault()->id).") WHERE `dir` = 'entrata'"; $query = "SELECT `co_tipidocumento`.`id`, CONCAT('(', `codice_tipo_documento_fe`, ') ', `title`) AS descrizione FROM `co_tipidocumento` LEFT JOIN `co_tipidocumento_lang` ON (`co_tipidocumento_lang`.`id_record` = `co_tipidocumento`.`id` AND `co_tipidocumento_lang`.`id_lang` = ".prepare(Models\Locale::getDefault()->id).") WHERE `dir` = 'entrata'";
$query_tipo = $query.' AND `codice_tipo_documento_fe` = '.prepare($dati_generali['TipoDocumento']); $query_tipo = $query.' AND `codice_tipo_documento_fe` = '.prepare($dati_generali['TipoDocumento']);
@@ -532,7 +529,6 @@ if (!empty($righe)) {
// Prendo il codice articolo dal primo nodo CodiceValore che trovo // Prendo il codice articolo dal primo nodo CodiceValore che trovo
$codice_principale = $codici[0]['CodiceValore']; $codice_principale = $codici[0]['CodiceValore'];
if (!empty($codice_principale)) { if (!empty($codice_principale)) {
if (empty($id_articolo)) { if (empty($id_articolo)) {
$id_articolo = $database->fetchOne('SELECT `id` FROM `mg_articoli` WHERE `codice` = '.prepare($codice_principale))['id']; $id_articolo = $database->fetchOne('SELECT `id` FROM `mg_articoli` WHERE `codice` = '.prepare($codice_principale))['id'];
if (empty($id_articolo)) { if (empty($id_articolo)) {
@@ -541,7 +537,6 @@ if (!empty($righe)) {
} }
$idconto_vendita = $database->fetchOne('SELECT `idconto_vendita` FROM `mg_articoli` WHERE `id` = '.prepare($id_articolo))['idconto_vendita']; $idconto_vendita = $database->fetchOne('SELECT `idconto_vendita` FROM `mg_articoli` WHERE `id` = '.prepare($id_articolo))['idconto_vendita'];
} }
$idconto_vendita = $is_autofattura ? setting('Conto per autofattura') : $idconto_vendita; $idconto_vendita = $is_autofattura ? setting('Conto per autofattura') : $idconto_vendita;
@@ -746,10 +741,10 @@ if (!empty($righe)) {
FROM `or_ordini` FROM `or_ordini`
INNER JOIN `or_righe_ordini` ON `or_righe_ordini`.`idordine` = `or_ordini`.`id` INNER JOIN `or_righe_ordini` ON `or_righe_ordini`.`idordine` = `or_ordini`.`id`
WHERE WHERE
`or_ordini`.`idanagrafica` = " . prepare($anagrafica->id) . " AND `or_ordini`.`idanagrafica` = ".prepare($anagrafica->id).' AND
`or_ordini`.`numero` = " . prepare($riferimento['numero']) . " AND `or_ordini`.`numero` = '.prepare($riferimento['numero'])." AND
DATE_FORMAT(`or_ordini`.`data`, '%d/%m/%Y') = " . prepare($riferimento['data']) . " DATE_FORMAT(`or_ordini`.`data`, '%d/%m/%Y') = ".prepare($riferimento['data']).'
GROUP BY `or_ordini`.`id`"; GROUP BY `or_ordini`.`id`';
$ordini = $database->fetchArray($query); $ordini = $database->fetchArray($query);
@@ -779,8 +774,6 @@ if (!empty($righe)) {
</tr>'; </tr>';
} }
echo ' echo '
</tbody> </tbody>
</table> </table>

View File

@@ -55,7 +55,7 @@ switch ($action) {
'idContratto' => $pianificazione->idcontratto, 'idContratto' => $pianificazione->idcontratto,
'dataScadenza' => dateFormat($pianificazione->data_scadenza), 'dataScadenza' => dateFormat($pianificazione->data_scadenza),
'contratto' => reference($contratto), 'contratto' => reference($contratto),
'ragioneSociale' => Modules::link('Anagrafiche', $anagrafica->id, nl2br($anagrafica->ragione_sociale)), 'ragioneSociale' => Modules::link('Anagrafiche', $anagrafica->id, nl2br((string) $anagrafica->ragione_sociale)),
'totale' => moneyFormat($pianificazione->totale), 'totale' => moneyFormat($pianificazione->totale),
'importo' => tr('Rata _IND_/_NUM_ (totale: _TOT_)', [ 'importo' => tr('Rata _IND_/_NUM_ (totale: _TOT_)', [
'_IND_' => numberFormat($pianificazione->getNumeroPianificazione(), 0), '_IND_' => numberFormat($pianificazione->getNumeroPianificazione(), 0),

View File

@@ -39,7 +39,7 @@ foreach ($contratto->pianificazioni as $i => $p) {
$id_module_fattura = Module::where('name', 'Fatture di vendita')->first()->id; $id_module_fattura = Module::where('name', 'Fatture di vendita')->first()->id;
$id_conto = setting('Conto predefinito fatture di vendita'); $id_conto = setting('Conto predefinito fatture di vendita');
$data = date('Y-m', strtotime($pianificazione->data_scadenza)).'-'.date('d', strtotime($contratto->data_accettazione)); $data = date('Y-m', strtotime((string) $pianificazione->data_scadenza)).'-'.date('d', strtotime((string) $contratto->data_accettazione));
echo ' echo '
<form action="" method="post"> <form action="" method="post">

View File

@@ -116,7 +116,7 @@ foreach ($pianificazioni as $pianificazione) {
<small>'.reference($contratto).'</small> <small>'.reference($contratto).'</small>
</td> </td>
<td> <td>
'.Modules::link('Anagrafiche', $anagrafica->id, nl2br($anagrafica->ragione_sociale)).' '.Modules::link('Anagrafiche', $anagrafica->id, nl2br((string) $anagrafica->ragione_sociale)).'
</td> </td>
<td> <td>
<div>'.moneyFormat($pianificazione->totale).'</div> <div>'.moneyFormat($pianificazione->totale).'</div>

View File

@@ -102,7 +102,7 @@ class Promemoria extends Document
// Collego gli impianti del promemoria all'intervento // Collego gli impianti del promemoria all'intervento
$database = database(); $database = database();
if ($copia_impianti && !empty($this->idimpianti)) { if ($copia_impianti && !empty($this->idimpianti)) {
$impianti = explode(',', $this->idimpianti); $impianti = explode(',', (string) $this->idimpianti);
$impianti = array_unique($impianti); $impianti = array_unique($impianti);
foreach ($impianti as $impianto) { foreach ($impianti as $impianto) {
$database->insert('my_impianti_interventi', [ $database->insert('my_impianti_interventi', [

Some files were not shown because too many files have changed in this diff Show More