This commit is contained in:
MatteoPistorello 2023-09-25 16:57:24 +02:00
commit 92e0659bd4
92 changed files with 684 additions and 1922 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.49 (2023-09-22)](#2449-2023-09-25)
- [2.4.48 (2023-08-01)](#2448-2023-08-01)
- [2.4.47 (2023-06-30)](#2447-2023-06-30)
- [2.4.46 (2023-06-01)](#2446-2023-06-01)
@ -59,6 +60,38 @@ 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.49 (2023-09-25)
### Aggiunto (Added)
- Aggiunto avviso in caso di impossibilità di caricare la mappa
- Aggiunta l'obbligatorietà del campo nazione in Sede
- Aggiunta colonna Riferimenti in **Ordini cliente** e in **DDT in entrata**
- Aggiunto filtro per anagrafica in **Stampa scadenzario**
- Aggiunta modalità manutenzione e blocco hooks e cron
- Aggiunto il piano di sconto dell'anagrafica in fattura
- Aggiunto pulsante salvataggio note checklist
- Aggiunto script per php-cs-fix per la formattazione del codice
- Aggiunta rivalsa inps su bollo per il regime forfettario
- Aggiunta la colonna **Data scadenza** in **Listini clienti**
- Aggiunto widget **Preventivi da fatturare**
- Aggiunti i link ai file e alle stampa in fase di selezione upload e stampa
- Aggiunta la gestione dell'autofattura in caso di reverse charge misto
- Aggiunto raggruppamento delle righe dei preventivi
- Aggiunta l'impostazione **Tipo di sconto predefinito**
- Aggiunto sezionale predefinito per tipo documento
### Modificato (Changed)
- Migliorata la visualizzazione della tabella in **Listino clienti**
- Migliorata la stampa fattura con pagamenti completati segnati come tali
- Migliorata la vista del modulo **Articoli**, mostra ora i record colorati in base alla disponibilità in rapporto alla soglia minima impostata
- Migliorato l'elenco delle azioni di gruppo in fatture, è ora in ordine alfabetico.
- Migliorata la struttura delle api
### Fixed
- Corretta la visualizzazione delle sessioni in dashboard
- Corretti i riferimenti visualizzati nel widget **Notifiche interne**
- Corretto il widget **Contratti in scadenza** per i contratti conclusi
- Corrette le risorse api delle checklist
- Corretti i filtri sulle ricerche numeriche
- Corretta la rimozione dei record, evitando check, email, file, campi personalizzati e note interne orfani.
- Corretto l'avviso di numero duplicato in fatture
## 2.4.48 (2023-08-01)
### Aggiunto (Added)
- Aggiunta colonna **Agente** in vista **Contratti**

View File

@ -65,8 +65,8 @@ if (Auth::check()) {
<style>'.$custom_css.'</style>';
}
// Hooks
echo '
// Hooks
echo '
<script>
$(document).ready(function() {
// Toast
@ -75,18 +75,18 @@ if (Auth::check()) {
// Orologio
clock();';
// Hooks
if (!$config['disable_hooks']) {
echo '
// Hooks
if (!$config['disable_hooks']) {
echo '
setTimeout("startHooks();", 1000);';
}
}
// Abilitazione del cron autonoma
if (!$config['disable_cron']) {
echo '
// Abilitazione del cron autonoma
if (!$config['disable_cron']) {
echo '
$.get(globals.rootdir + "/cron.php");';
}
echo '
}
echo '
});
</script>';
}

View File

@ -39,4 +39,4 @@ if ($module['name'] == 'Preventivi' && $options['op'] == 'manage_descrizione') {
{[ "type": "checkbox", "label": "'.tr('Utilizza come titolo del gruppo').'", "name": "is_titolo", "value": '.json_encode($result['is_titolo']).', "help": "'.tr('').'" ]}
</div>
</div>';
}
}

View File

@ -22,7 +22,7 @@ include_once __DIR__.'/../../core.php';
if ($config['maintenance_ip'] != $_SERVER['REMOTE_ADDR']) {
include_once App::filepath('include|custom|', 'top.php');
$img = App::getPaths()['img'];
echo '
<div class="box box-center-large box-danger">
<div class="box-header with-border text-center">

View File

@ -116,7 +116,7 @@ function orderValue($table, $field, $id)
*/
function reorderRows($table, $field, $id)
{
$righe = database()->select($table, 'id', [$field => $id], ['order' => 'ASC']);
$righe = database()->select($table, 'id', [], [$field => $id], ['order' => 'ASC']);
$i = 1;
foreach ($righe as $riga) {

View File

@ -40,7 +40,7 @@ if ($module->replacePlaceholders($id_record, '{email}')) {
$id_anagrafica = $module->replacePlaceholders($id_record, '{id_anagrafica}', $placeholder_options);
// Aggiungo email referenti in base alla mansione impostata nel template
$mansioni = $dbo->select('em_mansioni_template', 'idmansione', ['id_template' => $template->id]);
$mansioni = $dbo->select('em_mansioni_template', 'idmansione', [], ['id_template' => $template->id]);
foreach ($mansioni as $mansione) {
$referenti = $dbo->table('an_referenti')->where('idmansione', $mansione['idmansione'])->where('idanagrafica', $id_anagrafica)->where('email', '!=', '')->get();
foreach ($referenti as $referente) {
@ -52,7 +52,7 @@ foreach ($mansioni as $mansione) {
// Aggiungo email tecnici assegnati quando sono sul template Notifica intervento
if ($template->name == 'Notifica intervento') {
$tecnici = $dbo->select('in_interventi_tecnici_assegnati', 'id_tecnico', ['id_intervento' => $id_record]);
$tecnici = $dbo->select('in_interventi_tecnici_assegnati', 'id_tecnico', [], ['id_intervento' => $id_record]);
foreach ($tecnici as $tecnico) {
$anagrafica = $dbo->table('an_anagrafiche')->where('idanagrafica', $tecnico['id_tecnico'])->where('email', '!=', '')->first();
if (!in_array($anagrafica->email, $emails)) {

View File

@ -24,81 +24,53 @@ use API\Interfaces\DeleteInterface;
use API\Interfaces\RetrieveInterface;
use API\Interfaces\UpdateInterface;
use API\Resource;
use Modules;
use Modules\Anagrafiche\Anagrafica;
class Anagrafiche extends Resource implements RetrieveInterface, CreateInterface, UpdateInterface, DeleteInterface
{
public function retrieve($request)
{
$database = database();
$table = 'an_anagrafiche';
$query = $database->table('an_anagrafiche')
->leftJoin('an_nazioni', 'an_anagrafiche.id_nazione', '=', 'an_nazioni.id')
->select(
'an_anagrafiche.ragione_sociale',
'an_anagrafiche.piva',
'an_anagrafiche.codice_fiscale',
'an_anagrafiche.indirizzo',
'an_anagrafiche.indirizzo2',
'an_anagrafiche.citta',
'an_anagrafiche.cap',
'an_anagrafiche.provincia',
'an_anagrafiche.km',
$database->raw('IFNULL(an_anagrafiche.lat, 0.00) AS latitudine'),
$database->raw('IFNULL(an_anagrafiche.lng, 0.00) AS longitudine'),
$database->raw('an_nazioni.nome AS nazione'),
'an_anagrafiche.telefono',
'an_anagrafiche.fax',
'an_anagrafiche.cellulare',
'an_anagrafiche.email',
'an_anagrafiche.sitoweb',
'an_anagrafiche.note',
'an_anagrafiche.idzona',
'an_anagrafiche.deleted_at'
)->orderBy('an_anagrafiche.ragione_sociale');
$select = [
'an_anagrafiche.*',
'an_nazioni.nome AS nazione',
];
$joins[] = [
'an_nazioni',
'an_anagrafiche.id_nazione',
'an_nazioni.id',
];
$where[] = ['an_anagrafiche.deleted_at', '=', null];
$order['an_anagrafiche.ragione_sociale'] = 'ASC';
if ($request['resource'] != 'anagrafiche') {
$type = 'Cliente';
$query = $query->whereRaw('an_anagrafiche.idanagrafica IN (SELECT idanagrafica FROM an_tipianagrafiche_anagrafiche WHERE idtipoanagrafica = (SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione = ?))', [$type]);
$joins[] = [
'an_tipianagrafiche_anagrafiche',
'an_anagrafiche.idanagrafica',
'an_tipianagrafiche_anagrafiche.idanagrafica',
];
$joins[] = [
'an_tipianagrafiche',
'an_tipianagrafiche_anagrafiche.idtipoanagrafica',
'an_tipianagrafiche.idtipoanagrafica',
];
$where[] = ['an_tipianagrafiche.descrizione', '=', $type];
}
// Filtri da richiesta API
$allow_list = [
'idanagrafica',
'ragione_sociale',
];
$conditions = array_intersect_key((array) $request['where'], array_flip($allow_list));
// Filtro per ID
if (!empty($conditions['idanagrafica'])) {
$query = $query->whereIn('an_anagrafiche.idanagrafica', (array) $conditions['idanagrafica']);
}
// Filtro per Ragione sociale
if (!empty($conditions['ragione_sociale'])) {
$query = $query->where('an_anagrafiche.ragione_sociale', 'like', '%'.$conditions['ragione_sociale'].'%');
}
// Filtri aggiuntivi predefiniti
$module = Modules::get('Anagrafiche');
$additionals = Modules::getAdditionals($module->id, false);
foreach ($additionals['WHR'] as $where) {
$query = $query->whereRaw($where);
}
foreach ($additionals['HVN'] as $having) {
$query = $query->havingRaw($having);
}
$total_count = $query->count();
return [
'results' => $query->skip($request['page'] * $request['length'])
->limit($request['length'])
->get()->toArray(),
'total-count' => $total_count,
'table' => $table,
'select' => $select,
'joins' => $joins,
'where' => $where,
'order' => $order,
];
}
@ -119,14 +91,14 @@ class Anagrafiche extends Resource implements RetrieveInterface, CreateInterface
{
$anagrafica = Anagrafica::find($request['id']);
$result = $anagrafica->delete();
$anagrafica->delete();
}
public function update($request)
{
$data = $request['data'];
$anagrafica = Anagrafica::find($request['id']);
$anagrafica = Anagrafica::find($data['id']);
if (isset($data['ragione_sociale'])) {
$anagrafica->ragione_sociale = $data['ragione_sociale'];

View File

@ -26,8 +26,10 @@ class Sedi extends Resource implements RetrieveInterface
{
public function retrieve($request)
{
$table = 'an_sedi';
return [
'table' => 'an_sedi',
'table' => $table,
];
}
}

View File

@ -30,13 +30,37 @@ class Articoli extends Resource implements RetrieveInterface, UpdateInterface, C
{
public function retrieve($request)
{
$query = 'SELECT *,
(SELECT nome FROM mg_categorie WHERE id = mg_articoli.id_categoria) AS categoria,
(SELECT nome FROM mg_categorie WHERE id = mg_articoli.id_sottocategoria) AS sottocategoria
FROM mg_articoli WHERE attivo = 1 AND deleted_at IS NULL';
$table = 'mg_articoli';
$select = [
'mg_articoli.*',
'categorie.nome AS categoria',
'sottocategorie.nome AS sottocategoria',
];
$joins[] = [
'mg_categorie AS categorie',
'mg_articoli.id_categoria',
'categorie.id',
];
$joins[] = [
'mg_categorie AS sottocategorie',
'mg_articoli.id_sottocategoria',
'sottocategorie.id',
];
$where[] = ['mg_articoli.deleted_at', '=', null];
$whereraw = [];
$order['mg_articoli.id'] = 'ASC';
return [
'query' => $query,
'table' => $table,
'select' => $select,
'joins' => $joins,
'where' => $where,
'whereraw' => $whereraw,
'order' => $order,
];
}

View File

@ -127,7 +127,6 @@ class Check extends Model
}
*/
/**
* Rimuove tutte le check di un determinato modulo/plugin e record.
*
@ -137,7 +136,7 @@ class Check extends Model
{
database()->delete('zz_checks', $data);
}
/* Relazioni Eloquent */
public function user()

View File

@ -49,7 +49,7 @@ $result = [
'um' => '',
'prezzo' => 0,
'sconto_unitario' => 0,
'tipo_sconto' => '',
'tipo_sconto' => (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT'),
'idiva' => '',
'provvigione_default' => 0,
'tipo_provvigione_default' => 'PRC',

View File

@ -48,6 +48,9 @@ $riga = $documento->getRiga($type, $id_riga);
$result = $riga->toArray();
$result['prezzo'] = $riga->prezzo_unitario;
if ($result['sconto'] == 0) {
$result['tipo_sconto'] = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
}
// Importazione della gestione dedicata
$file = 'riga';

View File

@ -153,6 +153,11 @@ foreach ($righe as $riga) {
<br><small class="label label-danger">'.$text.'</small>';
}
$tiposconto = '';
if ($riga['sconto'] == 0) {
$tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
}
echo '
</td>';
@ -160,7 +165,7 @@ foreach ($righe as $riga) {
if (!$block_edit) {
echo '
<td class="text-center">
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.$riga->tipo_sconto.'" ]}
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.($tipo_sconto ?: $riga->tipo_sconto).'" ]}
</td>';
}

View File

@ -69,7 +69,7 @@ foreach ($moduli as $module_id => $note) {
$documento = '';
if ($modulo->title == 'Attività') {
$documento = $dbo->fetchOne("SELECT in_interventi.codice AS numero, ragione_sociale FROM zz_notes INNER JOIN in_interventi ON (in_interventi.id = zz_notes.id_record AND zz_notes.id_module=(SELECT id FROM zz_modules WHERE title = 'Attività')zz) INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = in_interventi.idanagrafica WHERE zz_notes.id = ".$nota->id);
$documento = $dbo->fetchOne("SELECT in_interventi.codice AS numero, ragione_sociale FROM zz_notes INNER JOIN in_interventi ON (in_interventi.id = zz_notes.id_record AND zz_notes.id_module=(SELECT id FROM zz_modules WHERE title = 'Attività')) INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = in_interventi.idanagrafica WHERE zz_notes.id = ".$nota->id);
} elseif ($modulo->title == 'Fatture di vendita') {
$documento = $dbo->fetchOne("SELECT numero_esterno AS numero, ragione_sociale FROM zz_notes INNER JOIN co_documenti ON (co_documenti.id = zz_notes.id_record AND zz_notes.id_module=(SELECT id FROM zz_modules WHERE title = 'Fatture di vendita')) INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = co_documenti.idanagrafica WHERE zz_notes.id = ".$nota->id);
} elseif ($modulo->title == 'Fatture di acquisto') {

View File

@ -52,7 +52,7 @@ $result = [
'um' => '',
'prezzo' => 0,
'sconto_unitario' => 0,
'tipo_sconto' => '',
'tipo_sconto' => (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT'),
'idiva' => '',
'provvigione_default' => 0,
'tipo_provvigione_default' => 'PRC',

View File

@ -50,6 +50,9 @@ $riga = $documento->getRiga($type, $id_riga);
$result = $riga->toArray();
$result['prezzo'] = $riga->prezzo_unitario;
if ($result['sconto'] == 0) {
$result['tipo_sconto'] = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
}
// Importazione della gestione dedicata
$file = 'riga';

View File

@ -193,11 +193,16 @@ foreach ($righe as $riga) {
echo '
</td>';
$tiposconto = '';
if ($riga['sconto'] == 0) {
$tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
}
// Sconto unitario
if (!$block_edit) {
echo '
<td class="text-center">
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.$riga->tipo_sconto.'" ]}
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.($tipo_sconto ?: $riga->tipo_sconto).'" ]}
</td>';
}

View File

@ -187,14 +187,13 @@ class Mail extends Model
$id_templates = [];
foreach($templates as $template) {
foreach ($templates as $template) {
$id_templates[] = $template->id;
}
database()->table('em_emails')->where('id_record', $data['id_record'])->whereIn('id_template', $id_templates)->delete();
}
/* Relazioni Eloquent */
public function account()

View File

@ -242,7 +242,7 @@ switch ($op) {
->where('id', '!=', $id_record)
->where('data', '>=', $_SESSION['period_start'])
->where('data', '<=', $_SESSION['period_end'])
->where('numero_esterno', '!=', null)
->where('numero_esterno', '!=', '')
->whereHas('tipo', function ($query) use ($direzione) {
$query->where('dir', '=', $direzione);
})->count();
@ -1011,7 +1011,7 @@ switch ($op) {
if (!empty($piano_sconto)) {
$sconto = parseScontoCombinato($piano_sconto['prc_guadagno'].'+'.$sconto);
}
$provvigione = $dbo->selectOne('an_anagrafiche', 'provvigione_default', ['idanagrafica' => $fattura->idagente])['provvigione_default'];
$articolo->setPrezzoUnitario($prezzo_unitario, $id_iva);

View File

@ -70,11 +70,11 @@ $idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo 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 = '<?php echo $dir; ?>' ORDER BY codice_tipo_documento_fe", "value": "<?php echo $idtipodocumento; ?>" ]}
{[ "type": "select", "label": "<?php echo tr('Tipo documento'); ?>", "name": "idtipodocumento", "required": 1, "values": "query=SELECT co_tipidocumento.id, CONCAT(co_tipidocumento.codice_tipo_documento_fe, ' - ', co_tipidocumento.descrizione) AS descrizione, co_tipidocumento.id_segment, zz_segments.name as name_segment FROM co_tipidocumento INNER JOIN zz_segments ON zz_segments.id = co_tipidocumento.id_segment WHERE co_tipidocumento.enabled = 1 AND co_tipidocumento.dir = '<?php echo $dir; ?>' ORDER BY co_tipidocumento.codice_tipo_documento_fe", "value": "<?php echo $idtipodocumento; ?>" ]}
</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']; ?>" ]}
{[ "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 $database->selectOne('co_tipidocumento', 'id_segment', ['id' => $idtipodocumento])['id_segment']; ?>" ]}
</div>
</div>
@ -232,6 +232,8 @@ $(document).ready(function () {
});
input("idtipodocumento").change(function () {
$("#id_segment").selectSetNew($(this).selectData().id_segment, $(this).selectData().name_segment);
$.ajax({
url: globals.rootdir + "/actions.php",
type: "POST",

View File

@ -151,7 +151,7 @@ if ($dir == 'entrata') {
$pos = 'ord';
}
$r = $dbo->select($data[$pos]['table'], $data[$pos]['id'], ['id' => $res[0][str_replace('id', 'id_riga_', $data[$pos]['id'])]]);
$r = $dbo->select($data[$pos]['table'], $data[$pos]['id'], [], ['id' => $res[0][str_replace('id', 'id_riga_', $data[$pos]['id'])]]);
echo '
'.Modules::link($modulo, $r[0][$data[$pos]['id']], tr('Visualizza vendita'), null);

View File

@ -598,109 +598,6 @@ switch (post('op')) {
break;
}
if (App::debug()) {
$operations['delete-bulk'] = [
'text' => '<span><i class="fa fa-trash"></i> '.tr('Elimina selezionati').'</span> <span class="label label-danger">beta</span>',
];
}
$operations['export-csv'] = [
'text' => '<span><i class="fa fa-download"></i> '.tr('Esporta selezionati').'</span>',
'data' => [
'msg' => tr('Vuoi esportare un CSV con le fatture selezionate?'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-success',
'blank' => true,
],
];
$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, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $id_module, 'is_sezionale' => 1]).', "value": "'.$_SESSION['module_'.$id_module]['id_segment'].'", "select-options-escape": true ]}<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',
],
];
$operations['registrazione-contabile'] = [
'text' => '<span><i class="fa fa-calculator"></i> '.tr('Registrazione contabile').'</span>',
'data' => [
'title' => tr('Registrazione contabile'),
'type' => 'modal',
'origine' => 'fatture',
'url' => base_path().'/add.php?id_module='.Modules::get('Prima nota')['id'],
],
];
$operations['exportFE-bulk'] = [
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta stampe FE').'</span>',
'data' => [
'title' => '',
'msg' => tr('Vuoi davvero esportare i PDF delle fatture elettroniche selezionate in un archivio ZIP?'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
if ($module->name == 'Fatture di vendita') {
$operations['genera-xml'] = [
'text' => '<span><i class="fa fa-file-code-o"></i> '.tr('Genera fatture elettroniche').'</span>',
'data' => [
'title' => '',
'msg' => tr('Generare le fatture elettroniche per i documenti selezionati?<br><small>(le fatture dovranno trovarsi nello stato <i class="fa fa-clock-o text-info" title="Emessa"></i> <small>Emessa</small> e non essere mai state generate)</small>'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
$operations['export-bulk'] = [
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta stampe').'</span>',
'data' => [
'title' => '',
'msg' => tr('Vuoi davvero esportare i PDF delle fatture selezionate in un archivio ZIP?'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
$operations['check-bulk'] = [
'text' => '<span><i class="fa fa-list-alt"></i> '.tr('Controlla fatture elettroniche').'</span>',
'data' => [
'title' => '',
'msg' => tr('Controllare corrispondenza tra XML e fattura di vendita?<br><small>(le fatture dovranno essere state generate)</small>'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
}
$operations['export-xml-bulk'] = [
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta XML').'</span>',
'data' => [
'title' => '',
'msg' => tr('Vuoi davvero esportare le fatture elettroniche selezionate in un archivio ZIP?'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
$operations['export-ricevute-bulk'] = [
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta ricevute').'</span>',
'data' => [
'title' => '',
'msg' => tr('Vuoi davvero esportare le ricevute selezionate in un archivio ZIP?'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
$operations['change-bank'] = [
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Aggiorna banca').'</span>',
'data' => [
@ -712,18 +609,6 @@ $operations['change-bank'] = [
],
];
if ($dir == 'entrata') {
$operations['change-stato'] = [
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Emetti fatture').'</span>',
'data' => [
'title' => tr('Emissione fatture'),
'msg' => tr('Vuoi emettere le fatture selezionate? Verranno emesse solo le fatture in Bozza'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
],
];
}
$operations['cambia-sezionale'] = [
'text' => '<span><i class="fa fa-tags"></i> '.tr('Cambia sezionale'),
'data' => [
@ -747,7 +632,127 @@ if (Interaction::isEnabled()) {
'class' => 'btn btn-lg btn-warning',
],
];
}
if ($module->name == 'Fatture di vendita') {
$operations['check-bulk'] = [
'text' => '<span><i class="fa fa-list-alt"></i> '.tr('Controlla fatture elettroniche').'</span>',
'data' => [
'title' => '',
'msg' => tr('Controllare corrispondenza tra XML e fattura di vendita?<br><small>(le fatture dovranno essere state generate)</small>'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
}
$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, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $id_module, 'is_sezionale' => 1]).', "value": "'.$_SESSION['module_'.$id_module]['id_segment'].'", "select-options-escape": true ]}<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',
],
];
if (App::debug()) {
$operations['delete-bulk'] = [
'text' => '<span><i class="fa fa-trash"></i> '.tr('Elimina selezionati').'</span> <span class="label label-danger">beta</span>',
];
}
if ($dir == 'entrata') {
$operations['change-stato'] = [
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Emetti fatture').'</span>',
'data' => [
'title' => tr('Emissione fatture'),
'msg' => tr('Vuoi emettere le fatture selezionate? Verranno emesse solo le fatture in Bozza'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
],
];
}
$operations['export-csv'] = [
'text' => '<span><i class="fa fa-download"></i> '.tr('Esporta selezionati').'</span>',
'data' => [
'msg' => tr('Vuoi esportare un CSV con le fatture selezionate?'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-success',
'blank' => true,
],
];
if ($module->name == 'Fatture di vendita') {
$operations['export-bulk'] = [
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta stampe').'</span>',
'data' => [
'title' => '',
'msg' => tr('Vuoi davvero esportare i PDF delle fatture selezionate in un archivio ZIP?'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
}
$operations['exportFE-bulk'] = [
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta stampe FE').'</span>',
'data' => [
'title' => '',
'msg' => tr('Vuoi davvero esportare i PDF delle fatture elettroniche selezionate in un archivio ZIP?'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
$operations['export-ricevute-bulk'] = [
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta ricevute').'</span>',
'data' => [
'title' => '',
'msg' => tr('Vuoi davvero esportare le ricevute selezionate in un archivio ZIP?'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
$operations['export-xml-bulk'] = [
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta XML').'</span>',
'data' => [
'title' => '',
'msg' => tr('Vuoi davvero esportare le fatture elettroniche selezionate in un archivio ZIP?'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
if ($module->name == 'Fatture di vendita') {
$operations['genera-xml'] = [
'text' => '<span><i class="fa fa-file-code-o"></i> '.tr('Genera fatture elettroniche').'</span>',
'data' => [
'title' => '',
'msg' => tr('Generare le fatture elettroniche per i documenti selezionati?<br><small>(le fatture dovranno trovarsi nello stato <i class="fa fa-clock-o text-info" title="Emessa"></i> <small>Emessa</small> e non essere mai state generate)</small>'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
}
$operations['registrazione-contabile'] = [
'text' => '<span><i class="fa fa-calculator"></i> '.tr('Registrazione contabile').'</span>',
'data' => [
'title' => tr('Registrazione contabile'),
'type' => 'modal',
'origine' => 'fatture',
'url' => base_path().'/add.php?id_module='.Modules::get('Prima nota')['id'],
],
];
if (Interaction::isEnabled()) {
$operations['verify-notifiche'] = [
'text' => '<i class="fa fa-question-circle"></i> '.tr('Verifica notifiche').'</span>',
'data' => [

View File

@ -47,12 +47,12 @@ if (isset($id_record)) {
co_statidocumento.descrizione AS `stato`,
co_tipidocumento.descrizione AS `descrizione_tipo`,
co_tipidocumento.id AS `idtipodocumento`,
(SELECT is_fiscale FROM zz_segments WHERE id = id_segment) AS is_fiscale,
(SELECT is_fiscale FROM zz_segments WHERE zz_segments.id = co_documenti.id_segment) AS is_fiscale,
(SELECT descrizione FROM co_ritenutaacconto WHERE id=idritenutaacconto) AS ritenutaacconto_desc,
(SELECT descrizione FROM co_rivalse WHERE id=idrivalsainps) AS rivalsainps_desc,
(SELECT descrizione FROM dt_causalet WHERE id=idcausalet) AS causale_desc
FROM co_documenti
LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id
LEFT JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id
INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica
INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id
LEFT JOIN co_pagamenti ON co_documenti.idpagamento=co_pagamenti.id

View File

@ -63,7 +63,7 @@ $result = [
'prezzo' => 0,
'prezzo_acquisto' => 0,
'sconto_unitario' => 0,
'tipo_sconto' => '',
'tipo_sconto' => (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT'),
'idiva' => '',
'idconto' => $idconto,
'ritenuta_contributi' => true,

View File

@ -55,7 +55,9 @@ $riga = $documento->getRiga($type, $id_riga);
$result = $riga->toArray();
$result['prezzo'] = $riga->prezzo_unitario;
if ($result['sconto'] == 0) {
$result['tipo_sconto'] = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
}
// Importazione della gestione dedicata
$file = 'riga';
if ($riga->isDescrizione()) {

View File

@ -26,10 +26,31 @@ class Impianti extends Resource implements RetrieveInterface
{
public function retrieve($request)
{
$query = 'SELECT id, idanagrafica, matricola, nome, descrizione FROM my_impianti';
$table = 'my_impianti';
$select = [
'my_impianti.id',
'my_impianti.idanagrafica',
'my_impianti.matricola',
'my_impianti.nome',
'my_impianti.descrizione',
];
$where = [];
$whereraw = [];
$order = [];
$group = [];
return [
'query' => $query,
'table' => $table,
'select' => $select,
'where' => $where,
'whereraw' => $whereraw,
'order' => $order,
'group' => $group,
];
}
}

View File

@ -75,7 +75,7 @@ switch (post('op')) {
$tecnici_assegnati = (array) post('tecnici_assegnati');
$tecnici_presenti_array = $dbo->select('in_interventi_tecnici_assegnati', 'id_tecnico', ['id_intervento' => $intervento->id]);
$tecnici_presenti_array = $dbo->select('in_interventi_tecnici_assegnati', 'id_tecnico', [], ['id_intervento' => $intervento->id]);
foreach ($tecnici_presenti_array as $tecnico_presente) {
$tecnici_presenti[] = $tecnico_presente['id_tecnico'];
@ -144,12 +144,12 @@ switch (post('op')) {
$tecnici_intervento = [];
if (!empty($stato['notifica_tecnico_sessione'])) {
$tecnici_intervento = $dbo->select('in_interventi_tecnici', 'idtecnico', ['idintervento' => $id_record]);
$tecnici_intervento = $dbo->select('in_interventi_tecnici', 'idtecnico', [], ['idintervento' => $id_record]);
}
$tecnici_assegnati = [];
if (!empty($stato['notifica_tecnico_assegnato'])) {
$tecnici_assegnati = $dbo->select('in_interventi_tecnici_assegnati', 'id_tecnico AS idtecnico', ['id_intervento' => $id_record]);
$tecnici_assegnati = $dbo->select('in_interventi_tecnici_assegnati', 'id_tecnico AS idtecnico', [], ['id_intervento' => $id_record]);
}
$tecnici = array_unique(array_merge($tecnici_intervento, $tecnici_assegnati), SORT_REGULAR);
@ -398,7 +398,6 @@ switch (post('op')) {
// Eliminazione associazione interventi e my_impianti
$dbo->query('DELETE FROM my_impianti_interventi WHERE idintervento='.prepare($id_record));
flash()->info(tr('Intervento eliminato!'));
} catch (InvalidArgumentException $e) {
flash()->error(tr('Sono stati utilizzati alcuni serial number nel documento: impossibile procedere!'));
@ -703,8 +702,8 @@ switch (post('op')) {
}
if (!empty($stato['notifica_tecnici'])) {
$tecnici_intervento = $dbo->select('in_interventi_tecnici', 'idtecnico', ['idintervento' => $id_record]);
$tecnici_assegnati = $dbo->select('in_interventi_tecnici_assegnati', 'id_tecnico AS idtecnico', ['id_intervento' => $id_record]);
$tecnici_intervento = $dbo->select('in_interventi_tecnici', 'idtecnico', [], ['idintervento' => $id_record]);
$tecnici_assegnati = $dbo->select('in_interventi_tecnici_assegnati', 'id_tecnico AS idtecnico', [], ['id_intervento' => $id_record]);
$tecnici = array_unique(array_merge($tecnici_intervento, $tecnici_assegnati), SORT_REGULAR);
foreach ($tecnici as $tecnico) {
@ -783,8 +782,8 @@ switch (post('op')) {
}
if (!empty($stato['notifica_tecnici'])) {
$tecnici_intervento = $dbo->select('in_interventi_tecnici', 'idtecnico', ['idintervento' => $id_record]);
$tecnici_assegnati = $dbo->select('in_interventi_tecnici_assegnati', 'id_tecnico AS idtecnico', ['id_intervento' => $id_record]);
$tecnici_intervento = $dbo->select('in_interventi_tecnici', 'idtecnico', [], ['idintervento' => $id_record]);
$tecnici_assegnati = $dbo->select('in_interventi_tecnici_assegnati', 'id_tecnico AS idtecnico', [], ['id_intervento' => $id_record]);
$tecnici = array_unique(array_merge($tecnici_intervento, $tecnici_assegnati), SORT_REGULAR);
foreach ($tecnici as $tecnico) {
@ -995,7 +994,7 @@ switch (post('op')) {
// Copia degli impianti
if (!empty($copia_impianti)) {
$impianti = $dbo->select('my_impianti_interventi', '*', ['idintervento' => $intervento->id]);
$impianti = $dbo->select('my_impianti_interventi', '*', [], ['idintervento' => $intervento->id]);
foreach ($impianti as $impianto) {
$dbo->insert('my_impianti_interventi', [
'idintervento' => $id_record,
@ -1003,7 +1002,7 @@ switch (post('op')) {
]);
}
$componenti = $dbo->select('my_componenti_interventi', '*', ['id_intervento' => $intervento->id]);
$componenti = $dbo->select('my_componenti_interventi', '*', [], ['id_intervento' => $intervento->id]);
foreach ($componenti as $componente) {
$dbo->insert('my_componenti_interventi', [
'id_intervento' => $id_record,

View File

@ -250,7 +250,7 @@ switch (post('op')) {
// Copia degli impianti
if (!empty($copia_impianti)) {
$impianti = $dbo->select('my_impianti_interventi', '*', ['idintervento' => $intervento->id]);
$impianti = $dbo->select('my_impianti_interventi', '*', [], ['idintervento' => $intervento->id]);
foreach ($impianti as $impianto) {
$dbo->insert('my_impianti_interventi', [
'idintervento' => $id_record,
@ -258,7 +258,7 @@ switch (post('op')) {
]);
}
$componenti = $dbo->select('my_componenti_interventi', '*', ['id_intervento' => $intervento->id]);
$componenti = $dbo->select('my_componenti_interventi', '*', [], ['id_intervento' => $intervento->id]);
foreach ($componenti as $componente) {
$dbo->insert('my_componenti_interventi', [
'id_intervento' => $id_record,
@ -288,7 +288,6 @@ switch (post('op')) {
// Eliminazione associazione interventi e my_impianti
$dbo->query('DELETE FROM my_impianti_interventi WHERE idintervento='.prepare($id_record));
} catch (InvalidArgumentException $e) {
}
}
@ -326,7 +325,7 @@ switch (post('op')) {
}
// Aggiungo email referenti in base alla mansione impostata nel template
$mansioni = $dbo->select('em_mansioni_template', 'idmansione', ['id_template' => $template->id]);
$mansioni = $dbo->select('em_mansioni_template', 'idmansione', [], ['id_template' => $template->id]);
foreach ($mansioni as $mansione) {
$referenti = $dbo->table('an_referenti')->where('idmansione', $mansione['idmansione'])->where('idanagrafica', $id_anagrafica)->where('email', '!=', '')->get();
if (!$referenti->isEmpty() && $creata_mail == false) {

View File

@ -56,7 +56,7 @@ $result = [
'um' => '',
'prezzo' => 0,
'sconto_unitario' => 0,
'tipo_sconto' => '',
'tipo_sconto' => (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT'),
'idiva' => '',
'idconto' => $idconto,
'ritenuta_contributi' => true,

View File

@ -54,7 +54,9 @@ $riga = $documento->getRiga($type, $id_riga);
$result = $riga->toArray();
$result['prezzo'] = $riga->prezzo_unitario;
if ($result['sconto'] == 0) {
$result['tipo_sconto'] = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
}
// Importazione della gestione dedicata
$file = 'riga';
if ($riga->isDescrizione()) {

View File

@ -157,11 +157,16 @@ echo '
echo '
</td>';
$tiposconto = '';
if ($riga['sconto'] == 0) {
$tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
}
// Sconto unitario
if (!$block_edit) {
echo '
<td class="text-center">
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.$riga->tipo_sconto.'" ]}
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.($tipo_sconto ?: $riga->tipo_sconto).'" ]}
</td>';
}

View File

@ -30,15 +30,22 @@ class Articoli extends Resource implements RetrieveInterface, CreateInterface
{
public function retrieve($request)
{
$query = 'SELECT id, idarticolo AS id_articolo, idintervento AS id_intervento, qta, created_at as data FROM in_righe_interventi WHERE `idarticolo` IS NOT NULL AND `idintervento` = :id_intervento';
$table = 'in_righe_interventi';
$parameters = [
':id_intervento' => $request['id_intervento'],
$select = [
'in_righe_interventi.id',
'in_righe_interventi.idarticolo AS id_articolo',
'in_righe_interventi.idintervento AS id_intervento',
'in_righe_interventi.qta',
'in_righe_interventi.created_at as data',
];
$where = [['in_righe_interventi.idarticolo', '!=', null], ['in_righe_interventi.idintervento', '=', $request['id_intervento']]];
return [
'query' => $query,
'parameters' => $parameters,
'table' => $table,
'select' => $select,
'where' => $where,
];
}
@ -58,13 +65,4 @@ class Articoli extends Resource implements RetrieveInterface, CreateInterface
$articolo->save();
}
public function delete($request)
{
$database = database();
$database->query('DELETE FROM `in_righe_interventi` WHERE `idarticolo` IS NOT NULL AND `idintervento` = :id_intervento', [
':id_intervento' => $request['id_intervento'],
]);
}
}

View File

@ -25,6 +25,7 @@ use Models\Upload;
class Firma extends Resource implements UpdateInterface
{
// TODO: Da rivedere con upload in base64
public function update($request)
{
$database = database();

View File

@ -27,15 +27,19 @@ class Impianti extends Resource implements RetrieveInterface, CreateInterface
{
public function retrieve($request)
{
$query = 'SELECT idimpianto AS id_impianto, idintervento AS id_intervento FROM my_impianti_interventi WHERE `idintervento` = :id_intervento';
$table = 'my_impianti_interventi';
$parameters = [
':id_intervento' => $request['id_intervento'],
$select = [
'idimpianto AS id_impianto',
'idintervento AS id_intervento',
];
$where[] = ['my_impianti_interventi.idintervento', '=', $request['id_intervento']];
return [
'query' => $query,
'parameters' => $parameters,
'table' => $table,
'select' => $select,
'where' => $where,
];
}
@ -44,14 +48,13 @@ class Impianti extends Resource implements RetrieveInterface, CreateInterface
$data = $request['data'];
$id_record = $data['id_intervento'];
$database = database();
$database->query('DELETE FROM my_impianti_interventi WHERE `idintervento` = :id_intervento', [
database()->query('DELETE FROM my_impianti_interventi WHERE `idintervento` = :id_intervento', [
':id_intervento' => $id_record,
]);
$impianti = $data['impianti'];
foreach ($impianti as $impianto) {
$database->insert('my_impianti_interventi', [
database()->insert('my_impianti_interventi', [
'idintervento' => $id_record,
'idimpianto' => $impianto,
]);

View File

@ -24,7 +24,6 @@ use API\Interfaces\RetrieveInterface;
use API\Interfaces\UpdateInterface;
use API\Resource;
use Auth;
use Modules;
use Modules\Anagrafiche\Anagrafica;
use Modules\Interventi\Intervento;
use Modules\Interventi\Stato;
@ -35,58 +34,58 @@ class Interventi extends Resource implements RetrieveInterface, CreateInterface,
public function retrieve($request)
{
// Periodo per selezionare interventi
$today = date('Y-m-d');
$period_end = date('Y-m-d', strtotime($today.' +7 days'));
$period_start = date('Y-m-d', strtotime($today.' -2 months'));
$user = Auth::user();
// AND `in_statiintervento`.`is_completato`=0
$query = "SELECT `in_interventi`.`id`,
`in_interventi`.`codice`,
`in_interventi`.`data_richiesta`,
`in_interventi`.`richiesta`,
`in_interventi`.`descrizione`,
`in_interventi`.`idtipointervento`,
`in_interventi`.`idanagrafica`,
`in_interventi`.`idsede_destinazione`,
`in_interventi`.`idstatointervento`,
`in_interventi`.`informazioniaggiuntive`,
`in_interventi`.`idclientefinale`,
`in_interventi`.`firma_file`,
IF(firma_data = '0000-00-00 00:00:00', '', firma_data) AS `firma_data`,
`in_interventi`.firma_nome,
(SELECT GROUP_CONCAT(CONCAT(my_impianti.matricola, ' - ', my_impianti.nome) SEPARATOR ', ') FROM (my_impianti_interventi INNER JOIN my_impianti ON my_impianti_interventi.idimpianto=my_impianti.id) WHERE my_impianti_interventi.idintervento = `in_interventi`.`id`) AS `impianti`,
(SELECT MAX(`orario_fine`) FROM `in_interventi_tecnici` WHERE `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`) AS `data`,
(SELECT GROUP_CONCAT(DISTINCT ragione_sociale SEPARATOR ', ') FROM `in_interventi_tecnici` INNER JOIN `an_anagrafiche` ON `in_interventi_tecnici`.`idtecnico` = `an_anagrafiche`.`idanagrafica` WHERE `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`) AS `tecnici`,
`in_statiintervento`.`colore` AS `bgcolor`,
`in_statiintervento`.`descrizione` AS `stato`,
`in_interventi`.`idtipointervento` AS `tipo`
FROM `in_interventi`
INNER JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento` = `in_statiintervento`.`idstatointervento`
INNER JOIN `an_anagrafiche` ON `in_interventi`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`
LEFT JOIN `an_sedi` ON `in_interventi`.`idsede_destinazione` = `an_sedi`.`id`
WHERE EXISTS(SELECT `orario_fine` FROM `in_interventi_tecnici` WHERE `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id` AND `orario_fine` BETWEEN :period_start AND :period_end AND idtecnico LIKE :idtecnico)";
$table = 'in_interventi';
// Se sono l'admin posso vedere tutte le attività
$id_anagrafica = $user->is_admin ? '%' : $user->idanagrafica;
$query .= '
HAVING 2=2
ORDER BY `in_interventi`.`data_richiesta` DESC';
$parameters = [
':period_end' => $period_end,
':period_start' => $period_start,
':idtecnico' => $id_anagrafica,
$select = [
'in_interventi.*',
'MAX(in_interventi_tecnici.orario_fine) as data',
'GROUP_CONCAT(DISTINCT b.ragione_sociale SEPARATOR \', \') AS tecnici',
'in_statiintervento.descrizione AS stato',
];
$module = Modules::get('Interventi');
$joins[] = [
'in_statiintervento',
'in_interventi.idstatointervento',
'in_statiintervento.idstatointervento',
];
$query = Modules::replaceAdditionals($module->id, $query);
$joins[] = [
'an_anagrafiche',
'in_interventi.idanagrafica',
'an_anagrafiche.idanagrafica',
];
$joins[] = [
'in_interventi_tecnici',
'in_interventi_tecnici.idintervento',
'in_interventi.id',
];
$joins[] = [
'an_anagrafiche as b',
'in_interventi_tecnici.idtecnico',
'b.ragione_sociale',
];
$where = [];
if (!$user->is_admin) {
$where[] = ['in_interventi_tecnici.idtecnico', '=', $user->idanagrafica];
}
$whereraw = [];
$group = 'in_interventi.id';
return [
'query' => $query,
'parameters' => $parameters,
'table' => $table,
'select' => $select,
'joins' => $joins,
'where' => $where,
'whereraw' => $whereraw,
'group' => $group,
];
}

View File

@ -82,7 +82,7 @@ switch (filter('op')) {
'id_list' => $lista->id,
]);
$registrato = $database->select('em_list_receiver', '*', $data);
$registrato = $database->select('em_list_receiver', '*', [], $data);
if (empty($registrato)) {
$database->insert('em_list_receiver', $data);
}

View File

@ -7,7 +7,7 @@ $search = filter('search') ? filter('search')['value'] : null;
$start = filter('start');
$length = filter('length');
$tot_articoli = $dbo->select('mg_listini_articoli', '*', ['id_listino' => $id_listino]);
$tot_articoli = $dbo->select('mg_listini_articoli', '*', [], ['id_listino' => $id_listino]);
if (empty($search)) {
$articoli = $dbo->fetchArray('SELECT mg_listini_articoli.*, mg_articoli.codice, mg_articoli.descrizione, mg_articoli.'.($prezzi_ivati ? 'minimo_vendita_ivato' : 'minimo_vendita').' AS minimo_vendita FROM mg_listini_articoli LEFT JOIN mg_articoli ON mg_listini_articoli.id_articolo=mg_articoli.id WHERE id_listino='.prepare($id_listino).' LIMIT '.$start.', '.$length);

View File

@ -52,10 +52,10 @@ switch (filter('op')) {
flash()->info(tr('Campagna newsletter salvata!'));
if($newsletter->state = "OK") {
$newsletter->completed_at = $newsletter -> updated_at;
};
if ($newsletter->state = 'OK') {
$newsletter->completed_at = $newsletter->updated_at;
}
$newsletter->save();
break;
@ -187,7 +187,7 @@ switch (filter('op')) {
];
// Aggiornamento destinatari
$registrato = $database->select('em_newsletter_receiver', '*', $data);
$registrato = $database->select('em_newsletter_receiver', '*', [], $data);
if (empty($registrato)) {
$database->insert('em_newsletter_receiver', $data);
}

View File

@ -50,7 +50,7 @@ $result = [
'um' => '',
'prezzo' => 0,
'sconto_unitario' => 0,
'tipo_sconto' => '',
'tipo_sconto' => (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT'),
'idiva' => '',
'provvigione_default' => 0,
'tipo_provvigione_default' => 'PRC',

View File

@ -48,6 +48,9 @@ $riga = $documento->getRiga($type, $id_riga);
$result = $riga->toArray();
$result['prezzo'] = $riga->prezzo_unitario;
if ($result['sconto'] == 0) {
$result['tipo_sconto'] = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
}
// Importazione della gestione dedicata
$file = 'riga';

View File

@ -239,11 +239,16 @@ foreach ($righe as $riga) {
echo '
</td>';
$tiposconto = '';
if ($riga['sconto'] == 0) {
$tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
}
// Sconto unitario
if (!$block_edit) {
echo '
<td class="text-center">
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.$riga->tipo_sconto.'" ]}
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.($tipo_sconto ?: $riga->tipo_sconto).'" ]}
</td>';
}

View File

@ -49,7 +49,7 @@ $result = [
'um' => '',
'prezzo' => 0,
'sconto_unitario' => 0,
'tipo_sconto' => '',
'tipo_sconto' => (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT'),
'idiva' => '',
'provvigione_default' => 0,
'tipo_provvigione_default' => 'PRC',

View File

@ -49,6 +49,10 @@ $riga = $documento->getRiga($type, $id_riga);
$result = $riga->toArray();
$result['prezzo'] = $riga->prezzo_unitario;
if ($result['sconto'] == 0) {
$result['tipo_sconto'] = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
}
// Importazione della gestione dedicata
$file = 'riga';
if ($riga->isDescrizione()) {

View File

@ -206,11 +206,16 @@ foreach ($righe as $key => $riga) {
echo '
</td>';
$tiposconto = '';
if ($riga['sconto'] == 0) {
$tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
}
// Sconto unitario
if (!$block_edit) {
echo '
<td class="text-center">
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.$riga->tipo_sconto.'" ]}
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.($tipo_sconto ?: $riga->tipo_sconto).'" ]}
</td>';
}
@ -251,9 +256,9 @@ foreach ($righe as $key => $riga) {
</td>
</tr>';
$next = $righe->flatten()[$num];
if ($has_gruppo && ($next->is_titolo || $next == null)) {
echo '
$next = $righe->flatten()[$num];
if ($has_gruppo && ($next->is_titolo || $next == null)) {
echo '
<tr>
<td style="background-color:'.$color_gruppo.'" colspan="'.$colspan.'" class="text-right">
<b>'.tr('Subtotale', [], ['upper' => true]).':</b>
@ -283,7 +288,7 @@ foreach ($righe as $key => $riga) {
</td>
<td style="background-color:'.$color_gruppo.'"></td>
</tr>';
}
}
}
echo '

View File

@ -23,7 +23,7 @@ use Modules\Preventivi\Stato;
$id_module = Modules::get('Preventivi')['id'];
$rs = $dbo->fetchArray("SELECT *, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=co_preventivi.idanagrafica) AS ragione_sociale FROM co_preventivi WHERE idstato IN (SELECT id FROM co_statipreventivi WHERE is_fatturabile = 1) AND default_revision = 1 ORDER BY data_conclusione ASC");
$rs = $dbo->fetchArray('SELECT *, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=co_preventivi.idanagrafica) AS ragione_sociale FROM co_preventivi WHERE idstato IN (SELECT id FROM co_statipreventivi WHERE is_fatturabile = 1) AND default_revision = 1 ORDER BY data_conclusione ASC');
if (!empty($rs)) {
echo "
@ -39,7 +39,7 @@ if (!empty($rs)) {
$data_accettazione = ($preventivo['data_accettazione'] != '0000-00-00') ? Translator::dateToLocale($preventivo['data_accettazione']) : '';
$data_conclusione = ($preventivo['data_conclusione'] != '0000-00-00') ? Translator::dateToLocale($preventivo['data_conclusione']) : '';
$stato_preventivo = Stato::find($preventivo['idstato'])->descrizione;
if (strtotime($preventivo['data_conclusione']) < strtotime(date('Y-m-d')) && $data_conclusione != '') {
$attr = ' class="danger"';
} else {

View File

@ -120,7 +120,7 @@ switch (post('op')) {
}
// Aggiungo email referenti in base alla mansione impostata nel template
$mansioni = $dbo->select('em_mansioni_template', 'idmansione', ['id_template' => $template->id]);
$mansioni = $dbo->select('em_mansioni_template', 'idmansione', [], ['id_template' => $template->id]);
foreach ($mansioni as $mansione) {
$referenti = $dbo->table('an_referenti')->where('idmansione', $mansione['idmansione'])->where('idanagrafica', $id_anagrafica)->where('email', '!=', '')->get();
if (!$referenti->isEmpty() && $creata_mail == false) {

View File

@ -109,7 +109,7 @@ class SollecitoTask extends Manager
}
// Aggiungo email referenti in base alla mansione impostata nel template
$mansioni = database()->select('em_mansioni_template', 'idmansione', ['id_template' => $template->id]);
$mansioni = database()->select('em_mansioni_template', 'idmansione', [], ['id_template' => $template->id]);
foreach ($mansioni as $mansione) {
$referenti = database()->table('an_referenti')->where('idmansione', $mansione['idmansione'])->where('idanagrafica', $id_anagrafica)->where('email', '!=', '')->get();
if (!$referenti->isEmpty() && $creata_mail == false) {

View File

@ -21,7 +21,7 @@ include_once __DIR__.'/../../core.php';
use Models\PrintTemplate;
$id_files = $dbo->select('zz_files_print', 'id_file', ['id_print' => $id_record]);
$id_files = $dbo->select('zz_files_print', 'id_file', [], ['id_print' => $id_record]);
?><form action="" method="post" id="edit-form">
<input type="hidden" name="backto" value="record-edit">

View File

@ -39,6 +39,7 @@ switch (filter('op')) {
'help' => filter('help'),
'predefined' => $predefined,
'enabled' => post('enabled'),
'id_segment' => post('id_segment')
], ['id' => $id_record]);
flash()->info(tr('Salvataggio completato!'));

View File

@ -29,34 +29,43 @@ include_once __DIR__.'/../../core.php';
</div>
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Direzione'); ?>", "name": "dir", "value": "$dir$", "values": "list=\"\": \"Non specificato\", \"entrata\": \"<?php echo tr('Entrata'); ?>\", \"uscita\": \"<?php echo tr('Uscita'); ?>\"", "required": 1 ]}
{[ "type": "select", "label": "<?php echo tr('Direzione'); ?>", "name": "dir", "value": "$dir$", "values": "list=\"\": \"Non specificato\", \"entrata\": \"<?php echo tr('Entrata'); ?>\", \"uscita\": \"<?php echo tr('Uscita'); ?>\"", "required": 1]}
</div>
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Codice tipo documento FE'); ?>", "name": "codice_tipo_documento_fe", "value": "$codice_tipo_documento_fe$", "values": "query=SELECT codice AS id, CONCAT_WS(' - ', codice, descrizione) AS descrizione FROM fe_tipi_documento", "required": 1 ]}
</div>
<div class="col-md-4">
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Tipo documento predefinito'); ?>", "name": "predefined", "value": "<?php echo intval($record['predefined']); ?>", "help":"<?php echo tr('Impostare questo tipo di documento predefinto per le fatture di '); echo ($record['dir'] == 'entrata') ? tr('Vendita') : tr('Acquisto'); ?>." ]}
</div>
<div class="col-md-4">
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Attivo'); ?>", "name": "enabled", "disabled": "<?php echo ($record['predefined'] && $record['enabled']) ? 1 : 0; ?>", "value": "<?php echo intval($record['enabled']); ?>" ]}
</div>
<div class="col-md-4">
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Reversed'); ?>", "name": "reversed", "value": "<?php echo intval($record['reversed']); ?>", "readonly": 1 ]}
</div>
<?php
$id_module_acquisti = database()->fetchOne('SELECT id FROM zz_modules WHERE title = "Fatture di acquisto"')['id'];
$id_module_vendite = database()->fetchOne('SELECT id FROM zz_modules WHERE title = "Fatture di vendita"')['id'];
echo'
<div class="col-md-3">
{[ "type": "select", "label": "'.tr('Sezionale predefinito').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $record['dir'] == 'entrata' ? $id_module_vendite : $id_module_acquisti, 'is_sezionale' => 1]).', "value": "$id_segment$" ]}
</div>
<div class="col-md-12">
{[ "type": "text", "label": "<?php echo tr('Help'); ?>", "name": "help", "value": "$help$" ]}
{[ "type": "text", "label": "'.tr('Help').'", "name": "help", "value": "$help$" ]}
</div>
</div>
</form>
<?php
</form>';
// Collegamenti diretti (numerici)
$numero_documenti = $dbo->fetchNum('SELECT id FROM co_documenti WHERE idtipodocumento='.prepare($id_record));
@ -73,3 +82,4 @@ if (!empty($numero_documenti)) {
<a class="btn btn-danger ask" data-backto="record-list">
<i class="fa fa-trash"></i> <?php echo tr('Elimina'); ?>
</a>

View File

@ -79,7 +79,7 @@ switch (post('op')) {
$id_record = $tipo->id;
$fasce_orarie = $dbo->select('in_fasceorarie', '*', ['deleted_at' => null]);
$fasce_orarie = $dbo->select('in_fasceorarie', '*', [], ['deleted_at' => null]);
foreach ($fasce_orarie as $fascia_oraria) {
$dbo->insert('in_fasceorarie_tipiintervento', [
'idfasciaoraria' => $fascia_oraria['id'],

View File

@ -815,8 +815,14 @@ class FatturaElettronica
}
// Riferimento Amministrazione
if (!empty($azienda['riferimento_amministrazione'])) {
$result['RiferimentoAmministrazione'] = $azienda['riferimento_amministrazione'];
if ($fattura->getCliente()->tipo == "Ente pubblico") {
if (!empty($fattura->getCliente()->riferimento_amministrazione)) {
$result['RiferimentoAmministrazione'] = $fattura->getCliente()->riferimento_amministrazione;
}
} else {
if (!empty($azienda['riferimento_amministrazione'])) {
$result['RiferimentoAmministrazione'] = $azienda['riferimento_amministrazione'];
}
}
return $result;
@ -843,6 +849,11 @@ class FatturaElettronica
'Sede' => static::getSede($cliente),
];
// Riferimento Amministrazione
if (!empty($cliente->riferimento_amministrazione)) {
$result['RiferimentoAmministrazione'] = $cliente->riferimento_amministrazione;
}
return $result;
}

View File

@ -211,21 +211,23 @@ echo '
</div>';
// Tipo del documento
$query = "SELECT id, CONCAT (descrizione, IF((codice_tipo_documento_fe IS NULL), '', CONCAT(' (', codice_tipo_documento_fe, ')' ) )) AS descrizione FROM co_tipidocumento WHERE dir = 'uscita'";
$query = "SELECT id, CONCAT('(', codice_tipo_documento_fe, ') ', descrizione) AS descrizione FROM co_tipidocumento WHERE dir = 'uscita'";
$query_tipo = $query.' AND codice_tipo_documento_fe = '.prepare($dati_generali['TipoDocumento']);
$numero_tipo = $database->fetchNum($query_tipo);
if (!empty($numero_tipo)) {
$query = $query_tipo;
}
$id_tipodocumento = $database->fetchOne($query_tipo)['id'];
echo '
<div class="row">
<div class="col-md-3">
{[ "type": "select", "label": "'.tr('Tipo fattura').'", "name": "id_tipo", "required": 1, "values": "query='.$query.'", "value": "'.($numero_tipo == 1 ? $database->fetchOne($query_tipo)['id'] : '').'" ]}
{[ "type": "select", "label": "'.tr('Tipo fattura').'", "name": "id_tipo", "required": 1, "values": "query='.$query.'", "value": "'.($numero_tipo == 1 ? $id_tipodocumento : '').'" ]}
</div>';
// Sezionale
$id_segment = $is_autofattura ? setting('Sezionale per autofatture di acquisto') : $_SESSION['module_'.$id_module]['id_segment'];
$id_segment = $database->table('co_tipidocumento')->where('id', '=', $id_tipodocumento)->value('id_segment');
echo '
<div class="col-md-3">

View File

@ -87,7 +87,7 @@ $ddt_uscita = DDT::whereBetween('data', [$start, $end])
$totale_ddt_uscita = $ddt_uscita->sum('totale_imponibile');
// Fatture di vendita
$segmenti = $dbo->select('zz_segments', 'id', ['autofatture' => 0]);
$segmenti = $dbo->select('zz_segments', 'id', [], ['autofatture' => 0]);
$fatture_vendita = Fattura::whereBetween('data', [$start, $end])
->where('idanagrafica', $id_record)
->whereHas('tipo', function ($query) {

View File

@ -28,9 +28,13 @@
<xsl:template name="FormatIVA">
<xsl:param name="Natura" />
<xsl:param name="IVA" />
<xsl:choose>
<xsl:choose>
<xsl:when test="$Natura">
<xsl:value-of select="$Natura" />
<xsl:if test="number($IVA)" >
<br/><xsl:value-of select="format-number($IVA, '###.###.##0,00', 'euro')" />
</xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:if test="$IVA">
@ -493,7 +497,7 @@
<td class="import" >
<xsl:if test="PrezzoUnitario">
<xsl:if test="number(PrezzoTotale)">
<xsl:if test="number(PrezzoUnitario)">
<xsl:value-of select="format-number(PrezzoUnitario, '###.###.##0,00######', 'euro')" />
</xsl:if>
@ -890,6 +894,7 @@
</xsl:otherwise>
</xsl:choose>
</span>
</xsl:if>
</div>
@ -1848,14 +1853,7 @@
<tr>
<th>Tipologia documento</th>
<xsl:if test="$IsFPRS='0'">
<th class="perc">Art. 73</th>
</xsl:if>
<xsl:if test="$IsFPRS='1'">
<th class="perc">Imposta bollo</th>
</xsl:if>
<th class="perc">Art. 73</th>
<th >Numero documento</th>
<th class="data">Data documento</th>
<th >Codice destinatario</th>
@ -1878,10 +1876,10 @@
fattura
</xsl:when>
<xsl:when test="$TD='TD02'">
acconto/anticipo su fattura
acconto / anticipo su fattura
</xsl:when>
<xsl:when test="$TD='TD03'">
acconto/anticipo su parcella
acconto / anticipo su parcella
</xsl:when>
<xsl:when test="$TD='TD04'">
nota di credito
@ -1896,16 +1894,16 @@
integrazione fattura reverse charge interno
</xsl:when>
<xsl:when test="$TD='TD17'">
integrazione/autofattura per acquisto servizi da estero
integrazione/autofattura per acquisto servizi dall'estero
</xsl:when>
<xsl:when test="$TD='TD18'">
integrazione per acquisto beni intracomunitari
integrazione per acquisto di beni intracomunitari
</xsl:when>
<xsl:when test="$TD='TD19'">
integrazione/autofattura per acquisto beni ex art.17 c.2 DPR 633/72
integrazione/autofattura per acquisto di beni ex art.17 c.2 DPR 633/72
</xsl:when>
<xsl:when test="$TD='TD20'">
autofattura per regolarizzazione e integrazione delle fatture - art.6 c.8 d.lgs.471/97 o art.46 c.5 D.L.331/93
autofattura per regolarizzazione e integrazione delle fatture (ex art.6 c.8 e 9-bis d.lgs.471/97 o art.46 c.5 D.L. 331/93
</xsl:when>
<xsl:when test="$TD='TD21'">
autofattura per splafonamento
@ -1914,22 +1912,22 @@
estrazione beni da Deposito IVA
</xsl:when>
<xsl:when test="$TD='TD23'">
estrazione beni da Deposito IVA con versamento IVA
estrazione beni da Deposito IVA con versamento dell'IVA
</xsl:when>
<xsl:when test="$TD='TD24'">
fattura differita - art.21 c.4 lett. a)
fattura differita di cui all'art.21, comma 4, terzo periodo lett. a) DPR 633/72
</xsl:when>
<xsl:when test="$TD='TD25'">
fattura differita - art.21 c.4 terzo periodo lett. b)
fattura differita di cui all'art.21, comma 4, terzo periodo lett. b) DPR 633/72
</xsl:when>
<xsl:when test="$TD='TD26'">
cessione di beni ammortizzabili e per passaggi interni - art.36 DPR 633/72
cessione di beni ammortizzabili e per passaggi interni (ex art.36 DPR 633/72)
</xsl:when>
<xsl:when test="$TD='TD27'">
fattura per autoconsumo o per cessioni gratuite senza rivalsa
</xsl:when>
<xsl:when test="$TD='TD28'">
fattura per acquisti da San Marino
<xsl:when test="$TD='TD28'">
acquisti da San Marino con IVA (fattura cartacea)
</xsl:when>
<!--FPRS-->
@ -1944,26 +1942,19 @@
</xsl:when>
<xsl:when test="$TD=''">
</xsl:when>
<!--<xsl:otherwise>
<span>(!!! codice non previsto !!!)</span>
</xsl:otherwise>-->
</xsl:choose>
</xsl:if>
</td>
<xsl:if test="$IsFPRS='0'">
<td class="ritenuta" >
<xsl:if test="DatiGenerali/DatiGeneraliDocumento/Art73">
<xsl:value-of select="DatiGenerali/DatiGeneraliDocumento/Art73" />
</xsl:if>
</td>
</xsl:if>
<xsl:if test="$IsFPRS='1'">
<td class="textCenter">
<xsl:if test="DatiGenerali/DatiGeneraliDocumento/BolloVirtuale">
<xsl:value-of select="DatiGenerali/DatiGeneraliDocumento/BolloVirtuale" />
</xsl:if>
</td>
</xsl:if>
<td class="ritenuta" >
<xsl:if test="DatiGenerali/DatiGeneraliDocumento/Art73">
<xsl:value-of select="DatiGenerali/DatiGeneraliDocumento/Art73" />
</xsl:if>
</td>
<td class="textCenter" >
@ -2018,8 +2009,7 @@
<xsl:if test="DatiGenerali/DatiGeneraliDocumento/Causale">
<xsl:for-each select="DatiGenerali/DatiGeneraliDocumento/Causale" >
<xsl:value-of select="." />
<br/>
<xsl:value-of select="." /><br/>
</xsl:for-each>
</xsl:if>
@ -2534,7 +2524,7 @@
<tr >
<th colspan="2">
Imposta bollo
Importo bollo
</th>
<th colspan="3">
Sconto/Maggiorazione
@ -3163,4 +3153,4 @@
</body>
</html>
</xsl:template>
</xsl:stylesheet>
</xsl:stylesheet>

View File

@ -75,25 +75,55 @@ class Manager
$where = [];
$order = [];
// Selezione personalizzata
$whereraw = [];
// Selezione campi personalizzati
// Esempio:
// display=[id,ragione_sociale,telefono]
$select = !empty($request['display']) ? explode(',', substr($request['display'], 1, -1)) : null;
// Ricerca personalizzata
// Filtri personalizzati
// Esempio:
// filter[ragione_sociale]=[Mario Rossi]&filter[telefono]=[0429%]
$values = isset($request['filter']) ? (array) $request['filter'] : [];
foreach ($values as $key => $value) {
// Rimozione delle parentesi
$value = substr($value, 1, -1);
// Individuazione della tipologia (array o string)
$where[$key] = string_contains($value, ',') ? explode(',', $value) : $value;
$value = trim($value, '[');
$value = trim($value, ']');
$values = explode(',', $value);
foreach ($values as $value) {
// Filtro per LIKE se il valore contiene %
if (string_contains($value, '%')) {
$where[] = [
$key,
'LIKE',
$value,
];
}
// Filtro preciso se il valore non contiene %
else {
$where[] = [
$key,
'=',
$value,
];
}
}
}
// Ordinamento personalizzato
// Esempi:
// order=[ragione_sociale]
// order=[ragione_sociale|asc]
// order=[ragione_sociale|desc]
// order=[ragione_sociale]&order=[telefono]
$values = isset($request['order']) ? (array) $request['order'] : [];
foreach ($values as $value) {
$value = trim($value, '[');
$value = trim($value, ']');
$pieces = explode('|', $value);
$order[] = empty($pieces[1]) ? $pieces[0] : [$pieces[0] => $pieces[1]];
$order = empty($pieces[1]) ? $pieces[0] : [$pieces[0] => $pieces[1]];
}
// Paginazione automatica dell'API
@ -107,14 +137,27 @@ class Manager
'order' => $order,
'page' => $page,
'length' => $length,
'whereraw' => $whereraw,
]);
$response = $this->getResponse($data);
$parameters = $response['parameters'];
$table = $response['table'];
$select = $response['select'] ?: $select;
$select = $select ?: '*';
$joins = $response['joins'];
$group = $response['group'];
if (!empty($response['where'])) {
$where = array_merge($where, $response['where']);
}
if (!empty($response['whereraw'])) {
$whereraw = $response['whereraw'];
}
if (empty($select)) {
$select = $response['select'] ?: $select;
$select = $select ?: '*';
}
$query = $response['query'];
@ -131,19 +174,44 @@ class Manager
$where['#created_at'] = 'created_at >= '.prepare($request['crd']);
}
$query = $database->table($table);
// Query per ottenere le informazioni
$query = $database->select($table, $select, $where, $order, [], true);
foreach ($where as $key => $value) {
$parameters[] = $value;
foreach ($select as $s) {
$query->selectRaw($s);
}
}
if (!empty($query)) {
foreach ($joins as $join) {
$query->leftJoin($join[0], $join[1], $join[2]);
}
if (!empty($where)) {
$query->where($where);
}
foreach ($whereraw as $w) {
$query->whereRaw($w);
}
if (!empty($group)) {
$query->groupBy($group);
}
$count = $query->count();
// Composizione query finale
$response = [];
$response['records'] = $database->fetchArray($query.' LIMIT '.($page * $length).', '.$length, $parameters);
$count = $database->fetchNum($query, $parameters);
$response['records'] = $database->select($table, $select, $joins, $where, $order, [$page * $length, $length], null, $group, $whereraw);
$response['total-count'] = $count;
}
// Query diretta
elseif (!empty($query)) {
$response = [];
$response['records'] = $database->fetchArray($query.' LIMIT '.($page * $length).', '.$length, [$parameters]);
$count = $database->fetchNum($query);
$response['total-count'] = $count;
}

View File

@ -295,7 +295,7 @@ abstract class Document extends Model implements ReferenceInterface, DocumentInt
$id_fields = [];
foreach($fields as $field) {
foreach ($fields as $field) {
$id_fields[] = $field->id;
}
database()->table('zz_field_record')->where('id_record', $this->id)->whereIn('id_field', $id_fields)->delete();

View File

@ -451,7 +451,7 @@ class Database extends Util\Singleton
*
* @return string|array
*/
public function select($table, $array = [], $conditions = [], $order = [], $limit = null, $return = false)
public function select($table, $array = [], $joins = [], $conditions = [], $order = [], $limit = null, $return = false, $group = [], $whereraw = [])
{
if (
!is_string($table) ||
@ -468,7 +468,21 @@ class Database extends Util\Singleton
}
$select = !empty($select) ? $select : ['*'];
$statement = Capsule::table($table)->where($conditions)->select($select);
$statement = Capsule::table($table);
foreach ($joins as $join) {
$statement = $statement->leftJoin($join[0], $join[1], $join[2]);
}
foreach ($whereraw as $w) {
$statement->whereRaw($w);
}
$statement->where($conditions);
foreach ($select as $s) {
$statement->selectRaw($s);
}
// Impostazioni di ordinamento
if (!empty($order)) {
@ -484,6 +498,11 @@ class Database extends Util\Singleton
}
}
// Gruppo
if (!empty($group)) {
$statement = $statement->groupBy($group);
}
// Eventuali limiti
if (!empty($limit)) {
$offset = is_array($limit) ? $limit[0] : null;
@ -522,7 +541,7 @@ class Database extends Util\Singleton
{
$limit = 1;
$result = $this->select($table, $array, $conditions, $order, $limit, $return);
$result = $this->select($table, $array, [], $conditions, $order, $limit, $return);
if (!is_string($result) && isset($result[0])) {
return $result[0];
@ -574,7 +593,7 @@ class Database extends Util\Singleton
$sync = array_unique((array) current($list));
if (!empty($field)) {
$results = array_column($this->select($table, $field, $conditions), $field);
$results = array_column($this->select($table, $field, [], $conditions), $field);
$detachs = array_unique(array_diff($results, $sync));
$this->detach($table, $conditions, [$field => $detachs]);
@ -607,7 +626,7 @@ class Database extends Util\Singleton
$inserts = [];
if (!empty($field)) {
$results = array_column($this->select($table, $field, $conditions), $field);
$results = array_column($this->select($table, $field, [], $conditions), $field);
$inserts = array_unique(array_diff($sync, $results));
foreach ($inserts as $insert) {

View File

@ -70,7 +70,6 @@ class Note extends Model
database()->delete('zz_notes', $data);
}
/* Relazioni Eloquent */
public function user()

View File

@ -695,7 +695,7 @@ class Prints
$mpdf->WriteHTML('<div style="position:absolute; bottom: 13mm; margin-right: '.($settings['margins']['right']).'mm">'.$foot.'</div>');
}
$id_files = $dbo->select('zz_files_print', 'id_file', ['id_print' => $id_print]);
$id_files = $dbo->select('zz_files_print', 'id_file', [], ['id_print' => $id_print]);
$has_pdf = false;
foreach ($id_files as $id_file) {
$fil = Models\Upload::find($id_file)->first();

View File

@ -37,7 +37,7 @@ class Uploads
{
$database = database();
$uploads = $database->select('zz_files', '*', [
$uploads = $database->select('zz_files', '*', [], [
'id_module' => !empty($data['id_module']) && empty($data['id_plugin']) ? $data['id_module'] : null,
'id_plugin' => !empty($data['id_plugin']) ? $data['id_plugin'] : null,
'id_record' => $data['id_record'],

View File

@ -172,7 +172,7 @@ if ($options['pricing']) {
echo "
<th class='text-center' style='width:15%'>".tr('Prezzo unitario', [], ['upper' => true])."</th>
<th class='text-center' style='width:10%'>".tr('IVA', [], ['upper' => true])." (%)</th>
<th class='text-center' style='width:15%'>".($options['hide-total'] ? tr('Importo ivato', [], ['upper' => true]) : tr('Importo', [], ['upper' => true]))."</th>";
<th class='text-center' style='width:15%'>".($options['hide-total'] ? tr('Importo ivato', [], ['upper' => true]) : tr('Importo', [], ['upper' => true])).'</th>';
}
echo '
@ -280,8 +280,8 @@ foreach ($righe as $key => $riga) {
'.Translator::numberToLocale($riga->aliquota->percentuale, 2).'
</td>';
// Imponibile
echo '
// Imponibile
echo '
<td class="text-right" style="vertical-align: middle" >
'.(($options['hide-total'] || $prezzi_ivati) ? moneyFormat($riga->totale) : moneyFormat($riga->totale_imponibile)).'
</td>';

View File

View File

@ -1,2 +0,0 @@
*
!.gitignore

View File

@ -1,110 +0,0 @@
<?php
class AcceptanceTester extends \Codeception\Actor
{
use _generated\AcceptanceTesterActions;
use \Codeception\Lib\Actor\Shared\Retry;
/**
* Clicca sul pulsante e attende la conclusione del caricamento.
*
* @param $link
* @param $context
*/
public function clickAndWait($link, $context = null)
{
$t = $this;
$t->retryClick($link, $context);
$t->waitForElementNotVisible('#main_loading');
$t->waitForElementNotVisible('#mini-loader');
}
/**
* Clicca sul pulsante e attende la conclusione del caricamento del modal.
*
* @param $link
* @param $context
*/
public function clickAndWaitModal($link, $context = null)
{
$t = $this;
$t->clickAndWait($link, $context);
$t->waitForElementVisible('.modal');
$t->wait(1);
}
/**
* Clicca sul pulsante dentro il modal.
*
* @param $link
*/
public function clickModalButton($link)
{
$t = $this;
$t->clickAndWait($link, '.modal-content');
}
/**
* Clicca sul pulsante e attende la conclusione del caricamento del modal SWAL.
*
* @param $link
* @param $context
*/
public function clickAndWaitSwal($link, $context = null)
{
$t = $this;
$t->clickAndWait($link, $context);
$t->waitForElementVisible('.swal2-modal');
}
/**
* Clicca sul pulsante dentro il modal SWAL.
*
* @param $link
*/
public function clickSwalButton($link)
{
$t = $this;
$t->clickAndWait($link, '.swal2-buttonswrapper');
}
public function navigateTo($link)
{
$this->wait(0.5);
$this->clickAndWait($link, '.sidebar');
}
/**
* Effettua il login dalla pagina principale.
*
* @param string $username
* @param string $password
*/
public function login($username, $password)
{
$t = $this;
// Operazioni di login
$t->amOnPage('/');
$t->fillField('username', $username);
$t->fillField('password', $password);
$t->clickAndWait('Accedi');
// Controlla il completamento del login
$t->see($username, '.user-panel');
// Rimozione barra di debug
$t->executeJS('$(".phpdebugbar-close-btn").click()');
}
}

View File

@ -1,26 +0,0 @@
<?php
/**
* Inherited Methods.
*
* @method void wantToTest($text)
* @method void wantTo($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
*
* @SuppressWarnings(PHPMD)
*/
class FunctionalTester extends \Codeception\Actor
{
use _generated\FunctionalTesterActions;
/*
* Define custom actions here
*/
}

View File

@ -1,73 +0,0 @@
<?php
namespace Helper;
// here you can define custom actions
// all public methods declared in helper class will be available in $t
class Acceptance extends \Codeception\Module
{
/**
* Imposta il valore di un select gestito dal framework Select2.
*
* @param $selector
* @param $option
* @param int $timeout seconds. Default to 1
*/
public function select2($selector, $option, $timeout = null)
{
$select2 = $this->getModule('\Helper\Select2');
$select2->openSelect2($selector);
$select2->selectOptionForSelect2($selector, $option, $timeout);
$select2->closeSelect2($selector);
}
/**
* Imposta il valore di un select gestito dal framework Select2.
*
* @param $selector
* @param $option
* @param int $timeout seconds. Default to 1
*/
public function select2ajax($selector, $option, $timeout = null)
{
$select2 = $this->getModule('\Helper\Select2Ajax');
$t = $this->getAcceptanceModule();
$select2->openSelect2($selector);
$t->wait(1);
$select2->selectByPosition($selector, $option, $timeout);
$select2->closeSelect2($selector);
}
public function seePageHasElement($element)
{
try {
$this->getAcceptanceModule()->seeElement($element);
} catch (\Exception $f) {
return false;
}
return true;
}
public function expandSidebarLink($link)
{
$t = $this->getAcceptanceModule();
if (!$this->seePageHasElement("descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' sidebar ')]/descendant-or-self::*/li[contains(., '".$link."') and @class and contains(concat(' ', normalize-space(@class), ' '), ' menu-open ')]")) {
$t->click($link, '.sidebar');
$t->wait(1);
}
}
protected function getAcceptanceModule()
{
if (!$this->hasModule('WebDriver')) {
throw new \Exception('You must enable the WebDriver module', 1);
}
return $this->getModule('WebDriver');
}
}

View File

@ -1,225 +0,0 @@
<?php
namespace Helper\Common;
use AcceptanceTester;
class RowHelper extends \Codeception\Module
{
/** @param string */
protected $tablePattern = "//div[@class='panel-heading' and contains(string(), 'Righe')]/parent::*//table//tr[contains(string(), '|name|')]";
protected $dir;
/**
* Aggiunge un nuovo sconto.
*
* @param string $value
* @param int $type
*/
public function addDiscount(AcceptanceTester $t, $descrizione, $value, $type)
{
$t->wait(0.5);
// Apre il modal
$t->clickAndWaitModal('Sconto/maggiorazione', '#tab_0');
$t->fillField('#descrizione_riga', $descrizione);
if ($type == 'UNT') {
$t->fillField('#sconto_unitario', $value);
} else {
$t->fillField('#sconto_percentuale', $value);
}
// Effettua il submit
$t->clickAndWait('Aggiungi', '.modal');
// Controlla il salvataggio finale
$t->see('Sconto/maggiorazione aggiunto');
}
/**
* Aggiunge una nuova riga.
*
* @param string $descrizione
* @param int $qta
* @param float $prezzo
* @param int $sconto
* @param string $tipo_sconto
* @param int $id_iva
* @param int $id_rivalsa_inps
* @param int $id_ritenuta_acconto
*/
public function addRow(AcceptanceTester $t, $descrizione, $qta, $prezzo, $sconto = 0, $tipo_sconto = 'UNT', $id_iva = null, $id_rivalsa_inps = null, $id_ritenuta_acconto = null)
{
$t->wait(0.5);
// Apre il modal
$t->clickAndWaitModal('Riga', '#tab_0');
$this->fill($t, $descrizione, $qta, $prezzo, $sconto, $tipo_sconto, $id_iva, $id_rivalsa_inps, $id_ritenuta_acconto);
// Effettua il submit
$t->clickAndWait('Aggiungi', '.modal');
// Controlla il salvataggio finale
$t->see('Riga aggiunta');
}
/**
* Aggiunge un nuovo articolo.
*
* @param string $descrizione
* @param int $qta
* @param float $prezzo
* @param int $sconto
* @param string $tipo_sconto
* @param int $id_iva
* @param int $id_rivalsa_inps
* @param int $id_ritenuta_acconto
*/
public function addArticle(AcceptanceTester $t, $id_articolo, $descrizione, $qta, $prezzo, $sconto = 0, $tipo_sconto = 'UNT', $id_iva = null, $id_rivalsa_inps = null, $id_ritenuta_acconto = null)
{
$t->wait(0.5);
// Apre il modal
$t->clickAndWaitModal('Articolo', '#tab_0');
$t->select2ajax('#idarticolo', $id_articolo);
$this->fill($t, $descrizione, $qta, $prezzo, $sconto, $tipo_sconto, $id_iva, $id_rivalsa_inps, $id_ritenuta_acconto);
// Effettua il submit
$t->clickAndWait('Aggiungi', '.modal');
// Controlla il salvataggio finale
$t->see('Articolo aggiunto');
}
/**
* Undocumented function.
*/
public function testImporti(AcceptanceTester $t, $direzione = 'entrata')
{
$this->dir = $direzione;
// Righe di test (issue #98)
$this->addRow($t, 'Riga 1', 1, 34);
$this->addRow($t, 'Riga 2', 1, 17.44);
$this->addRow($t, 'Riga 3', 48, 0.52);
$this->addRow($t, 'Riga 4', 66, 0.44);
$this->addRow($t, 'Riga 5', 1, 104.90);
$this->addRow($t, 'Riga 6', 1, 2);
$t->see('212,34', $this->getFinalValue('Imponibile'));
$t->see('46,71', $this->getFinalValue('IVA'));
$t->see('259,05', $this->getFinalValue('Totale'));
// Righe di controllo sugli sconti
$this->addRow($t, 'Riga 7 con sconto in euro', 15, 12, 2);
$this->addRow($t, 'Riga 8 con sconto percentuale', 15, 10, 20, 'PRC');
$t->see('542,34', $this->getFinalValue('Imponibile'));
$t->see('60,00', $this->getFinalValue('Sconto'));
$t->see('482,34', $this->getFinalValue('Totale imponibile'));
$t->see('106,11', $this->getFinalValue('IVA'));
$t->see('588,45', $this->getFinalValue('Totale'));
// Sconto globale in euro
$this->addDiscount($t, 'Sconto unitario', 100, 'UNT');
$t->see('542,34', $this->getFinalValue('Imponibile'));
$t->see('160,00', $this->getFinalValue('Sconto'));
$t->see('382,34', $this->getFinalValue('Totale imponibile'));
$t->see('84,11', $this->getFinalValue('IVA'));
$t->see('466,45', $this->getFinalValue('Totale'));
// Sconto globale in percentuale
$this->addDiscount($t, null, 10, 'PRC');
$this->delete($t, 'Sconto unitario');
$t->see('542,34', $this->getFinalValue('Imponibile'));
$t->see('98,23', $this->getFinalValue('Sconto'));
$t->see('444,11', $this->getFinalValue('Totale imponibile'));
$t->see('97,70', $this->getFinalValue('IVA'));
$t->see('541,81', $this->getFinalValue('Totale'));
}
/**
* Completa le informazioni per la creazione di un nuovo elemento.
*
* @param [type] $descrizione
* @param [type] $qta
* @param [type] $prezzo
* @param int $sconto
* @param string $tipo_sconto
* @param [type] $id_iva
* @param [type] $id_rivalsa_inps
* @param [type] $id_ritenuta_acconto
*/
protected function fill(AcceptanceTester $t, $descrizione, $qta, $prezzo, $sconto = 0, $tipo_sconto = 'UNT', $id_iva = null, $id_rivalsa_inps = null, $id_ritenuta_acconto = null)
{
$t->fillField('#descrizione_riga', $descrizione);
$t->fillField('#qta', $qta);
$t->fillField('#prezzo_unitario', $prezzo);
if (!empty($sconto)) {
$t->fillField('#sconto', $sconto);
if (in_array($tipo_sconto, ['PRC', 'UNT'])) {
$t->select2ajax('#tipo_sconto', $tipo_sconto == 'PRC' ? 0 : 1);
}
}
if ($id_iva) {
$t->select2('#idiva', $id_iva);
}
if ($id_rivalsa_inps) {
$t->select2('#id_rivalsa_inps', $id_rivalsa_inps);
}
if ($id_ritenuta_acconto) {
$t->select2('#id_ritenuta_acconto', $id_ritenuta_acconto);
}
}
protected function delete(AcceptanceTester $t, $descrizione)
{
$path = $this->getPattern($descrizione).'//td[last()]';
$t->wait(0.5);
$t->click('.btn-danger', $path);
$t->acceptPopup();
$t->waitForElementNotVisible('#main_loading');
$t->waitForElementNotVisible('#mini-loader');
$t->see('Riga eliminata!');
//$t->click('#save', '#tab_0');
}
/**
* Undocumented function.
*
* @param string $pattern
*/
protected function setPattern($pattern)
{
$this->tablePattern = $pattern;
}
protected function getPattern($name)
{
return str_replace('|name|', $name, $this->tablePattern);
}
protected function getFinalValue($name)
{
$name = strtoupper($name);
return $this->getPattern($name).'//td[2]';
}
}

View File

@ -1,10 +0,0 @@
<?php
namespace Helper;
// here you can define custom actions
// all public methods declared in helper class will be available in $I
class Functional extends \Codeception\Module
{
}

View File

@ -1,232 +0,0 @@
<?php
// @codingStandardsIgnoreFile
namespace Helper;
// Select2 version 4.0 or greater helpers for the jQuery based replacement for select boxes.
// See: http://select2.github.io/select2
// Author: Tortue Torche <tortuetorche@spam.me>
// Author: Florian Krämer
// Author: Tom Walsh
// License: MIT
//
// Installation:
// * Put this file in your 'tests/_support/Helper' directory
// * Add it in your 'tests/acceptance.suite.yml' file, like this:
// class_name: AcceptanceTester
// modules:
// enabled:
// - WebDriver:
// url: 'http://localhost:8000'
// # ...
// - \Helper\Select2
//
// * Then run ./vendor/bin/codecept build
class Select2 extends \Codeception\Module
{
/**
* Wait until the select2 component is loaded.
*
* @param $selector
* @param int $timeout seconds. Default to 5
*/
public function waitForSelect2($selector, $timeout = 5)
{
$t = $this->getAcceptanceModule();
$selector = $this->getSelect2Selector($selector);
$t->waitForJS('return !!jQuery("'.$selector.'").data("select2");', $timeout);
}
/**
* Checks that the given option is not selected.
*
* @param $selector
* @param $optionText
* @param int $timeout seconds. Default to 5
*/
public function dontSeeOptionIsSelectedForSelect2($selector, $optionText, $timeout = 5)
{
$t = $this->getAcceptanceModule();
$selector = $this->getSelect2Selector($selector);
$this->waitForSelect2($selector, $timeout);
$script = $this->_optionIsSelectedForSelect2($selector, $optionText, false);
$t->waitForJS($script, $timeout);
}
/**
* Checks that the given option is selected.
*
* @param $selector
* @param $optionText
* @param int $timeout seconds. Default to 5
*/
public function seeOptionIsSelectedForSelect2($selector, $optionText, $timeout = 5)
{
$t = $this->getAcceptanceModule();
$selector = $this->getSelect2Selector($selector);
$this->waitForSelect2($selector, $timeout);
$script = $this->_optionIsSelectedForSelect2($selector, $optionText);
$t->waitForJS($script, $timeout);
}
/**
* Selects an option in a select2 component.
*
* $t->selectOptionForSelect2('#my_select2', 'Option value');
* $t->selectOptionForSelect2('#my_select2', ['Option value 1', 'Option value 2']);
* $t->selectOptionForSelect2('#my_select2', ['text' => 'Option text']);
* $t->selectOptionForSelect2('#my_select2', ['id' => 'Option value', 'text' => 'Option text']);
*
* @param $selector
* @param $option
* @param int $timeout seconds. Default to 1
*/
public function selectOptionForSelect2($selector, $option, $timeout = 5)
{
$t = $this->getAcceptanceModule();
$selector = $this->getSelect2Selector($selector);
$this->waitForSelect2($selector, $timeout);
if (is_int($option)) {
$option = (string) $option;
}
if (is_string($option) || (is_array($option) && array_values($option) === $option)) {
$t->executeJS('jQuery("'.$selector.'").select2("val", '.json_encode($option).');', [$timeout]);
$t->executeJS('jQuery("'.$selector.'").trigger("select2:select").trigger("change");', [$timeout]);
} elseif (is_array($option)) {
$optionId = 'null';
if (isset($option['text']) && empty($option['id'])) {
$optionText = $option['text'];
$optionId = <<<EOT
function() {
if (!\$.expr[':'].textEquals) {
// Source: http://stackoverflow.com/a/26431267
\$.expr[':'].textEquals = function(el, i, m) {
var searchText = m[3];
return $(el).text().trim() === searchText;
}
}
// Find select option by text
return \$("$selector").find("option:textEquals('$optionText'):first").val();
}();
EOT;
}
$jsonOption = json_encode($option);
$script = <<<EOT
(function (\$) {
var option = $jsonOption;
if (!option.id) {
option.id = $optionId;
}
\$("$selector").val(option.id).trigger('select2:select').trigger('change');
}(jQuery));
EOT;
$t->executeJS($script, [$timeout]);
} else {
$t->fail();
}
}
/**
* Unselect an option in the given select2 component.
*
* @param $selector
* @param $option
* @param int $timeout seconds. Default to 1
*/
public function unselectOptionForSelect2($selector, $option = null, $timeout = 1)
{
$t = $this->getAcceptanceModule();
$selector = $this->getSelect2Selector($selector);
$this->waitForSelect2($selector, $timeout);
if ($option && is_string($option)) {
$script = <<<EOT
(function (\$) {
var values = \$("$selector").select2("val");
var index = values.indexOf("$option");
if (index > -1) {
values.splice(index, 1);
}
\$("$selector").select2("val", values);
\$(\$("$selector").trigger("select2:select").trigger("change");
}(jQuery));
EOT;
$t->executeJS($script, [$timeout]);
} else {
$t->executeJS('jQuery("'.$selector.'").select2("val", "");', [$timeout]);
$t->executeJS('jQuery("'.$selector.'").trigger("select2:select").trigger("change");', [$timeout]);
}
}
/**
* Open the Select2 component.
*
* @param string $selector
*/
public function openSelect2($selector)
{
$t = $this->getAcceptanceModule();
$selector = $this->getSelect2Selector($selector);
$this->waitForSelect2($selector);
$t->executeJS('jQuery("'.$selector.'").select2("open");');
}
/**
* Close the Select2 component.
*
* @param string $selector
*/
public function closeSelect2($selector)
{
$t = $this->getAcceptanceModule();
$selector = $this->getSelect2Selector($selector);
$this->waitForSelect2($selector);
$t->executeJS('jQuery("'.$selector.'").select2("close");');
}
/**
* @param $selector
* @param $optionText
* @param bool $expectedReturn Default to true
*
* @return string JavaScript
*/
protected function _optionIsSelectedForSelect2($selector, $optionText, $expectedReturn = true)
{
$returnFlag = $expectedReturn === true ? '' : '!';
return $script = <<<EOT
return (function (\$) {
var isSelected = false;
var values = \$("$selector").val();
values = \$.isArray(values ) ? values : [values];
if (values && values.length > 0) {
isSelected = values.some(function (data) {
if (data && data.text && data.text === "$optionText") {
return data;
}
});
}
return ${returnFlag}isSelected;
}(jQuery));
EOT;
}
protected function getSelect2Selector($selector)
{
return $selector;
//return preg_replace("/^\#((?!s2id_).+)$/", '#s2id_$1', $selector);
}
protected function getAcceptanceModule()
{
if (!$this->hasModule('WebDriver')) {
throw new \Exception('You must enable the WebDriver module', 1);
}
return $this->getModule('WebDriver');
}
}

View File

@ -1,88 +0,0 @@
<?php
// @codingStandardsIgnoreFile
namespace Helper;
/**
* Select2 version 4.0 or greater helpers for the jQuery based replacement for select boxes (Ajax version).
*
* Installation:
* - Put this file in your 'tests/_support/Helper' directory
* - Add it in your 'tests/acceptance.suite.yml' file, like this:
* class_name: AcceptanceTester
* modules:
* enabled:
* - WebDriver:
* # ...
* - \Helper\Select2Ajax
* - Run ./vendor/bin/codecept build
*
* @see http://select2.github.io/select2
*
* @author Thomas Zilio
* @license MIT
*/
class Select2Ajax extends Select2
{
/**
* Selects an option in a select2 component.
*
* @param $selector
* @param $option
* @param int $timeout seconds. Default to 1
*/
public function selectByTextOrId($selector, $option, $timeout = 5)
{
$code = '
$(options).each(function () {
if($(this).text == "'.$option.'" || $(this).id == "'.$option.'") {
$("'.$selector.'").selectSetNew(this.id, this.text);
}
});';
$this->execute($selector, $timeout, $code);
}
public function selectByPosition($selector, $position, $timeout = 5)
{
$code = '
var result = options['.$position.'];
$("'.$selector.'").selectSetNew(result.id, result.text);';
$this->execute($selector, $timeout, $code);
}
protected function execute($selector, $timeout, $code)
{
$t = $this->getAcceptanceModule();
$selector = $this->getSelect2Selector($selector);
$this->waitForSelect2($selector, $timeout);
if (is_int($option)) {
$option = (string) $option;
}
$results_selector = str_replace('#', '', $selector);
$script = <<<EOT
$(document).ready(function() {
var children = $("#select2-$results_selector-results").children();
var options = [];
children.each(function () {
var data = $(this)[0];
var output = Object.entries(data).map(([key, value]) => ({key,value}));
if(output[0]) {
options.push(output[0].value.data);
}
})
$code
});
EOT;
$t->executeJS($script, [$timeout]);
}
}

View File

@ -1,10 +0,0 @@
<?php
namespace Helper;
// here you can define custom actions
// all public methods declared in helper class will be available in $I
class Unit extends \Codeception\Module
{
}

View File

@ -1,26 +0,0 @@
<?php
/**
* Inherited Methods.
*
* @method void wantToTest($text)
* @method void wantTo($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
*
* @SuppressWarnings(PHPMD)
*/
class UnitTester extends \Codeception\Actor
{
use _generated\UnitTesterActions;
/*
* Define custom actions here
*/
}

View File

@ -1,2 +0,0 @@
*
!.gitignore

View File

@ -1,22 +0,0 @@
# Codeception Test Suite Configuration
#
# Suite for acceptance tests.
# Perform tests in browser using the WebDriver or PhpBrowser.
# If you need both WebDriver and PHPBrowser tests - create a separate suite.
actor: AcceptanceTester
modules:
enabled:
- WebDriver:
browser: chrome
port: 9515 # ChromeDriver port
window_size: false
capabilities:
chromeOptions:
args: ["--headless", "--disable-gpu"]
- \Helper\Acceptance
- \Helper\Select2
- \Helper\Select2Ajax
- \Helper\Common\RowHelper
step_decorators:
- \Codeception\Step\Retry

View File

@ -1,92 +0,0 @@
<?php
class AnagraficheCest
{
public function _before(AcceptanceTester $t)
{
// Effettua l'accesso con le credenziali fornite
$t->login('admin', 'admin');
}
/**
* Crea una nuova anagrafica di tipo Cliente.
*/
public function testAnagraficaCliente(AcceptanceTester $t)
{
$this->addAnag($t, 'Cliente', 1, '05024030289');
}
/**
* Crea una nuova anagrafica di tipo Tecnico.
*/
public function testAnagraficaTecnico(AcceptanceTester $t)
{
$this->addAnag($t, 'Tecnico', 2, '05024030289');
}
/**
* Crea una nuova anagrafica di tipo Fornitore.
*/
public function testAnagraficaFornitore(AcceptanceTester $t)
{
$this->addAnag($t, 'Fornitore', 4, '05024030289');
}
/**
* Crea una nuova anagrafica di tipo Vettore.
*/
public function testAnagraficaVettore(AcceptanceTester $t)
{
$this->addAnag($t, 'Vettore', 5, '05024030289');
}
/**
* Crea una nuova anagrafica di tipo Agente.
*/
public function testAnagraficaAgente(AcceptanceTester $t)
{
$this->addAnag($t, 'Agente', 6, '05024030289');
}
/**
* Crea una nuova anagrafica.
*/
protected function addAnag(AcceptanceTester $t, $name = 'ANAGRAFICA DI PROVA', $tipo = 1, $partita_iva = '')
{
// Seleziona il modulo da aprire
$t->navigateTo('Anagrafiche');
// Apre la schermata di nuovo elemento
$t->clickAndWaitModal('.btn-primary', '#tabs');
// Completa i campi per il nuovo elemento
$t->fillField('Denominazione', $name);
$t->select2('#idtipoanagrafica', $tipo);
$t->click('.btn-box-tool');
$t->waitForElementVisible('#piva', 3);
$t->fillField('Partita IVA', $partita_iva);
// Effettua il submit
$t->clickAndWait('Aggiungi', '#add-form');
// Controlla il salvataggio finale
$t->seeInField('Denominazione', $name);
}
/**
* Crea una nuova anagrafica di tipo cliente e la elimina.
*/
protected function addAndDeleteAnag(AcceptanceTester $t, $name = 'ANAGRAFICA DI PROVA', $tipo = 1, $partita_iva = '')
{
$this->addAnag($t, $name, $tipo, $partita_iva);
// Seleziona l'azione di eliminazione
$t->clickAndWaitSwal('Elimina', '#tab_0');
// Conferma l'eliminazione
$t->clickSwalButton('Elimina');
// Controlla eliminazione
$t->see('Anagrafica eliminata!', '.alert-success');
}
}

View File

@ -1,46 +0,0 @@
<?php
class BackupCest
{
public function _before(AcceptanceTester $t)
{
// Effettua l'accesso con le credenziali fornite
$t->login('admin', 'admin');
}
/**
* Crea un nuovo backup.
*/
protected function createBackup(AcceptanceTester $t)
{
// Seleziona il modulo da aprire
$t->expandSidebarLink('Strumenti');
$t->navigateTo('Backup');
$t->clickAndWaitSwal('Crea backup');
// Conferma la creazione
$t->clickSwalButton('Crea');
// Controlla il salvataggio finale
$t->see('Nuovo backup creato correttamente!');
}
/**
* Ripristina un backup specifico.
*/
protected function restoreBackup(AcceptanceTester $t, $name = null)
{
// Seleziona il modulo da aprire
$t->expandSidebarLink('Strumenti');
$t->navigateTo('Backup');
}
/**
* Crea una nuova anagrafica di tipo Cliente.
*/
protected function testBackup(AcceptanceTester $t)
{
$name = $this->createBackup($t);
}
}

View File

@ -1,74 +0,0 @@
<?php
use Helper\Common\RowHelper;
class ContrattiCest
{
/**
* @var Helper\SignUp
*/
protected $rowHelper;
public function _before(AcceptanceTester $t)
{
// Effettua l'accesso con le credenziali fornite
$t->login('admin', 'admin');
}
/**
* Crea un nuovo contratto.
*/
public function testContratto(AcceptanceTester $t)
{
$this->addContratto($t, 'Contratto di test', 2);
$this->rowHelper->testImporti($t);
//$t->click('Stampa');
}
protected function _inject(RowHelper $rowHelper)
{
$this->rowHelper = $rowHelper;
}
/**
* Crea un nuovo contratto.
*/
protected function addContratto(AcceptanceTester $t, $name, $anagrafica)
{
// Seleziona il modulo da aprire
$t->expandSidebarLink('Vendite');
$t->navigateTo('Contratti');
// Apre la schermata di nuovo elemento
$t->clickAndWaitModal('.btn-primary', '#tabs');
// Completa i campi per il nuovo elemento
$t->fillField('Nome', $name);
$t->select2ajax('#idanagrafica', $anagrafica);
// Effettua il submit
$t->clickAndWait('Aggiungi', '#add-form');
// Controlla il salvataggio finale
$t->see('Aggiunto contratto');
}
/**
* Crea una nuova anagrafica di tipo cliente e la elimina.
*/
protected function addAndDeleteContratto(AcceptanceTester $t, $name, $anagrafica = 2)
{
$this->addAnag($t, $name, $anagrafica);
// Seleziona l'azione di eliminazione
$t->clickAndWaitSwal('Elimina', '#tab_0');
// Conferma l'eliminazione
$t->clickSwalButton('Elimina');
// Controlla eliminazione
$t->see('Contratto eliminato!', '.alert-success');
}
}

View File

@ -1,84 +0,0 @@
<?php
use Helper\Common\RowHelper;
class DDTCest
{
/**
* @var Helper\SignUp
*/
protected $rowHelper;
public function _before(AcceptanceTester $t)
{
// Effettua l'accesso con le credenziali fornite
$t->login('admin', 'admin');
}
/**
* Crea un nuovo ddt.
*/
public function testDdtDiVendita(AcceptanceTester $t)
{
$this->addDdt($t, true, 2, 2);
$this->rowHelper->testImporti($t);
//$t->click('Stampa');
}
/**
* Crea un nuovo ddt.
*/
public function testDdtDiAcquisto(AcceptanceTester $t)
{
$this->addDdt($t, false, 3, 1);
$this->rowHelper->testImporti($t, 'uscita');
}
protected function _inject(RowHelper $rowHelper)
{
$this->rowHelper = $rowHelper;
}
/**
* Crea un nuovo ddt.
*/
protected function addDdt(AcceptanceTester $t, $entrata, $anagrafica, $tipo)
{
// Seleziona il modulo da aprire
$t->expandSidebarLink('Magazzino');
$t->navigateTo($entrata == true ? 'Ddt in uscita' : 'Ddt in entrata');
// Apre la schermata di nuovo elemento
$t->clickAndWaitModal('.btn-primary', '#tabs');
// Completa i campi per il nuovo elemento
$t->select2ajax('#idanagrafica_add', $anagrafica);
$t->select2('#idtipoddt', $tipo);
// Effettua il submit
$t->clickAndWait('Aggiungi', '#add-form');
// Controlla il salvataggio finale
$t->see('Aggiunto ddt');
}
/**
* Crea una nuova anagrafica di tipo cliente e la elimina.
*/
protected function addAndDeleteDdt(AcceptanceTester $t, $entrata, $anagrafica, $tipo)
{
$this->addAnag($t, $entrata, $anagrafica, $tipo);
// Seleziona l'azione di eliminazione
$t->clickAndWaitSwal('Elimina', '#tab_0');
// Conferma l'eliminazione
$t->clickSwalButton('Elimina');
// Controlla eliminazione
$t->see('Ddt eliminato!', '.alert-success');
}
}

View File

@ -1,86 +0,0 @@
<?php
use Helper\Common\RowHelper;
class FattureCest
{
/**
* @var Helper\SignUp
*/
protected $rowHelper;
public function _before(AcceptanceTester $t)
{
// Effettua l'accesso con le credenziali fornite
$t->login('admin', 'admin');
}
/**
* Crea una nuova fattura di vendita.
*/
public function testFatturaDiVendita(AcceptanceTester $t)
{
$this->addFattura($t, true, 2, 2);
$this->rowHelper->testImporti($t);
}
/**
* Crea una nuova fattura di acquisto.
*/
public function testFatturaDiAcquisto(AcceptanceTester $t)
{
$this->addFattura($t, false, 1, 4);
// Fix pagamento vuoto
$t->select2('#idpagamento', 109);
$t->clickAndWait('Salva');
$this->rowHelper->testImporti($t, 'uscita');
}
protected function _inject(RowHelper $rowHelper)
{
$this->rowHelper = $rowHelper;
}
/**
* Crea una nuova fattura.
*/
protected function addFattura(AcceptanceTester $t, $entrata, $tipo, $anagrafica)
{
// Seleziona il modulo da aprire
$t->expandSidebarLink($entrata == true ? 'Vendite' : 'Acquisti');
$t->navigateTo($entrata == true ? 'Fatture di vendita' : 'Fatture di acquisto');
// Apre la schermata di nuovo elemento
$t->clickAndWaitModal('.btn-primary', '#tabs');
// Completa i campi per il nuovo elemento
$t->select2ajax('#idanagrafica_add', $anagrafica);
$t->select2('#idtipodocumento', $tipo);
// Effettua il submit
$t->clickAndWait('Aggiungi', '#add-form');
// Controlla il salvataggio finale
$t->see('Aggiunta fattura');
}
/**
* Crea una nuova fattura e la elimina.
*/
protected function addAndDeleteFattura(AcceptanceTester $t, $cliente, $tipo)
{
$this->addAnag($t, $cliente, $tipo);
// Seleziona l'azione di eliminazione
$t->clickAndWaitSwal('Elimina', '#tab_0');
// Conferma l'eliminazione
$t->clickSwalButton('Elimina');
// Controlla eliminazione
$t->see('Fattura eliminata!', '.alert-success');
}
}

View File

@ -1,87 +0,0 @@
<?php
use Helper\Common\RowHelper;
class OrdiniCest
{
/**
* @var Helper\SignUp
*/
protected $rowHelper;
public function _before(AcceptanceTester $t)
{
// Effettua l'accesso con le credenziali fornite
$t->login('admin', 'admin');
}
/**
* Crea un nuovo ordine.
*/
public function testOrdineCliente(AcceptanceTester $t)
{
$this->addOrdine($t, true, 2);
$this->rowHelper->testImporti($t);
//$t->click('Stampa');
}
/**
* Crea un nuovo ordine.
*/
public function testOrdineFornitore(AcceptanceTester $t)
{
$this->addOrdine($t, false, 4);
// Fix pagamento vuoto
$t->select2('#idpagamento', 109);
$t->clickAndWait('Salva');
$this->rowHelper->testImporti($t, 'uscita');
}
protected function _inject(RowHelper $rowHelper)
{
$this->rowHelper = $rowHelper;
}
/**
* Crea un nuovo ordine.
*/
protected function addOrdine(AcceptanceTester $t, $entrata, $anagrafica)
{
// Seleziona il modulo da aprire
$t->expandSidebarLink($entrata == true ? 'Vendite' : 'Acquisti');
$t->navigateTo($entrata == true ? 'Ordini cliente' : 'Ordini fornitore');
// Apre la schermata di nuovo elemento
$t->clickAndWaitModal('.btn-primary', '#tabs');
// Completa i campi per il nuovo elemento
$t->select2ajax('#idanagrafica', $anagrafica);
// Effettua il submit
$t->clickAndWait('Aggiungi', '#add-form');
// Controlla il salvataggio finale
$t->see('Aggiunto ordine');
}
/**
* Crea una nuova anagrafica di tipo cliente e la elimina.
*/
protected function addAndDeleteOrdine(AcceptanceTester $t, $entrata, $anagrafica = 2)
{
$this->addAnag($t, $entrata, $anagrafica);
// Seleziona l'azione di eliminazione
$t->clickAndWaitSwal('Elimina', '#tab_0');
// Conferma l'eliminazione
$t->clickSwalButton('Elimina');
// Controlla eliminazione
$t->see('Ordine eliminato!', '.alert-success');
}
}

View File

@ -1,75 +0,0 @@
<?php
use Helper\Common\RowHelper;
class PreventiviCest
{
/**
* @var Helper\SignUp
*/
protected $rowHelper;
public function _before(AcceptanceTester $t)
{
// Effettua l'accesso con le credenziali fornite
$t->login('admin', 'admin');
}
/**
* Crea un nuovo preventivo.
*/
public function testPreventivo(AcceptanceTester $t)
{
$this->addPreventivo($t, 'Preventivo di test', 2);
$this->rowHelper->testImporti($t);
//$t->click('Stampa');
}
protected function _inject(RowHelper $rowHelper)
{
$this->rowHelper = $rowHelper;
}
/**
* Crea un nuovo preventivo.
*/
protected function addPreventivo(AcceptanceTester $t, $name, $anagrafica, $tipo = 'GEN')
{
// Seleziona il modulo da aprire
$t->expandSidebarLink('Vendite');
$t->navigateTo('Preventivi');
// Apre la schermata di nuovo elemento
$t->clickAndWaitModal('.btn-primary', '#tabs');
// Completa i campi per il nuovo elemento
$t->fillField('Nome preventivo', $name);
$t->select2ajax('#idanagrafica', $anagrafica);
$t->select2ajax('#idtipointervento', $tipo);
// Effettua il submit
$t->clickAndWait('Aggiungi', '#add-form');
// Controlla il salvataggio finale
$t->see('Aggiunto preventivo');
}
/**
* Crea una nuova anagrafica di tipo cliente e la elimina.
*/
protected function addAndDeletePreventivo(AcceptanceTester $t, $name, $anagrafica = 2, $tipo = 'GEN')
{
$this->addAnag($t, $name, $anagrafica, $tipo);
// Seleziona l'azione di eliminazione
$t->clickAndWaitSwal('Elimina', '#tab_0');
// Conferma l'eliminazione
$t->clickSwalButton('Elimina');
// Controlla eliminazione
$t->see('Preventivo eliminato!', '.alert-success');
}
}

View File

@ -1 +0,0 @@
<?php

View File

@ -1,12 +0,0 @@
# Codeception Test Suite Configuration
#
# Suite for functional tests
# Emulate web requests and make application process them
# Include one of framework modules (Symfony2, Yii2, Laravel5) to use it
# Remove this suite if you don't use frameworks
actor: FunctionalTester
modules:
enabled:
# add a framework module here
- \Helper\Functional

View File

@ -1 +0,0 @@
<?php

View File

@ -1,9 +0,0 @@
# Codeception Test Suite Configuration
#
# Suite for unit or integration tests.
actor: UnitTester
modules:
enabled:
- Asserts
- \Helper\Unit

View File

@ -1,70 +0,0 @@
<?php
use Util\Generator;
class GeneratorTest extends \Codeception\Test\Unit
{
public function testNumbersWithPrefix()
{
$this->test(null, '|TEST');
}
public function testNumbersWithSuffix()
{
$this->test('|TEST');
}
public function testCommonNumbers()
{
$this->test();
}
public function testDates()
{
$this->test('/YYYY');
$this->test('/yy');
$this->test(null, 'YYYY-');
$this->test(null, 'yy-');
}
protected function test($prefix = null, $suffix = null)
{
$date = date('Y-m-d H:i:s');
$info = Generator::dateToPattern($date);
// Individuazione valori relativi a suffisso e prefisso
$prefix_value = Generator::complete($prefix, $info);
$suffix_value = Generator::complete($suffix, $info);
$step = 3;
// Pattern di base con numero di caratteri incrementale
$pattern = $prefix.'#'.$suffix;
$previous = null;
for ($i = 0; $i < 10000; $i = $i + $step) {
$value = $prefix_value.$this->pad($i + 1, $length).$suffix_value;
$this->assertEquals($value, Generator::generate($pattern, $previous, $step, $info));
$previous = $value;
}
// Pattern con padding
$length = 5;
$pattern = $prefix.str_repeat('#', $length).$suffix;
$previous = null;
for ($i = 0; $i < 10000; $i = $i + $step) {
$value = $prefix_value.$this->pad($i + 1, $length).$suffix_value;
$this->assertEquals($value, Generator::generate($pattern, $previous, $step, $info));
$previous = $value;
}
}
protected function pad($number, $length)
{
return str_pad($number, $length, '0', STR_PAD_LEFT);
}
}

View File

@ -1,10 +0,0 @@
<?php
use Codeception\Util\Autoload;
// Caricamento delle dipendenze e delle librerie del progetto
$namespaces = require_once __DIR__.'/../../config/namespaces.php';
foreach ($namespaces as $path => $namespace) {
Autoload::addNamespace($namespace.'\\', __DIR__.'/../../'.$path.'/custom/src');
Autoload::addNamespace($namespace.'\\', __DIR__.'/../../'.$path.'/src');
}

View File

@ -25,23 +25,23 @@ foreach ($scadenze as $scadenza) {
$aliquote_eliminate = $dbo->fetchArray('SELECT * FROM co_iva WHERE deleted_at IS NOT NULL');
foreach ($aliquote_eliminate as $aliquota) {
$elimina_iva = true;
if (!empty($dbo->select('mg_articoli', 'id', ['idiva_vendita' => $aliquota['id']]))) {
if (!empty($dbo->select('mg_articoli', 'id', [], ['idiva_vendita' => $aliquota['id']]))) {
$elimina_iva = false;
} elseif (!empty($dbo->select('an_anagrafiche', 'idanagrafica', ['idiva_vendite' => $aliquota['id']]))) {
} elseif (!empty($dbo->select('an_anagrafiche', 'idanagrafica', [], ['idiva_vendite' => $aliquota['id']]))) {
$elimina_iva = false;
} elseif (!empty($dbo->select('an_anagrafiche', 'idanagrafica', ['idiva_acquisti' => $aliquota['id']]))) {
} elseif (!empty($dbo->select('an_anagrafiche', 'idanagrafica', [], ['idiva_acquisti' => $aliquota['id']]))) {
$elimina_iva = false;
} elseif (!empty($dbo->select('co_righe_contratti', 'id', ['idiva' => $aliquota['id']]))) {
} elseif (!empty($dbo->select('co_righe_contratti', 'id', [], ['idiva' => $aliquota['id']]))) {
$elimina_iva = false;
} elseif (!empty($dbo->select('dt_righe_ddt', 'id', ['idiva' => $aliquota['id']]))) {
} elseif (!empty($dbo->select('dt_righe_ddt', 'id', [], ['idiva' => $aliquota['id']]))) {
$elimina_iva = false;
} elseif (!empty($dbo->select('co_righe_documenti', 'id', ['idiva' => $aliquota['id']]))) {
} elseif (!empty($dbo->select('co_righe_documenti', 'id', [], ['idiva' => $aliquota['id']]))) {
$elimina_iva = false;
} elseif (!empty($dbo->select('in_righe_interventi', 'id', ['idiva' => $aliquota['id']]))) {
} elseif (!empty($dbo->select('in_righe_interventi', 'id', [], ['idiva' => $aliquota['id']]))) {
$elimina_iva = false;
} elseif (!empty($dbo->select('co_righe_preventivi', 'id', ['idiva' => $aliquota['id']]))) {
} elseif (!empty($dbo->select('co_righe_preventivi', 'id', [], ['idiva' => $aliquota['id']]))) {
$elimina_iva = false;
} elseif (!empty($dbo->select('or_righe_ordini', 'id', ['idiva' => $aliquota['id']]))) {
} elseif (!empty($dbo->select('or_righe_ordini', 'id', [], ['idiva' => $aliquota['id']]))) {
$elimina_iva = false;
}

View File

@ -97,34 +97,6 @@ INSERT INTO `zz_prints` (`id_module`, `is_record`, `name`, `title`, `filename`,
INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES ( "Visualizza solo promemoria assegnati", '0', 'boolean', '1', 'Applicazione', '7', 'Se abilitata permetti ai tecnici la visualizzazione dei soli promemoria in cui risultano come assegnati');
-- Fix query 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 `co_ritenuta_contributi` ON `co_documenti`.`id_ritenuta_contributi` = `co_ritenuta_contributi`.`id`
LEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`
LEFT JOIN (SELECT `co_banche`.`id`, CONCAT(`nome`, ' - ', `iban`) AS `descrizione` FROM `co_banche`) AS `banche` ON `banche`.`id` = `co_documenti`.`id_banca_azienda`
LEFT JOIN (SELECT `iddocumento`, GROUP_CONCAT(`co_pianodeiconti3`.`descrizione`) AS `descrizione` FROM `co_righe_documenti` INNER JOIN `co_pianodeiconti3` ON `co_pianodeiconti3`.`id` = `co_righe_documenti`.`idconto` GROUP BY iddocumento) AS `conti` ON `conti`.`iddocumento` = `co_documenti`.`id`
LEFT JOIN (SELECT `iddocumento`, SUM(`subtotale` - `sconto`) AS `totale_imponibile`, SUM(`iva`) AS `iva` FROM `co_righe_documenti` GROUP BY `iddocumento`) AS `righe` ON `co_documenti`.`id` = `righe`.`iddocumento`
LEFT JOIN (SELECT COUNT(`d`.`id`) AS `conteggio`, IF(`d`.`numero_esterno` = '', `d`.`numero`, `d`.`numero_esterno`) AS `numero_documento`, `d`.`idanagrafica` AS `anagrafica`, `id_segment` FROM `co_documenti` AS `d`
LEFT JOIN `co_tipidocumento` AS `d_tipo` ON `d`.`idtipodocumento` = `d_tipo`.`id` WHERE 1=1 AND `d_tipo`.`dir` = 'uscita' AND('|period_start|' <= `d`.`data` AND '|period_end|' >= `d`.`data` OR '|period_start|' <= `d`.`data_competenza` AND '|period_end|' >= `d`.`data_competenza`) GROUP BY `id_segment`, `numero_documento`, `d`.`idanagrafica`) AS `d` ON (`d`.`numero_documento` = IF(`co_documenti`.`numero_esterno` = '',`co_documenti`.`numero`,`co_documenti`.`numero_esterno`) AND `d`.`anagrafica` = `co_documenti`.`idanagrafica` AND `d`.`id_segment` = `co_documenti`.`id_segment`)
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` )|
GROUP BY
`co_documenti`.`id`, `d`.`conteggio`
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';
-- Fix query vista Fatture di vendita
UPDATE `zz_views` INNER JOIN `zz_modules` ON `zz_views`.`id_module` = `zz_modules`.`id` SET `zz_views`.`query` = 'IF(emails IS NOT NULL, \'fa fa-envelope text-success\', \'\')' WHERE `zz_modules`.`name` = 'Fatture di vendita' AND `zz_views`.`name` = 'icon_Inviata';
UPDATE `zz_views` INNER JOIN `zz_modules` ON `zz_views`.`id_module` = `zz_modules`.`id` SET `zz_views`.`query` = 'IF(emails IS NOT NULL, \'Inviata via email\', \'\')' WHERE `zz_modules`.`name` = 'Fatture di vendita' AND `zz_views`.`name` = 'icon_title_Inviata';

12
update/2_4_49.php Normal file
View File

@ -0,0 +1,12 @@
<?php
// File e cartelle deprecate
$files = [
'tests/',
];
foreach ($files as $key => $value) {
$files[$key] = realpath(base_dir().'/'.$value);
}
delete($files);

View File

@ -64,7 +64,60 @@ UPDATE `zz_widgets` SET `text` = 'Listini disattivati' WHERE `zz_widgets`.`name`
INSERT INTO `zz_widgets` (`id`, `name`, `type`, `id_module`, `location`, `class`, `query`, `bgcolor`, `icon`, `print_link`, `more_link`, `more_link_type`, `php_include`, `text`, `enabled`, `help`) VALUES (NULL, 'Preventivi da fatturare', 'stats', '1', 'controller_top', NULL, 'SELECT COUNT(id) AS dato FROM co_preventivi WHERE idstato IN (SELECT id FROM co_statipreventivi WHERE is_fatturabile=1) AND default_revision=1', '#44aae4', 'fa fa-file', '', './modules/preventivi/widgets/preventivi.fatturare.dashboard.php', 'popup', '', 'Preventivi da fatturare', 0, NULL);
INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `html_format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Articoli'), '_bg_', 'IF(threshold_qta!=0, IF(mg_articoli.qta>threshold_qta, \'#CCFFCC\', \'#FFCCEB\'), \'\')', '14', '0', '0', '0', '0', '', '', '0', '0', '0');
INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `html_format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Articoli'), '_bg_', 'IF(threshold_qta!=0, IF(mg_articoli.qta>=threshold_qta, \'#CCFFCC\', \'#FFCCEB\'), \'\')', '14', '0', '0', '0', '0', '', '', '0', '0', '0');
-- Aggiunto titolo righe preventivi
ALTER TABLE `co_righe_preventivi` ADD `is_titolo` BOOLEAN NOT NULL AFTER `confermato`;
ALTER TABLE `co_righe_preventivi` ADD `is_titolo` BOOLEAN NOT NULL AFTER `confermato`;
ALTER TABLE `co_documenti` CHANGE `numero_esterno` `numero_esterno` VARCHAR(100) NOT NULL;
INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES ('Tipo di sconto predefinito', '%', 'list[%,€]', '1', 'Generali', '1', NULL);
ALTER TABLE `co_tipidocumento` ADD `id_segment` INT NOT NULL AFTER `predefined`;
UPDATE `co_tipidocumento` SET `id_segment`= (SELECT `zz_segments`.`id` FROM `zz_segments` INNER JOIN `zz_modules` ON `zz_segments`.`id_module` = `zz_modules`.`id` WHERE `zz_modules`.`name` = 'Fatture di vendita' AND `zz_segments`.`predefined` = 1) WHERE `co_tipidocumento`.`dir` = 'entrata';
UPDATE `co_tipidocumento` SET `id_segment`= (SELECT `zz_segments`.`id` FROM `zz_segments` INNER JOIN `zz_modules` ON `zz_segments`.`id_module` = `zz_modules`.`id` WHERE `zz_modules`.`name` = 'Fatture di acquisto' AND `zz_segments`.`predefined` = 1) WHERE `co_tipidocumento`.`dir` = 'uscita';
UPDATE `co_tipidocumento` SET `id_segment`=(SELECT `zz_segments`.`id` FROM `zz_segments` INNER JOIN `zz_modules` ON `zz_segments`.`id_module` = `zz_modules`.`id` WHERE `zz_segments`.`name` = 'Autofatture' AND `zz_modules`.`name` = 'Fatture di vendita') WHERE `co_tipidocumento`.`dir` = 'entrata' AND `co_tipidocumento`.`descrizione` LIKE "%autofattura%";
UPDATE `co_tipidocumento` SET `id_segment`=(SELECT `zz_segments`.`id` FROM `zz_segments` INNER JOIN `zz_modules` ON `zz_segments`.`id_module` = `zz_modules`.`id` WHERE `zz_segments`.`name` = 'Autofatture' AND `zz_modules`.`name` = 'Fatture di acquisto') WHERE `co_tipidocumento`.`dir` = 'uscita' AND `co_tipidocumento`.`descrizione` LIKE "%autofattura%";
-- Fix query 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 `co_ritenuta_contributi` ON `co_documenti`.`id_ritenuta_contributi` = `co_ritenuta_contributi`.`id`
LEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`
LEFT JOIN (SELECT `co_banche`.`id`, CONCAT(`nome`, ' - ', `iban`) AS `descrizione` FROM `co_banche`) AS `banche` ON `banche`.`id` = `co_documenti`.`id_banca_azienda`
LEFT JOIN (SELECT `iddocumento`, GROUP_CONCAT(`co_pianodeiconti3`.`descrizione`) AS `descrizione` FROM `co_righe_documenti` INNER JOIN `co_pianodeiconti3` ON `co_pianodeiconti3`.`id` = `co_righe_documenti`.`idconto` GROUP BY iddocumento) AS `conti` ON `conti`.`iddocumento` = `co_documenti`.`id`
LEFT JOIN (SELECT `iddocumento`, SUM(`subtotale` - `sconto`) AS `totale_imponibile`, SUM(`iva`) AS `iva` FROM `co_righe_documenti` GROUP BY `iddocumento`) AS `righe` ON `co_documenti`.`id` = `righe`.`iddocumento`
LEFT JOIN (SELECT COUNT(`d`.`id`) AS `conteggio`, IF(`d`.`numero_esterno` = '', `d`.`numero`, `d`.`numero_esterno`) AS `numero_documento`, `d`.`idanagrafica` AS `anagrafica`, `d`.`id_segment` FROM `co_documenti` AS `d`
LEFT JOIN `co_tipidocumento` AS `d_tipo` ON `d`.`idtipodocumento` = `d_tipo`.`id` WHERE 1=1 AND `d_tipo`.`dir` = 'uscita' AND('|period_start|' <= `d`.`data` AND '|period_end|' >= `d`.`data` OR '|period_start|' <= `d`.`data_competenza` AND '|period_end|' >= `d`.`data_competenza`) GROUP BY `d`.`id_segment`, `numero_documento`, `d`.`idanagrafica`) AS `d` ON (`d`.`numero_documento` = IF(`co_documenti`.`numero_esterno` = '',`co_documenti`.`numero`,`co_documenti`.`numero_esterno`) AND `d`.`anagrafica` = `co_documenti`.`idanagrafica` AND `d`.`id_segment` = `co_documenti`.`id_segment`)
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` )|
GROUP BY
`co_documenti`.`id`, `d`.`conteggio`
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';
-- Fix widget Acquisti
UPDATE `zz_widgets` SET `query` = 'SELECT\n CONCAT_WS(\' \', REPLACE(REPLACE(REPLACE(FORMAT((\n SELECT SUM(\n (co_righe_documenti.subtotale - co_righe_documenti.sconto) * IF(co_tipidocumento.reversed, -1, 1)\n )\n ), 2), \',\', \'#\'), \'.\', \',\'), \'#\', \'.\'), \'&euro;\') AS dato\nFROM co_righe_documenti\n INNER JOIN co_documenti ON co_righe_documenti.iddocumento = co_documenti.id\n INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento = co_tipidocumento.id\nWHERE co_tipidocumento.dir=\'uscita\' |segment(`co_documenti`.`id_segment`)| AND data >= \'|period_start|\' AND data <= \'|period_end|\' AND 1=1' WHERE `zz_widgets`.`name` = 'Acquisti';
-- Fix widget Debiti verso fornitori
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(\' \', REPLACE(REPLACE(REPLACE(FORMAT((SELECT ABS(SUM(da_pagare-pagato))), 2), \',\', \'#\'), \'.\', \',\'),\'#\', \'.\'), \'&euro;\') AS dato FROM (co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir=\'uscita\' AND co_documenti.idstatodocumento!=1 |segment(`co_documenti`.`id_segment`)| AND 1=1' WHERE `zz_widgets`.`name` = 'Debiti verso fornitori';
-- Fix widget Fatturato
UPDATE `zz_widgets` SET `query` = 'SELECT\n CONCAT_WS(\' \', REPLACE(REPLACE(REPLACE(FORMAT((\n SELECT SUM(\n (co_righe_documenti.subtotale - co_righe_documenti.sconto) * IF(co_tipidocumento.reversed, -1, 1)\n )\n ), 2), \',\', \'#\'), \'.\', \',\'), \'#\', \'.\'), \'&euro;\') AS dato\nFROM co_righe_documenti\n INNER JOIN co_documenti ON co_righe_documenti.iddocumento = co_documenti.id\n INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento = co_tipidocumento.id\n INNER JOIN co_statidocumento ON co_documenti.idstatodocumento = co_statidocumento.id\nWHERE co_statidocumento.descrizione!=\'Bozza\' AND co_tipidocumento.dir=\'entrata\' |segment(`co_documenti`.`id_segment`)| AND data >= \'|period_start|\' AND data <= \'|period_end|\' AND 1=1' WHERE `zz_widgets`.`name` = 'Fatturato';
-- Fix widget Crediti da clienti
UPDATE `zz_widgets` SET `query` = 'SELECT \n CONCAT_WS(\' \', REPLACE(REPLACE(REPLACE(FORMAT((\n SELECT SUM(da_pagare-pagato)), 2), \',\', \'#\'), \'.\', \',\'),\'#\', \'.\'), \'&euro;\') AS dato FROM (co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir=\'entrata\' AND co_documenti.idstatodocumento!=1 |segment(`co_documenti`.`id_segment`)| AND 1=1' WHERE `zz_widgets`.`name` = 'Crediti da clienti';
-- Correzione collegamento scadenze al log email
UPDATE `zz_operations` INNER JOIN `em_emails` ON `zz_operations`.`id_email` = `em_emails`.`id` INNER JOIN `zz_modules` ON `zz_operations`.`id_module` = `zz_modules`.`id` SET `zz_operations`.`id_record` = `em_emails`.`id_record` WHERE `zz_operations`.`id_record` IS NULL AND `zz_modules`.`name` = "Scadenzario" AND `zz_operations`.`op` IN ("send-email", "send-sollecito");