From 9c75dd6402e0b68380a8bc2c9c196e308b94542e Mon Sep 17 00:00:00 2001 From: Luca Date: Fri, 25 Mar 2022 16:28:25 +0100 Subject: [PATCH 1/6] Fix minori --- modules/contratti/edit.php | 2 +- modules/impianti/edit.php | 2 +- update/2_4_26.sql | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/contratti/edit.php b/modules/contratti/edit.php index bcdda45b8..baa7de552 100755 --- a/modules/contratti/edit.php +++ b/modules/contratti/edit.php @@ -114,7 +114,7 @@ if (strtotime($record['data_conclusione']) < strtotime($record['data_accettazion
- {[ "type": "select", "multiple": "1", "label": "", "name": "matricolaimpianto[]", "values": "query=SELECT idanagrafica, id AS id, IF(nome = '', matricola, CONCAT(matricola, ' - ', nome)) AS descrizione FROM my_impianti WHERE idanagrafica='$idanagrafica$' ORDER BY descrizione", "value": "$idimpianti$", "icon-after": "add||||" ]} + {[ "type": "select", "multiple": "1", "label": "", "name": "matricolaimpianto[]", "values": "query=SELECT idanagrafica, id AS id, IF(nome = '', matricola, CONCAT(matricola, ' - ', nome)) AS descrizione FROM my_impianti WHERE idanagrafica='$idanagrafica$' ORDER BY descrizione", "value": "$idimpianti$", "icon-after": "add||||" ]}
diff --git a/modules/impianti/edit.php b/modules/impianti/edit.php index 049b49b9c..74dddba53 100644 --- a/modules/impianti/edit.php +++ b/modules/impianti/edit.php @@ -63,7 +63,7 @@ if (!empty($record['immagine'])) { {[ "type": "select", "label": "", "name": "idanagrafica", "required": 1, "value": "$idanagrafica$", "extra": "", "ajax-source": "clienti" ]}
- {[ "type": "select", "label": "", "name": "id_categoria", "required": 0, "value": "$id_categoria$", "values": "query=SELECT id, nome AS descrizione FROM my_impianti_categorie" ]} + {[ "type": "select", "label": "", "name": "id_categoria", "required": 0, "value": "$id_categoria$", "values": "query=SELECT id, nome AS descrizione FROM my_impianti_categorie", "icon-after": "add|" ]}
diff --git a/update/2_4_26.sql b/update/2_4_26.sql index 66b3ac490..54427f986 100644 --- a/update/2_4_26.sql +++ b/update/2_4_26.sql @@ -62,8 +62,8 @@ CREATE TABLE IF NOT EXISTS `mg_articolo_attributo` ( ALTER TABLE `mg_articoli` ADD `id_combinazione` int(11), ADD FOREIGN KEY (`id_combinazione`) REFERENCES `mg_combinazioni`(`id`); INSERT INTO `zz_modules` (`id`, `name`, `title`, `directory`, `options`, `options2`, `icon`, `version`, `compatibility`, `order`, `parent`, `default`, `enabled`) VALUES -(NULL, 'Attributi Combinazioni', 'Attributi Combinazioni', 'attributi_combinazioni', 'SELECT |select| FROM mg_attributi WHERE mg_attributi.deleted_at IS NULL AND 1=1 HAVING 2=2', NULL, 'fa fa-angle-right', '1.0', '2.*', '100', '20', '1', '1'), -(NULL, 'Combinazioni', 'Combinazioni', 'combinazioni_articoli', 'SELECT |select| FROM mg_combinazioni WHERE mg_combinazioni.deleted_at IS NULL AND 1=1 HAVING 2=2', NULL, 'fa fa-angle-right', '1.0', '2.*', '100', '20', '1', '1'); +(NULL, 'Attributi Combinazioni', 'Attributi Combinazioni', 'attributi_combinazioni', 'SELECT |select| FROM mg_attributi WHERE mg_attributi.deleted_at IS NULL AND 1=1 HAVING 2=2', NULL, 'fa fa-angle-right', '1.0', '2.*', '100', (SELECT id FROM zz_modules t WHERE t.name = 'Magazzino'), '1', '1'), +(NULL, 'Combinazioni', 'Combinazioni', 'combinazioni_articoli', 'SELECT |select| FROM mg_combinazioni WHERE mg_combinazioni.deleted_at IS NULL AND 1=1 HAVING 2=2', NULL, 'fa fa-angle-right', '1.0', '2.*', '100', (SELECT id FROM zz_modules t WHERE t.name = 'Magazzino'), '1', '1'); INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `directory`, `options`) VALUES (NULL, 'Varianti Articolo', 'Varianti Articolo', (SELECT `id` FROM `zz_modules` WHERE `name`='Articoli'), (SELECT `id` FROM `zz_modules` WHERE `name`='Articoli'), 'tab', 'varianti_articolo', 'custom'); From 57d53fa173c980b038818a4995bcff8d991f5a62 Mon Sep 17 00:00:00 2001 From: Beppe Date: Fri, 25 Mar 2022 16:44:48 +0100 Subject: [PATCH 2/6] Migliorie dichiarazioni d'intento --- modules/fatture/edit.php | 9 +++- plugins/dichiarazioni_intento/edit.php | 50 ++++++++++++++----- .../src/Dichiarazione.php | 14 +++--- plugins/exportFE/src/FatturaElettronica.php | 9 +++- update/2_4_32.sql | 5 +- 5 files changed, 62 insertions(+), 25 deletions(-) diff --git a/modules/fatture/edit.php b/modules/fatture/edit.php index 197d7a9c6..066857cec 100755 --- a/modules/fatture/edit.php +++ b/modules/fatture/edit.php @@ -659,11 +659,16 @@ echo ' //Dich. intento collegata if ($dir == 'entrata' && !empty($fattura->dichiarazione)){ + $ive_accettate = $dbo->table('co_iva')->where('codice_natura_fe','N3.5')->get(); + foreach($ive_accettate as $iva_accettata){ + $descrizione_iva_accettata .= '
  • '.$iva_accettata->descrizione.'
  • '; + } + if ($fattura->stato->descrizione == 'Bozza'){ - echo ' + echo '
    - '.tr("La fattura è collegata ad una dichiarazione d'intento con diponibilità residura pari a _MONEY_.", [ '_MONEY_' => moneyFormat(abs($diff)),]).'
    '.tr("Per collegare una riga alla dichiarazione è sufficiente specificare come IVA _IVA_", ['_IVA_' => '"'.$iva->codice.' - '.$iva->descrizione.'"',]).'. + '.tr("La fattura è collegata ad una dichiarazione d'intento con diponibilità residura pari a _MONEY_.", [ '_MONEY_' => moneyFormat(abs($diff)),]).'
    '.tr("Per collegare una riga alla dichiarazione è sufficiente specificare come IVA
      _IVA_
    ", ['_IVA_' => $descrizione_iva_accettata]).'
    '; } diff --git a/plugins/dichiarazioni_intento/edit.php b/plugins/dichiarazioni_intento/edit.php index 3d71ffc53..5190aa155 100755 --- a/plugins/dichiarazioni_intento/edit.php +++ b/plugins/dichiarazioni_intento/edit.php @@ -74,18 +74,6 @@ echo ' '; -// Collegamenti diretti (numerici) -$numero_documenti = $dbo->fetchNum('SELECT id FROM co_documenti WHERE id_dichiarazione_intento='.prepare($id_record)); - -if (!empty($numero_documenti)) { - echo ' -
    - '.tr('Ci sono _NUM_ documenti collegati', [ - '_NUM_' => $numero_documenti, - ]).'. -
    '; -} - echo ' @@ -101,3 +89,41 @@ echo ' '; + +//Documenti collegati +$elementi = $dbo->fetchArray('SELECT `co_documenti`.`id`, `co_documenti`.`data`, `co_documenti`.`numero`, `co_documenti`.`numero_esterno`, `co_tipidocumento`.`descrizione` AS tipo_documento, `co_tipidocumento`.`dir`, NULL AS `deleted_at` FROM `co_documenti` JOIN `co_tipidocumento` ON `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento` WHERE `co_documenti`.`id_dichiarazione_intento` = '.prepare($record['id'])); + +if (!empty($elementi)) { + echo ' +
    +
    +
    +

    '.tr('Documenti collegati: _NUM_', [ + '_NUM_' => count($elementi), + ]).'

    +
    + +
    +
    +
    +
      '; + + foreach ($elementi as $elemento) { + $descrizione = tr('_DOC_ _NUM_ del _DATE_ _DELETED_AT_', [ + '_DOC_' => $elemento['tipo_documento'], + '_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'], + '_DATE_' => Translator::dateToLocale($elemento['data']), + '_DELETED_AT_' => (!empty($elemento['deleted_at']) ? tr('Eliminato il:').' '.Translator::dateToLocale($elemento['deleted_at']) : ''), + ]); + $modulo = ($elemento['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto'; + $id = $elemento['id']; + + echo ' +
    • '.Modules::link($modulo, $id, $descrizione).'
    • '; + } + + echo ' +
    +
    +
    '; +} \ No newline at end of file diff --git a/plugins/dichiarazioni_intento/src/Dichiarazione.php b/plugins/dichiarazioni_intento/src/Dichiarazione.php index e1218c184..d85cc6bda 100755 --- a/plugins/dichiarazioni_intento/src/Dichiarazione.php +++ b/plugins/dichiarazioni_intento/src/Dichiarazione.php @@ -74,17 +74,15 @@ class Dichiarazione extends Model $righe = collect(); $fatture = $this->fatture; + $totale = 0; foreach ($fatture as $fattura) { - $righe = $righe->merge($fattura->getRighe()); + foreach( $fattura->getRighe() as $riga){ + if( $riga->aliquota->codice_natura_fe == 'N3.5' ){ + $totale += ($fattura->tipo->reversed ? -$riga->totale_imponibile : $riga->totale_imponibile); + } + } } - // Filtro delle righe per IVA - $id_iva = setting("Iva per lettere d'intento"); - $righe_dichiarazione = $righe->filter(function ($item, $key) use ($id_iva) { - return $item->aliquota != null && $item->aliquota->id == $id_iva; - }); - - $totale = $righe_dichiarazione->sum('totale_imponibile') ?: 0; $this->totale = $totale; } diff --git a/plugins/exportFE/src/FatturaElettronica.php b/plugins/exportFE/src/FatturaElettronica.php index 5cce1e39d..d1f439180 100755 --- a/plugins/exportFE/src/FatturaElettronica.php +++ b/plugins/exportFE/src/FatturaElettronica.php @@ -1443,9 +1443,14 @@ class FatturaElettronica // Dichiarazione d'intento //Il numero di protocollo della dichiarazione d’intento, rilevabile dalla ricevuta telematica rilasciata dall’Agenzia delle entrate, è composto da 2 parti 17+6 (protocollo di ricezione della dichiarazione d’intento e il suo progressivo) + //$id_iva_dichiarazione = setting("Iva per lettere d'intento"); $dichiarazione = $documento->dichiarazione; - $id_iva_dichiarazione = setting("Iva per lettere d'intento"); - if (!empty($dichiarazione) && $riga->aliquota->id == $id_iva_dichiarazione) { + $ive_accettate = []; + $rs = $dbo->table('co_iva')->where('codice_natura_fe','N3.5')->get(); + foreach($rs as $r){ + $ive_accettate[] = $r->id; + } + if (!empty($dichiarazione) && in_array($riga->aliquota->id, $ive_accettate) ) { $dettaglio[]['AltriDatiGestionali'] = [ 'TipoDato' => 'INTENTO', 'RiferimentoTesto' => $dichiarazione->numero_protocollo, diff --git a/update/2_4_32.sql b/update/2_4_32.sql index e4820da58..d2f8fff9b 100644 --- a/update/2_4_32.sql +++ b/update/2_4_32.sql @@ -9,4 +9,7 @@ UPDATE `zz_settings` SET `tipo` = 'list[mese,settimana,giorno,agenda]' WHERE `zz -- Aggiunta colonna Impianti in Attività UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `in_interventi`\nINNER JOIN `an_anagrafiche` ON `in_interventi`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\nLEFT JOIN `in_interventi_tecnici` ON `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`\nLEFT JOIN `in_interventi_tecnici_assegnati` ON `in_interventi_tecnici_assegnati`.`id_intervento` = `in_interventi`.`id`\nLEFT JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento`=`in_statiintervento`.`idstatointervento`\nLEFT JOIN (\n SELECT an_sedi.id, CONCAT(an_sedi.nomesede, \'
    \',IF(an_sedi.telefono!=\'\',CONCAT(an_sedi.telefono,\'
    \'),\'\'),IF(an_sedi.cellulare!=\'\',CONCAT(an_sedi.cellulare,\'
    \'),\'\'),an_sedi.citta,IF(an_sedi.indirizzo!=\'\',CONCAT(\' - \',an_sedi.indirizzo),\'\')) AS info FROM an_sedi\n) AS sede_destinazione ON sede_destinazione.id = in_interventi.idsede_destinazione\nLEFT JOIN (\n SELECT co_righe_documenti.idintervento, CONCAT(\'Fatt. \', co_documenti.numero_esterno, \' del \', DATE_FORMAT(co_documenti.data, \'%d/%m/%Y\')) AS info FROM co_documenti INNER JOIN co_righe_documenti ON co_documenti.id = co_righe_documenti.iddocumento\n) AS fattura ON fattura.idintervento = in_interventi.id\nLEFT JOIN (SELECT `zz_operations`.`id_email`, `zz_operations`.`id_record`\n FROM `zz_operations`\n INNER JOIN `em_emails` ON `zz_operations`.`id_email` = `em_emails`.`id`\n INNER JOIN `em_templates` ON `em_emails`.`id_template` = `em_templates`.`id`\n INNER JOIN `zz_modules` ON `zz_operations`.`id_module` = `zz_modules`.`id` \n WHERE `zz_modules`.`name` = \'Interventi\' AND `zz_operations`.`op` = \'send-email\' \n GROUP BY `zz_operations`.`id_record`) AS email ON email.id_record=in_interventi.id\nLEFT JOIN (\n SELECT GROUP_CONCAT(CONCAT(matricola, IF(nome != \'\', CONCAT(\' - \', nome), \'\')) SEPARATOR \'
    \') AS descrizione, my_impianti_interventi.idintervento\n FROM my_impianti\n INNER JOIN my_impianti_interventi ON my_impianti.id = my_impianti_interventi.idimpianto\n GROUP BY my_impianti_interventi.idintervento\n) AS impianti ON impianti.idintervento = in_interventi.id\nWHERE 1=1 |date_period(`orario_inizio`,`data_richiesta`)|\nGROUP BY `in_interventi`.`id`\nHAVING 2=2\nORDER BY IFNULL(`orario_fine`, `data_richiesta`) DESC' WHERE `zz_modules`.`name` = 'Interventi'; -INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `html_format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi'), 'Impianti', 'impianti.descrizione', '16', '1', '0', '0', '1', NULL, NULL, '0', '0', '1'); \ No newline at end of file +INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `html_format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi'), 'Impianti', 'impianti.descrizione', '16', '1', '0', '0', '1', NULL, NULL, '0', '0', '1'); + +-- Allineamento totali dichiaranzione d'intento +UPDATE `co_dichiarazioni_intento` INNER JOIN (SELECT `co_documenti`.`id_dichiarazione_intento`, SUM(IF(`co_tipidocumento`.`reversed`=1, (-(`co_righe_documenti`.`subtotale`-`co_righe_documenti`.`sconto`)), (`co_righe_documenti`.`subtotale`-`co_righe_documenti`.`sconto`))) AS `totale` FROM `co_righe_documenti` INNER JOIN `co_documenti` ON `co_documenti`.`id`=`co_righe_documenti`.`iddocumento` INNER JOIN `co_tipidocumento` ON `co_tipidocumento`.`id`=`co_documenti`.`idtipodocumento` INNER JOIN `co_iva` ON `co_iva`.`id`=`co_righe_documenti`.`idiva` WHERE `co_iva`.`codice_natura_fe`='N3.5' GROUP BY `co_documenti`.`id_dichiarazione_intento`) AS `righe` ON `righe`.`id_dichiarazione_intento`=`co_dichiarazioni_intento`.`id` SET `co_dichiarazioni_intento`.`totale`=`righe`.`totale`; \ No newline at end of file From c8215016e190934ff6bf4f480621d7521e4b5f54 Mon Sep 17 00:00:00 2001 From: Luca Date: Fri, 25 Mar 2022 18:47:13 +0100 Subject: [PATCH 3/6] Fix PHP 8.1 --- include/common/riga.php | 2 +- lib/helpers.php | 2 +- src/Database.php | 2 +- src/Intl/Formatter.php | 16 +++++++--------- src/Util/Generator.php | 2 +- update/2_4_13.php | 1 - 6 files changed, 11 insertions(+), 14 deletions(-) diff --git a/include/common/riga.php b/include/common/riga.php index f28529443..46bdef961 100755 --- a/include/common/riga.php +++ b/include/common/riga.php @@ -33,7 +33,7 @@ echo ' // Quantità echo '
    - {[ "type": "number", "label": "'.tr('Q.tà').'", "name": "qta", "required": 1, "value": "'.abs($result['qta']).'", "decimals": "qta"'.(isset($result['max_qta']) ? ', "icon-after": "/ '.numberFormat(abs($result['max_qta']), 'qta').' "' : '').', "min-value": "'.abs($result['qta_evasa']).'" ]} + {[ "type": "number", "label": "'.tr('Q.tà').'", "name": "qta", "required": 1, "value": "'.abs((float) $result['qta']).'", "decimals": "qta"'.(isset($result['max_qta']) ? ', "icon-after": "/ '.numberFormat(abs((float) $result['max_qta']), 'qta').' "' : '').', "min-value": "'.abs((float) $result['qta_evasa']).'" ]}
    '; // Unità di misura diff --git a/lib/helpers.php b/lib/helpers.php index 520c464e2..ae18b01aa 100755 --- a/lib/helpers.php +++ b/lib/helpers.php @@ -46,7 +46,7 @@ function database() */ function prepare($parameter) { - return database()->prepare($parameter); + return database()->prepare((string) $parameter); } /** diff --git a/src/Database.php b/src/Database.php index 5cf7bb805..1a0a57ee2 100755 --- a/src/Database.php +++ b/src/Database.php @@ -390,7 +390,7 @@ class Database extends Util\Singleton */ public function prepare($parameter) { - return $this->getPDO()->quote($parameter); + return $this->getPDO()->quote((string) $parameter); } /** diff --git a/src/Intl/Formatter.php b/src/Intl/Formatter.php index 05f082c1b..0ddf87ea4 100755 --- a/src/Intl/Formatter.php +++ b/src/Intl/Formatter.php @@ -421,18 +421,16 @@ class Formatter */ public function formatDate($value) { - if (!empty($value)){ - $object = DateTime::createFromFormat(static::$standards['date'], $value); + + $object = DateTime::createFromFormat(static::$standards['date'], (string) $value); - // Fallback per la gestione dei timestamp - $object = !is_object($object) ? DateTime::createFromFormat(static::$standards['timestamp'], $value) : $object; + // Fallback per la gestione dei timestamp + $object = !is_object($object) ? DateTime::createFromFormat(static::$standards['timestamp'], (string) $value) : $object; - $result = is_object($object) ? $object->format($this->getDatePattern()) : false; + $result = is_object($object) ? $object->format($this->getDatePattern()) : false; - return $result; - }else{ - return true; - } + return $result; + } /** diff --git a/src/Util/Generator.php b/src/Util/Generator.php index 79b8bc196..a968f335c 100755 --- a/src/Util/Generator.php +++ b/src/Util/Generator.php @@ -122,7 +122,7 @@ class Generator $pattern = str_replace(array_keys($replaces), array_values($values), $pattern); // Individuazione dei valori - preg_match('/^'.$pattern.'/', $string, $m); + preg_match('/^'.$pattern.'/', (string) $string, $m); return array_filter($m, 'is_string', ARRAY_FILTER_USE_KEY); } diff --git a/update/2_4_13.php b/update/2_4_13.php index 53f459b6c..4270ca06f 100755 --- a/update/2_4_13.php +++ b/update/2_4_13.php @@ -26,7 +26,6 @@ $files = [ 'templates\scadenzario\scadenzario.html', 'templates\registro_iva\pdfgen.registro_iva.php', 'templates\registro_iva\registroiva_body.html', - 'templates\registro_iva\header.php', 'templates\registro_iva\body.php', 'templates\preventivi_cons\body.php', 'templates\contratti_cons\body.php', From 07636b7e7a97a7aaf83f8fc6c4df959919dba370 Mon Sep 17 00:00:00 2001 From: Luca Date: Fri, 25 Mar 2022 19:26:50 +0100 Subject: [PATCH 4/6] Introduzione modulo fasce orarie e modulo eventi --- lib/util.php | 2 +- modules/eventi/actions.php | 92 ++++++++++++++ modules/eventi/add.php | 43 +++++++ modules/eventi/ajax/select.php | 35 ++++++ modules/eventi/edit.php | 74 +++++++++++ modules/eventi/init.php | 24 ++++ modules/fasce_orarie/actions.php | 103 +++++++++++++++ modules/fasce_orarie/add.php | 38 ++++++ modules/fasce_orarie/ajax/select.php | 35 ++++++ modules/fasce_orarie/edit.php | 182 +++++++++++++++++++++++++++ modules/fasce_orarie/init.php | 24 ++++ src/Util/Query.php | 4 +- update/2_4_33.php | 25 ++++ update/2_4_33.sql | 70 +++++++++++ update/tables.php | 3 + 15 files changed, 751 insertions(+), 3 deletions(-) create mode 100644 modules/eventi/actions.php create mode 100644 modules/eventi/add.php create mode 100644 modules/eventi/ajax/select.php create mode 100644 modules/eventi/edit.php create mode 100644 modules/eventi/init.php create mode 100644 modules/fasce_orarie/actions.php create mode 100644 modules/fasce_orarie/add.php create mode 100644 modules/fasce_orarie/ajax/select.php create mode 100644 modules/fasce_orarie/edit.php create mode 100644 modules/fasce_orarie/init.php create mode 100644 update/2_4_33.php create mode 100644 update/2_4_33.sql diff --git a/lib/util.php b/lib/util.php index cde7af85a..0ed471c86 100755 --- a/lib/util.php +++ b/lib/util.php @@ -185,7 +185,7 @@ if (!function_exists('replace')) { */ function replace($string, $array) { - return str_replace(array_keys($array), array_values($array), $string); + return str_replace(array_keys($array), array_values($array), (string) $string); } } diff --git a/modules/eventi/actions.php b/modules/eventi/actions.php new file mode 100644 index 000000000..60712b5df --- /dev/null +++ b/modules/eventi/actions.php @@ -0,0 +1,92 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +switch (post('op')) { + case 'update': + $nome = post('nome'); + $data = post('data'); + $id_nazione = post('id_nazione'); + $id_regione = post('id_regione'); + $is_recurring = post('is_recurring'); + $is_bank_holiday = post('is_recurring'); + + if ($dbo->fetchNum('SELECT * FROM `zz_events` WHERE `nome`='.prepare($nome).' AND `id`!='.prepare($id_record)) == 0) { + + $dbo->update('zz_events', [ + 'nome' => $nome, + 'data' => $data, + 'id_nazione' =>$id_nazione, + 'id_regione' => $id_regione, + 'is_recurring' => $is_recurring, + 'is_bank_holiday' => $is_bank_holiday, + ], [ + 'id' => $id_record, + ]); + + + flash()->info(tr('Salvataggio completato.')); + } else { + flash()->error(tr("E' già presente un _TYPE_ con lo stesso nome", [ + '_TYPE_' => 'evento', + ])); + } + + break; + + case 'add': + $nome = post('nome'); + $id_nazione = post('id_nazione'); + if ($dbo->fetchNum('SELECT * FROM `zz_events` WHERE `id_nazione` = '.prepare($id_nazione).' AND `nome`='.prepare($nome)) == 0) { + + $dbo->insert('zz_events', [ + 'nome' => $nome, + 'id_nazione' => $id_nazione, + ]); + + $id_record = $dbo->lastInsertedID(); + + if (isAjaxRequest()) { + echo json_encode(['id' => $id_record, 'text' => $nome]); + } + + flash()->info(tr('Aggiunto nuovo _TYPE_', [ + '_TYPE_' => 'evento', + ])); + } else { + flash()->error(tr("E' già presente un _TYPE_ con lo stesso nome e nazione", [ + '_TYPE_' => 'evento', + ])); + } + + break; + + case 'delete': + + $dbo->delete('zz_events', [ + 'id' => $id_record, + ]); + + flash()->info(tr('_TYPE_ eliminato con successo.', [ + '_TYPE_' => 'Evento', + ])); + + break; +} diff --git a/modules/eventi/add.php b/modules/eventi/add.php new file mode 100644 index 000000000..e937fa9f0 --- /dev/null +++ b/modules/eventi/add.php @@ -0,0 +1,43 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +?>
    + + + +
    +
    + {[ "type": "text", "label": "", "name": "nome", "required": 1 ]} +
    + +
    + {[ "type": "select", "label": "", "name": "id_nazione", "required": 1, "ajax-source": "nazioni" ]} +
    + +
    + + +
    +
    + +
    +
    +
    diff --git a/modules/eventi/ajax/select.php b/modules/eventi/ajax/select.php new file mode 100644 index 000000000..d1d9dab8c --- /dev/null +++ b/modules/eventi/ajax/select.php @@ -0,0 +1,35 @@ +. + */ + +include_once __DIR__.'/../../../core.php'; + +switch ($resource) { + case 'fasce_orarie': + $query = 'SELECT id, nome AS descrizione FROM zz_events |where| ORDER BY nome ASC'; + + foreach ($elements as $element) { + $filter[] = 'id='.prepare($element); + } + + if (!empty($search)) { + $search_fields[] = 'nome LIKE '.prepare('%'.$search.'%'); + } + + break; +} diff --git a/modules/eventi/edit.php b/modules/eventi/edit.php new file mode 100644 index 000000000..7371db15a --- /dev/null +++ b/modules/eventi/edit.php @@ -0,0 +1,74 @@ +. + */ + +use Carbon\Carbon; +include_once __DIR__.'/../../core.php'; + +//$block_edit = $record['is_predefined']; + +?> + +
    + + + + +
    +
    +

    +
    + +
    +
    +
    + {[ "type": "text", "label": "", "name": "nome", "required": 1, "value": "$nome$" ]} +
    + +
    + {[ "type": "date", "label": "", "name": "data", "required": 1, "value": "$data$" ]} +
    +
    + +
    +
    + {[ "type": "select", "label": "", "name": "id_nazione", "required": 1, "value": "$id_nazione$", "ajax-source": "nazioni" ]} +
    + +
    + {[ "type": "select", "label": "", "name": "id_regione", "value": "$id_regione$", "ajax-source": "regioni" ]} +
    +
    + +
    +
    + {[ "type": "checkbox", "label": "", "name": "is_recurring", "value": "$is_recurring$" ]} +
    + +
    + {[ "type": "checkbox", "label": "", "name": "is_bank_holiday", "value": "$is_bank_holiday$" ]} +
    +
    + +
    +
    +
    + + + + diff --git a/modules/eventi/init.php b/modules/eventi/init.php new file mode 100644 index 000000000..2b56bc5e3 --- /dev/null +++ b/modules/eventi/init.php @@ -0,0 +1,24 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +if (isset($id_record)) { + $record = $dbo->fetchOne('SELECT * FROM `zz_events` WHERE id='.prepare($id_record)); +} diff --git a/modules/fasce_orarie/actions.php b/modules/fasce_orarie/actions.php new file mode 100644 index 000000000..4ba9f1090 --- /dev/null +++ b/modules/fasce_orarie/actions.php @@ -0,0 +1,103 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +switch (post('op')) { + case 'update': + $nome = post('nome'); + $giorni = (array) post('giorni'); + $ora_inizio = post('ora_inizio'); + $ora_fine = post('ora_fine'); + $include_bank_holidays = post('include_bank_holidays'); + + if ($dbo->fetchNum('SELECT * FROM `in_fasceorarie` WHERE `nome`='.prepare($nome).' AND `id`!='.prepare($id_record)) == 0) { + + $dbo->update('in_fasceorarie', [ + 'nome' => $nome, + 'giorni' => $giorni ? implode(',' , $giorni) : null, + 'ora_inizio' =>$ora_inizio, + 'ora_fine' => $ora_fine, + 'include_bank_holidays' => $include_bank_holidays, + ], [ + 'id' => $id_record, + ]); + + + flash()->info(tr('Salvataggio completato.')); + } else { + flash()->error(tr("E' già presente una _TYPE_ con lo stesso nome", [ + '_TYPE_' => 'fascia oraria', + ])); + } + + break; + + case 'add': + $nome = post('nome'); + + if ($dbo->fetchNum('SELECT * FROM `in_fasceorarie` WHERE `nome`='.prepare($nome)) == 0) { + + $dbo->insert('in_fasceorarie', [ + 'nome' => $nome, + ]); + + $id_record = $dbo->lastInsertedID(); + + if (isAjaxRequest()) { + echo json_encode(['id' => $id_record, 'text' => $nome]); + } + + flash()->info(tr('Aggiunta nuova _TYPE_', [ + '_TYPE_' => 'fascia oraria', + ])); + } else { + flash()->error(tr("E' già presente una _TYPE_ con lo stesso nome", [ + '_TYPE_' => 'fascia oraria', + ])); + } + + break; + + case 'delete': + $tipi_interventi = $dbo->fetchNum('SELECT idtipointervento FROM in_fasceorarie_tipiintervento WHERE idfasciaoraria='.prepare($id_record)); + + if (isset($id_record) && empty($tipi_interventi)) { + + $dbo->delete('in_fasceorarie', [ + 'id' => $id_record, + 'can_delete' => 1, + ]); + + flash()->info(tr('_TYPE_ eliminata con successo.', [ + '_TYPE_' => 'Fascia oraria', + ])); + + } else { + + flash()->error(tr('Sono presenti dei tipi interventi collegate a questa fascia oraria.')); + + # soft delete + /*$dbo->update('in_fasceorarie', [ + 'deleted_at' => date('Y-m-d H:i:s'), + ], ['id' => $id_record, 'can_delete' => 1]);*/ + } + + break; +} diff --git a/modules/fasce_orarie/add.php b/modules/fasce_orarie/add.php new file mode 100644 index 000000000..afb7a3023 --- /dev/null +++ b/modules/fasce_orarie/add.php @@ -0,0 +1,38 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +?>
    + + + +
    +
    + {[ "type": "text", "label": "", "name": "nome", "required": 1 ]} +
    +
    + + +
    +
    + +
    +
    +
    diff --git a/modules/fasce_orarie/ajax/select.php b/modules/fasce_orarie/ajax/select.php new file mode 100644 index 000000000..26261053e --- /dev/null +++ b/modules/fasce_orarie/ajax/select.php @@ -0,0 +1,35 @@ +. + */ + +include_once __DIR__.'/../../../core.php'; + +switch ($resource) { + case 'fasce_orarie': + $query = 'SELECT id, nome AS descrizione FROM in_fasceorarie |where| ORDER BY nome ASC'; + + foreach ($elements as $element) { + $filter[] = 'id='.prepare($element); + } + + if (!empty($search)) { + $search_fields[] = 'nome LIKE '.prepare('%'.$search.'%'); + } + + break; +} diff --git a/modules/fasce_orarie/edit.php b/modules/fasce_orarie/edit.php new file mode 100644 index 000000000..1123a91dc --- /dev/null +++ b/modules/fasce_orarie/edit.php @@ -0,0 +1,182 @@ +. + */ + + +include_once __DIR__.'/../../core.php'; + +//$block_edit = $record['is_predefined']; + +?> + +
    + + + + +
    +
    +

    +
    + +
    +
    +
    + {[ "type": "text", "label": "", "name": "nome", "required": 1, "value": "$nome$" ]} +
    + +
    + {[ "type": "select", "multiple":"1", "label": "", "name": "giorni[]", "required": 0, "value": "$giorni$", "values": "list=\"1\":\"\", \"2\":\"\", \"3\":\"\", \"4\":\"\", \"5\":\"\", \"6\":\"\", \"7\":\"\"" ]} +
    +
    + +
    +
    + {[ "type": "time", "label": "", "name": "ora_inizio", "required": 1, "value": "$ora_inizio$" ]} +
    + +
    + {[ "type": "time", "label": "", "name": "ora_fine", "required": 1, "value": "$ora_fine$" ]} +
    + +
    + {[ "type": "checkbox", "label": "", "name": "include_bank_holidays", "required": 0, "value": "$include_bank_holidays$" ]} +
    + + + +
    +
    +
    + + +
    +
    +

    +
    + +
    +
    + + fetchArray('SELECT * FROM `co_pagamenti` WHERE descrizione='.prepare($record['descrizione']).' ORDER BY `num_giorni` ASC'); + $numero_data = 1; + foreach ($results as $result) { + + } + + ?> + +
    +
    + + + +
    +
    +
    + +
    + + + +
    +
    +

    '.tr('Nuova data').'

    +
    +
    + + +
    +
    + {[ "type": "text", "label": "'.tr('Nome').'", "name": "nome[-id-]"]} +
    + +
    + {[ "type": "date", "label": "'.tr('Data').'", "name": "data[-id-]" ]} +
    + +
    + {[ "type": "checkbox", "label": "'.tr('Data ricorrente').'", "name": "data_ricorrente[-id-]", "value": "" ]} +
    +
    + +
    +
    +'; + +?> + + +fetchArray('SELECT in_tipiintervento.codice, in_tipiintervento.descrizione, in_tipiintervento.idtipointervento FROM in_tipiintervento LEFT JOIN in_fasceorarie_tipiintervento ON in_tipiintervento.idtipointervento=in_fasceorarie_tipiintervento.idtipointervento WHERE in_fasceorarie_tipiintervento.idfasciaoraria='.prepare($id_record)); + +if (!empty($elementi)) { + echo ' +
    +
    +

    '.tr('Tipi interventi collegati: _NUM_', [ + '_NUM_' => count($elementi), + ]).'

    +
    + +
    +
    +
    +
      '; + + foreach ($elementi as $elemento) { + $descrizione = tr('_REF_ (_TIPO_INTERVENTO_)', [ + '_REF_' => $elemento['descrizione'], + '_TIPO_INTERVENTO_' => $elemento['codice'], + ]); + + $modulo = 'Tipi di intervento'; + $id = $elemento['idtipointervento']; + + echo ' +
    • '.Modules::link($modulo, $id, $descrizione).'
    • '; + + } + + echo ' +
    +
    +
    '; +} + +?> + + + + diff --git a/modules/fasce_orarie/init.php b/modules/fasce_orarie/init.php new file mode 100644 index 000000000..05d90bc3b --- /dev/null +++ b/modules/fasce_orarie/init.php @@ -0,0 +1,24 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +if (isset($id_record)) { + $record = $dbo->fetchOne('SELECT * FROM `in_fasceorarie` WHERE id='.prepare($id_record)); +} diff --git a/src/Util/Query.php b/src/Util/Query.php index 2aed990ca..ac954036a 100755 --- a/src/Util/Query.php +++ b/src/Util/Query.php @@ -79,7 +79,7 @@ class Query $user = Auth::user(); // Sostituzione periodi temporali - preg_match('|date_period\((.+?)\)|', $query, $matches); + preg_match('|date_period\((.+?)\)|', (string) $query, $matches); $date_query = $date_filter = null; if (!empty($matches)) { $dates = explode(',', $matches[1]); @@ -102,7 +102,7 @@ class Query } // Sostituzione periodi temporali - preg_match('|segment\((.+?)\)|', $query, $matches); + preg_match('|segment\((.+?)\)|', (string) $query, $matches); $segment_name = !empty($matches[1]) ? $matches[1] : 'id_segment'; $segment_filter = !empty($matches[0]) ? $matches[0] : 'segment'; diff --git a/update/2_4_33.php b/update/2_4_33.php new file mode 100644 index 000000000..884e9112c --- /dev/null +++ b/update/2_4_33.php @@ -0,0 +1,25 @@ +fetchArray('SELECT * FROM in_fasceorarie'); +$tipi_intervento = $database->fetchArray('SELECT * FROM in_tipiintervento'); + +foreach ($fascie_orarie as $fascia_oraria) { + + foreach ($tipi_intervento as $tipo_intervento) { + + $database->insert('in_fasceorarie_tipiintervento', [ + 'idfasciaoraria' => $fascia_oraria['id'], + 'idtipointervento' => $tipo_intervento['idtipointervento'], + 'costo_orario' => $tipo_intervento['costo_orario'], + 'costo_km' => $tipo_intervento['costo_km'], + 'costo_diritto_chiamata' => $tipo_intervento['costo_diritto_chiamata'], + 'costo_orario_tecnico' => $tipo_intervento['costo_orario_tecnico'], + 'costo_km_tecnico' => $tipo_intervento['costo_km_tecnico'], + 'costo_diritto_chiamata_tecnico' => $tipo_intervento['costo_km_tecnico'], + ]); + + } + +} + +?> \ No newline at end of file diff --git a/update/2_4_33.sql b/update/2_4_33.sql new file mode 100644 index 000000000..3043b741d --- /dev/null +++ b/update/2_4_33.sql @@ -0,0 +1,70 @@ +-- Nuovo modulo "Fasce orarie" +CREATE TABLE IF NOT EXISTS `in_fasceorarie` ( + `id` int NOT NULL AUTO_INCREMENT, + `nome` varchar(255) NOT NULL, + `giorni` varchar(255) DEFAULT NULL, + `ora_inizio` time DEFAULT NULL, + `ora_fine` time DEFAULT NULL, + `can_delete` BOOLEAN NOT NULL DEFAULT TRUE, + `include_bank_holidays` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +INSERT INTO `zz_modules` (`id`, `name`, `title`, `directory`, `options`, `options2`, `icon`, `version`, `compatibility`, `order`, `parent`, `default`, `enabled`, `use_notes`, `use_checklists`) VALUES (NULL, 'Fasce orarie', 'Fasce orarie', 'fasce_orarie', 'SELECT |select| FROM `in_fasceorarie` WHERE 1=1 HAVING 2=2', '', 'fa fa-angle-right', '2.4.32', '2.4.32', '1', (SELECT id FROM zz_modules t WHERE t.name = 'Interventi'), '1', '1', '0', '0'); + +INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `visible`, `format`, `default`) VALUES +(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Fasce orarie'), 'id', 'in_fasceorarie.id', 1, 1, 0, 1), +(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Fasce orarie'), 'Nome', 'in_fasceorarie.nome', 2, 1, 0, 1), +(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Fasce orarie'), 'Festività', 'IF(in_fasceorarie.include_bank_holidays, ''Sì'', ''No'')', 3, 1, 0, 1); + + + +-- Fascia oraria "Ordinaria" +INSERT INTO `in_fasceorarie` (`id`, `nome`, `giorni`, `ora_inizio`, `ora_fine`, `can_delete`) VALUES (NULL, 'Ordinario', '1,2,3,4,5,6,7', '00:00', '23:59', '0'); + +-- Relazione fasca oraria / tipo intervento +CREATE TABLE IF NOT EXISTS `in_fasceorarie_tipiintervento` ( + `idfasciaoraria` int NOT NULL, + `idtipointervento` int NOT NULL, + `costo_orario` decimal(12,6) NOT NULL, + `costo_km` decimal(12,6) NOT NULL, + `costo_diritto_chiamata` decimal(12,6) NOT NULL, + `costo_orario_tecnico` decimal(12,6) NOT NULL, + `costo_km_tecnico` decimal(12,6) NOT NULL, + `costo_diritto_chiamata_tecnico` decimal(12,6) NOT NULL, + PRIMARY KEY (`idfasciaoraria`,`idtipointervento`), + FOREIGN KEY (`idfasciaoraria`) REFERENCES `in_fasceorarie` (`id`), + FOREIGN KEY (`idtipointervento`) REFERENCES `in_tipiintervento` (`idtipointervento`), + KEY `idtipointervento` (`idtipointervento`) +) ENGINE=InnoDB; + + +-- Nuovo modulo "Eventi" +CREATE TABLE IF NOT EXISTS `zz_events` ( + `id` int NOT NULL AUTO_INCREMENT, + `nome` varchar(255) NOT NULL, + `data` date NOT NULL, + `id_nazione` int NOT NULL, + `id_regione` int DEFAULT NULL, + `is_recurring` tinyint(1) NOT NULL DEFAULT '0', + `is_bank_holiday` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + FOREIGN KEY (`id_nazione`) REFERENCES `an_nazioni` (`id`) +) ENGINE=InnoDB; + + +INSERT INTO `zz_modules` (`id`, `name`, `title`, `directory`, `options`, `options2`, `icon`, `version`, `compatibility`, `order`, `parent`, `default`, `enabled`, `use_notes`, `use_checklists`) VALUES (NULL, 'Eventi', 'Eventi', 'eventi', 'SELECT |select| FROM `zz_events` INNER JOIN `an_nazioni` ON `an_nazioni`.id = `zz_events`.id_nazione WHERE 1=1 HAVING 2=2', '', 'fa fa-angle-right', '2.4.32', '2.4.32', '1', (SELECT id FROM zz_modules t WHERE t.name = 'Tabelle'), '1', '1', '0', '0'); + +INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `visible`, `format`, `default`) VALUES +(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Eventi'), 'id', 'zz_events.id', 1, 0, 0, 1), +(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Eventi'), 'Nome', 'zz_events.nome', 2, 1, 0, 1), +(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Eventi'), 'Nazione', 'an_nazioni.nome', 3, 1, 0, 1) +(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Eventi'), 'Data', 'zz_events.data', 4, 1, 1, 1),; + +-- Natale +INSERT INTO `zz_events` (`id`, `nome`, `data`, `id_nazione`, `id_regione`, `is_recurring`, `is_bank_holiday`) VALUES (NULL, 'Natale', '2022-12-25', (SELECT id FROM an_nazioni WHERE nome = 'Italia'), NULL, '1', '1'); + +-- Fix ordine colonne Conto dare e Conto avere in Prima nota +UPDATE `zz_views` SET `order` = '8' WHERE `zz_views`.`name` = 'Conto dare'; +UPDATE `zz_views` SET `order` = '9' WHERE `zz_views`.`name` = 'Conto avere'; +UPDATE `zz_views` SET `order` = '20' WHERE `zz_views`.`name` = '_print_'; diff --git a/update/tables.php b/update/tables.php index a3d0ee182..2fc3a048e 100755 --- a/update/tables.php +++ b/update/tables.php @@ -82,6 +82,8 @@ return [ 'in_tariffe', 'in_tipiintervento', 'in_vociservizio', + 'in_fasceorarie', + 'in_fasceorarie_tipiintervento', 'mg_articoli', 'mg_fornitore_articolo', 'mg_categorie', @@ -118,6 +120,7 @@ return [ 'zz_checklist_items', 'zz_documenti', 'zz_documenti_categorie', + 'zz_events', 'zz_field_record', 'zz_fields', 'zz_files', From 4ba06353d066f355eda876d74130ba101ebd135e Mon Sep 17 00:00:00 2001 From: Luca Date: Sat, 26 Mar 2022 11:55:01 +0100 Subject: [PATCH 5/6] Update 2_4_13.php --- update/2_4_13.php | 1 - 1 file changed, 1 deletion(-) diff --git a/update/2_4_13.php b/update/2_4_13.php index 4270ca06f..6e4fdcc76 100755 --- a/update/2_4_13.php +++ b/update/2_4_13.php @@ -32,7 +32,6 @@ $files = [ 'templates\magazzino_inventario\pdfgen.magazzino_inventario.php', 'templates\magazzino_inventario\magazzino_inventario_body.html', 'templates\magazzino_inventario\magazzino_inventario.html', - 'modules\contratti\modutil.php', 'modules\contratti\plugins\contratti.ordiniservizio.interventi.php', 'modules\contratti\plugins\contratti.ordiniservizio.php', 'modules\interventi\src\TipoSessione.php', From e06d4d4c86d44cd37d6b167315d328b59a2b94bb Mon Sep 17 00:00:00 2001 From: Luca Date: Mon, 28 Mar 2022 09:07:45 +0200 Subject: [PATCH 6/6] Update 2_4_33.sql --- update/2_4_33.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/update/2_4_33.sql b/update/2_4_33.sql index 3043b741d..90dc6fed4 100644 --- a/update/2_4_33.sql +++ b/update/2_4_33.sql @@ -58,8 +58,8 @@ INSERT INTO `zz_modules` (`id`, `name`, `title`, `directory`, `options`, `option INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `visible`, `format`, `default`) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Eventi'), 'id', 'zz_events.id', 1, 0, 0, 1), (NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Eventi'), 'Nome', 'zz_events.nome', 2, 1, 0, 1), -(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Eventi'), 'Nazione', 'an_nazioni.nome', 3, 1, 0, 1) -(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Eventi'), 'Data', 'zz_events.data', 4, 1, 1, 1),; +(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Eventi'), 'Nazione', 'an_nazioni.nome', 3, 1, 0, 1), +(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Eventi'), 'Data', 'zz_events.data', 4, 1, 1, 1); -- Natale INSERT INTO `zz_events` (`id`, `nome`, `data`, `id_nazione`, `id_regione`, `is_recurring`, `is_bank_holiday`) VALUES (NULL, 'Natale', '2022-12-25', (SELECT id FROM an_nazioni WHERE nome = 'Italia'), NULL, '1', '1');