Compare commits

...

2 Commits

Author SHA1 Message Date
MatteoPistorello 4a1c2a8113 Merge branch 'master' of https://github.com/devcode-it/openstamanager 2022-11-28 09:30:17 +01:00
MatteoPistorello c981f650bc Gestione permessi segmenti e numerazione documenti 2022-11-28 09:27:25 +01:00
45 changed files with 358 additions and 117 deletions

View File

@ -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",

View File

@ -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'].'"]}
</div>
<div class="col-md-4">
<div class="col-md-6">
{[ "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.'" ]}
</div>
<div class="col-md-4">
{[ "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.'" ]}
</div>
<div class="col-md-4">
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Ritenuta previdenziale').'", "name": "id_ritenuta_contributi", "value": "$id_ritenuta_contributi$", "values": "query=SELECT * FROM co_ritenuta_contributi" ]}
</div>';
}
@ -184,6 +179,9 @@ if (!empty($options['create_document'])) {
}
echo '
<div class="col-md-6">
{[ "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.'" ]}
</div>
</div>
</div>
</div>';

View File

@ -74,7 +74,7 @@ if (!empty($type) && $type != 'menu' && $type != 'custom') {
echo '
<div class="row">
<div class="col-md-4 pull-right">
{[ "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'].'" ]}
</div>
</div>
<br>';

View File

@ -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;
}

View File

@ -341,7 +341,10 @@ function redirectOperation($id_module, $id_record)
*/
function prepareToField($string)
{
return str_replace('"', '&quot;', $string);
$string = str_replace('&quot;', '&amp;quot;', $string);
$string = str_replace('"', '&quot;', $string);
return $string;
}
/**

View File

@ -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').'
<br><br>{[ "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'),

View File

@ -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;

View File

@ -42,19 +42,25 @@ echo '
</div>
<div class="row">
<div class="col-md-3">
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Stato').'", "name": "idstato", "required": 1, "values": "query='.$stati.'" ]}
</div>
<div class="col-md-3">
<div class="col-md-6">
{[ "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'].'" ]}
</div>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "date", "label": "'.tr('Data accettazione').'", "name": "data_accettazione" ]}
</div>
<div class="col-md-3">
<div class="col-md-4">
{[ "type": "date", "label": "'.tr('Data conclusione').'", "name": "data_conclusione" ]}
</div>
<div class="col-md-3">
<div class="col-md-4">
{[ "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').'" ]}
</div>
</div>

View File

@ -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": "<small>'.tr('Aggiungere alle fatture di vendita non ancora emesse?').'</small>", "placeholder": "'.tr('Aggiungere alle fatture esistenti non ancora emesse?').'", "name": "accodare" ]}<br>
{[ "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.'" ]}<br>
{[ "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.'" ]}<br>
{[ "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',

View File

@ -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', [

View File

@ -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);

View File

@ -48,7 +48,7 @@ $id_anagrafica = !empty(get('idanagrafica')) ? get('idanagrafica') : '';
<input type="hidden" name="id_record" value="">
<div class="row">
<div class="col-md-4">
<div class="col-md-6">
{[ "type": "date", "label": "<?php echo tr('Data'); ?>", "name": "data", "required": 1, "value": "-now-" ]}
</div>
@ -60,10 +60,16 @@ $id_anagrafica = !empty(get('idanagrafica')) ? get('idanagrafica') : '';
<div class="col-md-4 hide">
{[ "type": "select", "label": "<?php echo tr('Tipo ddt'); ?>", "name": "idtipoddt", "required": 1, "values": "query=SELECT id, descrizione FROM dt_tipiddt WHERE dir='<?php echo $dir; ?>'", "value": "<?php echo $id_tipoddt; ?>" ]}
</div>
</div>
<div class="col-md-4">
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Causale trasporto'); ?>", "name": "idcausalet", "required": 1, "value": "<?php echo $id_causalet; ?>", "ajax-source": "causali", "icon-after": "add|<?php echo Modules::get('Causali')['id']; ?>|||" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Sezionale'); ?>", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": <?php echo json_encode(['id_module' => $id_module, 'is_sezionale' => 1]); ?>, "value": "<?php echo $_SESSION['module_'.$id_module]['id_segment']; ?>" ]}
</div>
</div>
<!-- PULSANTI -->

View File

@ -179,7 +179,7 @@ $operations['crea_fattura'] = [
'data' => [
'title' => tr('Fatturare i _TYPE_ selezionati?', ['_TYPE_' => strtolower($module['name'])]),
'msg' => '{[ "type": "checkbox", "label": "<small>'.tr('Aggiungere alle _TYPE_ non ancora emesse?', ['_TYPE_' => strtolower($module_fatture)]).'", "placeholder": "'.tr('Aggiungere alle _TYPE_ nello stato bozza?', ['_TYPE_' => strtolower($module_fatture)]).'</small>", "name": "accodare" ]}<br>
{[ "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.'" ]}<br>
{[ "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.'" ]}<br>
{[ "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',

View File

@ -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);
}
/**

View File

@ -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))),

View File

@ -74,7 +74,7 @@ $idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Sezionale'); ?>", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='<?php echo $id_module; ?>' ORDER BY name", "value": "<?php echo $_SESSION['module_'.$id_module]['id_segment']; ?>" ]}
{[ "type": "select", "label": "<?php echo tr('Sezionale'); ?>", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": <?php echo json_encode(['id_module' => $id_module, 'is_sezionale' => 1]); ?>, "value": "<?php echo $_SESSION['module_'.$id_module]['id_segment']; ?>" ]}
</div>
</div>

View File

@ -557,7 +557,7 @@ $operations['export-csv'] = [
$operations['copy-bulk'] = [
'text' => '<span><i class="fa fa-copy"></i> '.tr('Duplica selezionati').'</span>',
'data' => [
'msg' => tr('Vuoi davvero duplicare le righe selezionate?').'<br><br>{[ "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" ]}<br>{[ "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'].'" ]}<br>{[ "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?').'<br><br>{[ "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" ]}<br>{[ "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'].'" ]}<br>{[ "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',
],

View File

@ -59,7 +59,7 @@ echo '
}
if (empty($record['is_fiscale'])) {
$msg = '<br>{[ "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 = '<br>{[ "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 '

View File

@ -33,7 +33,7 @@ echo '
</div>
<div class="col-md-6">
{[ "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.'" ]}
</div>
</div>

View File

@ -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 = '';

View File

@ -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 '
<form action="" method="post" id="add-form">
<input type="hidden" name="op" value="add">
@ -195,6 +192,10 @@ echo '
<div class="col-md-4">
{[ "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.'" ]}
</div>
<div class="col-md-4">
{[ "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'].'" ]}
</div>
</div>
<div class="row">

View File

@ -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'])]).' <small><i class="fa fa-question-circle-o tip" title="'.tr('Verranno fatturati solo gli interventi completati non collegati a contratti o preventivi').'."></i></small>',
'msg' => '{[ "type": "checkbox", "label": "<small>'.tr('Aggiungere alle fatture di vendita non ancora emesse?').'</small>", "placeholder": "'.tr('Aggiungere alle fatture di vendita nello stato bozza?').'", "name": "accodare" ]}<br>
{[ "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.'" ]}<br>
{[ "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.'" ]}<br>
{[ "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',

View File

@ -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');

View File

@ -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;

View File

@ -44,13 +44,17 @@ $id_anagrafica = !empty(get('idanagrafica')) ? get('idanagrafica') : $user['idan
<input type="hidden" name="id_record" value="">
<div class="row">
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "date", "label": "<?php echo tr('Data'); ?>", "name": "data", "required": 1, "value": "-now-" ]}
</div>
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo $tipo_anagrafica; ?>", "name": "idanagrafica", "required": 1, "value": "<?php echo $id_anagrafica; ?>", "ajax-source": "<?php echo $ajax; ?>", "icon-after": "add|<?php echo Modules::get('Anagrafiche')['id']; ?>|tipoanagrafica=<?php echo $tipo_anagrafica; ?>&readonly_tipo=1" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Sezionale'); ?>", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": <?php echo json_encode(['id_module' => $id_module, 'is_sezionale' => 1]); ?>, "value": "<?php echo $_SESSION['module_'.$id_module]['id_segment']; ?>" ]}
</div>
</div>
<!-- PULSANTI -->

View File

@ -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": "<small>'.tr('Aggiungere alle _TYPE_ non ancora emesse?', ['_TYPE_' => strtolower($module_fatture)]).'", "placeholder": "'.tr('Aggiungere alle _TYPE_ nello stato bozza?', ['_TYPE_' => strtolower($module_fatture)]).'</small>", "name": "accodare" ]}
<br>{[ "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.'" ]}<br>
{[ "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' => '<span><i class="fa fa-refresh"></i> '.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.<br>Tutti gli ordini processati verranno eliminati e verrà creato un nuovo ordine unificato per fornitore.').'<br>
<br>{[ "type": "select", "label": "'.tr('Stato').'", "name": "id_stato", "required": 1, "values": "query=SELECT id, descrizione FROM or_statiordine" ]}<br>
<br>{[ "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.<br>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,

View File

@ -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);
}
/**

View File

@ -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', [

View File

@ -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();

View File

@ -42,15 +42,17 @@ $stati = get('pianificabile') ? 'SELECT id, descrizione FROM co_statipreventivi
</div>
<div class="row">
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Sede'); ?>", "name": "idsede", "ajax-source": "sedi", "placeholder": "Sede legale" ]}
</div>
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "date", "label": "<?php echo tr('Data bozza'); ?>", "name": "data_bozza", "value": "<?php echo '-now-'; ?>", "required": 1 ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Sezionale'); ?>", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": <?php echo json_encode(['id_module' => $id_module, 'is_sezionale' => 1]); ?>, "value": "<?php echo $_SESSION['module_'.$id_module]['id_segment']; ?>" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">

View File

@ -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', [

View File

@ -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;

View File

@ -28,9 +28,13 @@ include_once __DIR__.'/../../core.php';
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "name", "required": 1, "value": "$name$" ]}
</div>
<div class="col-md-6">
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Maschera'); ?>", "name": "pattern", "class": "alphanumeric-mask", "value": "$pattern$", "maxlength": 25, "placeholder":"####/YYYY" ]}
</div>
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Sezionale'); ?>", "help": "<?php echo tr('Se attivo verrà utilizzato il contatore'); ?>", "name": "is_sezionale", "value": "$is_sezionale$" ]}
</div>
</div>
<div class="row">

View File

@ -0,0 +1,53 @@
<?php
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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;
}

View File

@ -33,28 +33,35 @@ include_once __DIR__.'/../../core.php';
<div class="panel-body">
<div class="row">
<div class="col-md-4">
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "name", "required": 1, "value": "$name$" ]}
</div>
<div class="col-md-4">
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Modulo'); ?>", "name": "module", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_modules WHERE ( enabled = 1 AND options != 'custom' ) OR id = <?php echo $record['id_module']; ?> ORDER BY name ASC", "value": "<?php echo $record['id_module']; ?>", "extra": "<?php echo ($record['predefined']) ? 'readonly' : ''; ?>" ]}
</div>
<div class="col-md-4">
<div class="col-md-2">
{[ "type": "checkbox", "label": "<?php echo tr('Predefinito'); ?>", "name": "predefined", "value": "$predefined$", "help": "<?php echo tr('Seleziona per rendere il segmento predefinito.'); ?>", "placeholder": "<?php echo tr('Segmento predefinito'); ?>", "extra": "<?php echo ($record['predefined']) ? 'readonly' : ''; ?>" ]}
</div>
<div class="col-md-2">
{[ "type": "checkbox", "label": "<?php echo tr('Sezionale'); ?>", "help": "<?php echo tr('Se attivo verrà utilizzato il contatore'); ?>", "name": "is_sezionale", "value": "$is_sezionale$", "extra": "readonly" ]}
</div>
<div class="col-md-2">
{[ "type": "text", "label": "<?php echo tr('Maschera'); ?>", "name": "pattern", "value": "$pattern$", "maxlength": 25, "placeholder":"####/YYYY", "extra": "<?php echo ($tot > 0) ? 'readonly' : ''; ?>", "extra": "<?php echo (!$record['is_sezionale']) ? 'readonly' : ''; ?>" ]}
</div>
</div>
<div class="row">
<div class="col-md-8">
{[ "type": "textarea", "label": "<?php echo tr('Filtro'); ?>", "name": "clause", "required": 1, "value": "$clause$" ]}
{[ "type": "textarea", "label": "<?php echo tr('Filtro'); ?>", "name": "clause", "required": 1, "value": "$clause$", "extra": "<?php echo ($record['is_sezionale']) ? 'readonly' : ''; ?>" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Posizione'); ?>", "name": "position", "required": 1, "values":"list=\"WHR\": \"WHERE\", \"HVN\": \"HAVING\"", "value": "$position$" ]}
{[ "type": "select", "label": "<?php echo tr('Posizione'); ?>", "name": "position", "required": 1, "values":"list=\"WHR\": \"WHERE\", \"HVN\": \"HAVING\"", "value": "$position$", "extra": "<?php echo ($record['is_sezionale']) ? 'readonly' : ''; ?>" ]}
</div>
</div>
@ -92,13 +99,23 @@ $_SESSION['module_'.$record['id_module']]['id_segment'] = $previous_module;
</div>
<?php
}
echo '
<div class="row">
<div class="col-md-12">
{[ "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').'" ]}
</div>
</div>';
?>
</div>
</div>
<?php
if (string_contains($current_module['option'], '|segment')) {
if ($record['is_sezionale']) {
?>
<!-- Campi extra -->
<div class="panel panel-primary">
@ -108,26 +125,22 @@ if (string_contains($current_module['option'], '|segment')) {
<div class="panel-body">
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "<?php echo tr('Maschera'); ?>", "name": "pattern", "value": "$pattern$", "maxlength": 25, "placeholder":"####/YYYY", "extra": "<?php echo ($tot > 0) ? 'readonly' : ''; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "checkbox", "label": "<?php echo tr('Sezionale fiscale'); ?>", "name": "is_fiscale", "value": "$is_fiscale$", "extra": "<?php echo ($tot > 0) ? 'readonly' : ''; ?>" ]}
{[ "type": "checkbox", "label": "<?php echo tr('Sezionale fiscale'); ?>", "name": "is_fiscale", "value": "$is_fiscale$", "extra": "<?php echo ($tot > 0 || ($record['modulo']!='Fatture di vendita' && $record['modulo']!='Fatture di acquisto')) ? 'readonly' : ''; ?>" ]}
</div>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "checkbox", "label": "<?php echo tr('Predefinito note di credito'); ?>", "name": "predefined_accredito", "value": "$predefined_accredito$", "help": "<?php echo tr('Seleziona per rendere il sezionale predefinito per le note di credito'); ?>", "placeholder": "<?php echo tr('Sezionale predefinito per le note di credito'); ?>" ]}
{[ "type": "checkbox", "label": "<?php echo tr('Predefinito note di credito'); ?>", "name": "predefined_accredito", "value": "$predefined_accredito$", "help": "<?php echo tr('Seleziona per rendere il sezionale predefinito per le note di credito'); ?>", "placeholder": "<?php echo tr('Sezionale predefinito per le note di credito'); ?>", "extra": "<?php echo ($record['modulo']!='Fatture di vendita' && $record['modulo']!='Fatture di acquisto') ? 'readonly' : ''; ?>" ]}
</div>
<div class="col-md-4">
{[ "type": "checkbox", "label": "<?php echo tr('Predefinito note di debito'); ?>", "name": "predefined_addebito", "value": "$predefined_addebito$", "help": "<?php echo tr('Seleziona per rendere il sezionale predefinito per le note di debito'); ?>", "placeholder": "<?php echo tr('Sezionale predefinito per le note di debito'); ?>" ]}
{[ "type": "checkbox", "label": "<?php echo tr('Predefinito note di debito'); ?>", "name": "predefined_addebito", "value": "$predefined_addebito$", "help": "<?php echo tr('Seleziona per rendere il sezionale predefinito per le note di debito'); ?>", "placeholder": "<?php echo tr('Sezionale predefinito per le note di debito'); ?>", "extra": "<?php echo ($record['modulo']!='Fatture di vendita' && $record['modulo']!='Fatture di acquisto') ? 'readonly' : ''; ?>" ]}
</div>
<div class="col-md-4">
{[ "type": "checkbox", "label": "<?php echo tr('Autofatture'); ?>", "name": "autofatture", "value": "$autofatture$" ]}
{[ "type": "checkbox", "label": "<?php echo tr('Autofatture'); ?>", "name": "autofatture", "value": "$autofatture$", "extra": "<?php echo ($record['modulo']!='Fatture di vendita' && $record['modulo']!='Fatture di acquisto') ? 'readonly' : ''; ?>" ]}
</div>
</div>

View File

@ -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'];
}

View File

@ -229,7 +229,7 @@ $id_segment = $is_autofattura ? setting('Sezionale per autofatture di acquisto')
echo '
<div class="col-md-3">
{[ "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.'" ]}
</div>';
// Data di registrazione

View File

@ -66,7 +66,7 @@ echo '
echo '
<div class="row">
<div class="col-md-6">
{[ "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'].'" ]}
</div>';
// Conto

View File

@ -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;

View File

@ -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 '
<div class="panel-body">
<div class="row">
<div class="col-md-6">
<div class="col-md-4">
{[ "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.'" ]}
</div>
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Tipo intervento').'", "name": "idtipointervento", "required": 1, "id": "idtipointervento_", "value": "'.$record['idtipointervento'].'", "readonly": '.intval($block_edit).', "ajax-source": "tipiintervento", "value": "'.$idtipointervento.'" ]}
</div>
<div class="col-md-4">
{[ "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'].'" ]}
</div>
</div>
<div class="row">

View File

@ -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];

View File

@ -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());

View File

@ -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),

View File

@ -620,6 +620,73 @@ HAVING
ORDER BY
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, \'<br />\',IF(an_sedi.telefono!=\'\',CONCAT(an_sedi.telefono,\'<br />\'),\'\'),IF(an_sedi.cellulare!=\'\',CONCAT(an_sedi.cellulare,\'<br />\'),\'\'),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 \'<br />\') 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 \'<br>\') 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';
-- Aggiunta campi provvigione su righe promemoria
ALTER TABLE `co_righe_promemoria` ADD `provvigione` DECIMAL(15,6) NOT NULL AFTER `prezzo_unitario_ivato`, ADD `provvigione_unitaria` DECIMAL(15,6) NOT NULL AFTER `provvigione`, ADD `provvigione_percentuale` DECIMAL(15,6) NOT NULL AFTER `provvigione_unitaria`, ADD `tipo_provvigione` ENUM('UNT','PRC') NOT NULL DEFAULT 'UNT' AFTER `provvigione_percentuale`;
@ -709,4 +776,4 @@ WHERE
HAVING
2=2
ORDER BY
`nome`" WHERE `name` = 'Piani di sconto/maggiorazione';
`nome`" WHERE `name` = 'Piani di sconto/maggiorazione';

View File

@ -132,6 +132,7 @@ return [
'zz_files',
'zz_groups',
'zz_group_module',
'zz_group_segment',
'zz_group_view',
'zz_hooks',
'zz_imports',