diff --git a/CHANGELOG.md b/CHANGELOG.md index b9dd2b7b5..81f143a90 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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** diff --git a/include/bottom.php b/include/bottom.php index d72a083a8..77df97a38 100755 --- a/include/bottom.php +++ b/include/bottom.php @@ -65,8 +65,8 @@ if (Auth::check()) { '; } - // Hooks - echo ' + // Hooks + echo ' '; } diff --git a/include/common/descrizione.php b/include/common/descrizione.php index 0dee7d76c..d332527ba 100755 --- a/include/common/descrizione.php +++ b/include/common/descrizione.php @@ -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('').'" ]} '; -} \ No newline at end of file +} diff --git a/include/init/maintenance.php b/include/init/maintenance.php index 63ce05a31..c02c45db7 100644 --- a/include/init/maintenance.php +++ b/include/init/maintenance.php @@ -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 '
diff --git a/lib/common.php b/lib/common.php index b828a776b..01e3f2553 100755 --- a/lib/common.php +++ b/lib/common.php @@ -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) { diff --git a/mail.php b/mail.php index 9b9afb0a7..3db69b96d 100755 --- a/mail.php +++ b/mail.php @@ -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)) { diff --git a/modules/anagrafiche/src/API/v1/Anagrafiche.php b/modules/anagrafiche/src/API/v1/Anagrafiche.php index 26cf08695..1875ca617 100755 --- a/modules/anagrafiche/src/API/v1/Anagrafiche.php +++ b/modules/anagrafiche/src/API/v1/Anagrafiche.php @@ -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']; diff --git a/modules/anagrafiche/src/API/v1/Sedi.php b/modules/anagrafiche/src/API/v1/Sedi.php index c40aff7d8..c9f5e60f8 100755 --- a/modules/anagrafiche/src/API/v1/Sedi.php +++ b/modules/anagrafiche/src/API/v1/Sedi.php @@ -26,8 +26,10 @@ class Sedi extends Resource implements RetrieveInterface { public function retrieve($request) { + $table = 'an_sedi'; + return [ - 'table' => 'an_sedi', + 'table' => $table, ]; } } diff --git a/modules/articoli/src/API/v1/Articoli.php b/modules/articoli/src/API/v1/Articoli.php index 74f0ac4ee..bfe612c01 100755 --- a/modules/articoli/src/API/v1/Articoli.php +++ b/modules/articoli/src/API/v1/Articoli.php @@ -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, ]; } diff --git a/modules/checklists/src/Check.php b/modules/checklists/src/Check.php index 9998c7808..98fab83b3 100755 --- a/modules/checklists/src/Check.php +++ b/modules/checklists/src/Check.php @@ -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() diff --git a/modules/contratti/row-add.php b/modules/contratti/row-add.php index c54d9f616..f965029a3 100755 --- a/modules/contratti/row-add.php +++ b/modules/contratti/row-add.php @@ -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', diff --git a/modules/contratti/row-edit.php b/modules/contratti/row-edit.php index fa35e896e..f6f79c89a 100755 --- a/modules/contratti/row-edit.php +++ b/modules/contratti/row-edit.php @@ -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'; diff --git a/modules/contratti/row-list.php b/modules/contratti/row-list.php index b9a5e12a0..b2f9b5e8b 100755 --- a/modules/contratti/row-list.php +++ b/modules/contratti/row-list.php @@ -153,6 +153,11 @@ foreach ($righe as $riga) {
'.$text.''; } + $tiposconto = ''; + if ($riga['sconto'] == 0) { + $tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT'); + } + echo ' '; @@ -160,7 +165,7 @@ foreach ($righe as $riga) { if (!$block_edit) { echo ' - {[ "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).'" ]} '; } diff --git a/modules/dashboard/widgets/notifiche.php b/modules/dashboard/widgets/notifiche.php index fa13fcc21..6ab816ed5 100755 --- a/modules/dashboard/widgets/notifiche.php +++ b/modules/dashboard/widgets/notifiche.php @@ -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') { diff --git a/modules/ddt/row-add.php b/modules/ddt/row-add.php index 2a2d483a2..579938dc9 100755 --- a/modules/ddt/row-add.php +++ b/modules/ddt/row-add.php @@ -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', diff --git a/modules/ddt/row-edit.php b/modules/ddt/row-edit.php index 5dc305125..442c14e15 100755 --- a/modules/ddt/row-edit.php +++ b/modules/ddt/row-edit.php @@ -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'; diff --git a/modules/ddt/row-list.php b/modules/ddt/row-list.php index 7bb03afa1..0433832df 100755 --- a/modules/ddt/row-list.php +++ b/modules/ddt/row-list.php @@ -193,11 +193,16 @@ foreach ($righe as $riga) { echo ' '; + $tiposconto = ''; + if ($riga['sconto'] == 0) { + $tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT'); + } + // Sconto unitario if (!$block_edit) { echo ' - {[ "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).'" ]} '; } diff --git a/modules/emails/src/Mail.php b/modules/emails/src/Mail.php index 684ccfa47..442c19486 100755 --- a/modules/emails/src/Mail.php +++ b/modules/emails/src/Mail.php @@ -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() diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index 4eebe320c..cc578f87b 100755 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -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); diff --git a/modules/fatture/add.php b/modules/fatture/add.php index 4281e3c57..ce3816212 100755 --- a/modules/fatture/add.php +++ b/modules/fatture/add.php @@ -70,11 +70,11 @@ $idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
- {[ "type": "select", "label": "", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, CONCAT(codice_tipo_documento_fe, ' - ', descrizione) AS descrizione FROM co_tipidocumento WHERE enabled = 1 AND dir = '' ORDER BY codice_tipo_documento_fe", "value": "" ]} + {[ "type": "select", "label": "", "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 = '' ORDER BY co_tipidocumento.codice_tipo_documento_fe", "value": "" ]}
- {[ "type": "select", "label": "", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": $id_module, 'is_sezionale' => 1]); ?>, "value": "" ]} + {[ "type": "select", "label": "", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": $id_module, 'is_sezionale' => 1]); ?>, "value": "selectOne('co_tipidocumento', 'id_segment', ['id' => $idtipodocumento])['id_segment']; ?>" ]}
@@ -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", diff --git a/modules/fatture/add_serial.php b/modules/fatture/add_serial.php index 00826f4aa..57d3c283c 100755 --- a/modules/fatture/add_serial.php +++ b/modules/fatture/add_serial.php @@ -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); diff --git a/modules/fatture/bulk.php b/modules/fatture/bulk.php index 2e62cf4b7..73fa95c50 100755 --- a/modules/fatture/bulk.php +++ b/modules/fatture/bulk.php @@ -598,109 +598,6 @@ switch (post('op')) { break; } -if (App::debug()) { - $operations['delete-bulk'] = [ - 'text' => ' '.tr('Elimina selezionati').' beta', - ]; -} - -$operations['export-csv'] = [ - 'text' => ' '.tr('Esporta selezionati').'', - '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' => ' '.tr('Duplica selezionati').'', - 'data' => [ - 'msg' => tr('Vuoi davvero duplicare le righe selezionate?').'

{[ "type": "select", "label": "'.tr('Fattura in avanti di').'", "name": "skip_time", "required": 1, "values": "list=\"Giorno\":\"'.tr('Un giorno').'\", \"Settimana\":\"'.tr('Una settimana').'\", \"Mese\":\"'.tr('Un mese').'\", \"Anno\":\"'.tr('Un anno').'\" ", "value": "Giorno" ]}
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "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 ]}
{[ "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' => ' '.tr('Registrazione contabile').'', - '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' => ' '.tr('Esporta stampe FE').'', - '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' => ' '.tr('Genera fatture elettroniche').'', - 'data' => [ - 'title' => '', - 'msg' => tr('Generare le fatture elettroniche per i documenti selezionati?
(le fatture dovranno trovarsi nello stato Emessa e non essere mai state generate)'), - 'button' => tr('Procedi'), - 'class' => 'btn btn-lg btn-warning', - 'blank' => true, - ], - ]; - - $operations['export-bulk'] = [ - 'text' => ' '.tr('Esporta stampe').'', - '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' => ' '.tr('Controlla fatture elettroniche').'', - 'data' => [ - 'title' => '', - 'msg' => tr('Controllare corrispondenza tra XML e fattura di vendita?
(le fatture dovranno essere state generate)'), - 'button' => tr('Procedi'), - 'class' => 'btn btn-lg btn-warning', - 'blank' => true, - ], - ]; -} - -$operations['export-xml-bulk'] = [ - 'text' => ' '.tr('Esporta XML').'', - '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' => ' '.tr('Esporta ricevute').'', - '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' => ' '.tr('Aggiorna banca').'', 'data' => [ @@ -712,18 +609,6 @@ $operations['change-bank'] = [ ], ]; -if ($dir == 'entrata') { - $operations['change-stato'] = [ - 'text' => ' '.tr('Emetti fatture').'', - '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' => ' '.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' => ' '.tr('Controlla fatture elettroniche').'', + 'data' => [ + 'title' => '', + 'msg' => tr('Controllare corrispondenza tra XML e fattura di vendita?
(le fatture dovranno essere state generate)'), + 'button' => tr('Procedi'), + 'class' => 'btn btn-lg btn-warning', + 'blank' => true, + ], + ]; +} + +$operations['copy-bulk'] = [ + 'text' => ' '.tr('Duplica selezionati').'', + 'data' => [ + 'msg' => tr('Vuoi davvero duplicare le righe selezionate?').'

{[ "type": "select", "label": "'.tr('Fattura in avanti di').'", "name": "skip_time", "required": 1, "values": "list=\"Giorno\":\"'.tr('Un giorno').'\", \"Settimana\":\"'.tr('Una settimana').'\", \"Mese\":\"'.tr('Un mese').'\", \"Anno\":\"'.tr('Un anno').'\" ", "value": "Giorno" ]}
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "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 ]}
{[ "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' => ' '.tr('Elimina selezionati').' beta', + ]; +} + +if ($dir == 'entrata') { + $operations['change-stato'] = [ + 'text' => ' '.tr('Emetti fatture').'', + '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' => ' '.tr('Esporta selezionati').'', + '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' => ' '.tr('Esporta stampe').'', + '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' => ' '.tr('Esporta stampe FE').'', + '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' => ' '.tr('Esporta ricevute').'', + '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' => ' '.tr('Esporta XML').'', + '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' => ' '.tr('Genera fatture elettroniche').'', + 'data' => [ + 'title' => '', + 'msg' => tr('Generare le fatture elettroniche per i documenti selezionati?
(le fatture dovranno trovarsi nello stato Emessa e non essere mai state generate)'), + 'button' => tr('Procedi'), + 'class' => 'btn btn-lg btn-warning', + 'blank' => true, + ], + ]; +} + +$operations['registrazione-contabile'] = [ + 'text' => ' '.tr('Registrazione contabile').'', + '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' => ' '.tr('Verifica notifiche').'
', 'data' => [ diff --git a/modules/fatture/init.php b/modules/fatture/init.php index 781a3e459..95058a804 100755 --- a/modules/fatture/init.php +++ b/modules/fatture/init.php @@ -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 diff --git a/modules/fatture/row-add.php b/modules/fatture/row-add.php index 6eb1b0829..a19474d1b 100755 --- a/modules/fatture/row-add.php +++ b/modules/fatture/row-add.php @@ -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, diff --git a/modules/fatture/row-edit.php b/modules/fatture/row-edit.php index 516b616c6..39f779fa2 100755 --- a/modules/fatture/row-edit.php +++ b/modules/fatture/row-edit.php @@ -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()) { diff --git a/modules/impianti/src/API/v1/Impianti.php b/modules/impianti/src/API/v1/Impianti.php index 23800ca10..69a61adeb 100755 --- a/modules/impianti/src/API/v1/Impianti.php +++ b/modules/impianti/src/API/v1/Impianti.php @@ -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, ]; } } diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index 29346202a..4c6c0ad91 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -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, diff --git a/modules/interventi/bulk.php b/modules/interventi/bulk.php index 346670ca1..9d3e2996b 100755 --- a/modules/interventi/bulk.php +++ b/modules/interventi/bulk.php @@ -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) { diff --git a/modules/interventi/row-add.php b/modules/interventi/row-add.php index d19dc6066..752b73e0d 100755 --- a/modules/interventi/row-add.php +++ b/modules/interventi/row-add.php @@ -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, diff --git a/modules/interventi/row-edit.php b/modules/interventi/row-edit.php index 528578075..84cb190d3 100755 --- a/modules/interventi/row-edit.php +++ b/modules/interventi/row-edit.php @@ -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()) { diff --git a/modules/interventi/row-list.php b/modules/interventi/row-list.php index 79abce077..09a7681f7 100755 --- a/modules/interventi/row-list.php +++ b/modules/interventi/row-list.php @@ -157,11 +157,16 @@ echo ' echo ' '; + $tiposconto = ''; + if ($riga['sconto'] == 0) { + $tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT'); + } + // Sconto unitario if (!$block_edit) { echo ' - {[ "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).'" ]} '; } diff --git a/modules/interventi/src/API/v1/Articoli.php b/modules/interventi/src/API/v1/Articoli.php index d916b69c9..ec220f638 100755 --- a/modules/interventi/src/API/v1/Articoli.php +++ b/modules/interventi/src/API/v1/Articoli.php @@ -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'], - ]); - } } diff --git a/modules/interventi/src/API/v1/Firma.php b/modules/interventi/src/API/v1/Firma.php index d44ab3395..a500a0589 100755 --- a/modules/interventi/src/API/v1/Firma.php +++ b/modules/interventi/src/API/v1/Firma.php @@ -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(); diff --git a/modules/interventi/src/API/v1/Impianti.php b/modules/interventi/src/API/v1/Impianti.php index 264d022ae..e43276bd3 100755 --- a/modules/interventi/src/API/v1/Impianti.php +++ b/modules/interventi/src/API/v1/Impianti.php @@ -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, ]); diff --git a/modules/interventi/src/API/v1/Interventi.php b/modules/interventi/src/API/v1/Interventi.php index 92efa3a43..68d60c2cd 100755 --- a/modules/interventi/src/API/v1/Interventi.php +++ b/modules/interventi/src/API/v1/Interventi.php @@ -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, ]; } diff --git a/modules/liste_newsletter/actions.php b/modules/liste_newsletter/actions.php index 3f89f1f61..2f6fc4213 100755 --- a/modules/liste_newsletter/actions.php +++ b/modules/liste_newsletter/actions.php @@ -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); } diff --git a/modules/listini_cliente/ajax/table.php b/modules/listini_cliente/ajax/table.php index 945331ec5..230b2903a 100644 --- a/modules/listini_cliente/ajax/table.php +++ b/modules/listini_cliente/ajax/table.php @@ -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); diff --git a/modules/newsletter/actions.php b/modules/newsletter/actions.php index d9cb4831e..71fb03f55 100755 --- a/modules/newsletter/actions.php +++ b/modules/newsletter/actions.php @@ -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); } diff --git a/modules/ordini/row-add.php b/modules/ordini/row-add.php index f72474637..d3a4ca115 100755 --- a/modules/ordini/row-add.php +++ b/modules/ordini/row-add.php @@ -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', diff --git a/modules/ordini/row-edit.php b/modules/ordini/row-edit.php index 1e9deafc8..17bf62265 100755 --- a/modules/ordini/row-edit.php +++ b/modules/ordini/row-edit.php @@ -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'; diff --git a/modules/ordini/row-list.php b/modules/ordini/row-list.php index 387020154..fde0a0b4d 100755 --- a/modules/ordini/row-list.php +++ b/modules/ordini/row-list.php @@ -239,11 +239,16 @@ foreach ($righe as $riga) { echo ' '; + $tiposconto = ''; + if ($riga['sconto'] == 0) { + $tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT'); + } + // Sconto unitario if (!$block_edit) { echo ' - {[ "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).'" ]} '; } diff --git a/modules/preventivi/row-add.php b/modules/preventivi/row-add.php index 1e2502923..b6bbe329c 100755 --- a/modules/preventivi/row-add.php +++ b/modules/preventivi/row-add.php @@ -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', diff --git a/modules/preventivi/row-edit.php b/modules/preventivi/row-edit.php index 48801052b..cd5d77e83 100755 --- a/modules/preventivi/row-edit.php +++ b/modules/preventivi/row-edit.php @@ -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()) { diff --git a/modules/preventivi/row-list.php b/modules/preventivi/row-list.php index d6732ef08..755429093 100755 --- a/modules/preventivi/row-list.php +++ b/modules/preventivi/row-list.php @@ -206,11 +206,16 @@ foreach ($righe as $key => $riga) { echo ' '; + $tiposconto = ''; + if ($riga['sconto'] == 0) { + $tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT'); + } + // Sconto unitario if (!$block_edit) { echo ' - {[ "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).'" ]} '; } @@ -251,9 +256,9 @@ foreach ($righe as $key => $riga) { '; - $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('Subtotale', [], ['upper' => true]).': @@ -283,7 +288,7 @@ foreach ($righe as $key => $riga) { '; - } + } } echo ' diff --git a/modules/preventivi/widgets/preventivi.fatturare.dashboard.php b/modules/preventivi/widgets/preventivi.fatturare.dashboard.php index bc15cd96f..d2acf9d55 100644 --- a/modules/preventivi/widgets/preventivi.fatturare.dashboard.php +++ b/modules/preventivi/widgets/preventivi.fatturare.dashboard.php @@ -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 { diff --git a/modules/scadenzario/bulk.php b/modules/scadenzario/bulk.php index b624cdd55..ddd894abf 100755 --- a/modules/scadenzario/bulk.php +++ b/modules/scadenzario/bulk.php @@ -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) { diff --git a/modules/scadenzario/src/SollecitoTask.php b/modules/scadenzario/src/SollecitoTask.php index 2f5aa391e..54a691d07 100644 --- a/modules/scadenzario/src/SollecitoTask.php +++ b/modules/scadenzario/src/SollecitoTask.php @@ -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) { diff --git a/modules/stampe/edit.php b/modules/stampe/edit.php index e64a3915d..73db4c1a6 100755 --- a/modules/stampe/edit.php +++ b/modules/stampe/edit.php @@ -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]); ?>
diff --git a/modules/tipi_documento/actions.php b/modules/tipi_documento/actions.php index 9822df3a3..91cfdebc2 100644 --- a/modules/tipi_documento/actions.php +++ b/modules/tipi_documento/actions.php @@ -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!')); diff --git a/modules/tipi_documento/edit.php b/modules/tipi_documento/edit.php index 61d8b40b6..70c04147c 100644 --- a/modules/tipi_documento/edit.php +++ b/modules/tipi_documento/edit.php @@ -29,34 +29,43 @@ include_once __DIR__.'/../../core.php';
- {[ "type": "select", "label": "", "name": "dir", "value": "$dir$", "values": "list=\"\": \"Non specificato\", \"entrata\": \"\", \"uscita\": \"\"", "required": 1 ]} + {[ "type": "select", "label": "", "name": "dir", "value": "$dir$", "values": "list=\"\": \"Non specificato\", \"entrata\": \"\", \"uscita\": \"\"", "required": 1]}
{[ "type": "select", "label": "", "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 ]}
-
+
{[ "type": "checkbox", "label": "", "name": "predefined", "value": "", "help":"." ]}
-
+
{[ "type": "checkbox", "label": "", "name": "enabled", "disabled": "", "value": "" ]}
-
+
{[ "type": "checkbox", "label": "", "name": "reversed", "value": "", "readonly": 1 ]}
+ 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' +
+ + {[ "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$" ]} +
+
- {[ "type": "text", "label": "", "name": "help", "value": "$help$" ]} + {[ "type": "text", "label": "'.tr('Help').'", "name": "help", "value": "$help$" ]}
- - -'; // 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)) { + diff --git a/modules/tipi_intervento/actions.php b/modules/tipi_intervento/actions.php index f81f2cc7f..e5b436d63 100755 --- a/modules/tipi_intervento/actions.php +++ b/modules/tipi_intervento/actions.php @@ -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'], diff --git a/plugins/exportFE/src/FatturaElettronica.php b/plugins/exportFE/src/FatturaElettronica.php index aface0940..2732efaad 100755 --- a/plugins/exportFE/src/FatturaElettronica.php +++ b/plugins/exportFE/src/FatturaElettronica.php @@ -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; } diff --git a/plugins/importFE/generate.php b/plugins/importFE/generate.php index e5b6bd1ee..999e80fae 100755 --- a/plugins/importFE/generate.php +++ b/plugins/importFE/generate.php @@ -211,21 +211,23 @@ echo '
'; // 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 '
- {[ "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 : '').'" ]}
'; // 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 '
diff --git a/plugins/statistiche_anagrafiche/info.php b/plugins/statistiche_anagrafiche/info.php index e21a9ac20..753098fcb 100755 --- a/plugins/statistiche_anagrafiche/info.php +++ b/plugins/statistiche_anagrafiche/info.php @@ -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) { diff --git a/plugins/xml/asso-invoice.xsl b/plugins/xml/asso-invoice.xsl index 960e5b65f..a330bc7a6 100755 --- a/plugins/xml/asso-invoice.xsl +++ b/plugins/xml/asso-invoice.xsl @@ -28,9 +28,13 @@ - + + + +
+
@@ -493,7 +497,7 @@ - + @@ -890,6 +894,7 @@
+
@@ -1848,14 +1853,7 @@ Tipologia documento - - Art. 73 - - - - Imposta bollo - - + Art. 73 Numero documento Data documento Codice destinatario @@ -1878,10 +1876,10 @@ fattura - acconto/anticipo su fattura + acconto / anticipo su fattura - acconto/anticipo su parcella + acconto / anticipo su parcella nota di credito @@ -1896,16 +1894,16 @@ integrazione fattura reverse charge interno - integrazione/autofattura per acquisto servizi da estero + integrazione/autofattura per acquisto servizi dall'estero - integrazione per acquisto beni intracomunitari + integrazione per acquisto di beni intracomunitari - 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 - 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 autofattura per splafonamento @@ -1914,22 +1912,22 @@ estrazione beni da Deposito IVA - estrazione beni da Deposito IVA con versamento IVA + estrazione beni da Deposito IVA con versamento dell'IVA - fattura differita - art.21 c.4 lett. a) + fattura differita di cui all'art.21, comma 4, terzo periodo lett. a) DPR 633/72 - 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 - 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) fattura per autoconsumo o per cessioni gratuite senza rivalsa - - fattura per acquisti da San Marino + + acquisti da San Marino con IVA (fattura cartacea) @@ -1944,26 +1942,19 @@ + - - - - - - - - - - - - - - - + + + + + @@ -2018,8 +2009,7 @@ - -
+
@@ -2534,7 +2524,7 @@ - Imposta bollo + Importo bollo Sconto/Maggiorazione @@ -3163,4 +3153,4 @@ - \ No newline at end of file + diff --git a/src/API/Manager.php b/src/API/Manager.php index c93acb8b6..7f5fa48bc 100755 --- a/src/API/Manager.php +++ b/src/API/Manager.php @@ -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; } diff --git a/src/Common/Document.php b/src/Common/Document.php index 99002e74d..d4630a77e 100755 --- a/src/Common/Document.php +++ b/src/Common/Document.php @@ -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(); diff --git a/src/Database.php b/src/Database.php index a6e3ae4d8..3ba0753e3 100755 --- a/src/Database.php +++ b/src/Database.php @@ -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) { diff --git a/src/Models/Note.php b/src/Models/Note.php index 496279d97..2c97854c2 100755 --- a/src/Models/Note.php +++ b/src/Models/Note.php @@ -70,7 +70,6 @@ class Note extends Model database()->delete('zz_notes', $data); } - /* Relazioni Eloquent */ public function user() diff --git a/src/Prints.php b/src/Prints.php index d60686987..48de7e801 100755 --- a/src/Prints.php +++ b/src/Prints.php @@ -695,7 +695,7 @@ class Prints $mpdf->WriteHTML('
'.$foot.'
'); } - $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(); diff --git a/src/Uploads.php b/src/Uploads.php index 2a3c19c5d..5b6c66d93 100755 --- a/src/Uploads.php +++ b/src/Uploads.php @@ -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'], diff --git a/templates/preventivi/body.php b/templates/preventivi/body.php index d5f5c312f..0b4dd8c6c 100755 --- a/templates/preventivi/body.php +++ b/templates/preventivi/body.php @@ -172,7 +172,7 @@ if ($options['pricing']) { echo " ".tr('Prezzo unitario', [], ['upper' => true])." ".tr('IVA', [], ['upper' => true])." (%) - ".($options['hide-total'] ? tr('Importo ivato', [], ['upper' => true]) : tr('Importo', [], ['upper' => true])).""; + ".($options['hide-total'] ? tr('Importo ivato', [], ['upper' => true]) : tr('Importo', [], ['upper' => true])).''; } echo ' @@ -280,8 +280,8 @@ foreach ($righe as $key => $riga) { '.Translator::numberToLocale($riga->aliquota->percentuale, 2).' '; - // Imponibile - echo ' + // Imponibile + echo ' '.(($options['hide-total'] || $prezzi_ivati) ? moneyFormat($riga->totale) : moneyFormat($riga->totale_imponibile)).' '; diff --git a/tests/_data/.gitkeep b/tests/_data/.gitkeep deleted file mode 100755 index e69de29bb..000000000 diff --git a/tests/_output/.gitignore b/tests/_output/.gitignore deleted file mode 100755 index c96a04f00..000000000 --- a/tests/_output/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore \ No newline at end of file diff --git a/tests/_support/AcceptanceTester.php b/tests/_support/AcceptanceTester.php deleted file mode 100755 index 173de9ed6..000000000 --- a/tests/_support/AcceptanceTester.php +++ /dev/null @@ -1,110 +0,0 @@ -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()'); - } -} diff --git a/tests/_support/FunctionalTester.php b/tests/_support/FunctionalTester.php deleted file mode 100755 index e3a9dd03c..000000000 --- a/tests/_support/FunctionalTester.php +++ /dev/null @@ -1,26 +0,0 @@ -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'); - } -} diff --git a/tests/_support/Helper/Common/RowHelper.php b/tests/_support/Helper/Common/RowHelper.php deleted file mode 100755 index b93a006f8..000000000 --- a/tests/_support/Helper/Common/RowHelper.php +++ /dev/null @@ -1,225 +0,0 @@ -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]'; - } -} diff --git a/tests/_support/Helper/Functional.php b/tests/_support/Helper/Functional.php deleted file mode 100755 index 57e511334..000000000 --- a/tests/_support/Helper/Functional.php +++ /dev/null @@ -1,10 +0,0 @@ - -// 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 = <<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 = << -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 = << 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'); - } -} diff --git a/tests/_support/Helper/Select2Ajax.php b/tests/_support/Helper/Select2Ajax.php deleted file mode 100755 index 7d169fbb1..000000000 --- a/tests/_support/Helper/Select2Ajax.php +++ /dev/null @@ -1,88 +0,0 @@ -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 = << ({key,value})); - - if(output[0]) { - options.push(output[0].value.data); - } - }) - - $code -}); -EOT; - - $t->executeJS($script, [$timeout]); - } -} diff --git a/tests/_support/Helper/Unit.php b/tests/_support/Helper/Unit.php deleted file mode 100755 index 4d27aa359..000000000 --- a/tests/_support/Helper/Unit.php +++ /dev/null @@ -1,10 +0,0 @@ -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'); - } -} diff --git a/tests/acceptance/BackupCest.php b/tests/acceptance/BackupCest.php deleted file mode 100755 index 179553c14..000000000 --- a/tests/acceptance/BackupCest.php +++ /dev/null @@ -1,46 +0,0 @@ -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); - } -} diff --git a/tests/acceptance/ContrattiCest.php b/tests/acceptance/ContrattiCest.php deleted file mode 100755 index f09f1659f..000000000 --- a/tests/acceptance/ContrattiCest.php +++ /dev/null @@ -1,74 +0,0 @@ -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'); - } -} diff --git a/tests/acceptance/DDTCest.php b/tests/acceptance/DDTCest.php deleted file mode 100755 index 6aad70b4a..000000000 --- a/tests/acceptance/DDTCest.php +++ /dev/null @@ -1,84 +0,0 @@ -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'); - } -} diff --git a/tests/acceptance/FattureCest.php b/tests/acceptance/FattureCest.php deleted file mode 100755 index cb6011e1e..000000000 --- a/tests/acceptance/FattureCest.php +++ /dev/null @@ -1,86 +0,0 @@ -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'); - } -} diff --git a/tests/acceptance/OrdiniCest.php b/tests/acceptance/OrdiniCest.php deleted file mode 100755 index f9c55d6d7..000000000 --- a/tests/acceptance/OrdiniCest.php +++ /dev/null @@ -1,87 +0,0 @@ -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'); - } -} diff --git a/tests/acceptance/PreventiviCest.php b/tests/acceptance/PreventiviCest.php deleted file mode 100755 index 322a24b01..000000000 --- a/tests/acceptance/PreventiviCest.php +++ /dev/null @@ -1,75 +0,0 @@ -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'); - } -} diff --git a/tests/acceptance/_bootstrap.php b/tests/acceptance/_bootstrap.php deleted file mode 100755 index b3d9bbc7f..000000000 --- a/tests/acceptance/_bootstrap.php +++ /dev/null @@ -1 +0,0 @@ -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); - } -} diff --git a/tests/unit/_bootstrap.php b/tests/unit/_bootstrap.php deleted file mode 100755 index 25cdd55a6..000000000 --- a/tests/unit/_bootstrap.php +++ /dev/null @@ -1,10 +0,0 @@ - $namespace) { - Autoload::addNamespace($namespace.'\\', __DIR__.'/../../'.$path.'/custom/src'); - Autoload::addNamespace($namespace.'\\', __DIR__.'/../../'.$path.'/src'); -} diff --git a/update/2_4_36.php b/update/2_4_36.php index 51045d6c5..b2994f3f1 100644 --- a/update/2_4_36.php +++ b/update/2_4_36.php @@ -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; } diff --git a/update/2_4_45.sql b/update/2_4_45.sql index f1601bfb1..fe73253bd 100644 --- a/update/2_4_45.sql +++ b/update/2_4_45.sql @@ -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'; diff --git a/update/2_4_49.php b/update/2_4_49.php new file mode 100644 index 000000000..ea7dbf6c0 --- /dev/null +++ b/update/2_4_49.php @@ -0,0 +1,12 @@ + $value) { + $files[$key] = realpath(base_dir().'/'.$value); +} + +delete($files); diff --git a/update/2_4_49.sql b/update/2_4_49.sql index f830467cf..4c271c6c3 100644 --- a/update/2_4_49.sql +++ b/update/2_4_49.sql @@ -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`; \ No newline at end of file +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), \',\', \'#\'), \'.\', \',\'), \'#\', \'.\'), \'€\') 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), \',\', \'#\'), \'.\', \',\'),\'#\', \'.\'), \'€\') 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), \',\', \'#\'), \'.\', \',\'), \'#\', \'.\'), \'€\') 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), \',\', \'#\'), \'.\', \',\'),\'#\', \'.\'), \'€\') 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"); \ No newline at end of file