Merge branch 'master' into plugin-sidebar

This commit is contained in:
Thomas Zilio 2020-07-31 11:30:35 +02:00
commit 12deba4c2a
58 changed files with 7450 additions and 5188 deletions

View File

@ -4,6 +4,7 @@ Tutti i maggiori cambiamenti di questo progetto saranno documentati in questo fi
Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://keepachangelog.com/), e il progetto segue il [Semantic Versioning](http://semver.org/) per definire le versioni delle release.
- [2.4.16 (2020-07-28)](#2416-2020-07-28)
- [2.4.15 (2020-05-01)](#2415-2020-05-01)
- [2.4.14 (2020-04-23)](#2414-2020-04-23)
- [2.4.13 (2020-02-05)](#2413-2020-02-05)
@ -25,7 +26,63 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
- [2.2 (2016-11-10)](#22-2016-11-10)
- [2.1 (2015-04-02)](#21-2015-04-02)
## 2.4.15 (2020-05-01)
## 2.4.16 (2020-07-28)
### Aggiunto (Added)
- Aggiunta possibilità di creare un contratto dalla scheda del preventivo
- Aggiunta in supersearch la ricerca articoli per barcode
- Aggiunta rivalsa INPS e relativa IVA per il calcolo del totale ivato del documento
- Aggiunta colonna immagine per stampa preventivi
- Aggiunto pulsante visualizza la scheda del promemoria
- Aggiunta gestione allegati nello scadenzario
- Aggiunto ID per righe documenti
- Aggiunto avviso se ci sono fatture in elaborazione da più di 7 giorni per le quali non ho ancora ricevuto in feedback
- Aggiunta possibilità di duplicare l'attività (anche in bulk)
- Aggiunte operazioni di verifica notifica FE
- Aggiunta scelta del sezionale prima della stampa del registro IVA
- Aggiunta visualizzazione quantità disponibile in ordine
- Agginata possibilità di specificare riferimenti tra i documenti (#822)
- Aggiunti dettagli Fornitori per gli Articoli (#810)
- Aggiunto prezzo vendita ivato per gli Articoli
- Aggiunti periodi temporali per campo “Validità” (#806)
- Aggiunto supporto alle Causali DDT non fatturabili
- Aggiunti totali delle tabelle ristretti alla selezione
- Aggiunta articoli in sequenza tramite barcode
### Modificato (Changed)
- Allineamento Fattura Elettronica a versione schema XML 1.2.1
- Aggiornamento foglio di stile FE Asso Invoice
- Migliorato caricamento files con Dropzone
- Aggiornamento a Gulp4
- Migliorata stampa registro IVA
- Compattazione grafica righe documenti
- Ottimizzazione caricamento lista fatture
### Fixed
- Fix pulsante compilazione automatica campi in fase di import Fattura Elettronica passiva
- Fix statistiche per anagrafiche eliminate
- Fix creazione sottocategoria articoli
- Fix riporto sconti da attività a fattura (#817)
- Fix calcolo numero progressivo in fase di duplicazione dei preventivi (#825)
- Fix stampa preventivo per descrizioni lunghe con testo troppo piccolo (#759)
- Ripristino TD01 per fatture differite
- Fix widget "Contratti in scadenza"
- Fix IVA con prezzi fino a 6 decimali
- Fix valorizzazione campi anagrafica fornitore creata in fase di import Fattura Elettronica passiva (#840)
- Fix sconto attività (#841)
- Fix filtro articoli con caratteri speciali (#838)
- Fix lunghezza campo PrezzoUnitario per problemi di arrotondamento e calcolo FE
- Fix calcolo sconto su riga per prezzi ivati
- Fix calcolo ore Consuntivo Contratti
- Fix movimentazioni per Note di credito/debito
- Fix Validazione codice articolo (#854)
- Fix dicitura footer stampa fattura
- Fix calcolo quantità per inventario
- Fix stato dei Preventivi selezionabili
## 2.4.15 (2020-05-01)
### Aggiunto (Added)
- Aggiunta impostazione per abilitare la notifica di nuove pre-release oltre a release stabili

View File

@ -8,12 +8,18 @@ if (!isset($resource)) {
$page = filter('page') ?: 0;
$length = filter('length') ?: 100;
// Opzioni di selezione sugli elementi
$options = filter('options') ?: [];
$options_compatibility = $_SESSION['superselect'] ?: [];
$options = array_merge($options_compatibility, $options);
// Preselezione su $elements dichiarato da file precedente
if (!isset($elements)) {
$elements = [];
}
$elements = (!is_array($elements)) ? explode(',', $elements) : $elements;
$results = AJAX::select($op, $elements, $search, $page, $length);
$results = AJAX::select($op, $elements, $search, $page, $length, $options);
echo json_encode($results);
}

View File

@ -898,7 +898,7 @@ input.small-width {
border: 2px dashed #337ab7;
border-radius: 5px;
background: white;
margin-top:10px;
margin-top: 10px;
}
.dropzone .dz-message {
@ -912,6 +912,40 @@ input.small-width {
margin-top: 1.4rem;
}
/* Fancy checkbox: https://bootsnipp.com/snippets/M2bda */
.form-group input[type="checkbox"] {
display: none;
}
.form-group input[type="checkbox"] + .btn-group > label span {
width: 20px;
}
.form-group input[type="checkbox"] + .btn-group {
width: 100%;
display: flex;
}
.form-group input[type="checkbox"] + .btn-group label:last-child {
flex-grow: 100;
}
.form-group input[type="checkbox"] + .btn-group > label span:first-child {
display: none;
}
.form-group input[type="checkbox"] + .btn-group > label span:last-child {
display: inline-block;
}
.form-group input[type="checkbox"]:checked + .btn-group > label span:first-child {
display: inline-block;
}
.form-group input[type="checkbox"]:checked + .btn-group > label span:last-child {
display: none;
}
.control-sidebar-bg {
top: 50px;
}

View File

@ -70,11 +70,24 @@ function start_superselect() {
dataType: 'json',
delay: 250,
data: function (params) {
return {
const data = {
search: params.term,
page: params.page || 0,
length: params.length || 100,
}
options: {}, // Dati aggiuntivi
};
// Lettura dei dati aggiuntivi
$(this).each(function () {
$.each(this.attributes, function () {
if (this.specified && this.name.startsWith('data-select-')) {
const name = this.name.replace('data-select-', '');
data.options[name] = this.value;
}
});
});
return data;
},
processResults: function (data, params) {
params.page = params.page || 0;
@ -163,7 +176,7 @@ jQuery.fn.selectAdd = function (values) {
values.forEach(function (item) {
if (item.data) {
Object.keys(item.data).forEach(function(element) {
Object.keys(item.data).forEach(function (element) {
item['data-' + element] = item.data[element];
});
}
@ -196,3 +209,12 @@ jQuery.fn.selectData = function () {
}
}
};
/**
* Imposta le informazioni aggiuntive di un <select> creato con select2.
*/
jQuery.fn.selectInfo = function (name, value) {
this.attr('data-select-' + name, value);
return this;
};

View File

@ -388,10 +388,7 @@ if (empty($record) || !$has_access) {
</div>
<div class="col-md-4 text-right">
<p><small class="label label-default tip" title="'.Translator::timestampToLocale($operation['created_at']).'"><i class="fa fa-clock-o"></i> '.Carbon::parse($operation['created_at'])->diffForHumans().'</small></p>
<p><small class="label label-default"><i class="fa fa-user"></i> '.tr('_USER_', [
'_USER_' => $operation['username'],
]).
'</small></p>
<p><small class="label label-default"><i class="fa fa-user"></i> '.$operation['username'].'</small></p>
</div>
</div>
</div>

View File

@ -122,6 +122,7 @@ function srcCSS() {
var themes = gulp.src([
config.development + '/' + config.paths.css + '/themes/*.{css,scss,less,styl}',
config.main.bowerDirectory + '/admin-lte/dist/css/skins/_all-skins.min.css',
])
.pipe(gulpIf('*.scss', sass(), gulpIf('*.less', less(), gulpIf('*.styl', stylus()))))
.pipe(autoprefixer())

View File

@ -117,6 +117,8 @@ echo '
}
$("#um").selectSetNew($data.um, $data.um);
// Aggiornamento automatico di guadagno e margine
aggiorna_guadagno();
}';
if ($module['name'] != 'Contratti' && $module['name'] != 'Preventivi') {

View File

@ -64,14 +64,27 @@ if (!empty($options['create_document'])) {
}
echo '
<div class="col-md-6">
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Ritenuta contributi').'", "name": "id_ritenuta_contributi", "value": "$id_ritenuta_contributi$", "values": "query=SELECT * FROM co_ritenuta_contributi" ]}
</div>
<div class="col-md-12">
{[ "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>';
} elseif ($options['op'] == 'add_ordine_cliente') {
}
// Opzioni aggiuntive per gli Interventi
elseif ($final_module['name'] == 'Interventi') {
echo '
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Stato').'", "name": "id_stato_intervento", "required": 1, "values": "query=SELECT idstatointervento AS id, descrizione, colore AS _bgcolor_ FROM in_statiintervento WHERE deleted_at IS NULL" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Tipo').'", "name": "id_tipo_intervento", "required": 1, "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento" ]}
</div>';
}
// Selezione fornitore per Ordine fornitore
elseif ($options['op'] == 'add_ordine_cliente') {
$tipo_anagrafica = tr('Fornitore');
$ajax = 'fornitori';
@ -87,7 +100,7 @@ if (!empty($options['create_document'])) {
</div>';
}
// Conto, rivalsa INPS, ritenuta d'acconto e ritenuta contributi
// Conto, rivalsa INPS, ritenuta d'acconto e ritenuta contributi
if (in_array($final_module['name'], ['Fatture di vendita', 'Fatture di acquisto']) && !in_array($original_module['name'], ['Fatture di vendita', 'Fatture di acquisto'])) {
$id_rivalsa_inps = setting('Percentuale rivalsa');
if ($dir == 'uscita') {

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -10,10 +10,12 @@ $id = post('id');
switch (filter('op')) {
case 'check':
$result = UpdateHook::isAvailable();
$versione = $result[0].' ('.$result[1].')';
Cache::get('Ultima versione di OpenSTAManager disponibile')->set($result[0].' ('.$result[1].')');
// Salvataggio della versione nella cache
Cache::get('Ultima versione di OpenSTAManager disponibile')->set($versione);
echo $result[0];
echo $versione;
break;

View File

@ -125,10 +125,11 @@ function search(button) {
op: "check",
},
success: function(data){
if (data == "none" || data == "" ) {
if (data === "none" || !data) {
$("#update-search").html("'.tr('Nessun aggiornamento disponibile').'.");
} else {
$("#update-search").html("'.tr("E' stato individuato un nuovo aggiornamento").': " + data + ".<br>'.tr('Scaricalo ora: _LINK_', [
let beta_warning = data.includes("beta") ? "<br><b>'.tr('Attenzione: la versione individuata è in fase sperimentale, e pertanto può presentare diversi bug e malfunzionamenti').'.</b>" : "";
$("#update-search").html("'.tr("E' stato individuato un nuovo aggiornamento").': " + data + "." + beta_warning + "<br>'.tr('Scaricalo ora: _LINK_', [
'_LINK_' => "<a target='_blank' href='https://github.com/devcode-it/openstamanager/releases'>https://github.com/devcode-it/openstamanager/releases</a>",
]).'");
}

View File

@ -51,7 +51,7 @@ class UpdateHook extends CachedManager
if (!$api['prerelease'] or setting('Abilita canale pre-release per aggiornamenti')) {
$version[0] = ltrim($api['tag_name'], 'v');
$version[1] = (($api['prerelease']) ? 'prerelease' : 'stable');
$version[1] = !empty($api['prerelease']) ? 'beta' : 'stabile';
$current = Update::getVersion();
if (version_compare($current, $version[0]) < 0) {

View File

@ -4,13 +4,13 @@ include_once __DIR__.'/../../../core.php';
switch ($resource) {
case 'clienti':
$query = "SELECT an_anagrafiche.idanagrafica AS id, CONCAT(ragione_sociale, IF(citta IS NULL OR citta = '', '', CONCAT(' (', citta, ')')), IF(deleted_at IS NULL, '', ' (".tr('eliminata').")')) AS descrizione, idtipointervento_default FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica |where| ORDER BY ragione_sociale";
$query = "SELECT an_anagrafiche.idanagrafica AS id, CONCAT(ragione_sociale, IF(citta IS NULL OR citta = '', '', CONCAT(' (', citta, ')')), IF(deleted_at IS NULL, '', ' (".tr('eliminata').")')) AS descrizione, idtipointervento_default, in_tipiintervento.descrizione AS idtipointervento_descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica LEFT JOIN in_tipiintervento ON an_anagrafiche.idtipointervento_default=in_tipiintervento.idtipointervento |where| ORDER BY ragione_sociale";
foreach ($elements as $element) {
$filter[] = 'an_anagrafiche.idanagrafica='.prepare($element);
}
$where[] = "descrizione='Cliente'";
$where[] = "an_tipianagrafiche.descrizione='Cliente'";
if (empty($filter)) {
$where[] = 'deleted_at IS NULL';
}
@ -22,6 +22,7 @@ switch ($resource) {
}
$custom['idtipointervento'] = 'idtipointervento_default';
$custom['idtipointervento_descrizione'] = 'idtipointervento_descrizione';
break;

View File

@ -14,7 +14,7 @@ if (!empty($google)) {
}
if (!$is_cliente && !$is_fornitore && $is_tecnico) {
$ignore = $dbo->fetchArray("SELECT id FROM zz_plugins WHERE name='Sedi' OR name='Referenti' OR name='Dichiarazioni d\'intento'");
$ignore = $dbo->fetchArray("SELECT id FROM zz_plugins WHERE name='Sedi' OR name='Referenti' OR name='Dichiarazioni d\'intento'");
foreach ($ignore as $plugin) {
echo '
@ -232,7 +232,7 @@ if (!empty($google)) {
} else {
echo '
<div class="alert alert-info">
'.Modules::link('Impostazioni', $dbo->fetchOne("SELECT `id` FROM `zz_settings` WHERE sezione='Generali'")['id'], tr('Per abilitare la visualizzazione delle anagrafiche nella mappa, inserire la Google Maps API Key nella scheda Impostazioni')).'.
'.Modules::link('Impostazioni', $dbo->fetchOne("SELECT `id` FROM `zz_settings` WHERE nome='Google Maps API key'")['id'], tr('Per abilitare la visualizzazione delle anagrafiche nella mappa, inserire la Google Maps API Key nella scheda Impostazioni')).'.
</div>';
}
@ -296,7 +296,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<div class="tab-pane '.(!$is_cliente ? 'hide' : 'active').'" id="cliente">
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Agenti secondari').'", "multiple": "1", "name": "idagenti[]", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, IF(deleted_at IS NOT NULL, CONCAT(ragione_sociale, \' (Eliminato)\'), ragione_sociale ) AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE (descrizione=\'Agente\' AND deleted_at IS NULL AND an_anagrafiche.idanagrafica NOT IN (SELECT idagente FROM an_anagrafiche WHERE idanagrafica = '.prepare($record['idanagrafica']).')) OR (an_anagrafiche.idanagrafica IN (SELECT idagente FROM an_anagrafiche_agenti WHERE idanagrafica = '.prepare($record['idanagrafica']).') ) ORDER BY ragione_sociale", "value": "$idagenti$" ]}
{[ "type": "select", "label": "'.tr('Tipo attività predefinita').'", "name": "idtipointervento_default", "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC", "value": "$idtipointervento_default$" ]}
</div>
<div class="col-md-6">
@ -336,11 +336,11 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Tipo attività predefinita').'", "name": "idtipointervento_default", "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC", "value": "$idtipointervento_default$" ]}
{[ "type": "select", "label": "'.tr('Agente principale').'", "name": "idagente", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, IF(deleted_at IS NOT NULL, CONCAT(ragione_sociale, \' (Eliminato)\'), ragione_sociale ) AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE (descrizione=\'Agente\' AND deleted_at IS NULL)'.(isset($record['idagente']) ? 'OR (an_anagrafiche.idanagrafica = '.prepare($record['idagente']).' AND deleted_at IS NOT NULL) ' : '').'ORDER BY ragione_sociale", "value": "$idagente$" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Agente principale').'", "name": "idagente", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, IF(deleted_at IS NOT NULL, CONCAT(ragione_sociale, \' (Eliminato)\'), ragione_sociale ) AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE (descrizione=\'Agente\' AND deleted_at IS NULL)'.(isset($record['idagente']) ? 'OR (an_anagrafiche.idanagrafica = '.prepare($record['idagente']).' AND deleted_at IS NOT NULL) ' : '').'ORDER BY ragione_sociale", "value": "$idagente$" ]}
{[ "type": "select", "label": "'.tr('Agenti secondari').'", "multiple": "1", "name": "idagenti[]", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, IF(deleted_at IS NOT NULL, CONCAT(ragione_sociale, \' (Eliminato)\'), ragione_sociale ) AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE (descrizione=\'Agente\' AND deleted_at IS NULL AND an_anagrafiche.idanagrafica NOT IN (SELECT idagente FROM an_anagrafiche WHERE idanagrafica = '.prepare($record['idanagrafica']).')) OR (an_anagrafiche.idanagrafica IN (SELECT idagente FROM an_anagrafiche_agenti WHERE idanagrafica = '.prepare($record['idanagrafica']).') ) ORDER BY ragione_sociale", "value": "$idagenti$" ]}
</div>
</div>';
@ -350,19 +350,16 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
echo '
<div class="row">
<div class="col-md-6">
';
<p><b>'.tr('Piano dei conti cliente').'</b></p>';
if (!empty($conto['numero_conto'])) {
$piano_dei_conti_cliente = tr('_NAME_', [
'_NAME_' => $conto['numero'].'.'.$conto['numero_conto'].' '.htmlentities($conto['descrizione']),
]);
echo Modules::link('Piano dei conti', null, null, null, 'class="pull-right"', 1, 'movimenti-'.$conto['id']);
$piano_dei_conti_cliente = $conto['numero'].'.'.$conto['numero_conto'].' '.$conto['descrizione'];
echo Modules::link('Piano dei conti', null, $piano_dei_conti_cliente, null, '', 1, 'movimenti-'.$conto['id']);
} else {
$piano_dei_conti_cliente = tr('Nessuno');
}
echo '
{[ "type": "select", "label": "'.tr('Piano dei conti cliente').'", "name": "piano_dei_conti_cliente", "values": "list=\"\": \"'.$piano_dei_conti_cliente.'\"", "readonly": 1 ]}
</div>
</div>
</div>';
@ -394,28 +391,21 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
{[ "type": "select", "label": "'.tr('Listino articoli').'", "name": "idlistino_acquisti", "values": "query=SELECT id, nome AS descrizione FROM mg_listini ORDER BY nome ASC", "value": "$idlistino_acquisti$" ]}
</div>';
echo '
<div class="col-md-6">';
/*echo '
<p>'.tr('Piano dei conti collegato: _NAME_', [
'_NAME_' => $conto['numero'].'.'.$conto['numero_conto'].' '.$conto['descrizione'],
]).Modules::link('Piano dei conti', null, '').'</p>';*/
// Collegamento con il conto
$conto = $dbo->fetchOne('SELECT co_pianodeiconti2.numero as numero, co_pianodeiconti3.numero as numero_conto, co_pianodeiconti3.descrizione as descrizione FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti3.id = '.prepare($record['idconto_fornitore']));
$conto = $dbo->fetchOne('SELECT co_pianodeiconti3.id, co_pianodeiconti2.numero as numero, co_pianodeiconti3.numero as numero_conto, co_pianodeiconti3.descrizione as descrizione FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti3.id = '.prepare($record['idconto_fornitore']));
echo '
<div class="col-md-6">
<p><b>'.tr('Piano dei conti fornitore').'</b></p>';
if (!empty($conto['numero_conto'])) {
$piano_dei_conti_fornitore = tr('_NAME_', [
'_NAME_' => $conto['numero'].'.'.$conto['numero_conto'].' '.$conto['descrizione'],
]);
echo Modules::link('Piano dei conti', null, null, null, 'class="pull-right"');
$piano_dei_conti_fornitore = $conto['numero'].'.'.$conto['numero_conto'].' '.$conto['descrizione'];
echo Modules::link('Piano dei conti', null, $piano_dei_conti_fornitore, null, '', 1, 'movimenti-'.$conto['id']);
} else {
$piano_dei_conti_fornitore = tr('Nessuno');
}
echo '
{[ "type": "select", "label": "'.tr('Piano dei conti fornitore').'", "name": "piano_dei_conti_fornitore", "values": "list=\"\": \"'.$piano_dei_conti_fornitore.'\"", "readonly": 1 ]}
</div>
</div>
</div>';
@ -444,7 +434,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<div class="panel-body">
<div class="row">
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Numero d\'iscrizione registro imprese'); ?>", "name": "codiceri", "value": "$codiceri$", "help": "<?php echo tr('Il numero registro imprese è il numero di iscrizione attribuito dal Registro Imprese della Camera di Commercio.'); ?>" ]}
</div>
@ -454,7 +444,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
'_PATTERN_' => 'RM-123456',
]); ?>" ]}
</div>
<!-- campi già specificati in Codice R.E.A., da eliminare nelle prossime release -->
<!--div class="col-md-3">
@ -464,7 +454,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Città iscr. C.C.I.A.A.'); ?>", "name": "cciaa_citta", "value": "$cciaa_citta$" ]}
</div-->
</div>
<div class="row">
<div class="col-md-3">
@ -508,7 +498,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<?php
if (in_array($id_azienda, $tipi_anagrafica)) {
echo '
<p class=\'badge badge-info\' >'.tr('Questa anagrafica &egrave; di tipo "Azienda"').'.</p>';
<p class="badge badge-info">'.tr('Questa anagrafica è di tipo "Azienda"').'.</p>';
}
?>
</div>

View File

@ -161,16 +161,20 @@ switch (post('op')) {
// Duplica articolo
case 'copy':
$new = $articolo->replicate();
$new->codice = post('codice');
$new->qta = 0;
$new->save();
// Copia degli allegati
$allegati = $articolo->uploads();
foreach ($allegati as $allegato) {
$allegato->copia([
'id_module' => $new->getModule()->id,
'id_record' => $new->id,
]);
$copia_allegati = post('copia_allegati');
if (!empty($copia_allegati)) {
$allegati = $articolo->uploads();
foreach ($allegati as $allegato) {
$allegato->copia([
'id_module' => $new->getModule()->id,
'id_record' => $new->id,
]);
}
}
// Salvataggio immagine relativa

View File

@ -6,17 +6,34 @@ switch ($resource) {
case 'articoli':
$sedi_non_impostate = !isset($superselect['idsede_partenza']) && !isset($superselect['idsede_destinazione']);
$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
$usare_dettaglio_fornitore = $superselect['dir'] == 'uscita';
$query = 'SELECT
mg_articoli.id,
mg_articoli.barcode,
mg_articoli.'.($prezzi_ivati ? 'prezzo_vendita_ivato' : 'prezzo_vendita').' AS prezzo_vendita,
mg_articoli.prezzo_vendita_ivato AS prezzo_vendita_ivato,';
// Informazioni relative al fornitore specificato dal documenti di acquisto
if ($usare_dettaglio_fornitore) {
$query .= '
IFNULL(mg_fornitore_articolo.codice_fornitore, mg_articoli.codice) AS codice,
IFNULL(mg_fornitore_articolo.descrizione, mg_articoli.descrizione) AS descrizione,
IFNULL(mg_fornitore_articolo.prezzo_acquisto, mg_articoli.prezzo_acquisto) AS prezzo_acquisto,
mg_articoli.'.($prezzi_ivati ? 'prezzo_vendita_ivato' : 'prezzo_vendita').' AS prezzo_vendita,
mg_articoli.prezzo_vendita_ivato AS prezzo_vendita_ivato,
IFNULL(mg_fornitore_articolo.qta_minima, 0) AS qta_minima,
mg_fornitore_articolo.id AS id_dettaglio_fornitore,
mg_fornitore_articolo.id AS id_dettaglio_fornitore,';
}
// Informazioni dell'articolo per i documenti di vendita
else {
$query .= '
mg_articoli.codice AS codice,
mg_articoli.descrizione AS descrizione,
mg_articoli.prezzo_acquisto AS prezzo_acquisto,
0 AS qta_minima,
NULL AS id_dettaglio_fornitore,';
}
$query .= '
round(mg_articoli.qta,'.setting('Cifre decimali per quantità').') AS qta,
mg_articoli.um,
mg_articoli.servizio,
@ -79,6 +96,11 @@ switch ($resource) {
$search_fields[] = 'mg_articoli.descrizione LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'mg_articoli.codice LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'mg_articoli.barcode LIKE '.prepare('%'.$search.'%');
if ($usare_dettaglio_fornitore) {
$search_fields[] = 'mg_fornitore_articolo.descrizione LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'mg_fornitore_articolo.codice_fornitore LIKE '.prepare('%'.$search.'%');
}
}
$custom = [

View File

@ -3,12 +3,12 @@
include_once __DIR__.'/../../core.php';
echo '
<form action="" class="text-right" method="post" id="form-copy">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="copy">
</form>
<button type="button" class="btn btn-primary" onclick="if( confirm(\'Duplicare questo articolo?\') ){ $(\'#form-copy\').submit(); }">
<button type="button" class="btn btn-primary" onclick="duplicaArticolo()">
<i class="fa fa-copy"></i> '.tr('Duplica articolo').'
</button>';
</button>
<script>
function duplicaArticolo() {
openModal("'.tr('Duplica articolo').'", "'.$module->fileurl('modals/duplicazione.php').'?id_module='.$id_module.'&id_record='.$id_record.'");
}
</script>';

View File

@ -0,0 +1,31 @@
<?php
include_once __DIR__.'/../../../core.php';
echo '
<form action="" method="post" id="form-copy">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="copy">
<div class="row">
<div class="col-md-9">
{[ "type": "text", "label": "'.tr('Codice').'", "name": "codice", "required": 1, "value": "", "validation": "codice" ]}
</div>
<div class="col-md-3">
{[ "type": "checkbox", "label": "'.tr('Copia allegati').'", "name": "copia_allegati", "value": 1 ]}
</div>
</div>
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary">
<i class="fa fa-copy"></i> '.tr('Duplica').'
</button>
</div>
</div>
</form>';
echo '
<script>$(document).ready(init)</script>';

View File

@ -436,12 +436,17 @@ $riga = $contratto->getRiga($type, $id_riga);
}
$documento = $class::find($id_documento);
// Individuazione sede
$id_sede = ($documento->direzione == 'entrata') ? $documento->idsede_destinazione : $documento->idsede_partenza;
$id_sede = $id_sede ?: $documento->idsede;
$id_sede = $id_sede ?: 0;
// Creazione del contratto al volo
if (post('create_document') == 'on') {
$contratto = Contratto::build($documento->anagrafica, $documento->nome);
$contratto->idpagamento = $documento->idpagamento;
$contratto->idsede = $documento->idsede;
$contratto->idsede = $id_sede;
$contratto->id_documento_fe = $documento->id_documento_fe;
$contratto->codice_cup = $documento->codice_cup;

View File

@ -27,6 +27,7 @@ if (!empty($id_documento)) {
$id_anagrafica = $documento_finale->idanagrafica;
$_SESSION['superselect']['idanagrafica'] = $id_anagrafica;
$_SESSION['superselect']['stato'] = 'is_fatturabile';
echo '
<div class="row">
@ -36,7 +37,7 @@ echo '
</div>
<div id="righe_documento">
</div>
<div class="alert alert-info" id="box-loading">
@ -46,20 +47,20 @@ echo '
$file = basename(__FILE__);
echo '
<script>$(document).ready(init)</script>
<script>
var content = $("#righe_documento");
var loader = $("#box-loading");
$(document).ready(function(){
loader.hide();
});
$("#id_documento").on("change", function(){
loader.show();
var id = $(this).selectData() ? $(this).selectData().id : "";
content.html("");
content.load("'.$structure->fileurl($file).'?id_module='.$id_module.'&id_record='.$id_record.'&id_documento=" + id, function() {
loader.hide();

View File

@ -25,7 +25,9 @@ echo '
// Duplica contratto
echo'
<button type="button" class="btn btn-primary" onclick="if( confirm(\''.tr('Duplicare questo contratto?').'\') ){ $(\'#copia-contratto\').submit(); }"> <i class="fa fa-copy"></i> '.tr('Duplica contratto').'</button>';
<button type="button" class="btn btn-primary" onclick="if( confirm(\''.tr('Duplicare questo contratto?').'\') ){ $(\'#copia-contratto\').submit(); }">
<i class="fa fa-copy"></i> '.tr('Duplica contratto').'
</button>';
echo '
<form action="" method="post" id="copia-contratto">

View File

@ -286,6 +286,11 @@ switch (post('op')) {
}
$documento = $class::find($id_documento);
// Individuazione sede
$id_sede = ($documento->direzione == 'entrata') ? $documento->idsede_destinazione : $documento->idsede_partenza;
$id_sede = $id_sede ?: $documento->idsede;
$id_sede = $id_sede ?: 0;
// Creazione del ddt al volo
if (post('create_document') == 'on') {
$tipo = Tipo::where('dir', $documento->direzione)->first();
@ -297,7 +302,7 @@ switch (post('op')) {
$ddt->codice_cup = $documento->codice_cup;
$ddt->codice_cig = $documento->codice_cig;
$ddt->num_item = $documento->num_item;
$ddt->idsede_destinazione = $documento->idsede;
$ddt->idsede_destinazione = $id_sede;
$ddt->save();

View File

@ -28,6 +28,7 @@ if (!empty($id_documento)) {
$id_anagrafica = $documento_finale->idanagrafica;
$_SESSION['superselect']['idanagrafica'] = $id_anagrafica;
$_SESSION['superselect']['stato'] = 'is_fatturabile';
echo '
<div class="row">
@ -37,7 +38,7 @@ echo '
</div>
<div id="righe_documento">
</div>
<div class="alert alert-info" id="box-loading">
@ -47,20 +48,20 @@ echo '
$file = basename(__FILE__);
echo '
<script>$(document).ready(init)</script>
<script>
var content = $("#righe_documento");
var loader = $("#box-loading");
$(document).ready(function(){
loader.hide();
});
$("#id_documento").on("change", function(){
loader.show();
var id = $(this).selectData() ? $(this).selectData().id : "";
content.html("");
content.load("'.$structure->fileurl($file).'?id_module='.$id_module.'&id_record='.$id_record.'&id_documento=" + id, function() {
loader.hide();

View File

@ -3,6 +3,7 @@
include_once __DIR__.'/../../core.php';
use Modules\Fatture\Fattura;
use Modules\Fatture\Stato;
use Plugins\ExportFE\FatturaElettronica;
use Plugins\ExportFE\Interaction;
use Util\Zip;
@ -173,8 +174,10 @@ switch (post('op')) {
break;
case 'copy-bulk':
$list = [];
foreach ($id_records as $id) {
$fattura = Fattura::find($id);
array_push($list, $fattura->numero_esterno);
$id_segment = (post('id_segment') ? post('id_segment') : $fattura->id_segment);
$dir = $dbo->fetchOne('SELECT dir FROM co_tipidocumento WHERE id='.prepare($fattura->idtipodocumento))['dir'];
@ -199,11 +202,16 @@ switch (post('op')) {
$data = date('Y-m-d', strtotime('+1 year', strtotime($fattura->data)));
}
$stato = Stato::where('descrizione', 'Bozza')->first();
$new = $fattura->replicate();
$new->codice_stato_fe = null;
$new->id_segment = $id_segment;
$new->numero_esterno = Fattura::getNextNumeroSecondario($data, $dir, $id_segment);
$new->numero = Fattura::getNextNumero($data, $dir, $id_segment);
$new->idstatodocumento = 2;
if (!empty($fattura->numero_esterno)) {
$new->numero_esterno = Fattura::getNextNumeroSecondario($data, $dir, $id_segment);
}
$new->stato()->associate($stato);
$new->data = $data;
$new->save();
@ -231,7 +239,9 @@ switch (post('op')) {
}
}
flash()->info(tr('Fatture duplicate correttamente!'));
flash()->info(tr('Fatture _LIST_ duplicate correttamente!', [
'_LIST_' => implode(',', $list),
]));
break;
@ -257,7 +267,7 @@ if (App::debug()) {
$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": "", "name": "skip_time", "required": 1, "values": "list=\"Giorno\":\"'.tr('Giorno').'\", \"Settimana\":\"'.tr('Settimana').'\", \"Mese\":\"'.tr('Mese').'\", \"Anno\":\"'.tr('Anno').'\" ", "value": "Giorno" ]}<br>{[ "type": "select", "label": "", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.$id_module.' ORDER BY name", "value": "Giorno" ]}<br>{[ "type": "checkbox", "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, "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", "placeholder": "'.tr('Aggiungere i riferimenti ai documenti esterni?').'", "name": "riferimenti" ]}',
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
],

View File

@ -3,13 +3,7 @@
include_once __DIR__.'/../../core.php';
echo '
<form action="" class="text-right" method="post" id="form-copy">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="copy">
</form>
<button type="button" class="btn btn-primary" '.(empty($record['reversed']) ? '' : 'disabled').' onclick="if( confirm(\'Duplicare questa fattura?\') ){ $(\'#form-copy\').submit(); }">
<button type="button" class="btn btn-primary ask btn-primary" '.(empty($record['is_reversed']) ? '' : 'disabled').' data-msg="'.tr('Duplicare questa fattura?').'" data-op="copy" data-button="'.tr('Duplica').'" data-class="btn btn-lg btn-warning" data-backto="record-edit" >
<i class="fa fa-copy"></i> '.tr('Duplica fattura').'
</button>';
@ -25,7 +19,7 @@ if ($module->name == 'Fatture di vendita') {
if ($dir == 'entrata') {
echo '
<div class="btn-group">
<button type="button" class="btn btn-primary unblockable dropdown-toggle '.(((!empty($record['ref_documento']) || $record['stato'] != 'Bozza') and empty($record['reversed'])) ? '' : 'disabled').'" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<button type="button" class="btn btn-primary unblockable dropdown-toggle '.(((!empty($record['ref_documento']) || $record['stato'] != 'Bozza') and empty($record['is_reversed'])) ? '' : 'disabled').'" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-magic"></i> '.tr('Crea').' <span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>

View File

@ -172,9 +172,9 @@ elseif ($record['stato'] == 'Bozza') {
<div class="col-md-2" <?php echo ($dir == 'entrata') ? 'hidden' : ''; ?>>
{[ "type": "date", "label": "<?php echo tr('Data registrazione'); ?>", <?php echo $readonly; ?> "name": "data_registrazione", "required": 0, "value": "$data_registrazione$", "help": "<?php echo tr('Data in cui si è effettuata la registrazione della fattura in contabilità'); ?>" ]}
</div>
<!-- TODO: da nascondere per le fatture di vendita in quanto questa data sarà sempre uguale alla data di emissione -->
<div class="col-md-2" <?php echo ($is_fiscale) ? '' : 'hidden'; ?>>
{[ "type": "date", "label": "<?php echo tr('Data competenza'); ?>", "name": "data_competenza", "required": 1, "value": "$data_competenza$", "min-date": "$data_registrazione$", "help": "<?php echo tr('Data nella quale considerare il movimento contabile, che può essere posticipato rispetto la data della fattura'); ?>" ]}
{[ "type": "date", "class":"<?php echo (dateFormat($fattura->data_competenza) < dateFormat($fattura->data)) ? 'unblockable' : ''; ?>", "label": "<?php echo tr('Data competenza'); ?>", "name": "data_competenza", "required": 1, "value": "$data_competenza$", "min-date": "$data_registrazione$", "help": "<?php echo tr('Data nella quale considerare il movimento contabile, che può essere posticipato rispetto la data della fattura'); ?>" ]}
</div>

View File

@ -258,7 +258,7 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
$importo_cliente = sum($importo_cliente, -$iva_fattura, 2);
}
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($data_documento).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($importo_cliente + $totale_bolli) * $segno_mov1_cliente).', '.prepare($primanota).' )';
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($importo_cliente + $totale_bolli) * $segno_mov1_cliente).', '.prepare($primanota).' )';
$dbo->query($query2);
// 2) Aggiungo il totale sul conto dei ricavi/spese scelto
@ -269,7 +269,7 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
// Retrocompatibilità
$idconto_riga = !empty($riga['idconto']) ? $riga['idconto'] : $idconto;
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($data_documento).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_riga).', '.prepare($riga['imponibile'] * $segno_mov2_ricavivendite).', '.prepare($primanota).')';
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_riga).', '.prepare($riga['imponibile'] * $segno_mov2_ricavivendite).', '.prepare($primanota).')';
$dbo->query($query2);
}
@ -279,7 +279,7 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
$descrizione_conto_iva = ($dir == 'entrata') ? 'Iva su vendite' : 'Iva su acquisti';
$idconto_iva = setting('Conto per '.$descrizione_conto_iva);
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($data_documento).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva).', '.prepare($iva_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva).', '.prepare($iva_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
$dbo->query($query2);
}
@ -287,7 +287,7 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
if ($iva_indetraibile_fattura != 0 && !$split_payment) {
$idconto_iva2 = setting('Conto per Iva indetraibile');
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($data_documento).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva2).', '.prepare($iva_indetraibile_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva2).', '.prepare($iva_indetraibile_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
$dbo->query($query2);
}
@ -296,7 +296,7 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
if ($totale_rivalsainps != 0) {
$idconto_inps = setting('Conto per Erario c/INPS');
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($data_documento).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_inps).', '.prepare($totale_rivalsainps * $segno_mov4_inps).', '.prepare($primanota).')';
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_inps).', '.prepare($totale_rivalsainps * $segno_mov4_inps).', '.prepare($primanota).')';
$dbo->query($query2);
}
@ -306,11 +306,11 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
$idconto_ritenutaacconto = setting("Conto per Erario c/ritenute d'acconto");
// DARE nel conto ritenuta
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($data_documento).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaacconto).', '.prepare($totale_ritenutaacconto * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaacconto).', '.prepare($totale_ritenutaacconto * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
$dbo->query($query2);
// AVERE nel riepilogativo clienti
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($data_documento).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutaacconto * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutaacconto * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
$dbo->query($query2);
}
@ -320,11 +320,11 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
$idconto_ritenutaenasarco = setting('Conto per Erario c/enasarco');
// DARE nel conto ritenuta
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($data_documento).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaenasarco).', '.prepare($totale_ritenutacontributi * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaenasarco).', '.prepare($totale_ritenutacontributi * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
$dbo->query($query2);
// AVERE nel riepilogativo clienti
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($data_documento).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutacontributi * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutacontributi * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
$dbo->query($query2);
}
}

View File

@ -55,9 +55,8 @@ foreach ($righe as $riga) {
}
$descrizione_conto = $dbo->fetchOne('SELECT descrizione FROM co_pianodeiconti3 WHERE id = '.prepare($riga->id_conto))['descrizione'];
//dump($documento_originale);exit();
$extra_riga = tr('_DESCRIZIONE_CONTO__ID_DOCUMENTO__NUMERO_RIGA__CODICE_CIG__CODICE_CUP__RITENUTA_ACCONTO__RITENUTA_CONTRIBUTI__RIVALSA_', [
$extra_riga = replace('_DESCRIZIONE_CONTO__ID_DOCUMENTO__NUMERO_RIGA__CODICE_CIG__CODICE_CUP__RITENUTA_ACCONTO__RITENUTA_CONTRIBUTI__RIVALSA_', [
'_RIVALSA_' => $riga->rivalsa_inps ? '<br>Rivalsa: '.moneyFormat(abs($riga->rivalsa_inps)) : null,
'_RITENUTA_ACCONTO_' => $riga->ritenuta_acconto ? '<br>Ritenuta acconto: '.moneyFormat(abs($riga->ritenuta_acconto)) : null,
'_RITENUTA_CONTRIBUTI_' => $riga->ritenuta_contributi ? '<br>Ritenuta contributi: '.moneyFormat(abs($riga->ritenuta_contributi)) : null,

View File

@ -333,6 +333,58 @@ $riga = $intervento->getRiga($type, $id_riga);
aggiorna_sedi_movimenti('interventi', $id_record);
break;
// Aggiunta di un documento in ordine
case 'add_documento':
$class = post('class');
$id_documento = post('id_documento');
// Individuazione del documento originale
if (!is_subclass_of($class, \Common\Document::class)) {
return;
}
$documento = $class::find($id_documento);
// Individuazione sede
$id_sede = ($documento->direzione == 'entrata') ? $documento->idsede_destinazione : $documento->idsede_partenza;
$id_sede = $id_sede ?: $documento->idsede;
$id_sede = $id_sede ?: 0;
// Creazione dell' ordine al volo
if (post('create_document') == 'on') {
$stato = Stato::find(post('id_stato_intervento'));
$tipo = TipoSessione::find(post('id_tipo_intervento'));
$intervento = Intervento::build($documento->anagrafica, $tipo, $stato, post('data'));
$intervento->idsede_destinazione = $id_sede;
$intervento->id_documento_fe = $documento->id_documento_fe;
$intervento->codice_cup = $documento->codice_cup;
$intervento->codice_cig = $documento->codice_cig;
$intervento->num_item = $documento->num_item;
$intervento->save();
$id_record = $intervento->id;
}
$righe = $documento->getRighe();
foreach ($righe as $riga) {
if (post('evadere')[$riga->id] == 'on' and !empty(post('qta_da_evadere')[$riga->id])) {
$qta = post('qta_da_evadere')[$riga->id];
$copia = $riga->copiaIn($intervento, $qta);
$copia->save();
}
}
// Messaggio informativo
$message = tr('_DOC_ aggiunto!', [
'_DOC_' => $documento->getReference(),
]);
flash()->info($message);
break;
case 'firma':
if (directory($docroot.'/files/interventi')) {
if (post('firma_base64') != '') {

View File

@ -370,6 +370,9 @@ if (!empty($id_intervento)) {
}
// session_set('superselect,idzona', $(this).selectData().idzona, 0);
}
// Settaggio tipo intervento da anagrafica
$('#modals > div #idtipointervento').selectSetNew($(this).selectData().idtipointervento, $(this).selectData().idtipointervento_descrizione);
});
$('#modals > div #idsede_destinazione').change( function(){
@ -392,7 +395,6 @@ if (!empty($id_intervento)) {
}
if($(this).val()){
//TODO: disattivato perché genera problemi con il change successivo di iditpointervento per il tempo standard*
$('#modals > div #idtipointervento').selectSetNew($(this).selectData().idtipointervento, $(this).selectData().idtipointervento_descrizione);
}
});

View File

@ -16,16 +16,23 @@ if (empty($record['firma_file'])) {
// Duplica intervento
echo'
<button type="button" class="btn btn-primary " onclick="launch_modal( \''.tr('Duplica attività').'\', globals.rootdir + \'/modules/interventi/copia_attivita.php?id_module='.$id_module.'&id_record='.$id_record.'\');" >
<i class="fa fa-copy"></i> '.tr('Duplica attività').'...
</button>';
// Disabilito il tasto di firma per gli interventi completati
echo '
<button type="button" class="btn btn-primary " onclick="duplicaIntervento()">
<i class="fa fa-copy"></i> '.tr('Duplica attività').'
</button>
<!-- EVENTUALE FIRMA GIA\' EFFETTUATA -->
'.$info_firma.'
<button type="button" class="btn btn-primary " onclick="launch_modal( \''.tr('Anteprima e firma').'\', globals.rootdir + \'/modules/interventi/add_firma.php?id_module='.$id_module.'&id_record='.$id_record.'&anteprima=1\');" '.($record['flag_completato'] ? 'disabled' : '').'>
<button type="button" class="btn btn-primary" onclick="anteprimaFirma()" '.($record['flag_completato'] ? 'disabled' : '').'>
<i class="fa fa-desktop"></i> '.$frase.'...
</button>';
</button>
<script>
function duplicaIntervento() {
openModal("'.tr('Duplica attività').'", "'.$module->fileurl('modals/duplicazione.php').'?id_module='.$id_module.'&id_record='.$id_record.'");
}
function anteprimaFirma() {
openModal("'.tr('Anteprima e firma').'", "'.$module->fileurl('add_firma.php').'?id_module='.$id_module.'&id_record='.$id_record.'&anteprima=1");
}
</script>';

View File

@ -7,9 +7,11 @@ $block_edit = $record['flag_completato'];
unset($_SESSION['superselect']['idanagrafica']);
unset($_SESSION['superselect']['idsede_partenza']);
unset($_SESSION['superselect']['idsede_destinazione']);
unset($_SESSION['superselect']['idintervento']);
$_SESSION['superselect']['idanagrafica'] = $record['idanagrafica'];
$_SESSION['superselect']['idsede_partenza'] = $record['idsede_partenza'];
$_SESSION['superselect']['idsede_partenza'];
$_SESSION['superselect']['idintervento'] = $id_record;
$_SESSION['superselect']['idsede_destinazione'] = $record['idsede_destinazione'];
$_SESSION['superselect']['permetti_movimento_a_zero'] = false;
@ -119,7 +121,6 @@ $_SESSION['superselect']['permetti_movimento_a_zero'] = false;
</div>
</div>
<!-- RIGA 5 -->
<div class="row">
<div class="col-md-12">
@ -262,7 +263,7 @@ $articoli = $intervento->articoli;
</div>
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Partenza merce'); ?>", "name": "idsede_partenza", "ajax-source": "sedi_azienda", "value": "$idsede_partenza$", "readonly": "<?php echo ($record['flag_completato'] || !empty($articoli)) ? 1 : 0; ?>" ]}
{[ "type": "select", "label": "<?php echo tr('Partenza merce'); ?>", "name": "idsede_partenza", "ajax-source": "sedi_azienda", "value": "$idsede_partenza$", "readonly": "<?php echo ($record['flag_completato'] || !$articoli->isEmpty()) ? 1 : 0; ?>" ]}
</div>
</div>

View File

@ -1,9 +1,9 @@
<?php
include_once __DIR__.'/../../core.php';
include_once __DIR__.'/../../../core.php';
echo '
<form action="" method="post" id="copia-intervento">
<form action="" method="post" id="form-copy">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="copy">
@ -11,27 +11,31 @@ echo '
<div class="col-md-6">
{[ "type": "timestamp", "label": "'.tr('Data/ora richiesta').'", "name": "data_richiesta", "required": 0, "value": "-now-", "required":1 ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Stato').'", "name": "idstatointervento", "required": 1, "values": "query=SELECT idstatointervento AS id, descrizione, colore AS _bgcolor_ FROM in_statiintervento WHERE deleted_at IS NULL", "value": "" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
{["type":"checkbox", "label":"'.tr('Duplica righe').'", "name":"righe", "value":"", "help":"'.tr('Selezione per riportare anche le righe nella nuova attività').'" ]}
</div>
<div class="col-md-6">
{["type":"checkbox", "label":"'.tr('Duplica sessioni').'", "name":"sessioni", "value":"", "help":"'.tr('Selezione per riportare anche le sessioni di lavoro nella nuova attività').'" ]}
</div>
</div>
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary"><i class="fa fa-copy"></i> '.tr('Duplica attività').'...</button>
</div>
</div>
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary">
<i class="fa fa-copy"></i> '.tr('Duplica').'
</button>
</div>
</div>
</form>';
</form>
<script>
init();
</script>';
echo '
<script>$(document).ready(init)</script>';

View File

@ -323,13 +323,18 @@ switch (post('op')) {
}
$documento = $class::find($id_documento);
// Individuazione sede
$id_sede = ($documento->direzione == 'entrata') ? $documento->idsede_destinazione : $documento->idsede_partenza;
$id_sede = $id_sede ?: $documento->idsede;
$id_sede = $id_sede ?: 0;
// Creazione dell' ordine al volo
if (post('create_document') == 'on') {
$tipo = Tipo::where('dir', $documento->direzione)->first();
$ordine = Ordine::build($documento->anagrafica, $tipo, post('data'));
$ordine->idpagamento = $documento->idpagamento;
$ordine->idsede = $documento->idsede;
$ordine->idsede = $id_sede;
$ordine->id_documento_fe = $documento->id_documento_fe;
$ordine->codice_cup = $documento->codice_cup;

View File

@ -8,26 +8,29 @@ echo '
<i class="fa fa-magic"></i>&nbsp;'.tr('Crea').'...
<span class="caret"></span>
</button>
<ul class="dropdown-menu dropdown-menu-right">';
echo '
<li>
<a data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=ordine_fornitore" data-toggle="modal" data-title="'.tr('Crea ordine fornitore').'" class="'.(in_array($record['stato'], ['Accettato', 'Parzialmente evaso']) ? '' : 'disabled').'"><i class="fa fa-file-o"></i>&nbsp;'.tr('Ordine fornitore').'
<ul class="dropdown-menu dropdown-menu-right">
<li>
<a data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=intervento" data-toggle="modal" data-title="'.tr('Crea attività').'">
<i class="fa fa-wrench"></i>&nbsp;'.tr('Attività').'
</a>
</li>';
</li>
echo '
<li>
<a data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=ddt" data-toggle="modal" data-title="'.tr('Crea ddt').'" class="'.(in_array($record['stato'], ['Accettato', 'Parzialmente evaso']) ? '' : 'disabled').'"><i class="fa fa-truck"></i>&nbsp;'.tr('Ddt').'
<a data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=ordine_fornitore" data-toggle="modal" data-title="'.tr('Crea ordine fornitore').'">
<i class="fa fa-file-o"></i>&nbsp;'.tr('Ordine fornitore').'
</a>
</li>';
</li>
echo '
<li>
<a data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=fattura" data-toggle="modal" data-title="'.tr('Crea fattura').'" class="'.(in_array($record['stato'], ['Accettato', 'Parzialmente fatturato']) ? '' : 'disabled').'"><i class="fa fa-file"></i>&nbsp;'.tr('Fattura').'
<a data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=ddt" data-toggle="modal" data-title="'.tr('Crea ddt').'">
<i class="fa fa-truck"></i>&nbsp;'.tr('Ddt').'
</a>
</li>';
</li>
echo '
<li>
<a data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=fattura" data-toggle="modal" data-title="'.tr('Crea fattura').'">
<i class="fa fa-file"></i>&nbsp;'.tr('Fattura').'
</a>
</li>
</ul>
</div>';

View File

@ -14,6 +14,9 @@ if (get('documento') == 'fattura') {
} elseif (get('documento') == 'ordine_fornitore') {
$final_module = 'Ordini fornitore';
$op = 'add_ordine_cliente';
} elseif (get('documento') == 'intervento') {
$final_module = 'Interventi';
$op = 'add_documento';
} else {
$final_module = $module['name'] == 'Ordini cliente' ? 'Ddt di vendita' : 'Ddt di acquisto';
$op = 'add_ordine';

View File

@ -28,7 +28,7 @@ $info = $dbo->fetchOne($query);
</div>
<div class="col-md-8">
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": "<?php echo $info['descrizione']; ?>" ]}
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": <?php echo json_encode($info['descrizione']); ?> ]}
</div>
</div>
<br>

View File

@ -15,7 +15,7 @@ switch ($resource) {
$where[] = 'an_anagrafiche.idanagrafica='.prepare($superselect['idanagrafica']);
$where[] = 'co_preventivi.default_revision=1';
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'is_fatturabile';
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'is_pianificabile';
$where[] = 'idstato IN (SELECT `id` FROM `co_statipreventivi` WHERE '.$stato.' = 1)';
}
@ -30,18 +30,5 @@ switch ($resource) {
$custom['sconto'] = 'sconto';
}
break;
case 'preventivi_aperti':
$query = 'SELECT co_preventivi.id AS id, CONCAT(numero, " ", co_preventivi.nome, " (", ragione_sociale, ")") AS descrizione FROM co_preventivi INNER JOIN an_anagrafiche ON co_preventivi.idanagrafica=an_anagrafiche.idanagrafica |where| ORDER BY id';
foreach ($elements as $element) {
$filter[] = 'idpreventivo='.prepare($element);
}
$where[] = 'idstato IN (1)';
if (!empty($search)) {
$search_fields[] = 'nome LIKE '.prepare('%'.$search.'%');
}
break;
}

View File

@ -3,13 +3,17 @@
include_once __DIR__.'/../../core.php';
echo'
<button type="button" class="btn btn-primary" onclick="if( confirm(\'Duplicare questo preventivo?\') ){ $(\'#copia-preventivo\').submit(); }"> <i class="fa fa-copy"></i> '.tr('Duplica preventivo').'</button>';
<button type="button" class="btn btn-primary" onclick="if( confirm(\'Duplicare questo preventivo?\') ){ $(\'#copia-preventivo\').submit(); }">
<i class="fa fa-copy"></i> '.tr('Duplica preventivo').'
</button>';
$stati_abilitati = $dbo->fetchOne('SELECT GROUP_CONCAT(`descrizione` SEPARATOR ", ") AS stati_abilitati FROM `co_statipreventivi` WHERE `is_revisionabile` = 1 ')['stati_abilitati'];
// Crea revisione
echo '
<button type="button" class="btn btn-warning '.($record['is_revisionabile'] ? '' : 'disabled tip').'" onclick="if(confirm(\'Vuoi creare un nuova revisione?\')){$(\'#crea-revisione\').submit();}" '.($record['is_revisionabile'] ? '' : 'disabled').' title="'.($record['is_revisionabile'] ? '' : tr('Per creare una nuova revisione lo stato del preventivo deve essere tra: ').$stati_abilitati).'" ><i class="fa fa-edit"></i> '.tr('Crea nuova revisione...').'</button>';
<button type="button" class="btn btn-warning '.($record['is_revisionabile'] ? '' : 'disabled tip').'" onclick="if(confirm(\'Vuoi creare un nuova revisione?\')){$(\'#crea-revisione\').submit();}" '.($record['is_revisionabile'] ? '' : 'disabled').' title="'.($record['is_revisionabile'] ? '' : tr('Per creare una nuova revisione lo stato del preventivo deve essere tra: ').$stati_abilitati).'">
<i class="fa fa-edit"></i> '.tr('Crea nuova revisione...').'
</button>';
$rs_documento = $dbo->fetchArray('SELECT * FROM co_righe_preventivi WHERE idpreventivo='.prepare($id_record));
@ -20,14 +24,16 @@ $stati_abilitati = $dbo->fetchOne('SELECT GROUP_CONCAT(`descrizione` SEPARATOR "
// Creazione altri documenti
echo '
<div style="margin-left:4px;" class="dropdown pull-right">
<button class="btn btn-info dropdown-toggle '.($disabled ? '' : 'disabled tip').'" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" '.($disabled ? '' : 'disabled').' title="'.($disabled ? '' : tr('Per creare un documento deve essere inserita almeno una riga e lo stato del preventivo deve essere tra: ').$stati_abilitati).'" >
<button class="btn btn-info dropdown-toggle '.($disabled ? '' : 'disabled tip').'" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" '.($disabled ? '' : 'disabled').' title="'.($disabled ? '' : tr('Per creare un documento deve essere inserita almeno una riga e lo stato del preventivo deve essere tra: _STATE_LIST_', [
'_STATE_LIST_' => $stati_abilitati,
])).'" >
<i class="fa fa-magic"></i>&nbsp;'.tr('Crea').'...
<span class="caret"></span>
</button>
<ul class="dropdown-menu dropdown-menu-right">
<li>
<a class="'.($disabled ? '' : 'disabled').'" data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=ddt" data-toggle="modal" data-title="'.tr('Crea ordine cliente').'">
<i class="fa fa-truck"></i>&nbsp;'.tr('DDT in uscita').'
<li>
<a class="'.($disabled ? '' : 'disabled').'" data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=contratto" data-toggle="modal" data-title="'.tr('Crea contratto').'">
<i class="fa fa-file-o"></i>&nbsp;'.tr('Contratto').'
</a>
</li>
@ -37,17 +43,17 @@ echo '
</a>
</li>
<li>
<a class="'.($disabled ? '' : 'disabled').'" data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=ddt" data-toggle="modal" data-title="'.tr('Crea ordine cliente').'">
<i class="fa fa-truck"></i>&nbsp;'.tr('DDT in uscita').'
</a>
</li>
<li>
<a class="'.($disabled ? '' : 'disabled').'" data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=fattura" data-toggle="modal" data-title="'.tr('Crea fattura').'">
<i class="fa fa-file"></i>&nbsp;'.tr('Fattura').'
</a>
</li>
<li>
<a class="'.($disabled ? '' : 'disabled').'" data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=contratto" data-toggle="modal" data-title="'.tr('Crea contratto').'">
<i class="fa fa-file-o"></i>&nbsp;'.tr('Contratto').'
</a>
</li>
</ul>
</div>';

View File

@ -213,11 +213,6 @@ if (!$block_edit) {
<i class="fa fa-plus"></i> '.tr('Barcode').'
</a>';
echo '
<a class="btn btn-sm btn-primary"data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_barcode" data-toggle="tooltip" data-title="'.tr('Aggiungi articoli tramite barcode').'">
<i class="fa fa-plus"></i> '.tr('Barcode').'
</a>';
echo '
<a class="btn btn-sm btn-primary" data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_riga" data-toggle="tooltip" data-title="'.tr('Aggiungi riga').'">
<i class="fa fa-plus"></i> '.tr('Riga').'

View File

@ -30,7 +30,6 @@ class Movimento extends Model
$documento = $scadenza ? $scadenza->documento : null;
if (!empty($documento)) {
$model->data_documento = $documento->data;
$model->iddocumento = $documento->id;
$model->idanagrafica = $documento->idanagrafica;
}

View File

@ -18,16 +18,16 @@ switch (post('op')) {
}
if ($i > 0) {
flash()->info(tr($i.' email rimosse dalla coda di invio.'));
flash()->info(tr('Email rimosse dalla coda di invio'));
} else {
flash()->warning(tr('Nessuna email rimossa dalla coda di invio.'));
flash()->warning(tr('Nessuna email rimossa dalla coda di invio'));
}
break;
}
$operations['delete-bulk'] = [
'text' => '<span><i class="fa fa-trash"></i> '.tr('Elimina selezionati').'</span>',
'text' => '<span><i class="fa fa-trash"></i> '.tr('Elimina email selezionate e non ancora inviate').'</span>',
'data' => [
'msg' => tr('Vuoi davvero eliminare dalla coda di invio le email selezionate?'),
'button' => tr('Procedi'),

View File

@ -72,24 +72,63 @@ include_once __DIR__.'/../../core.php';
//Permetto eliminazione tipo intervento solo se questo non è utilizzado da nessun'altra parte nel gestionale
//UNION SELECT `in_tariffe`.`idtipointervento` FROM `in_tariffe` WHERE `in_tariffe`.`idtipointervento` = '.prepare($id_record).'
//UNION SELECT `co_contratti_tipiintervento`.`idtipointervento` FROM `co_contratti_tipiintervento` WHERE `co_contratti_tipiintervento`.`idtipointervento` = '.prepare($id_record).'
$elementi = $dbo->fetchArray('SELECT `in_interventi`.`idtipointervento` FROM `in_interventi` WHERE `in_interventi`.`idtipointervento` = '.prepare($id_record).'
$elementi = $dbo->fetchArray('SELECT `in_interventi`.`idtipointervento`, id, codice AS numero, data_richiesta AS data, "Intervento" AS tipo_documento FROM `in_interventi` WHERE `in_interventi`.`idtipointervento` = '.prepare($id_record).'
UNION
SELECT `an_anagrafiche`.`idtipointervento_default` AS `idtipointervento` FROM `an_anagrafiche` WHERE `an_anagrafiche`.`idtipointervento_default` = '.prepare($id_record).'
SELECT `in_interventi_tecnici`.`idtipointervento`, idintervento AS id, codice AS numero, orario_inizio AS data, "Sessione intervento" AS tipo_documento FROM `in_interventi_tecnici` LEFT JOIN in_interventi ON in_interventi_tecnici.idintervento=in_interventi.id WHERE `in_interventi_tecnici`.`idtipointervento` = '.prepare($id_record).'
UNION
SELECT `co_preventivi`.`idtipointervento` FROM `co_preventivi` WHERE `co_preventivi`.`idtipointervento` = '.prepare($id_record).'
SELECT `an_anagrafiche`.`idtipointervento_default` AS `idtipointervento`, idanagrafica AS id, codice, "0000-00-00" AS data, "Anagrafica" AS tipo_documento FROM `an_anagrafiche` WHERE `an_anagrafiche`.`idtipointervento_default` = '.prepare($id_record).'
UNION
SELECT `co_promemoria`.`idtipointervento` FROM `co_promemoria` WHERE `co_promemoria`.`idtipointervento` = '.prepare($id_record).'
SELECT `co_preventivi`.`idtipointervento`, id, numero, data_bozza AS data, "Preventivo" AS tipo_documento FROM `co_preventivi` WHERE `co_preventivi`.`idtipointervento` = '.prepare($id_record).'
UNION
SELECT `in_interventi_tecnici`.`idtipointervento` FROM `in_interventi_tecnici` WHERE `in_interventi_tecnici`.`idtipointervento` = '.prepare($id_record).'
SELECT `co_promemoria`.`idtipointervento`, idcontratto AS id, numero, data_richiesta AS data, "Promemoria contratto" AS tipo_documento FROM `co_promemoria` LEFT JOIN co_contratti ON co_promemoria.idcontratto=co_contratti.id WHERE `co_promemoria`.`idtipointervento` = '.prepare($id_record).'
ORDER BY `idtipointervento`');
if (!empty($elementi)) {
echo '
<div class="alert alert-danger">
'.tr('Ci sono _NUM_ records collegati', [
<div class="box box-warning collapsable collapsed-box">
<div class="box-header with-border">
<h3 class="box-title"><i class="fa fa-warning"></i> '.tr('Documenti collegati: _NUM_', [
'_NUM_' => count($elementi),
]).'.
</div>';
]).'</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-plus"></i></button>
</div>
</div>
<div class="box-body">
<ul>';
foreach ($elementi as $elemento) {
$descrizione = tr('_DOC_ num. _NUM_ del _DATE_', [
'_DOC_' => $elemento['tipo_documento'],
'_NUM_' => $elemento['numero'],
'_DATE_' => Translator::dateToLocale($elemento['data']),
]);
if (in_array($elemento['tipo_documento'], ['Intervento'])) {
$modulo = 'Interventi';
}
if (in_array($elemento['tipo_documento'], ['Sessione intervento'])) {
$modulo = 'Interventi';
}
if (in_array($elemento['tipo_documento'], ['Anagrafica'])) {
$modulo = 'Anagrafiche';
}
if (in_array($elemento['tipo_documento'], ['Preventivo'])) {
$modulo = 'Preventivi';
}
if (in_array($elemento['tipo_documento'], ['Promemoria contratto'])) {
$modulo = 'Contratti';
}
$id = $elemento['id'];
echo '
<li>'.Modules::link($modulo, $id, $descrizione).'</li>';
}
echo '
</ul>
</div>
</div>';
} else {
echo '
<a class="btn btn-danger ask" data-backto="record-list">

View File

@ -126,7 +126,7 @@ if (!empty($google)) {
} else {
echo '
<div class="alert alert-info">
'.Modules::link('Impostazioni', $dbo->fetchOne("SELECT `id` FROM `zz_settings` WHERE sezione='Generali'")['id'], tr('Per abilitare la visualizzazione delle anagrafiche nella mappa, inserire la Google Maps API Key nella scheda Impostazioni')).'.
'.Modules::link('Impostazioni', $dbo->fetchOne("SELECT `id` FROM `zz_settings` WHERE nome='Google Maps API key'")['id'], tr('Per abilitare la visualizzazione delle anagrafiche nella mappa, inserire la Google Maps API Key nella scheda Impostazioni')).'.
</div>';
}

View File

@ -21,25 +21,27 @@ switch (post('op')) {
'stato' => Auth::getStatus()['failed']['code'],
]);
$utente = User::where('username', $username)->where('email', $email)->first();
if (!empty($utente)) {
$utente->reset_token = secure_random_string();
$utente->save();
try {
$utente = User::where('username', $username)->where('email', $email)->first();
if (!empty($utente)) {
$utente->reset_token = secure_random_string();
$utente->save();
$template = Template::get('Reset password');
$template = Template::get('Reset password');
$mail = Mail::build($utente, $template, $utente->id);
$mail->addReceiver($utente->email);
$mail->save();
$mail = Mail::build($utente, $template, $utente->id);
$mail->addReceiver($utente->email);
$mail->save();
$email = EmailNotification::build($mail);
$email->send();
$email = EmailNotification::build($mail);
$email->send();
}
flash()->info(tr("Se le informazioni inserite corrispondono ai dati di un utente, riceverai a breve un'email all'indirizzo collegato").'.');
} catch (Exception $e) {
flash()->error(tr("Errore durante la gestione della richiesta: si prega di contattare l'amministratore").'.');
}
//$message_email = substr($email, 0, 2).str_repeat('*', strlen($email)-8).substr($email, -6);
flash()->info(tr("Se le informazioni inserite corrispondono ai dati di un utente, riceverai a breve un'email all'indirizzo collegato").'.');
redirect(ROOTDIR.'/index.php');
exit();
break;

View File

@ -25,10 +25,11 @@ class AJAX
* @param mixed $search
* @param int $page
* @param int $length
* @param array $options
*
* @return array
*/
public static function select($resource, $elements = [], $search = null, $page = 0, $length = 100)
public static function select($resource, $elements = [], $search = null, $page = 0, $length = 100, $options = [])
{
if (!isset($elements)) {
$elements = [];
@ -215,13 +216,12 @@ class AJAX
* @param array $elements
* @param array $limit
* @param mixed $search
* @param array $options
*
* @return array|null
*/
protected static function getSelectResults($file, $resource, $elements = [], $limit = [], $search = null)
protected static function getSelectResults($file, $resource, $elements = [], $limit = [], $search = null, $options = [])
{
$superselect = self::getSelectInfo();
$where = [];
$filter = [];
$search_fields = [];
@ -234,6 +234,9 @@ class AJAX
// Database
$dbo = $database = database();
// Opzioni di selezione
$superselect = $options;
require $file;
if (!isset($results) && !empty($query)) {
@ -243,14 +246,6 @@ class AJAX
return isset($results) ? $results : null;
}
/**
* Restituisce le informazioni aggiuntive per i select.
*/
protected static function getSelectInfo()
{
return !empty($_SESSION['superselect']) ? $_SESSION['superselect'] : [];
}
/**
* Ottiene i risultati della ricerca all'interno di un file specifico (modulo).
*

View File

@ -1,6 +1,6 @@
<?php
namespace Api\Common;
namespace API\Common;
use API\Interfaces\CreateInterface;
use API\Resource;

View File

@ -1,6 +1,6 @@
<?php
namespace Api\Common;
namespace API\Common;
use API\Interfaces\RetrieveInterface;
use API\Resource;

View File

@ -49,13 +49,19 @@ class ChoicesHandler implements HandlerInterface
// Generazione del codice HTML
// "+ this.checked" rende il valore booleano un numero
$result = '
<div class="input-group">
<span class="input-group-addon before">
<input |attr| onchange="$(this).parent().find(\'[type=hidden]\').val( + this.checked)">
<div class="form-group">
<input type="hidden" name="|name|" value="|value|">
</span>
<input type="text" class="form-control" placeholder="|placeholder|" disabled>
</div>';
<input type="checkbox" id="|id|" value="|value|" autocomplete="off" class="hidden" |attr| onchange="$(this).parent().find(\'[type = hidden]\').val(+this.checked)"/>
<div class="btn-group">
<label for="|id|" class="btn btn-default">
<span class="fa fa-check"></span>
<span class="fa fa-close"></span>
</label>
<label for="|id|" class="btn btn-default active">
|placeholder|
</label>
</div>
</div>';
return $result;
}

View File

@ -2,6 +2,8 @@
namespace HTMLBuilder\Handler;
use AJAX;
/**
* Gestione dell'input di tipo "select".
*
@ -28,6 +30,21 @@ class SelectHandler implements HandlerInterface
$values['value'] = setting($values['valore_predefinito']);
}
// Informazioni aggiuntive per il select
$infos = [];
if (!empty($values['ajax-info'])) {
$list = explode(',', $values['ajax-info']);
foreach ($list as $element) {
list($name, $value) = explode('=', $element);
$values['data-select-'.$name] = $value;
$infos[$name] = $value;
}
unset($values['ajax-info']);
}
$values['value'] = (array) $values['value'];
// Inizializzazione del codice HTML
@ -38,7 +55,7 @@ class SelectHandler implements HandlerInterface
// Gestione delle richieste AJAX (se il campo "ajax-source" è impostato)
if (!empty($values['ajax-source'])) {
if (!empty($values['value']) || is_numeric($values['value'])) {
$result .= $this->select2($values['ajax-source'], $values['value']);
$result .= $this->select2($values['ajax-source'], $values['value'], $infos);
}
} else {
if (!in_array('multiple', $extras)) {
@ -102,24 +119,20 @@ class SelectHandler implements HandlerInterface
/**
* Gestione dell'input di tipo "select" con richieste AJAX (nome della richiesta indicato tramite attributo "ajax-source").
* Esempio: {[ "type": "select", "label": "Select di test", "name": "test", "ajax-source": "test" ]}.
* Esempio: {[ "type": "select", "label": "Select di test", "name": "test", "ajax-source": "test", "ajax-info": "id_test=1,test=si" ]}.
*
* @param string $op
* @param array $elements
* @param array $elements
* @param array $info
*
* @return string
*/
protected function select2($op, $elements)
protected function select2($op, $elements, $info)
{
// Richiamo del file dedicato alle richieste AJAX per ottenere il valore iniziale del select
ob_start();
$dbo = database();
include DOCROOT.'/ajax_select.php';
$text = ob_get_clean();
$response = AJAX::select($op, $elements, null, 0, 100, $info);
$html = '';
$response = (array) json_decode($text, true);
$results = $response['results'];
foreach ($results as $element) {
$element = (array) $element;

View File

@ -90,7 +90,7 @@ foreach ($righe as $riga) {
if (setting('Riferimento dei documenti nelle stampe') && $riga->hasOriginal()) {
$ref = $riga->getOriginal()->parent->getReference();
if (!empty($riga->getOriginal()->parent->numero_cliente)) {
$ref .= tr('<br>_DOC_ num. _NUM_ del _DATE_', [
$ref .= '<br>'.tr('_DOC_ num. _NUM_ del _DATE_', [
'_DOC_' => 'Rif. Vs. ordine cliente',
'_NUM_' => $riga->getOriginal()->parent->numero_cliente,
'_DATE_' => dateFormat($riga->getOriginal()->parent->data_cliente),
@ -113,7 +113,7 @@ foreach ($righe as $riga) {
$codice_cup = $documento_originale['codice_cup'];
$id_documento_fe = $documento_originale['id_documento_fe'];
$extra_riga = tr('_ID_DOCUMENTO__NUMERO_RIGA__CODICE_CIG__CODICE_CUP_', [
$extra_riga = replace('_ID_DOCUMENTO__NUMERO_RIGA__CODICE_CIG__CODICE_CUP_', [
'_ID_DOCUMENTO_' => $id_documento_fe ? 'DOC: '.$id_documento_fe : null,
'_NUMERO_RIGA_' => $num_item ? ', NRI: '.$num_item : null,
'_CODICE_CIG_' => $codice_cig ? ', CIG: '.$codice_cig : null,

View File

@ -26,7 +26,7 @@ $query = Query::getQuery($structure, $where, 0, []);
$query = Modules::replaceAdditionals($id_module, $query);
// Modifiche alla query principale
$query = preg_replace('/ FROM `mg_articoli` /', ' FROM mg_articoli LEFT JOIN (SELECT idarticolo, SUM(qta) AS qta_totale FROM mg_movimenti GROUP BY idarticolo) movimenti ON movimenti.idarticolo=mg_articoli.id ', $query);
$query = preg_replace('/ FROM `mg_articoli` /', ' FROM mg_articoli LEFT JOIN (SELECT idarticolo, SUM(qta) AS qta_totale FROM mg_movimenti WHERE data <='.prepare($period_end).' GROUP BY idarticolo) movimenti ON movimenti.idarticolo=mg_articoli.id ', $query);
$query = preg_replace('/^SELECT /', 'SELECT mg_articoli.prezzo_acquisto,', $query);
$query = preg_replace('/^SELECT /', 'SELECT mg_articoli.prezzo_vendita,', $query);

View File

@ -38,7 +38,7 @@ echo '<h4><b>'.$titolo.'</b></h4>
<th>'.tr('Data comp.').'</th>
<th>'.tr('Tipo').'</th>
<th>'.$tipo.'</th>
<th>'.tr('Tot.&nbsp;doc.').'</th>
<th>'.tr('Tot. doc.').'</th>
<th>'.tr('Imponibile').'</th>
<th>%</th>
<th>'.tr('Iva').'</th>

View File

@ -134,19 +134,16 @@ UPDATE `or_righe_ordini` SET `qta` = IF(`qta` = 0, 1, `qta`),
`prezzo_unitario` = `subtotale` / `qta`,
`iva_unitaria` = `iva` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`sconto_unitario_ivato` = `sconto_unitario`,
`sconto_percentuale` = IF(`tipo_sconto` = 'PRC', `sconto_unitario`, 0),
`sconto_unitario` = IF(`tipo_sconto` = 'PRC', `sconto` / `qta`, `sconto_unitario`),
`sconto_unitario_ivato` = `sconto_unitario`;
UPDATE `in_righe_interventi` SET `qta` = IF(`qta` = 0, 1, `qta`),
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`iva_unitaria` = `iva` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`sconto_percentuale` = IF(`tipo_sconto` = 'PRC', `sconto_unitario`, 0),
`sconto_unitario` = IF(`tipo_sconto` = 'PRC', `sconto` / `qta`, `sconto_unitario`),
`sconto_unitario_ivato` = `sconto_unitario`;
UPDATE `co_promemoria_righe` SET `qta` = IF(`qta` = 0, 1, `qta`),
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`iva_unitaria` = `iva` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`sconto_percentuale` = IF(`tipo_sconto` = 'PRC', `sconto_unitario`, 0),

View File

@ -134,4 +134,34 @@ INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `format
((SELECT `id` FROM `zz_modules` WHERE `name` = 'Ordini fornitore'), 'Data', 'or_ordini.data', 3, 1, 0, 0, 1);
-- Plugin storico attività scheda Aanagrafiche
INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `script`, `enabled`, `default`, `order`, `compatibility`, `version`, `options2`, `options`, `directory`, `help`) VALUES (NULL, 'Storico attività', 'Storico attività', (SELECT id FROM zz_modules WHERE name = 'Interventi'), (SELECT id FROM zz_modules WHERE name='Anagrafiche'), 'tab', '', '1', '1', '0', '2.*', '0.1', NULL, '{ "main_query": [ { "type": "table", "fields": "Numero, Data inizio, Data fine, Tipo", "query": "SELECT in_interventi.id, in_interventi.codice AS Numero, DATE_FORMAT(MAX(orario_inizio),''%d/%m/%Y'') AS ''Data inizio'', DATE_FORMAT(MAX(orario_fine),''%d/%m/%Y'') AS ''Data fine'', (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento=in_interventi.idtipointervento) AS ''Tipo'', (SELECT `id` FROM `zz_modules` WHERE `name` = ''Interventi'') AS _link_module_, in_interventi.id AS _link_record_ FROM in_interventi LEFT JOIN `in_interventi_tecnici` ON `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id` LEFT JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento`=`in_statiintervento`.`idstatointervento` WHERE 1=1 AND in_interventi.deleted_at IS NULL AND idanagrafica = |id_parent| HAVING 2=2 ORDER BY in_interventi.id DESC"} ]}', '', '');
INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `script`, `enabled`, `default`, `order`, `compatibility`, `version`, `options2`, `options`, `directory`, `help`) VALUES (NULL, 'Storico attività', 'Storico attività', (SELECT id FROM zz_modules WHERE name = 'Interventi'), (SELECT id FROM zz_modules WHERE name='Anagrafiche'), 'tab', '', '1', '1', '0', '2.*', '0.1', NULL, '{ "main_query": [ { "type": "table", "fields": "Numero, Data inizio, Data fine, Tipo", "query": "SELECT in_interventi.id, in_interventi.codice AS Numero, DATE_FORMAT(MAX(orario_inizio),''%d/%m/%Y'') AS ''Data inizio'', DATE_FORMAT(MAX(orario_fine),''%d/%m/%Y'') AS ''Data fine'', (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento=in_interventi.idtipointervento) AS ''Tipo'', (SELECT `id` FROM `zz_modules` WHERE `name` = ''Interventi'') AS _link_module_, in_interventi.id AS _link_record_ FROM in_interventi LEFT JOIN `in_interventi_tecnici` ON `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id` LEFT JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento`=`in_statiintervento`.`idstatointervento` WHERE 1=1 AND in_interventi.deleted_at IS NULL AND idanagrafica = |id_parent| HAVING 2=2 ORDER BY in_interventi.id DESC"} ]}', '', '');
-- Fix prezzo_unitario_ivato e sconto_iva_unitario per i documenti
UPDATE `co_righe_contratti` SET `prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`;
UPDATE `co_righe_documenti` SET `prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`;
UPDATE `co_righe_documenti` INNER JOIN `co_iva` ON `co_iva`.`id` = `co_righe_documenti`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
UPDATE `co_righe_preventivi` INNER JOIN `co_iva` ON `co_iva`.`id` = `co_righe_preventivi`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
UPDATE `co_righe_contratti` INNER JOIN `co_iva` ON `co_iva`.`id` = `co_righe_contratti`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
UPDATE `dt_righe_ddt` INNER JOIN `co_iva` ON `co_iva`.`id` = `dt_righe_ddt`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
UPDATE `or_righe_ordini` INNER JOIN `co_iva` ON `co_iva`.`id` = `or_righe_ordini`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
UPDATE `in_righe_interventi` INNER JOIN `co_iva` ON `co_iva`.`id` = `in_righe_interventi`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
UPDATE `co_righe_promemoria` INNER JOIN `co_iva` ON `co_iva`.`id` = `co_righe_promemoria`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
-- Fix namespace classi Stampa e Allegato per API
UPDATE `zz_api_resources` SET `class` = 'API\\Common\\Stampa' WHERE `class` = 'Api\\Common\\Stampa';
UPDATE `zz_api_resources` SET `class` = 'API\\Common\\Allegato' WHERE `class` = 'Api\\Common\\Allegato';

50
update/2_4_17.sql Normal file
View File

@ -0,0 +1,50 @@
-- Aggiunta data competenza nel filtro temporale per le fatture di acquisto
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_documenti`
LEFT JOIN `an_anagrafiche` ON `co_documenti`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`
LEFT JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`
LEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id`
LEFT JOIN (
SELECT `iddocumento`,
SUM(`subtotale` - `sconto`) AS `totale_imponibile`,
SUM(`subtotale` - `sconto` + `iva`) AS `totale`
FROM `co_righe_documenti`
GROUP BY `iddocumento`
) AS righe ON `co_documenti`.`id` = `righe`.`iddocumento`
WHERE 1=1 AND `dir` = \'uscita\' |segment(`co_documenti`.`id_segment`)||date_period(custom, \'|period_start|\' <= `co_documenti`.`data` AND \'|period_end|\' >= `co_documenti`.`data`, \'|period_start|\' <= `co_documenti`.`data_competenza` AND \'|period_end|\' >= `co_documenti`.`data_competenza` )|
HAVING 2=2
ORDER BY `co_documenti`.`data` DESC, CAST(IF(`co_documenti`.`numero` = \'\', `co_documenti`.`numero_esterno`, `co_documenti`.`numero`) AS UNSIGNED) DESC' WHERE `name` = 'Fatture di acquisto';
-- Allineo per i movimenti relativi alle fatture di vendita, la data del movimento con la data del documento
UPDATE `co_movimenti` SET `co_movimenti`.`data` = `co_movimenti`.`data_documento` WHERE `iddocumento` IN (SELECT `co_documenti`.`id` FROM `co_documenti` INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id` WHERE `co_tipidocumento`.`dir` = 'entrata' );
-- Allineo per le fatture di vendita, la data_competenza con data emissione del documento
UPDATE `co_documenti` SET `co_documenti`.`data_competenza` = `co_documenti`.`data` WHERE `co_documenti`.`idtipodocumento` IN (SELECT `co_tipidocumento`.`id` FROM `co_tipidocumento` WHERE `co_tipidocumento`.`dir` = 'entrata');
-- Elimino data_documento per co_documenti
ALTER TABLE `co_movimenti` DROP `data_documento`;
-- Allineamento idarticolo nelle tabelle delle righe
ALTER TABLE `co_righe_documenti` CHANGE `idarticolo` `idarticolo` INT(11) NULL;
UPDATE `co_righe_documenti` SET `idarticolo` = NULL WHERE `idarticolo` = 0;
ALTER TABLE `co_righe_preventivi` CHANGE `idarticolo` `idarticolo` INT(11) NULL;
UPDATE `co_righe_preventivi` SET `idarticolo` = NULL WHERE `idarticolo` = 0;
ALTER TABLE `co_righe_contratti` CHANGE `idarticolo` `idarticolo` INT(11) NULL;
UPDATE `co_righe_contratti` SET `idarticolo` = NULL WHERE `idarticolo` = 0;
ALTER TABLE `dt_righe_ddt` CHANGE `idarticolo` `idarticolo` INT(11) NULL;
UPDATE `dt_righe_ddt` SET `idarticolo` = NULL WHERE `idarticolo` = 0;
ALTER TABLE `or_righe_ordini` CHANGE `idarticolo` `idarticolo` INT(11) NULL;
UPDATE `or_righe_ordini` SET `idarticolo` = NULL WHERE `idarticolo` = 0;
ALTER TABLE `or_righe_ordini` CHANGE `idarticolo` `idarticolo` INT(11) NULL;
UPDATE `or_righe_ordini` SET `idarticolo` = NULL WHERE `idarticolo` = 0;
ALTER TABLE `co_righe_promemoria` CHANGE `idarticolo` `idarticolo` INT(11) NULL;
UPDATE `co_righe_promemoria` SET `idarticolo` = NULL WHERE `idarticolo` = 0;
-- Fix link del plugin "Ddt del cliente"
UPDATE `zz_plugins` SET `options` = ' { "main_query": [ { "type": "table", "fields": "Numero, Data, Descrizione, Qtà", "query": "SELECT dt_ddt.id, IF(dt_tipiddt.dir = \'entrata\', (SELECT `id` FROM `zz_modules` WHERE `name` = \'Ddt di vendita\'), (SELECT `id` FROM `zz_modules` WHERE `name` = \'Ddt di acquisto\')) AS _link_module_, dt_ddt.id AS _link_record_, IF(dt_ddt.numero_esterno = \'\', dt_ddt.numero, dt_ddt.numero_esterno) AS Numero, DATE_FORMAT(dt_ddt.data, \'%d/%m/%Y\') AS Data, dt_righe_ddt.descrizione AS `Descrizione`, REPLACE(REPLACE(REPLACE(FORMAT(dt_righe_ddt.qta, 2), \',\', \'#\'), \'.\', \',\'), \'#\', \'.\') AS `Qtà` FROM dt_ddt LEFT JOIN dt_righe_ddt ON dt_ddt.id=dt_righe_ddt.idddt JOIN dt_tipiddt ON dt_ddt.idtipoddt = dt_tipiddt.id WHERE dt_ddt.idanagrafica=|id_parent| GROUP BY dt_ddt.id HAVING 2=2 ORDER BY dt_ddt.id DESC"} ]}' WHERE `zz_plugins`.`name` = 'Ddt del cliente';