diff --git a/composer.json b/composer.json index 8b4c19b1d..c16789eae 100755 --- a/composer.json +++ b/composer.json @@ -29,11 +29,12 @@ "ext-xsl": "*", "ext-zip": "*", "aluguest/ical-easy-reader": "^1.5", - "voku/stringy": "~6.0", "davidepastore/codice-fiscale": "^0.6.0", + "digitick/sepa-xml": "^2.1", "dragonmantank/cron-expression": "^1.0", "ezyang/htmlpurifier": "^4.8", "filp/whoops": "^2.1", + "greenlion/php-sql-parser": "^4.5", "guzzlehttp/guzzle": "^7.0.1", "ifsnop/mysqldump-php": "^2.3", "illuminate/database": "^8.0", @@ -58,9 +59,9 @@ "symfony/translation": "^3.3", "symfony/var-dumper": "^3.3", "thenetworg/oauth2-azure": "^2.0", - "willdurand/geocoder": "^4.2", - "digitick/sepa-xml": "^2.1", - "wdog/sdd_ita": "dev-master" + "voku/stringy": "~6.0", + "wdog/sdd_ita": "dev-master", + "willdurand/geocoder": "^4.2" }, "require-dev": { "codeception/codeception": "^4.0", diff --git a/include/common/importa.php b/include/common/importa.php index 55090a656..0d1bcf38d 100755 --- a/include/common/importa.php +++ b/include/common/importa.php @@ -32,6 +32,7 @@ $original_module = Modules::get($documento->module); $name = !empty($documento_finale) ? $documento_finale->module : $options['module']; $final_module = Modules::get($name); +$id_segment = $_SESSION['module_'.$final_module['id']]['id_segment']; // IVA predefinita $id_iva = $id_iva ?: setting('Iva predefinita'); @@ -87,8 +88,6 @@ if (!empty($options['create_document'])) { // Opzioni aggiuntive per le Fatture if (in_array($final_module['name'], ['Fatture di vendita', 'Fatture di acquisto'])) { - $id_segment = $_SESSION['module_'.$final_module['id']]['id_segment']; - $stato_predefinito = $database->fetchOne("SELECT id FROM co_statidocumento WHERE descrizione = 'Bozza'"); if (!empty($options['reversed'])) { @@ -113,15 +112,11 @@ if (!empty($options['create_document'])) { {[ "type": "select", "label": "'.tr('Stato').'", "name": "id_stato", "required": 1, "values": "query=SELECT * FROM co_statidocumento WHERE descrizione IN (\'Emessa\', \'Bozza\')", "value": "'.$stato_predefinito['id'].'"]} -
+
{[ "type": "select", "label": "'.tr('Tipo documento').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, CONCAT(codice_tipo_documento_fe, \' - \', descrizione) AS descrizione FROM co_tipidocumento WHERE enabled = 1 AND dir = '.prepare($dir).' ORDER BY codice_tipo_documento_fe", "value": "'.$idtipodocumento.'" ]}
- -
- {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.prepare($final_module['id']).' ORDER BY name", "value": "'.$id_segment.'" ]} -
-
+
{[ "type": "select", "label": "'.tr('Ritenuta previdenziale').'", "name": "id_ritenuta_contributi", "value": "$id_ritenuta_contributi$", "values": "query=SELECT * FROM co_ritenuta_contributi" ]}
'; } @@ -184,6 +179,9 @@ if (!empty($options['create_document'])) { } echo ' +
+ {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $final_module['id'], 'is_sezionale' => 1]).', "value": "'.$id_segment.'" ]} +
'; diff --git a/include/manager.php b/include/manager.php index 0995a0d05..86170717e 100755 --- a/include/manager.php +++ b/include/manager.php @@ -74,7 +74,7 @@ if (!empty($type) && $type != 'menu' && $type != 'custom') { echo '
- {[ "type": "select", "name": "id_segment_", "required": 0, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module = '.prepare($id_module).'", "value": "'.$_SESSION['module_'.$id_module]['id_segment'].'" ]} + {[ "type": "select", "name": "id_segment_", "required": 0, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $id_module]).', "value": "'.$_SESSION['module_'.$id_module]['id_segment'].'" ]}

'; diff --git a/lib/common.php b/lib/common.php index 9f0e7209c..719704069 100755 --- a/lib/common.php +++ b/lib/common.php @@ -208,3 +208,19 @@ function parseScontoCombinato($combinato) return (1 - $result) * 100; } + +/** + * Funzione che gestisce il parsing di uno sconto combinato e la relativa trasformazione in sconto fisso. + * Esempio: (40 + 10) % = 44 %. + * + * @param $combinato + * + * @return float|int + */ +function getSegmentPredefined($id_module) +{ + $id_segment = database()->selectOne('zz_segments', 'id', ['id_module' => $id_module, 'predefined' => 1])['id']; + + return $id_segment; +} + diff --git a/lib/functions.php b/lib/functions.php index 17f1468e1..ec482f461 100755 --- a/lib/functions.php +++ b/lib/functions.php @@ -341,7 +341,10 @@ function redirectOperation($id_module, $id_record) */ function prepareToField($string) { - return str_replace('"', '"', $string); + $string = str_replace('"', '"', $string); + $string = str_replace('"', '"', $string); + + return $string; } /** diff --git a/modules/articoli/bulk.php b/modules/articoli/bulk.php index b57847faf..1c439defe 100644 --- a/modules/articoli/bulk.php +++ b/modules/articoli/bulk.php @@ -28,6 +28,12 @@ use Plugins\ListinoClienti\DettaglioPrezzo; include_once __DIR__.'/../../core.php'; +$module_preventivi = 'Preventivi'; + +// Segmenti +$id_preventivi = Modules::get($module_preventivi)['id']; +$id_segment = $_SESSION['module_'.$id_preventivi]['id_segment']; + switch (post('op')) { case 'change-acquisto': foreach ($id_records as $id) { @@ -183,7 +189,7 @@ switch (post('op')) { $tipo = TipoSessione::find($id_tipo); $n_articoli = 0; - $preventivo = Preventivo::build($anagrafica, $tipo, $nome, $data, 0); + $preventivo = Preventivo::build($anagrafica, $tipo, $nome, $data, 0, post('id_segment')); $id_preventivo = $preventivo->id; foreach ($id_records as $id) { @@ -483,6 +489,7 @@ $operations['crea-preventivo'] = [ 'msg' => tr('Ogni articolo selezionato, verrà aggiunto al preventivo').'

{[ "type": "text", "label": "'.tr('Nome preventivo').'", "name": "nome", "required": 1 ]} {[ "type": "select", "label": "'.tr('Cliente').'", "name": "id_cliente", "ajax-source": "clienti", "required": 1 ]} + {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(["id_module" => $id_preventivi, 'is_sezionale' => 1]).', "value": "'.$id_segment.'" ]} {[ "type": "select", "label": "'.tr('Tipo di attività').'", "name": "id_tipo", "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento", "required": 1 ]} {[ "type": "date", "label": "'.tr('Data').'", "name": "data", "required": 1, "value": "-now-" ]}', 'button' => tr('Procedi'), diff --git a/modules/contratti/actions.php b/modules/contratti/actions.php index 768745c8f..41342152f 100644 --- a/modules/contratti/actions.php +++ b/modules/contratti/actions.php @@ -34,9 +34,10 @@ switch (post('op')) { case 'add': $idanagrafica = post('idanagrafica'); $anagrafica = Anagrafica::find($idanagrafica); + $id_segment = post('id_segment'); // Generazione Contratto - $contratto = Contratto::build($anagrafica, post('nome')); + $contratto = Contratto::build($anagrafica, post('nome'), $id_segment); // Salvataggio informazioni sul rinnovo $contratto->idstato = post('idstato'); @@ -141,7 +142,7 @@ switch (post('op')) { // Duplica contratto case 'copy': $new = $contratto->replicate(); - $new->numero = Contratto::getNextNumero($contratto->data_bozza); + $new->numero = Contratto::getNextNumero($contratto->data_bozza, $contratto->id_segment); $stato = Stato::where('descrizione', '=', 'Bozza')->first(); $new->stato()->associate($stato); @@ -395,7 +396,7 @@ switch (post('op')) { $new_contratto->data_accettazione = $contratto->data_conclusione->copy()->addDays(1); $new_contratto->data_conclusione = $new_contratto->data_accettazione->copy()->add($diff); $new_contratto->data_bozza = Carbon::now(); - $new_contratto->numero = Contratto::getNextNumero($new_contratto->data_bozza); + $new_contratto->numero = Contratto::getNextNumero($new_contratto->data_bozza, $new_contratto->id_segment); $stato = Stato::where('descrizione', '=', 'Bozza')->first(); $new_contratto->stato()->associate($stato); @@ -514,7 +515,7 @@ switch (post('op')) { // Creazione del contratto al volo if (post('create_document') == 'on') { - $contratto = Contratto::build($documento->anagrafica, $documento->nome); + $contratto = Contratto::build($documento->anagrafica, $documento->nome, post('id_segment')); $contratto->idpagamento = $documento->idpagamento; $contratto->idsede = $id_sede; diff --git a/modules/contratti/add.php b/modules/contratti/add.php index 8d82e864e..583f64831 100755 --- a/modules/contratti/add.php +++ b/modules/contratti/add.php @@ -42,19 +42,25 @@ echo '
-
+
{[ "type": "select", "label": "'.tr('Stato').'", "name": "idstato", "required": 1, "values": "query='.$stati.'" ]}
-
+
+ {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $id_module, 'is_sezionale' => 1]).', "value": "'.$_SESSION['module_'.$id_module]['id_segment'].'" ]} +
+
+ +
+
{[ "type": "date", "label": "'.tr('Data accettazione').'", "name": "data_accettazione" ]}
-
+
{[ "type": "date", "label": "'.tr('Data conclusione').'", "name": "data_conclusione" ]}
-
+
{[ "type": "number", "label": "'.tr('Validità contratto').'", "name": "validita", "decimals": "0", "icon-after": "choice|period|'.$record['tipo_validita'].'", "help": "'.tr('Il campo Validità contratto viene utilizzato per il calcolo della Data di conclusione del contratto').'" ]}
diff --git a/modules/contratti/bulk.php b/modules/contratti/bulk.php index 4a578dd43..4ae2d3804 100755 --- a/modules/contratti/bulk.php +++ b/modules/contratti/bulk.php @@ -141,7 +141,7 @@ switch (post('op')) { $new_contratto = $contratto->replicate(); - $new_contratto->numero = Contratto::getNextNumero($contratto->data_conclusione->copy()->addDays(1)); + $new_contratto->numero = Contratto::getNextNumero($contratto->data_conclusione->copy()->addDays(1), $contratto->id_segment); $new_contratto->idcontratto_prev = $contratto->id; $new_contratto->data_accettazione = $contratto->data_conclusione->copy()->addDays(1); @@ -227,7 +227,7 @@ $operations['crea_fattura'] = [ 'data' => [ 'title' => tr('Fatturare i _TYPE_ selezionati?', ['_TYPE_' => strtolower($module['name'])]), 'msg' => '{[ "type": "checkbox", "label": "'.tr('Aggiungere alle fatture di vendita non ancora emesse?').'", "placeholder": "'.tr('Aggiungere alle fatture esistenti non ancora emesse?').'", "name": "accodare" ]}
- {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' ORDER BY name", "value": "'.$id_segment.'" ]}
+ {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(["id_module" => $id_fatture, 'is_sezionale' => 1]).', "value": "'.$id_segment.'" ]}
{[ "type": "select", "label": "'.tr('Tipo documento').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, CONCAT(codice_tipo_documento_fe, \' - \', descrizione) AS descrizione FROM co_tipidocumento WHERE enabled = 1 AND dir =\'entrata\' ORDER BY codice_tipo_documento_fe", "value": "'.$idtipodocumento.'" ]}', 'button' => tr('Procedi'), 'class' => 'btn btn-lg btn-warning', diff --git a/modules/contratti/src/Contratto.php b/modules/contratti/src/Contratto.php index 22c2d75d9..db57438ae 100755 --- a/modules/contratti/src/Contratto.php +++ b/modules/contratti/src/Contratto.php @@ -63,7 +63,7 @@ class Contratto extends Document * * @return self */ - public static function build(Anagrafica $anagrafica, $nome) + public static function build(Anagrafica $anagrafica, $nome, $id_segment = null) { $model = new static(); @@ -71,6 +71,7 @@ class Contratto extends Document $id_anagrafica = $anagrafica->id; $id_agente = $anagrafica->idagente; + $id_segment = $id_segment ?: getSegmentPredefined($model->getModule()->id); $id_pagamento = $anagrafica->idpagamento_vendite; if (empty($id_pagamento)) { @@ -82,7 +83,8 @@ class Contratto extends Document $model->nome = $nome; $model->data_bozza = Carbon::now(); - $model->numero = static::getNextNumero($model->data_bozza); + $model->numero = static::getNextNumero($model->data_bozza, $id_segment); + $model->id_segment = $id_segment; if (!empty($id_agente)) { $model->idagente = $id_agente; @@ -269,9 +271,9 @@ class Contratto extends Document * * @return string */ - public static function getNextNumero($data) + public static function getNextNumero($data, $id_segment) { - $maschera = setting('Formato codice contratti'); + $maschera = Generator::getMaschera($id_segment); if (strpos($maschera, 'm') !== false) { $ultimo = Generator::getPreviousFrom($maschera, 'co_contratti', 'numero', [ diff --git a/modules/ddt/actions.php b/modules/ddt/actions.php index 42f80dcfa..636e67f2a 100755 --- a/modules/ddt/actions.php +++ b/modules/ddt/actions.php @@ -43,11 +43,12 @@ switch (filter('op')) { $idanagrafica = post('idanagrafica'); $data = post('data'); $id_tipo = post('idtipoddt'); + $id_segment = post('id_segment'); $anagrafica = Anagrafica::find($idanagrafica); $tipo = Tipo::find($id_tipo); - $ddt = DDT::build($anagrafica, $tipo, $data); + $ddt = DDT::build($anagrafica, $tipo, $data, $id_segment); $id_record = $ddt->id; $ddt->idcausalet = post('idcausalet'); @@ -325,7 +326,7 @@ switch (filter('op')) { if (post('create_document') == 'on') { $tipo = Tipo::where('dir', $documento->direzione)->first(); - $ddt = DDT::build($documento->anagrafica, $tipo, post('data')); + $ddt = DDT::build($documento->anagrafica, $tipo, post('data'), post('id_segment')); $ddt->idpagamento = $documento->idpagamento; $ddt->id_documento_fe = $documento->id_documento_fe; @@ -483,7 +484,7 @@ switch (filter('op')) { $stato = Stato::where('descrizione', '=', 'Evaso')->first(); // Duplicazione DDT - $copia = DDT::build($ddt->anagrafica, $tipo, $ddt->data); + $copia = DDT::build($ddt->anagrafica, $tipo, $ddt->data, post('id_segment')); $copia->stato()->associate($stato); $copia->id_ddt_trasporto_interno = $ddt->id; $copia->idaspettobeni = $ddt->idaspettobeni; @@ -531,7 +532,7 @@ switch (filter('op')) { case 'copy': $new = $ddt->replicate(); $new->numero = DDT::getNextNumero($new->data, $dir); - $new->numero_esterno = DDT::getNextNumeroSecondario($new->data, $dir); + $new->numero_esterno = DDT::getNextNumeroSecondario($new->data, $dir, $new->id_segment); $stato = Stato::where('descrizione', '=', 'Bozza')->first(); $new->stato()->associate($stato); diff --git a/modules/ddt/add.php b/modules/ddt/add.php index 9336350ae..0835409c9 100755 --- a/modules/ddt/add.php +++ b/modules/ddt/add.php @@ -48,11 +48,11 @@ $id_anagrafica = !empty(get('idanagrafica')) ? get('idanagrafica') : '';
-
+
{[ "type": "date", "label": "", "name": "data", "required": 1, "value": "-now-" ]}
-
+
{[ "type": "select", "label": "", "name": "idanagrafica", "id": "idanagrafica_add", "required": 1, "value": "", "ajax-source": "clienti_fornitori", "icon-after": "add||tipoanagrafica=&readonly_tipo=1" ]}
@@ -60,10 +60,16 @@ $id_anagrafica = !empty(get('idanagrafica')) ? get('idanagrafica') : '';
{[ "type": "select", "label": "", "name": "idtipoddt", "required": 1, "values": "query=SELECT id, descrizione FROM dt_tipiddt WHERE dir=''", "value": "" ]}
+
-
+
+
{[ "type": "select", "label": "", "name": "idcausalet", "required": 1, "value": "", "ajax-source": "causali", "icon-after": "add||||" ]}
+ +
+ {[ "type": "select", "label": "", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": $id_module, 'is_sezionale' => 1]); ?>, "value": "" ]} +
diff --git a/modules/ddt/bulk.php b/modules/ddt/bulk.php index 394b26c42..d72797fe8 100755 --- a/modules/ddt/bulk.php +++ b/modules/ddt/bulk.php @@ -179,7 +179,7 @@ $operations['crea_fattura'] = [ 'data' => [ 'title' => tr('Fatturare i _TYPE_ selezionati?', ['_TYPE_' => strtolower($module['name'])]), 'msg' => '{[ "type": "checkbox", "label": "'.tr('Aggiungere alle _TYPE_ non ancora emesse?', ['_TYPE_' => strtolower($module_fatture)]).'", "placeholder": "'.tr('Aggiungere alle _TYPE_ nello stato bozza?', ['_TYPE_' => strtolower($module_fatture)]).'", "name": "accodare" ]}
- {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' ORDER BY name", "value": "'.$id_segment.'" ]}
+ {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(["id_module" => $id_fatture, 'is_sezionale' => 1]).', "value": "'.$id_segment.'" ]}
{[ "type": "select", "label": "'.tr('Tipo documento').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, CONCAT(codice_tipo_documento_fe, \' - \', descrizione) AS descrizione FROM co_tipidocumento WHERE enabled = 1 AND dir ='.prepare($dir).' ORDER BY codice_tipo_documento_fe", "value": "'.$idtipodocumento.'" ]}', 'button' => tr('Procedi'), 'class' => 'btn btn-lg btn-warning', diff --git a/modules/ddt/modutil.php b/modules/ddt/modutil.php index cc2dc67b5..1dcfd5c51 100644 --- a/modules/ddt/modutil.php +++ b/modules/ddt/modutil.php @@ -42,8 +42,9 @@ function get_new_numeroddt($data) function get_new_numerosecondarioddt($data) { global $dir; + global $id_segment; - return DDT::getNextNumeroSecondario($data, $dir); + return DDT::getNextNumeroSecondario($data, $dir, $id_segment); } /** diff --git a/modules/ddt/src/DDT.php b/modules/ddt/src/DDT.php index ea76f5584..3bdb61e62 100755 --- a/modules/ddt/src/DDT.php +++ b/modules/ddt/src/DDT.php @@ -55,7 +55,7 @@ class DDT extends Document * * @return self */ - public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data) + public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data, $id_segment = null) { $model = new static(); @@ -65,6 +65,7 @@ class DDT extends Document $id_anagrafica = $anagrafica->id; $direzione = $tipo_documento->dir; + $id_segment = $id_segment ?: getSegmentPredefined($model->getModule()->id); $database = database(); @@ -87,6 +88,7 @@ class DDT extends Document $model->anagrafica()->associate($anagrafica); $model->tipo()->associate($tipo_documento); $model->stato()->associate($stato_documento); + $model->id_segment = $id_segment; $model->save(); @@ -98,7 +100,7 @@ class DDT extends Document } $model->numero = static::getNextNumero($data, $direzione); - $model->numero_esterno = static::getNextNumeroSecondario($data, $direzione); + $model->numero_esterno = static::getNextNumeroSecondario($data, $direzione, $id_segment); // Imposto, come sede aziendale, la prima sede disponibile come utente if ($direzione == 'entrata') { @@ -282,13 +284,13 @@ class DDT extends Document * * @return string */ - public static function getNextNumeroSecondario($data, $direzione) + public static function getNextNumeroSecondario($data, $direzione, $id_segment) { if ($direzione == 'uscita') { return ''; } - $maschera = setting('Formato numero secondario ddt'); + $maschera = Generator::getMaschera($id_segment); $ultimo = Generator::getPreviousFrom($maschera, 'dt_ddt', 'numero_esterno', [ 'YEAR(data) = '.prepare(date('Y', strtotime($data))), diff --git a/modules/fatture/add.php b/modules/fatture/add.php index 73d3374ed..a3eab3abf 100755 --- a/modules/fatture/add.php +++ b/modules/fatture/add.php @@ -74,7 +74,7 @@ $idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
- {[ "type": "select", "label": "", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='' ORDER BY name", "value": "" ]} + {[ "type": "select", "label": "", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": $id_module, 'is_sezionale' => 1]); ?>, "value": "" ]}
diff --git a/modules/fatture/bulk.php b/modules/fatture/bulk.php index f5ada75d6..5ed0286d9 100755 --- a/modules/fatture/bulk.php +++ b/modules/fatture/bulk.php @@ -557,7 +557,7 @@ $operations['export-csv'] = [ $operations['copy-bulk'] = [ 'text' => ' '.tr('Duplica selezionati').'', 'data' => [ - 'msg' => tr('Vuoi davvero duplicare le righe selezionate?').'

{[ "type": "select", "label": "'.tr('Fattura in avanti di').'", "name": "skip_time", "required": 1, "values": "list=\"Giorno\":\"'.tr('Un giorno').'\", \"Settimana\":\"'.tr('Una settimana').'\", \"Mese\":\"'.tr('Un mese').'\", \"Anno\":\"'.tr('Un anno').'\" ", "value": "Giorno" ]}
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.$id_module.' ORDER BY name", "value": "'.$_SESSION['module_'.$id_module]['id_segment'].'" ]}
{[ "type": "checkbox", "label": "'.tr('Aggiungere i riferimenti ai documenti esterni?').'", "placeholder": "'.tr('Aggiungere i riferimenti ai documenti esterni?').'", "name": "riferimenti" ]}', + 'msg' => tr('Vuoi davvero duplicare le righe selezionate?').'

{[ "type": "select", "label": "'.tr('Fattura in avanti di').'", "name": "skip_time", "required": 1, "values": "list=\"Giorno\":\"'.tr('Un giorno').'\", \"Settimana\":\"'.tr('Una settimana').'\", \"Mese\":\"'.tr('Un mese').'\", \"Anno\":\"'.tr('Un anno').'\" ", "value": "Giorno" ]}
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(["id_module" => $id_module, 'is_sezionale' => 1]).', "value": "'.$_SESSION['module_'.$id_module]['id_segment'].'" ]}
{[ "type": "checkbox", "label": "'.tr('Aggiungere i riferimenti ai documenti esterni?').'", "placeholder": "'.tr('Aggiungere i riferimenti ai documenti esterni?').'", "name": "riferimenti" ]}', 'button' => tr('Procedi'), 'class' => 'btn btn-lg btn-warning', ], diff --git a/modules/fatture/buttons.php b/modules/fatture/buttons.php index 4bfc0bad3..b0ff2e5eb 100755 --- a/modules/fatture/buttons.php +++ b/modules/fatture/buttons.php @@ -59,7 +59,7 @@ echo ' } if (empty($record['is_fiscale'])) { - $msg = '
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_module.'\' AND is_fiscale = 1 ORDER BY name" ]} + $msg = '
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(["id_module" => $id_module, 'is_sezionale' => 1, 'is_fiscale' => 1]).' ]} {[ "type": "date", "label": "'.tr('Data').'", "name": "data", "required": 1, "value": "-now-" ]}'; echo ' diff --git a/modules/fatture/crea_autofattura.php b/modules/fatture/crea_autofattura.php index 8da84802e..a0085b499 100644 --- a/modules/fatture/crea_autofattura.php +++ b/modules/fatture/crea_autofattura.php @@ -33,7 +33,7 @@ echo '
- {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.prepare($id_module_fatture_vendita).' ORDER BY name", "value": "'.$id_segment.'" ]} + {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $id_module_fatture_vendita, 'is_sezionale' => 1]).', "value": "'.$id_segment.'" ]}
diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index d43e77a27..d689191c3 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -178,12 +178,13 @@ switch (post('op')) { $idstatointervento = post('idstatointervento'); $data_richiesta = post('data_richiesta'); $data_scadenza = post('data_scadenza') ?: null; + $id_segment = post('id_segment'); $anagrafica = Anagrafica::find($idanagrafica); $tipo = TipoSessione::find($idtipointervento); $stato = Stato::find($idstatointervento); - $intervento = Intervento::build($anagrafica, $tipo, $stato, $data_richiesta); + $intervento = Intervento::build($anagrafica, $tipo, $stato, $data_richiesta, $id_segment); $id_record = $intervento->id; flash()->info(tr('Aggiunto nuovo intervento!')); @@ -323,7 +324,7 @@ switch (post('op')) { $intervento = Intervento::find($id_record); $new = $intervento->replicate(); // Calcolo il nuovo codice - $new->codice = Intervento::getNextCodice($data_ricorrenza); + $new->codice = Intervento::getNextCodice($data_ricorrenza, $new->id_segment); $new->data_richiesta = $data_ricorrenza; $new->idstatointervento = $stato->idstatointervento; $new->save(); @@ -615,7 +616,7 @@ switch (post('op')) { $anagrafica = post('idanagrafica') ? Anagrafica::find(post('idanagrafica')) : $documento->anagrafica; - $intervento = Intervento::build($anagrafica, $tipo, $stato, post('data')); + $intervento = Intervento::build($anagrafica, $tipo, $stato, post('data'), post('id_segment')); $intervento->idsede_destinazione = $id_sede; $intervento->id_documento_fe = $documento->id_documento_fe; @@ -809,7 +810,7 @@ switch (post('op')) { $new->idstatointervento = $id_stato; // Calcolo del nuovo codice sulla base della data di richiesta - $new->codice = Intervento::getNextCodice($data_richiesta); + $new->codice = Intervento::getNextCodice($data_richiesta, $new->id_segment); $new->data_richiesta = $data_richiesta; $new->data_scadenza = post('data_scadenza'); $new->firma_file = ''; diff --git a/modules/interventi/add.php b/modules/interventi/add.php index d51b9484e..b6f1d2088 100755 --- a/modules/interventi/add.php +++ b/modules/interventi/add.php @@ -142,9 +142,6 @@ $data_fine = $data_fine ?: $data; $inizio_sessione = $data.' '.$orario_inizio; $fine_sessione = $data_fine.' '.$orario_fine; -// Calcolo del nuovo codice -$new_codice = Intervento::getNextCodice($data); - echo '
@@ -195,6 +192,10 @@ echo '
{[ "type": "select", "label": "'.tr('Referente').'", "name": "idreferente", "ajax-source": "referenti", "select-options": '.json_encode(['idanagrafica' => $id_anagrafica, 'idclientefinale' => $id_cliente_finale]).', "icon-after": "add|'.Modules::get('Anagrafiche')['id'].'|id_plugin='.Plugins::get('Referenti')['id'].'&id_parent='.$id_anagrafica.'" ]}
+ +
+ {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $id_module, 'is_sezionale' => 1]).', "value": "'.$_SESSION['module_'.$id_module]['id_segment'].'" ]} +
diff --git a/modules/interventi/bulk.php b/modules/interventi/bulk.php index 3348bc07a..95668aa7b 100755 --- a/modules/interventi/bulk.php +++ b/modules/interventi/bulk.php @@ -181,7 +181,7 @@ switch (post('op')) { $new->idstatointervento = $id_stato; // Calcolo del nuovo codice sulla base della data di richiesta - $new->codice = Intervento::getNextCodice($data_richiesta); + $new->codice = Intervento::getNextCodice($data_richiesta, $new->id_segment); $new->save(); @@ -296,7 +296,7 @@ if (App::debug()) { 'data' => [ 'title' => tr('Fatturare gli _TYPE_ selezionati?', ['_TYPE_' => strtolower($module['name'])]).' ', 'msg' => '{[ "type": "checkbox", "label": "'.tr('Aggiungere alle fatture di vendita non ancora emesse?').'", "placeholder": "'.tr('Aggiungere alle fatture di vendita nello stato bozza?').'", "name": "accodare" ]}
- {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' ORDER BY name", "value": "'.$id_segment.'" ]}
+ {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(["id_module" => $id_fatture, 'is_sezionale' => 1]).', "value": "'.$id_segment.'" ]}
{[ "type": "select", "label": "'.tr('Tipo documento').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, CONCAT(codice_tipo_documento_fe, \' - \', descrizione) AS descrizione FROM co_tipidocumento WHERE enabled = 1 AND dir =\'entrata\' ORDER BY codice_tipo_documento_fe", "value": "'.$idtipodocumento.'" ]}', 'button' => tr('Procedi'), 'class' => 'btn btn-lg btn-warning', diff --git a/modules/interventi/src/Intervento.php b/modules/interventi/src/Intervento.php index b04f28837..178656478 100755 --- a/modules/interventi/src/Intervento.php +++ b/modules/interventi/src/Intervento.php @@ -52,16 +52,19 @@ class Intervento extends Document * * @return self */ - public static function build(Anagrafica $anagrafica, TipoSessione $tipo_sessione, Stato $stato, $data_richiesta) + public static function build(Anagrafica $anagrafica, TipoSessione $tipo_sessione, Stato $stato, $data_richiesta, $id_segment = null) { $model = new static(); + $id_segment = $id_segment ?: getSegmentPredefined($model->getModule()->id); + $model->anagrafica()->associate($anagrafica); $model->stato()->associate($stato); $model->tipo()->associate($tipo_sessione); - $model->codice = static::getNextCodice($data_richiesta); + $model->codice = static::getNextCodice($data_richiesta, $id_segment); $model->data_richiesta = $data_richiesta; + $model->id_segment = $id_segment; $model->save(); @@ -207,9 +210,9 @@ class Intervento extends Document * * @return string */ - public static function getNextCodice($data) + public static function getNextCodice($data, $id_segment) { - $maschera = setting('Formato codice attività'); + $maschera = Generator::getMaschera($id_segment); //$ultimo = Generator::getPreviousFrom($maschera, 'in_interventi', 'codice'); diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php index e4bd480ea..f6eed7eae 100755 --- a/modules/ordini/actions.php +++ b/modules/ordini/actions.php @@ -42,11 +42,12 @@ switch (post('op')) { case 'add': $idanagrafica = post('idanagrafica'); $data = post('data'); + $id_segment = post('id_segment'); $anagrafica = Anagrafica::find($idanagrafica); $tipo = Tipo::where('dir', $dir)->first(); - $ordine = Ordine::build($anagrafica, $tipo, $data); + $ordine = Ordine::build($anagrafica, $tipo, $data, $id_segment); $id_record = $ordine->id; flash()->info(tr('Aggiunto ordine numero _NUM_!', [ @@ -423,7 +424,7 @@ switch (post('op')) { if (post('create_document') == 'on') { $tipo = Tipo::where('dir', $documento->direzione)->first(); - $ordine = Ordine::build($documento->anagrafica, $tipo, post('data')); + $ordine = Ordine::build($documento->anagrafica, $tipo, post('data'), post('id_segment')); $ordine->idpagamento = $documento->idpagamento; $ordine->idsede = $id_sede; @@ -483,7 +484,7 @@ switch (post('op')) { $anagrafica = Anagrafica::find(post('idanagrafica')); $tipo = Tipo::where('dir', $dir)->first(); - $ordine = Ordine::build($anagrafica, $tipo, post('data')); + $ordine = Ordine::build($anagrafica, $tipo, post('data'), post('id_segment')); $ordine->save(); $id_record = $ordine->id; @@ -548,7 +549,7 @@ switch (post('op')) { $anagrafica = Anagrafica::find(post('idanagrafica')); $tipo = Tipo::where('dir', $dir)->first(); - $ordine = Ordine::build($anagrafica, $tipo, post('data')); + $ordine = Ordine::build($anagrafica, $tipo, post('data'), post('id_segment')); $ordine->save(); $id_record = $ordine->id; diff --git a/modules/ordini/add.php b/modules/ordini/add.php index 619c6b712..fabd38bea 100755 --- a/modules/ordini/add.php +++ b/modules/ordini/add.php @@ -44,13 +44,17 @@ $id_anagrafica = !empty(get('idanagrafica')) ? get('idanagrafica') : $user['idan
-
+
{[ "type": "date", "label": "", "name": "data", "required": 1, "value": "-now-" ]}
-
+
{[ "type": "select", "label": "", "name": "idanagrafica", "required": 1, "value": "", "ajax-source": "", "icon-after": "add||tipoanagrafica=&readonly_tipo=1" ]}
+ +
+ {[ "type": "select", "label": "", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": $id_module, 'is_sezionale' => 1]); ?>, "value": "" ]} +
diff --git a/modules/ordini/bulk.php b/modules/ordini/bulk.php index 9f03f41e3..5df7f6392 100644 --- a/modules/ordini/bulk.php +++ b/modules/ordini/bulk.php @@ -36,6 +36,7 @@ if (!isset($_SESSION['module_'.$id_fatture]['id_segment'])) { $_SESSION['module_'.$id_fatture]['id_segment'] = isset($segments[0]['id']) ? $segments[0]['id'] : null; } $id_segment = $_SESSION['module_'.$id_fatture]['id_segment']; +$id_segment_ordini = $_SESSION['module_'.$id_module]['id_segment']; $idconto = setting('Conto predefinito fatture di vendita'); $idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [ 'predefined' => 1, @@ -162,7 +163,7 @@ switch (post('op')) { $new_ordine = Ordine::find($new_ordini[$ordine->idanagrafica]); } else { $anagrafica = Anagrafica::find($ordine->idanagrafica); - $new_ordine = Ordine::build($anagrafica, $tipo, $data); + $new_ordine = Ordine::build($anagrafica, $tipo, $data, post('id_segment')); $new_ordine->idstatoordine = $id_stato; $new_ordine->data = $data; $new_ordine->save(); @@ -199,7 +200,7 @@ if ($module['name'] == 'Ordini cliente') { 'data' => [ 'title' => tr('Fatturare i _TYPE_ selezionati?', ['_TYPE_' => strtolower($module['name'])]), 'msg' => '{[ "type": "checkbox", "label": "'.tr('Aggiungere alle _TYPE_ non ancora emesse?', ['_TYPE_' => strtolower($module_fatture)]).'", "placeholder": "'.tr('Aggiungere alle _TYPE_ nello stato bozza?', ['_TYPE_' => strtolower($module_fatture)]).'", "name": "accodare" ]} -
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' ORDER BY name", "value": "'.$id_segment.'" ]}
+ {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(["id_module" => $id_fatture, 'is_sezionale' => 1]).', "value": "'.$id_segment.'" ]} {[ "type": "select", "label": "'.tr('Tipo documento').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, CONCAT(codice_tipo_documento_fe, \' - \', descrizione) AS descrizione FROM co_tipidocumento WHERE enabled = 1 AND dir =\'entrata\' ORDER BY codice_tipo_documento_fe", "value": "'.$idtipodocumento.'" ]}', 'button' => tr('Procedi'), 'class' => 'btn btn-lg btn-warning', @@ -212,9 +213,10 @@ if ($module['name'] == 'Ordini cliente') { 'text' => ' '.tr('Unisci rdo'), 'data' => [ 'title' => tr('Unire gli ordini selezionati?'), - 'msg' => tr('Gli ordini saranno processati solo se in uno dei seguenti stati: Bozza, In attesa di conferma, Accettato.
Tutti gli ordini processati verranno eliminati e verrà creato un nuovo ordine unificato per fornitore.').'
-
{[ "type": "select", "label": "'.tr('Stato').'", "name": "id_stato", "required": 1, "values": "query=SELECT id, descrizione FROM or_statiordine" ]}
-
{[ "type": "date", "label": "'.tr('Data').'", "name": "data", "required": 1]}', + 'msg' => tr('Gli ordini saranno processati solo se in uno dei seguenti stati: Bozza, In attesa di conferma, Accettato.
Tutti gli ordini processati verranno eliminati e verrà creato un nuovo ordine unificato per fornitore.').' + {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(["id_module" => $id_module, 'is_sezionale' => 1]).', "value": "'.$id_segment_ordini.'" ]} + {[ "type": "select", "label": "'.tr('Stato').'", "name": "id_stato", "required": 1, "values": "query=SELECT id, descrizione FROM or_statiordine" ]} + {[ "type": "date", "label": "'.tr('Data').'", "name": "data", "required": 1]}', 'button' => tr('Procedi'), 'class' => 'btn btn-lg btn-warning', 'blank' => false, diff --git a/modules/ordini/modutil.php b/modules/ordini/modutil.php index 75da1ee98..a3d4635c4 100755 --- a/modules/ordini/modutil.php +++ b/modules/ordini/modutil.php @@ -42,8 +42,9 @@ function get_new_numeroordine($data) function get_new_numerosecondarioordine($data) { global $dir; + global $id_segment; - return Ordine::getNextNumeroSecondario($data, $dir); + return Ordine::getNextNumeroSecondario($data, $dir, $id_segment); } /** diff --git a/modules/ordini/src/Ordine.php b/modules/ordini/src/Ordine.php index 94aad8288..c4457f553 100755 --- a/modules/ordini/src/Ordine.php +++ b/modules/ordini/src/Ordine.php @@ -51,14 +51,14 @@ class Ordine extends Document * * @return self */ - public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data) + public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data, $id_segment = null) { $model = new static(); $stato_documento = Stato::where('descrizione', 'Bozza')->first(); - $id_anagrafica = $anagrafica->id; $direzione = $tipo_documento->dir; + $id_segment = $id_segment ?: getSegmentPredefined($model->getModule()->id); $database = database(); @@ -81,6 +81,7 @@ class Ordine extends Document $model->anagrafica()->associate($anagrafica); $model->tipo()->associate($tipo_documento); $model->stato()->associate($stato_documento); + $model->id_segment = $id_segment; $model->save(); @@ -92,7 +93,7 @@ class Ordine extends Document } $model->numero = static::getNextNumero($data, $direzione); - $model->numero_esterno = static::getNextNumeroSecondario($data, $direzione); + $model->numero_esterno = static::getNextNumeroSecondario($data, $direzione, $id_segment); $model->save(); @@ -218,13 +219,13 @@ class Ordine extends Document * * @return string */ - public static function getNextNumeroSecondario($data, $direzione) + public static function getNextNumeroSecondario($data, $direzione, $id_segment) { if ($direzione == 'uscita') { return ''; } - $maschera = setting('Formato numero secondario ordine'); + $maschera = Generator::getMaschera($id_segment); if (strpos($maschera, 'm') !== false) { $ultimo = Generator::getPreviousFrom($maschera, 'or_ordini', 'numero_esterno', [ diff --git a/modules/preventivi/actions.php b/modules/preventivi/actions.php index cccf20907..d9d5c7f97 100755 --- a/modules/preventivi/actions.php +++ b/modules/preventivi/actions.php @@ -37,11 +37,12 @@ switch (post('op')) { $idtipointervento = post('idtipointervento'); $data_bozza = post('data_bozza'); $id_sede = post('idsede'); + $id_segment = post('id_segment'); $anagrafica = Anagrafica::find($idanagrafica); $tipo = TipoSessione::find($idtipointervento); - $preventivo = Preventivo::build($anagrafica, $tipo, $nome, $data_bozza, $id_sede); + $preventivo = Preventivo::build($anagrafica, $tipo, $nome, $data_bozza, $id_sede, $id_segment); $preventivo->idstato = post('idstato'); $preventivo->save(); @@ -105,7 +106,7 @@ switch (post('op')) { case 'copy': // Copia del preventivo $new = $preventivo->replicate(); - $new->numero = Preventivo::getNextNumero(Carbon::now()); + $new->numero = Preventivo::getNextNumero(Carbon::now(), $new->id_segment); $new->data_bozza = Carbon::now(); $stato_preventivo = Stato::where('descrizione', '=', 'Bozza')->first(); diff --git a/modules/preventivi/add.php b/modules/preventivi/add.php index 8b29ab0c6..5e13c5482 100755 --- a/modules/preventivi/add.php +++ b/modules/preventivi/add.php @@ -42,15 +42,17 @@ $stati = get('pianificabile') ? 'SELECT id, descrizione FROM co_statipreventivi
-
+
{[ "type": "select", "label": "", "name": "idsede", "ajax-source": "sedi", "placeholder": "Sede legale" ]}
-
+
{[ "type": "date", "label": "", "name": "data_bozza", "value": "", "required": 1 ]}
- +
+ {[ "type": "select", "label": "", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": $id_module, 'is_sezionale' => 1]); ?>, "value": "" ]} +
diff --git a/modules/preventivi/src/Preventivo.php b/modules/preventivi/src/Preventivo.php index 984f274dc..6f8f52a23 100755 --- a/modules/preventivi/src/Preventivo.php +++ b/modules/preventivi/src/Preventivo.php @@ -64,18 +64,15 @@ class Preventivo extends Document * * @return self */ - public static function build(Anagrafica $anagrafica, TipoSessione $tipo_sessione, $nome, $data_bozza, $id_sede) + public static function build(Anagrafica $anagrafica, TipoSessione $tipo_sessione, $nome, $data_bozza, $id_sede, $id_segment = null) { $model = new static(); $stato_documento = Stato::where('descrizione', 'Bozza')->first(); - $id_anagrafica = $anagrafica->id; $id_agente = $anagrafica->idagente; $id_pagamento = $anagrafica->idpagamento_vendite; - - $costo_orario = $tipo_sessione['costo_orario']; - $costo_diritto_chiamata = $tipo_sessione['costo_diritto_chiamata']; + $id_segment = $id_segment ?: getSegmentPredefined($model->getModule()->id); $id_iva = setting('Iva predefinita'); if (empty($id_pagamento)) { @@ -86,7 +83,7 @@ class Preventivo extends Document $model->stato()->associate($stato_documento); $model->tipoSessione()->associate($tipo_sessione); - $model->numero = static::getNextNumero($data_bozza); + $model->numero = static::getNextNumero($data_bozza, $id_segment); // Salvataggio delle informazioni $model->nome = $nome; @@ -111,6 +108,7 @@ class Preventivo extends Document $model->idpagamento = $id_pagamento; } $model->condizioni_fornitura = setting('Condizioni generali di fornitura preventivi'); + $model->id_segment = $id_segment; $model->save(); @@ -298,9 +296,9 @@ class Preventivo extends Document * * @return string */ - public static function getNextNumero($data) + public static function getNextNumero($data, $id_segment) { - $maschera = setting('Formato codice preventivi'); + $maschera = Generator::getMaschera($id_segment); if (strpos($maschera, 'm') !== false) { $ultimo = Generator::getPreviousFrom($maschera, 'co_preventivi', 'numero', [ diff --git a/modules/segmenti/actions.php b/modules/segmenti/actions.php index 8d8b07ee6..a8e799aaf 100755 --- a/modules/segmenti/actions.php +++ b/modules/segmenti/actions.php @@ -58,6 +58,9 @@ switch (post('op')) { 'autofatture' => post('autofatture'), ], ['id' => $id_record]); + // Aggiornamento dei permessi relativi + $dbo->sync('zz_group_segment', ['id_segment' => $id_record], ['id_gruppo' => (array) post('gruppi')]); + flash()->info(tr('Modifiche salvate correttamente')); break; @@ -82,10 +85,22 @@ switch (post('op')) { 'pattern' => $pattern, 'note' => post('note'), 'predefined' => $predefined, + 'is_sezionale' => post('is_sezionale'), ]); $id_record = $dbo->lastInsertedID(); + // Aggiunta permessi segmento + $gruppi = $dbo->fetchArray('SELECT `id` FROM `zz_groups`'); + $array = []; + foreach ($gruppi as $gruppo) { + $array[] = [ + 'id_gruppo' => $gruppo['id'], + 'id_segment' => $id_record, + ]; + } + $dbo->insert('zz_group_segment', $array); + flash()->info(tr('Nuovo segmento aggiunto')); break; diff --git a/modules/segmenti/add.php b/modules/segmenti/add.php index 7ae6d80ba..b6a501ebc 100755 --- a/modules/segmenti/add.php +++ b/modules/segmenti/add.php @@ -28,9 +28,13 @@ include_once __DIR__.'/../../core.php'; {[ "type": "text", "label": "", "name": "name", "required": 1, "value": "$name$" ]}
-
+
{[ "type": "text", "label": "", "name": "pattern", "class": "alphanumeric-mask", "value": "$pattern$", "maxlength": 25, "placeholder":"####/YYYY" ]}
+ +
+ {[ "type": "checkbox", "label": "", "help": "", "name": "is_sezionale", "value": "$is_sezionale$" ]} +
diff --git a/modules/segmenti/ajax/select.php b/modules/segmenti/ajax/select.php new file mode 100644 index 000000000..7aa8f0ab0 --- /dev/null +++ b/modules/segmenti/ajax/select.php @@ -0,0 +1,53 @@ +. + */ + +include_once __DIR__.'/../../../core.php'; + +switch ($resource) { + case 'segmenti': + $user = Auth::user(); + $id_module = $superselect['id_module']; + $is_fiscale = $superselect['is_fiscale']; + $is_sezionale = $superselect['is_sezionale']; + + if (isset($id_module)) { + $query = 'SELECT `id`, `name` AS descrizione FROM zz_segments INNER JOIN `zz_group_segment` ON `zz_segments`.`id` = `zz_group_segment`.`id_segment` |where| ORDER BY `name` ASC'; + + $where[] = 'zz_segments.id_module = '.prepare($id_module); + $where[] = 'zz_group_segment.id_gruppo = '.prepare($user->idgruppo); + + if ($is_fiscale != null) { + $where[] = 'zz_segments.is_fiscale = '.prepare($is_fiscale); + } + + if ($is_sezionale != null) { + $where[] = 'zz_segments.is_sezionale = '.prepare($is_sezionale); + } + + foreach ($elements as $element) { + $filter[] = 'id='.prepare($element); + } + + if (!empty($search)) { + $search_fields[] = 'zz_segments.name LIKE '.prepare('%'.$search.'%'); + } + } + + break; +} diff --git a/modules/segmenti/edit.php b/modules/segmenti/edit.php index 72c3ac827..ad7d9e965 100755 --- a/modules/segmenti/edit.php +++ b/modules/segmenti/edit.php @@ -33,28 +33,35 @@ include_once __DIR__.'/../../core.php';
-
+
{[ "type": "text", "label": "", "name": "name", "required": 1, "value": "$name$" ]}
-
+
{[ "type": "select", "label": "", "name": "module", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_modules WHERE ( enabled = 1 AND options != 'custom' ) OR id = ORDER BY name ASC", "value": "", "extra": "" ]}
-
+
{[ "type": "checkbox", "label": "", "name": "predefined", "value": "$predefined$", "help": "", "placeholder": "", "extra": "" ]}
+
+ {[ "type": "checkbox", "label": "", "help": "", "name": "is_sezionale", "value": "$is_sezionale$", "extra": "readonly" ]} +
+ +
+ {[ "type": "text", "label": "", "name": "pattern", "value": "$pattern$", "maxlength": 25, "placeholder":"####/YYYY", "extra": " 0) ? 'readonly' : ''; ?>", "extra": "" ]} +
- {[ "type": "textarea", "label": "", "name": "clause", "required": 1, "value": "$clause$" ]} + {[ "type": "textarea", "label": "", "name": "clause", "required": 1, "value": "$clause$", "extra": "" ]}
- {[ "type": "select", "label": "", "name": "position", "required": 1, "values":"list=\"WHR\": \"WHERE\", \"HVN\": \"HAVING\"", "value": "$position$" ]} + {[ "type": "select", "label": "", "name": "position", "required": 1, "values":"list=\"WHR\": \"WHERE\", \"HVN\": \"HAVING\"", "value": "$position$", "extra": "" ]}
@@ -92,13 +99,23 @@ $_SESSION['module_'.$record['id_module']]['id_segment'] = $previous_module;
+
+ {[ "type": "select", "label": "'.tr('Gruppi con accesso').'", "name": "gruppi[]", "multiple": "1", "values": "query=SELECT id, nome AS descrizione FROM zz_groups ORDER BY id ASC", "value": "'; + $results = $dbo->fetchArray('SELECT GROUP_CONCAT(DISTINCT id_gruppo SEPARATOR \',\') AS gruppi FROM zz_group_segment WHERE id_segment='.prepare($id_record)); + + echo $results[0]['gruppi'].'"'; + + echo ', "help": "'.tr('Gruppi di utenti in grado di visualizzare questo segmento').'" ]} +
+
'; ?>
@@ -108,26 +125,22 @@ if (string_contains($current_module['option'], '|segment')) {
-
- {[ "type": "text", "label": "", "name": "pattern", "value": "$pattern$", "maxlength": 25, "placeholder":"####/YYYY", "extra": " 0) ? 'readonly' : ''; ?>" ]} -
-
- {[ "type": "checkbox", "label": "", "name": "is_fiscale", "value": "$is_fiscale$", "extra": " 0) ? 'readonly' : ''; ?>" ]} + {[ "type": "checkbox", "label": "", "name": "is_fiscale", "value": "$is_fiscale$", "extra": " 0 || ($record['modulo']!='Fatture di vendita' && $record['modulo']!='Fatture di acquisto')) ? 'readonly' : ''; ?>" ]}
- {[ "type": "checkbox", "label": "", "name": "predefined_accredito", "value": "$predefined_accredito$", "help": "", "placeholder": "" ]} + {[ "type": "checkbox", "label": "", "name": "predefined_accredito", "value": "$predefined_accredito$", "help": "", "placeholder": "", "extra": "" ]}
- {[ "type": "checkbox", "label": "", "name": "predefined_addebito", "value": "$predefined_addebito$", "help": "", "placeholder": "" ]} + {[ "type": "checkbox", "label": "", "name": "predefined_addebito", "value": "$predefined_addebito$", "help": "", "placeholder": "", "extra": "" ]}
- {[ "type": "checkbox", "label": "", "name": "autofatture", "value": "$autofatture$" ]} + {[ "type": "checkbox", "label": "", "name": "autofatture", "value": "$autofatture$", "extra": "" ]}
diff --git a/modules/segmenti/init.php b/modules/segmenti/init.php index 8fa58305f..71062f9df 100755 --- a/modules/segmenti/init.php +++ b/modules/segmenti/init.php @@ -19,12 +19,15 @@ include_once __DIR__.'/../../core.php'; +use PHPSQLParser\PHPSQLParser; + if (isset($id_record)) { $record = $dbo->fetchOne('SELECT *, (SELECT options FROM zz_modules WHERE id = zz_segments.id_module) options, (SELECT name FROM zz_modules WHERE id = zz_segments.id_module) AS modulo, (SELECT COUNT(t.id) FROM zz_segments t WHERE t.id_module = zz_segments.id_module) AS n_sezionali FROM zz_segments WHERE id='.prepare($id_record)); - $array = preg_match('/(?<=FROM)\s([^\s]+)\s/', $record['options'], $table); - if (strpos($table[0], 'co_documenti') !== false) { - $righe = $dbo->fetchArray('SELECT COUNT(*) AS tot FROM '.$table[0].' WHERE id_segment = '.prepare($id_record)); - $tot = $righe[0]['tot']; - } + $parser = new PHPSQLParser(); + $parsed = $parser->parse($record['options']); + $table = $parsed['FROM'][0]['table']; + + $righe = $dbo->fetchArray('SELECT COUNT(*) AS tot FROM '.$table.' WHERE id_segment = '.prepare($id_record)); + $tot = $righe[0]['tot']; } diff --git a/plugins/importFE/generate.php b/plugins/importFE/generate.php index d2bec2936..f318cefbf 100755 --- a/plugins/importFE/generate.php +++ b/plugins/importFE/generate.php @@ -229,7 +229,7 @@ $id_segment = $is_autofattura ? setting('Sezionale per autofatture di acquisto') echo '
- {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE is_fiscale = 1 AND id_module='.$id_module.' ORDER BY name", "value": "'.$id_segment.'" ]} + {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $id_module, 'is_fiscale' => 1, 'is_sezionale' => 1]).', "value": "'.$id_segment.'" ]}
'; // Data di registrazione diff --git a/plugins/pianificazione_fatturazione/crea_fattura.php b/plugins/pianificazione_fatturazione/crea_fattura.php index 4e017072c..57210e70e 100755 --- a/plugins/pianificazione_fatturazione/crea_fattura.php +++ b/plugins/pianificazione_fatturazione/crea_fattura.php @@ -66,7 +66,7 @@ echo ' echo '
- {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.$module_fattura['id'].' ORDER BY name", "value":"'.$_SESSION['module_'.$module_fattura['id']]['id_segment'].'" ]} + {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $module_fattura['id'], 'is_sezionale' => 1]).', "value":"'.$_SESSION['module_'.$module_fattura['id']]['id_segment'].'" ]}
'; // Conto diff --git a/plugins/pianificazione_interventi/actions.php b/plugins/pianificazione_interventi/actions.php index 515039784..02e2b40f8 100755 --- a/plugins/pianificazione_interventi/actions.php +++ b/plugins/pianificazione_interventi/actions.php @@ -150,7 +150,7 @@ switch ($operazione) { // Creazione intervento collegato se non presente if (post('pianifica_intervento') && empty($promemoria->intervento)) { // Creazione intervento - $intervento = Intervento::build($contratto->anagrafica, $promemoria_originale->tipo, $stato, $data_richiesta); + $intervento = Intervento::build($contratto->anagrafica, $promemoria_originale->tipo, $stato, $data_richiesta, post('id_segment')); $intervento->idsede_destinazione = $promemoria_corrente->idsede ?: 0; $intervento->richiesta = $promemoria_corrente->richiesta; $intervento->idclientefinale = post('idclientefinale') ?: 0; diff --git a/plugins/pianificazione_interventi/pianificazione.php b/plugins/pianificazione_interventi/pianificazione.php index 7f4b31079..6f4401cd0 100755 --- a/plugins/pianificazione_interventi/pianificazione.php +++ b/plugins/pianificazione_interventi/pianificazione.php @@ -23,6 +23,7 @@ $plugin = Plugins::get($id_plugin); $id_module = Modules::get('Contratti')['id']; $block_edit = filter('add') ? false : true; +$module_interventi = Modules::get('Interventi'); // Informazioni contratto $contratto = $dbo->fetchOne('SELECT * FROM `co_contratti` WHERE `id` = :id', [ @@ -95,13 +96,17 @@ echo '
-
+
{[ "type": "date", "label": "'.tr('Data promemoria').'", "name": "data_richiesta", "required": 1, "value": "'.$data_accettazione.'", "readonly": '.intval($block_edit).', "min-date": "'.$data_accettazione.'", "max-date": "'.$data_conclusione.'" ]}
-
+
{[ "type": "select", "label": "'.tr('Tipo intervento').'", "name": "idtipointervento", "required": 1, "id": "idtipointervento_", "value": "'.$record['idtipointervento'].'", "readonly": '.intval($block_edit).', "ajax-source": "tipiintervento", "value": "'.$idtipointervento.'" ]}
+ +
+ {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $module_interventi['id'], 'is_sezionale' => 1]).', "value":"'.$_SESSION['module_'.$module_interventi['id']]['id_segment'].'" ]} +
diff --git a/src/Modules.php b/src/Modules.php index f411b85c9..f776d0b63 100755 --- a/src/Modules.php +++ b/src/Modules.php @@ -179,11 +179,12 @@ class Modules } $module = self::get($module)['id']; + $user = Auth::user(); if (!isset(self::$segments[$module])) { $database = database(); - self::$segments[$module] = $database->fetchArray('SELECT * FROM `zz_segments` WHERE `id_module` = '.prepare($module).' ORDER BY `predefined` DESC, `id` ASC'); + self::$segments[$module] = $database->fetchArray('SELECT * FROM `zz_segments` INNER JOIN `zz_group_segment` ON `zz_segments`.`id` = `zz_group_segment`.`id_segment` WHERE `id_gruppo` = '.prepare($user->idgruppo).' AND `id_module` = '.prepare($module).' ORDER BY `predefined` DESC, `id` ASC'); } return (array) self::$segments[$module]; diff --git a/src/Update.php b/src/Update.php index 03c596d08..3c73d8b72 100755 --- a/src/Update.php +++ b/src/Update.php @@ -302,6 +302,25 @@ class Update } } + // Permessi di default dei segmenti + if ($database->tableExists('zz_segments')) { + $gruppi = $database->fetchArray('SELECT `id` FROM `zz_groups`'); + $segments = $database->fetchArray('SELECT `id` FROM `zz_segments` WHERE `id` NOT IN (SELECT `id_segment` FROM `zz_group_segment`)'); + + $array = []; + foreach ($segments as $segment) { + foreach ($gruppi as $gruppo) { + $array[] = [ + 'id_gruppo' => $gruppo['id'], + 'id_segment' => $segment['id'], + ]; + } + } + if (!empty($array)) { + $database->insert('zz_group_segment', $array); + } + } + // Normalizzazione di charset e collation self::normalizeDatabase($database->getDatabaseName()); diff --git a/src/Util/Query.php b/src/Util/Query.php index 4b6bc2cb0..af8dcb0b6 100755 --- a/src/Util/Query.php +++ b/src/Util/Query.php @@ -75,6 +75,7 @@ class Query $id_module = Modules::getCurrent()['id']; $segment = !empty(self::$segments) ? $_SESSION['module_'.$id_module]['id_segment'] : null; + $is_sezionale = database()->fetchOne('SELECT `is_sezionale` FROM `zz_segments` WHERE `id` = '.prepare($segment))['is_sezionale']; $user = Auth::user(); @@ -121,7 +122,7 @@ class Query '|period_end|' => $_SESSION['period_end'].' 23:59:59', // Segmenti - '|'.$segment_filter.'|' => !empty($segment) ? ' AND '.$segment_name.' = '.prepare($segment) : '', + '|'.$segment_filter.'|' => !empty($segment) && $is_sezionale ? ' AND '.$segment_name.' = '.prepare($segment) : '', // Filtro dinamico per il modulo Giacenze sedi '|giacenze_sedi_idsede|' => prepare(isset($_SESSION['giacenze_sedi']) ? $_SESSION['giacenze_sedi']['idsede'] : null), diff --git a/update/2_4_38.sql b/update/2_4_38.sql index 2e36fc09a..c69cec9fe 100644 --- a/update/2_4_38.sql +++ b/update/2_4_38.sql @@ -609,4 +609,71 @@ WHERE HAVING 2=2 ORDER BY - an_anagrafiche.ragione_sociale" WHERE `name` = 'Listini'; \ No newline at end of file + an_anagrafiche.ragione_sociale" WHERE `name` = 'Listini'; + +-- Aggiunta tabella permessi segmenti +CREATE TABLE `zz_group_segment` ( `id_gruppo` INT NOT NULL , `id_segment` INT NOT NULL , `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP , `updated_at` TIMESTAMP on update CURRENT_TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ); + +-- Aggiunti segmenti nei documenti +ALTER TABLE `zz_segments` ADD `is_sezionale` TINYINT(1) NOT NULL AFTER `autofatture`; + +UPDATE `zz_segments` SET `predefined` = '0' WHERE `zz_segments`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE name='Preventivi'); +INSERT INTO `zz_segments` (`id_module`, `name`, `clause`, `position`, `pattern`, `note`, `dicitura_fissa`, `predefined`, `predefined_accredito`, `predefined_addebito`, `autofatture`, `is_sezionale`, `created_at`, `updated_at`, `is_fiscale`) VALUES ((SELECT `id` FROM `zz_modules` WHERE name='Preventivi'), 'Standard preventivi', '1=1', 'WHR', (SELECT `valore` FROM `zz_settings` WHERE `nome`='Formato codice preventivi'), '', '', '1', '0', '0', '0', '1', NULL, NULL, '0'); + +UPDATE `zz_segments` SET `predefined` = '0' WHERE `zz_segments`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE name='Contratti'); +INSERT INTO `zz_segments` (`id_module`, `name`, `clause`, `position`, `pattern`, `note`, `dicitura_fissa`, `predefined`, `predefined_accredito`, `predefined_addebito`, `autofatture`, `is_sezionale`, `created_at`, `updated_at`, `is_fiscale`) VALUES ((SELECT `id` FROM `zz_modules` WHERE name='Contratti'), 'Standard contratti', '1=1', 'WHR', (SELECT `valore` FROM `zz_settings` WHERE `nome`='Formato codice contratti'), '', '', '1', '0', '0', '0', '1', NULL, NULL, '0'); + +UPDATE `zz_segments` SET `predefined` = '0' WHERE `zz_segments`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE name='Ddt di acquisto'); +INSERT INTO `zz_segments` (`id_module`, `name`, `clause`, `position`, `pattern`, `note`, `dicitura_fissa`, `predefined`, `predefined_accredito`, `predefined_addebito`, `autofatture`, `is_sezionale`, `created_at`, `updated_at`, `is_fiscale`) VALUES ((SELECT `id` FROM `zz_modules` WHERE name='Ddt di acquisto'), 'Standard ddt in entrata', '1=1', 'WHR', '#', '', '', '1', '0', '0', '0', '1', NULL, NULL, '0'); + +UPDATE `zz_segments` SET `predefined` = '0' WHERE `zz_segments`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE name='Ddt di vendita'); +INSERT INTO `zz_segments` (`id_module`, `name`, `clause`, `position`, `pattern`, `note`, `dicitura_fissa`, `predefined`, `predefined_accredito`, `predefined_addebito`, `autofatture`, `is_sezionale`, `created_at`, `updated_at`, `is_fiscale`) VALUES ((SELECT `id` FROM `zz_modules` WHERE name='Ddt di vendita'), 'Standard ddt in uscita', '1=1', 'WHR', (SELECT `valore` FROM `zz_settings` WHERE `nome`='Formato numero secondario ddt'), '', '', '1', '0', '0', '0', '1', NULL, NULL, '0'); + +UPDATE `zz_segments` SET `predefined` = '0' WHERE `zz_segments`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE name='Ordini cliente'); +INSERT INTO `zz_segments` (`id_module`, `name`, `clause`, `position`, `pattern`, `note`, `dicitura_fissa`, `predefined`, `predefined_accredito`, `predefined_addebito`, `autofatture`, `is_sezionale`, `created_at`, `updated_at`, `is_fiscale`) VALUES ((SELECT `id` FROM `zz_modules` WHERE name='Ordini cliente'), 'Standard ordini cliente', '1=1', 'WHR', (SELECT `valore` FROM `zz_settings` WHERE `nome`='Formato numero secondario ordine'), '', '', '1', '0', '0', '0', '1', NULL, NULL, '0'); + +UPDATE `zz_segments` SET `predefined` = '0' WHERE `zz_segments`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE name='Ordini fornitore'); +INSERT INTO `zz_segments` (`id_module`, `name`, `clause`, `position`, `pattern`, `note`, `dicitura_fissa`, `predefined`, `predefined_accredito`, `predefined_addebito`, `autofatture`, `is_sezionale`, `created_at`, `updated_at`, `is_fiscale`) VALUES ((SELECT `id` FROM `zz_modules` WHERE name='Ordini fornitore'), 'Standard ordini fornitore', '1=1', 'WHR', '#', '', '', '1', '0', '0', '0', '1', NULL, NULL, '0'); + +UPDATE `zz_segments` SET `predefined` = '0' WHERE `zz_segments`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE name='Interventi'); +UPDATE `zz_segments` SET `predefined` = '1', `is_sezionale` = '1', `name` = 'Standard attività' WHERE `zz_segments`.`name` = 'Tutti' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE name='Interventi'); + +UPDATE `zz_segments` SET `is_sezionale` = '1' WHERE `zz_segments`.`id_module` IN(SELECT `id` FROM `zz_modules` WHERE `name` IN('Fatture di vendita', 'Fatture di acquisto')); + +-- Aggiunto campo id_segment nei documenti +ALTER TABLE `co_contratti` ADD `id_segment` INT NOT NULL AFTER `updated_at`; +ALTER TABLE `dt_ddt` ADD `id_segment` INT NOT NULL AFTER `updated_at`; +ALTER TABLE `co_preventivi` ADD `id_segment` INT NOT NULL AFTER `updated_at`; +ALTER TABLE `or_ordini` ADD `id_segment` INT NOT NULL AFTER `updated_at`; +ALTER TABLE `in_interventi` ADD `id_segment` INT NOT NULL AFTER `updated_at`; + +-- Allineamento id_segment nei record già creati +UPDATE `co_contratti` SET `id_segment` = (SELECT `id` FROM `zz_segments` WHERE `name` = "Standard contratti"); +UPDATE `dt_ddt` SET `id_segment` = (SELECT `id` FROM `zz_segments` WHERE `name` = "Standard ddt in entrata") WHERE `idtipoddt` = (SELECT `id` FROM `dt_tipiddt` WHERE `descrizione` = "Ddt in entrata"); +UPDATE `dt_ddt` SET `id_segment` = (SELECT `id` FROM `zz_segments` WHERE `name` = "Standard ddt in uscita") WHERE `idtipoddt` = (SELECT `id` FROM `dt_tipiddt` WHERE `descrizione` = "Ddt in uscita"); +UPDATE `co_preventivi` SET `id_segment` = (SELECT `id` FROM `zz_segments` WHERE `name` = "Standard preventivi"); +UPDATE `in_interventi` SET `id_segment` = (SELECT `id` FROM `zz_segments` WHERE `name` = "Standard attività"); +UPDATE `or_ordini` SET `id_segment` = (SELECT `id` FROM `zz_segments` WHERE `name` = "Standard ordini cliente") WHERE `idtipoordine` = (SELECT `id` FROM `or_tipiordine` WHERE `descrizione` = "Ordine cliente"); +UPDATE `or_ordini` SET `id_segment` = (SELECT `id` FROM `zz_segments` WHERE `name` = "Standard ordini fornitore") WHERE `idtipoordine` = (SELECT `id` FROM `or_tipiordine` WHERE `descrizione` = "Ordine fornitore"); + +-- Aggiunto controllo id_segment in options moduli +UPDATE `zz_modules` SET `options` = 'SELECT \n |select|\nFROM\n `in_interventi`\n LEFT JOIN `an_anagrafiche` ON `in_interventi`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\n LEFT JOIN `in_interventi_tecnici` ON `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`\n LEFT JOIN `in_interventi_tecnici_assegnati` ON `in_interventi_tecnici_assegnati`.`id_intervento` = `in_interventi`.`id`\n LEFT JOIN (SELECT idintervento, SUM(prezzo_unitario*qta-sconto) AS ricavo_righe, SUM(costo_unitario*qta) AS costo_righe FROM `in_righe_interventi` GROUP BY idintervento) AS righe ON righe.`idintervento` = `in_interventi`.`id`\n LEFT JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento`=`in_statiintervento`.`idstatointervento`\n LEFT JOIN `an_referenti` ON `in_interventi`.`idreferente` = `an_referenti`.`id`\n LEFT JOIN (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) AS sede_destinazione ON sede_destinazione.id = in_interventi.idsede_destinazione\n LEFT JOIN (SELECT GROUP_CONCAT(DISTINCT co_documenti.numero_esterno SEPARATOR \', \') AS info, co_righe_documenti.original_document_id AS idintervento FROM co_documenti INNER JOIN co_righe_documenti ON co_documenti.id = co_righe_documenti.iddocumento WHERE original_document_type = \'Modules\\\\Interventi\\\\Intervento\' GROUP BY idintervento) AS fattura ON fattura.idintervento = in_interventi.id\n LEFT JOIN (SELECT `in_interventi_tecnici_assegnati`.`id_intervento`, GROUP_CONCAT( DISTINCT `ragione_sociale` SEPARATOR \', \') AS nomi FROM `an_anagrafiche` INNER JOIN `in_interventi_tecnici_assegnati` ON `in_interventi_tecnici_assegnati`.`id_tecnico` = `an_anagrafiche`.`idanagrafica` GROUP BY `id_intervento`) AS tecnici_assegnati ON `in_interventi`.`id` = `tecnici_assegnati`.`id_intervento` \n LEFT JOIN (SELECT `in_interventi_tecnici`.`idintervento`, GROUP_CONCAT( DISTINCT `ragione_sociale` SEPARATOR \', \') AS nomi FROM `an_anagrafiche` INNER JOIN `in_interventi_tecnici` ON `in_interventi_tecnici`.`idtecnico` = `an_anagrafiche`.`idanagrafica` GROUP BY `idintervento`) AS tecnici ON `in_interventi`.`id` = `tecnici`.`idintervento`\n LEFT JOIN (SELECT `zz_operations`.`id_email`, `zz_operations`.`id_record` FROM `zz_operations` INNER JOIN `em_emails` ON `zz_operations`.`id_email` = `em_emails`.`id` INNER JOIN `em_templates` ON `em_emails`.`id_template` = `em_templates`.`id` INNER JOIN `zz_modules` ON `zz_operations`.`id_module` = `zz_modules`.`id` WHERE `zz_modules`.`name` = \'Interventi\' AND `zz_operations`.`op` = \'send-email\' GROUP BY `zz_operations`.`id_record`) AS email ON email.id_record=in_interventi.id\n LEFT JOIN (SELECT GROUP_CONCAT(CONCAT(matricola, IF(nome != \'\', CONCAT(\' - \', nome), \'\')) SEPARATOR \'
\') AS descrizione, my_impianti_interventi.idintervento FROM my_impianti INNER JOIN my_impianti_interventi ON my_impianti.id = my_impianti_interventi.idimpianto GROUP BY my_impianti_interventi.idintervento) AS impianti ON impianti.idintervento = in_interventi.id\n LEFT JOIN (SELECT co_contratti.id, CONCAT(co_contratti.numero, \' del \', DATE_FORMAT(data_bozza, \'%d/%m/%Y\')) AS info FROM co_contratti) AS contratto ON contratto.id = in_interventi.id_contratto\n LEFT JOIN (SELECT co_preventivi.id, CONCAT(co_preventivi.numero, \' del \', DATE_FORMAT(data_bozza, \'%d/%m/%Y\')) AS info FROM co_preventivi) AS preventivo ON preventivo.id = in_interventi.id_preventivo\n LEFT JOIN (SELECT or_ordini.id, CONCAT(or_ordini.numero, \' del \', DATE_FORMAT(data, \'%d/%m/%Y\')) AS info FROM or_ordini) AS ordine ON ordine.id = in_interventi.id_ordine\n LEFT JOIN `in_tipiintervento` ON `in_interventi`.`idtipointervento` = `in_tipiintervento`.`idtipointervento`\nWHERE \n 1=1 |segment(`in_interventi`.`id_segment`)| |date_period(`orario_inizio`,`data_richiesta`)|\nGROUP BY \n `in_interventi`.`id`\nHAVING \n 2=2\nORDER BY \n IFNULL(`orario_fine`, `data_richiesta`) DESC' WHERE `zz_modules`.`name` = 'Interventi'; + +UPDATE `zz_modules` SET `options` = 'SELECT |select|\nFROM `co_preventivi`\n LEFT JOIN `an_anagrafiche` ON `co_preventivi`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\n LEFT JOIN `co_statipreventivi` ON `co_preventivi`.`idstato` = `co_statipreventivi`.`id`\n LEFT JOIN (\n SELECT `idpreventivo`,\n SUM(`subtotale` - `sconto`) AS `totale_imponibile`,\n SUM(`subtotale` - `sconto` + `iva`) AS `totale`\n FROM `co_righe_preventivi`\n GROUP BY `idpreventivo`\n ) AS righe ON `co_preventivi`.`id` = `righe`.`idpreventivo`\n\nLEFT JOIN (SELECT GROUP_CONCAT(DISTINCT co_documenti.numero_esterno SEPARATOR \", \") AS info, co_righe_documenti.original_document_id AS idpreventivo FROM co_documenti INNER JOIN co_righe_documenti ON co_documenti.id = co_righe_documenti.iddocumento WHERE original_document_type=\'Modules\\\\Preventivi\\\\Preventivo\' GROUP BY idpreventivo) AS fattura ON fattura.idpreventivo = co_preventivi.id\nWHERE 1=1 |segment(`co_preventivi`.`id_segment`)| |date_period(custom,\'|period_start|\' >= `data_bozza` AND \'|period_start|\' <= `data_conclusione`,\'|period_end|\' >= `data_bozza` AND \'|period_end|\' <= `data_conclusione`,`data_bozza` >= \'|period_start|\' AND `data_bozza` <= \'|period_end|\',`data_conclusione` >= \'|period_start|\' AND `data_conclusione` <= \'|period_end|\',`data_bozza` >= \'|period_start|\' AND `data_conclusione` = \'0000-00-00\')| AND default_revision = 1\nGROUP BY `co_preventivi`.`id`\nHAVING 2=2\nORDER BY `co_preventivi`.`id` DESC ' WHERE `zz_modules`.`name` = 'Preventivi'; + +UPDATE `zz_modules` SET `options` = 'SELECT\n |select|\nFROM\n `or_ordini`\n LEFT JOIN `or_tipiordine` ON `or_ordini`.`idtipoordine` = `or_tipiordine`.`id`\n LEFT JOIN `an_anagrafiche` ON `or_ordini`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\n LEFT JOIN (SELECT `idordine`, SUM(`qta` - `qta_evasa`) AS `qta_da_evadere`, SUM(`subtotale` - `sconto`) AS `totale_imponibile`, SUM(`subtotale` - `sconto` + `iva`) AS `totale` FROM `or_righe_ordini` GROUP BY `idordine`) AS righe ON `or_ordini`.`id` = `righe`.`idordine`\n LEFT JOIN (SELECT `idordine`, MIN(`data_evasione`) AS `data_evasione` FROM `or_righe_ordini` WHERE (`qta` - `qta_evasa`)>0 GROUP BY `idordine`) AS `righe_da_evadere` ON `righe`.`idordine`=`righe_da_evadere`.`idordine`\n LEFT JOIN `or_statiordine` ON `or_statiordine`.`id` = `or_ordini`.`idstatoordine`\n LEFT JOIN (\nSELECT GROUP_CONCAT(DISTINCT co_documenti.numero_esterno SEPARATOR \', \') AS info, co_righe_documenti.original_document_id AS idordine FROM co_documenti INNER JOIN co_righe_documenti ON co_documenti.id = co_righe_documenti.iddocumento WHERE original_document_type=\'Modules\\Ordini\\Ordine\' GROUP BY idordine\n) AS fattura ON fattura.idordine = or_ordini.id\nLEFT JOIN (\nSELECT `zz_operations`.`id_email`, `zz_operations`.`id_record`\nFROM `zz_operations`\nINNER JOIN `em_emails` ON `zz_operations`.`id_email` = `em_emails`.`id`\nINNER JOIN `em_templates` ON `em_emails`.`id_template` = `em_templates`.`id`\nINNER JOIN `zz_modules` ON `zz_operations`.`id_module` = `zz_modules`.`id`\nWHERE `zz_modules`.`name` = \'Ordini cliente\' AND `zz_operations`.`op` = \'send-email\'\nGROUP BY `zz_operations`.`id_record`\n) AS `email` ON `email`.`id_record` = `or_ordini`.`id`\nWHERE\n 1=1 |segment(`or_ordini`.`id_segment`)| AND `dir` = \'entrata\' |date_period(`or_ordini`.`data`)|\nHAVING\n 2=2\nORDER BY \n `data` DESC, \n CAST(`numero_esterno` AS UNSIGNED) DESC' WHERE `zz_modules`.`name` = 'Ordini cliente'; + +UPDATE `zz_modules` SET `options` = 'SELECT\n |select|\nFROM\n `or_ordini`\n LEFT JOIN `or_tipiordine` ON `or_ordini`.`idtipoordine` = `or_tipiordine`.`id`\n LEFT JOIN `an_anagrafiche` ON `or_ordini`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\n LEFT JOIN (SELECT `idordine`, SUM(`qta` - `qta_evasa`) AS `qta_da_evadere`, SUM(`subtotale` - `sconto`) AS `totale_imponibile`, SUM(`subtotale` - `sconto` + `iva`) AS `totale` FROM `or_righe_ordini` GROUP BY `idordine`) AS righe ON `or_ordini`.`id` = `righe`.`idordine`\n LEFT JOIN (SELECT `idordine`, MIN(`data_evasione`) AS `data_evasione` FROM `or_righe_ordini` WHERE (`qta` - `qta_evasa`)>0 GROUP BY `idordine`) AS `righe_da_evadere` ON `righe`.`idordine`=`righe_da_evadere`.`idordine`\n LEFT JOIN `or_statiordine` ON `or_statiordine`.`id` = `or_ordini`.`idstatoordine`\n LEFT JOIN (\nSELECT GROUP_CONCAT(DISTINCT co_documenti.numero_esterno SEPARATOR \', \') AS info, co_righe_documenti.original_document_id AS idordine FROM co_documenti INNER JOIN co_righe_documenti ON co_documenti.id = co_righe_documenti.iddocumento WHERE original_document_type=\'Modules\\Ordini\\Ordine\' GROUP BY idordine\n) AS fattura ON fattura.idordine = or_ordini.id\nLEFT JOIN (\nSELECT `zz_operations`.`id_email`, `zz_operations`.`id_record`\nFROM `zz_operations`\nINNER JOIN `em_emails` ON `zz_operations`.`id_email` = `em_emails`.`id`\nINNER JOIN `em_templates` ON `em_emails`.`id_template` = `em_templates`.`id`\nINNER JOIN `zz_modules` ON `zz_operations`.`id_module` = `zz_modules`.`id`\nWHERE `zz_modules`.`name` = \'Ordini fornitore\' AND `zz_operations`.`op` = \'send-email\'\nGROUP BY `zz_operations`.`id_record`\n) AS `email` ON `email`.`id_record` = `or_ordini`.`id`\nWHERE\n 1=1 |segment(`or_ordini`.`id_segment`)| AND `dir` = \'uscita\' |date_period(`or_ordini`.`data`)|\nHAVING\n 2=2\nORDER BY \n `data` DESC, \n CAST(`numero_esterno` AS UNSIGNED) DESC' WHERE `zz_modules`.`name` = 'Ordini fornitore'; + +UPDATE `zz_modules` SET `options` = 'SELECT\n |select|\nFROM\n `dt_ddt`\nLEFT JOIN `an_anagrafiche` ON `dt_ddt`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\nLEFT JOIN `dt_tipiddt` ON `dt_ddt`.`idtipoddt` = `dt_tipiddt`.`id`\nLEFT JOIN `dt_causalet` ON `dt_ddt`.`idcausalet` = `dt_causalet`.`id`\nLEFT JOIN `dt_spedizione` ON `dt_ddt`.`idspedizione` = `dt_spedizione`.`id`\nLEFT JOIN `an_anagrafiche` `vettori` ON `dt_ddt`.`idvettore` = `vettori`.`idanagrafica`\nLEFT JOIN `an_sedi` AS sedi ON `dt_ddt`.`idsede_partenza` = sedi.`id`\nLEFT JOIN `an_sedi` AS `sedi_destinazione`ON `dt_ddt`.`idsede_destinazione` = `sedi_destinazione`.`id`\nLEFT JOIN(\n SELECT `idddt`,\n SUM(`subtotale` - `sconto`) AS `totale_imponibile`,\n SUM(`subtotale` - `sconto` + `iva`) AS `totale`\n FROM\n `dt_righe_ddt`\n GROUP BY\n `idddt`\n) AS righe\nON\n `dt_ddt`.`id` = `righe`.`idddt`\nLEFT JOIN `dt_statiddt` ON `dt_statiddt`.`id` = `dt_ddt`.`idstatoddt` \nWHERE\n 1=1 |segment(`dt_ddt`.`id_segment`)| AND `dir` = \'entrata\' |date_period(`data`)|\nHAVING\n 2=2\nORDER BY\n `data` DESC,\n CAST(`numero_esterno` AS UNSIGNED) DESC,\n `dt_ddt`.created_at DESC' WHERE `zz_modules`.`name` = 'Ddt di vendita'; + +UPDATE `zz_modules` SET `options` = 'SELECT\n |select|\nFROM\n `dt_ddt`\nLEFT JOIN `an_anagrafiche` ON `dt_ddt`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\nLEFT JOIN `dt_tipiddt` ON `dt_ddt`.`idtipoddt` = `dt_tipiddt`.`id`\nLEFT JOIN `dt_causalet` ON `dt_ddt`.`idcausalet` = `dt_causalet`.`id`\nLEFT JOIN `dt_spedizione` ON `dt_ddt`.`idspedizione` = `dt_spedizione`.`id`\nLEFT JOIN `an_anagrafiche` `vettori` ON `dt_ddt`.`idvettore` = `vettori`.`idanagrafica`\nLEFT JOIN `an_sedi` AS sedi ON `dt_ddt`.`idsede_partenza` = sedi.`id`\nLEFT JOIN `an_sedi` AS `sedi_destinazione`ON `dt_ddt`.`idsede_destinazione` = `sedi_destinazione`.`id`\nLEFT JOIN(\n SELECT `idddt`,\n SUM(`subtotale` - `sconto`) AS `totale_imponibile`,\n SUM(`subtotale` - `sconto` + `iva`) AS `totale`\n FROM\n `dt_righe_ddt`\n GROUP BY\n `idddt`\n) AS righe\nON\n `dt_ddt`.`id` = `righe`.`idddt`\nLEFT JOIN `dt_statiddt` ON `dt_statiddt`.`id` = `dt_ddt`.`idstatoddt` \nWHERE\n 1=1 |segment(`dt_ddt`.`id_segment`)| AND `dir` = \'uscita\' |date_period(`data`)|\nHAVING\n 2=2\nORDER BY\n `data` DESC,\n CAST(`numero_esterno` AS UNSIGNED) DESC,\n `dt_ddt`.created_at DESC' WHERE `zz_modules`.`name` = 'Ddt di acquisto'; + +UPDATE `zz_modules` SET `options` = 'SELECT\n |select|\nFROM\n `co_contratti`\n LEFT JOIN `an_anagrafiche` ON `co_contratti`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\n LEFT JOIN `co_staticontratti` ON `co_contratti`.`idstato` = `co_staticontratti`.`id`\n LEFT JOIN ( SELECT `idcontratto`, SUM(`subtotale` - `sconto`) AS `totale_imponibile`, SUM(`subtotale` - `sconto` + `iva`) AS `totale` FROM `co_righe_contratti` GROUP BY `idcontratto`) AS righe ON `co_contratti`.`id` = `righe`.`idcontratto`\n LEFT JOIN ( SELECT GROUP_CONCAT(CONCAT(matricola, IF(nome != \'\', CONCAT(\' - \', nome), \'\')) SEPARATOR \'
\') AS descrizione, my_impianti_contratti.idcontratto FROM my_impianti INNER JOIN my_impianti_contratti ON my_impianti.id = my_impianti_contratti.idimpianto GROUP BY my_impianti_contratti.idcontratto) AS impianti ON impianti.idcontratto = co_contratti.id\n LEFT JOIN( SELECT um, SUM(qta) AS somma, idcontratto FROM co_righe_contratti GROUP BY um, idcontratto) AS orecontratti ON orecontratti.um = \'ore\' AND orecontratti.idcontratto = co_contratti.id \n LEFT JOIN( SELECT in_interventi.id_contratto, idintervento, SUM(ore) AS sommatecnici FROM in_interventi_tecnici INNER JOIN in_interventi ON in_interventi_tecnici.idintervento = in_interventi.id GROUP BY in_interventi.id_contratto, idintervento) AS tecnici ON tecnici.id_contratto = co_contratti.id\nWHERE\n 1=1 |segment(`co_contratti`.`id_segment`)|\n |date_period(custom,\'|period_start|\' >= `data_bozza` AND \'|period_start|\' <= `data_conclusione`,\'|period_end|\' >= `data_bozza` AND \'|period_end|\' <= `data_conclusione`,`data_bozza` >= \'|period_start|\' AND `data_bozza` <= \'|period_end|\',`data_conclusione` >= \'|period_start|\' AND `data_conclusione` <= \'|period_end|\',`data_bozza` >= \'|period_start|\' AND `data_conclusione` = \'0000-00-00\')|\nHAVING \n 2=2' WHERE `zz_modules`.`name` = 'Contratti'; + +-- Eliminazione impostazioni maschere +DELETE FROM `zz_settings` WHERE `zz_settings`.`nome` = 'Formato numero secondario ddt'; +DELETE FROM `zz_settings` WHERE `zz_settings`.`nome` = 'Formato numero secondario ordine'; +DELETE FROM `zz_settings` WHERE `zz_settings`.`nome` = 'Formato codice attività'; +DELETE FROM `zz_settings` WHERE `zz_settings`.`nome` = 'Formato codice preventivi'; +DELETE FROM `zz_settings` WHERE `zz_settings`.`nome` = 'Formato codice contratti'; \ No newline at end of file diff --git a/update/tables.php b/update/tables.php index e445324a7..9ff198ea7 100755 --- a/update/tables.php +++ b/update/tables.php @@ -132,6 +132,7 @@ return [ 'zz_files', 'zz_groups', 'zz_group_module', + 'zz_group_segment', 'zz_group_view', 'zz_hooks', 'zz_imports',