Merge branch 'master' of https://github.com/devcode-it/openstamanager
This commit is contained in:
commit
92e0659bd4
33
CHANGELOG.md
33
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**
|
||||
|
|
|
@ -65,8 +65,8 @@ if (Auth::check()) {
|
|||
<style>'.$custom_css.'</style>';
|
||||
}
|
||||
|
||||
// Hooks
|
||||
echo '
|
||||
// Hooks
|
||||
echo '
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
// Toast
|
||||
|
@ -75,18 +75,18 @@ if (Auth::check()) {
|
|||
// Orologio
|
||||
clock();';
|
||||
|
||||
// Hooks
|
||||
if (!$config['disable_hooks']) {
|
||||
echo '
|
||||
// Hooks
|
||||
if (!$config['disable_hooks']) {
|
||||
echo '
|
||||
setTimeout("startHooks();", 1000);';
|
||||
}
|
||||
}
|
||||
|
||||
// Abilitazione del cron autonoma
|
||||
if (!$config['disable_cron']) {
|
||||
echo '
|
||||
// Abilitazione del cron autonoma
|
||||
if (!$config['disable_cron']) {
|
||||
echo '
|
||||
$.get(globals.rootdir + "/cron.php");';
|
||||
}
|
||||
echo '
|
||||
}
|
||||
echo '
|
||||
});
|
||||
</script>';
|
||||
}
|
||||
|
|
|
@ -39,4 +39,4 @@ if ($module['name'] == 'Preventivi' && $options['op'] == 'manage_descrizione') {
|
|||
{[ "type": "checkbox", "label": "'.tr('Utilizza come titolo del gruppo').'", "name": "is_titolo", "value": '.json_encode($result['is_titolo']).', "help": "'.tr('').'" ]}
|
||||
</div>
|
||||
</div>';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ include_once __DIR__.'/../../core.php';
|
|||
if ($config['maintenance_ip'] != $_SERVER['REMOTE_ADDR']) {
|
||||
include_once App::filepath('include|custom|', 'top.php');
|
||||
$img = App::getPaths()['img'];
|
||||
|
||||
|
||||
echo '
|
||||
<div class="box box-center-large box-danger">
|
||||
<div class="box-header with-border text-center">
|
||||
|
|
|
@ -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) {
|
||||
|
|
4
mail.php
4
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)) {
|
||||
|
|
|
@ -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'];
|
||||
|
|
|
@ -26,8 +26,10 @@ class Sedi extends Resource implements RetrieveInterface
|
|||
{
|
||||
public function retrieve($request)
|
||||
{
|
||||
$table = 'an_sedi';
|
||||
|
||||
return [
|
||||
'table' => 'an_sedi',
|
||||
'table' => $table,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
];
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -153,6 +153,11 @@ foreach ($righe as $riga) {
|
|||
<br><small class="label label-danger">'.$text.'</small>';
|
||||
}
|
||||
|
||||
$tiposconto = '';
|
||||
if ($riga['sconto'] == 0) {
|
||||
$tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
|
||||
}
|
||||
|
||||
echo '
|
||||
</td>';
|
||||
|
||||
|
@ -160,7 +165,7 @@ foreach ($righe as $riga) {
|
|||
if (!$block_edit) {
|
||||
echo '
|
||||
<td class="text-center">
|
||||
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.$riga->tipo_sconto.'" ]}
|
||||
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.($tipo_sconto ?: $riga->tipo_sconto).'" ]}
|
||||
</td>';
|
||||
}
|
||||
|
||||
|
|
|
@ -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') {
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -193,11 +193,16 @@ foreach ($righe as $riga) {
|
|||
echo '
|
||||
</td>';
|
||||
|
||||
$tiposconto = '';
|
||||
if ($riga['sconto'] == 0) {
|
||||
$tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
|
||||
}
|
||||
|
||||
// Sconto unitario
|
||||
if (!$block_edit) {
|
||||
echo '
|
||||
<td class="text-center">
|
||||
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.$riga->tipo_sconto.'" ]}
|
||||
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.($tipo_sconto ?: $riga->tipo_sconto).'" ]}
|
||||
</td>';
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -70,11 +70,11 @@ $idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
|
|||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "<?php echo tr('Tipo documento'); ?>", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, CONCAT(codice_tipo_documento_fe, ' - ', descrizione) AS descrizione FROM co_tipidocumento WHERE enabled = 1 AND dir = '<?php echo $dir; ?>' ORDER BY codice_tipo_documento_fe", "value": "<?php echo $idtipodocumento; ?>" ]}
|
||||
{[ "type": "select", "label": "<?php echo tr('Tipo documento'); ?>", "name": "idtipodocumento", "required": 1, "values": "query=SELECT co_tipidocumento.id, CONCAT(co_tipidocumento.codice_tipo_documento_fe, ' - ', co_tipidocumento.descrizione) AS descrizione, co_tipidocumento.id_segment, zz_segments.name as name_segment FROM co_tipidocumento INNER JOIN zz_segments ON zz_segments.id = co_tipidocumento.id_segment WHERE co_tipidocumento.enabled = 1 AND co_tipidocumento.dir = '<?php echo $dir; ?>' ORDER BY co_tipidocumento.codice_tipo_documento_fe", "value": "<?php echo $idtipodocumento; ?>" ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "<?php echo tr('Sezionale'); ?>", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": <?php echo json_encode(['id_module' => $id_module, 'is_sezionale' => 1]); ?>, "value": "<?php echo $_SESSION['module_'.$id_module]['id_segment']; ?>" ]}
|
||||
{[ "type": "select", "label": "<?php echo tr('Sezionale'); ?>", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": <?php echo json_encode(['id_module' => $id_module, 'is_sezionale' => 1]); ?>, "value": "<?php echo $database->selectOne('co_tipidocumento', 'id_segment', ['id' => $idtipodocumento])['id_segment']; ?>" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -232,6 +232,8 @@ $(document).ready(function () {
|
|||
});
|
||||
|
||||
input("idtipodocumento").change(function () {
|
||||
$("#id_segment").selectSetNew($(this).selectData().id_segment, $(this).selectData().name_segment);
|
||||
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
type: "POST",
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -598,109 +598,6 @@ switch (post('op')) {
|
|||
break;
|
||||
}
|
||||
|
||||
if (App::debug()) {
|
||||
$operations['delete-bulk'] = [
|
||||
'text' => '<span><i class="fa fa-trash"></i> '.tr('Elimina selezionati').'</span> <span class="label label-danger">beta</span>',
|
||||
];
|
||||
}
|
||||
|
||||
$operations['export-csv'] = [
|
||||
'text' => '<span><i class="fa fa-download"></i> '.tr('Esporta selezionati').'</span>',
|
||||
'data' => [
|
||||
'msg' => tr('Vuoi esportare un CSV con le fatture selezionate?'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-success',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
|
||||
$operations['copy-bulk'] = [
|
||||
'text' => '<span><i class="fa fa-copy"></i> '.tr('Duplica selezionati').'</span>',
|
||||
'data' => [
|
||||
'msg' => tr('Vuoi davvero duplicare le righe selezionate?').'<br><br>{[ "type": "select", "label": "'.tr('Fattura in avanti di').'", "name": "skip_time", "required": 1, "values": "list=\"Giorno\":\"'.tr('Un giorno').'\", \"Settimana\":\"'.tr('Una settimana').'\", \"Mese\":\"'.tr('Un mese').'\", \"Anno\":\"'.tr('Un anno').'\" ", "value": "Giorno" ]}<br>{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $id_module, 'is_sezionale' => 1]).', "value": "'.$_SESSION['module_'.$id_module]['id_segment'].'", "select-options-escape": true ]}<br>{[ "type": "checkbox", "label": "'.tr('Aggiungere i riferimenti ai documenti esterni?').'", "placeholder": "'.tr('Aggiungere i riferimenti ai documenti esterni?').'", "name": "riferimenti" ]}',
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
],
|
||||
];
|
||||
|
||||
$operations['registrazione-contabile'] = [
|
||||
'text' => '<span><i class="fa fa-calculator"></i> '.tr('Registrazione contabile').'</span>',
|
||||
'data' => [
|
||||
'title' => tr('Registrazione contabile'),
|
||||
'type' => 'modal',
|
||||
'origine' => 'fatture',
|
||||
'url' => base_path().'/add.php?id_module='.Modules::get('Prima nota')['id'],
|
||||
],
|
||||
];
|
||||
|
||||
$operations['exportFE-bulk'] = [
|
||||
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta stampe FE').'</span>',
|
||||
'data' => [
|
||||
'title' => '',
|
||||
'msg' => tr('Vuoi davvero esportare i PDF delle fatture elettroniche selezionate in un archivio ZIP?'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
|
||||
if ($module->name == 'Fatture di vendita') {
|
||||
$operations['genera-xml'] = [
|
||||
'text' => '<span><i class="fa fa-file-code-o"></i> '.tr('Genera fatture elettroniche').'</span>',
|
||||
'data' => [
|
||||
'title' => '',
|
||||
'msg' => tr('Generare le fatture elettroniche per i documenti selezionati?<br><small>(le fatture dovranno trovarsi nello stato <i class="fa fa-clock-o text-info" title="Emessa"></i> <small>Emessa</small> e non essere mai state generate)</small>'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
|
||||
$operations['export-bulk'] = [
|
||||
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta stampe').'</span>',
|
||||
'data' => [
|
||||
'title' => '',
|
||||
'msg' => tr('Vuoi davvero esportare i PDF delle fatture selezionate in un archivio ZIP?'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
|
||||
$operations['check-bulk'] = [
|
||||
'text' => '<span><i class="fa fa-list-alt"></i> '.tr('Controlla fatture elettroniche').'</span>',
|
||||
'data' => [
|
||||
'title' => '',
|
||||
'msg' => tr('Controllare corrispondenza tra XML e fattura di vendita?<br><small>(le fatture dovranno essere state generate)</small>'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
$operations['export-xml-bulk'] = [
|
||||
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta XML').'</span>',
|
||||
'data' => [
|
||||
'title' => '',
|
||||
'msg' => tr('Vuoi davvero esportare le fatture elettroniche selezionate in un archivio ZIP?'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
|
||||
$operations['export-ricevute-bulk'] = [
|
||||
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta ricevute').'</span>',
|
||||
'data' => [
|
||||
'title' => '',
|
||||
'msg' => tr('Vuoi davvero esportare le ricevute selezionate in un archivio ZIP?'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
|
||||
$operations['change-bank'] = [
|
||||
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Aggiorna banca').'</span>',
|
||||
'data' => [
|
||||
|
@ -712,18 +609,6 @@ $operations['change-bank'] = [
|
|||
],
|
||||
];
|
||||
|
||||
if ($dir == 'entrata') {
|
||||
$operations['change-stato'] = [
|
||||
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Emetti fatture').'</span>',
|
||||
'data' => [
|
||||
'title' => tr('Emissione fatture'),
|
||||
'msg' => tr('Vuoi emettere le fatture selezionate? Verranno emesse solo le fatture in Bozza'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
$operations['cambia-sezionale'] = [
|
||||
'text' => '<span><i class="fa fa-tags"></i> '.tr('Cambia sezionale'),
|
||||
'data' => [
|
||||
|
@ -747,7 +632,127 @@ if (Interaction::isEnabled()) {
|
|||
'class' => 'btn btn-lg btn-warning',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
if ($module->name == 'Fatture di vendita') {
|
||||
$operations['check-bulk'] = [
|
||||
'text' => '<span><i class="fa fa-list-alt"></i> '.tr('Controlla fatture elettroniche').'</span>',
|
||||
'data' => [
|
||||
'title' => '',
|
||||
'msg' => tr('Controllare corrispondenza tra XML e fattura di vendita?<br><small>(le fatture dovranno essere state generate)</small>'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
$operations['copy-bulk'] = [
|
||||
'text' => '<span><i class="fa fa-copy"></i> '.tr('Duplica selezionati').'</span>',
|
||||
'data' => [
|
||||
'msg' => tr('Vuoi davvero duplicare le righe selezionate?').'<br><br>{[ "type": "select", "label": "'.tr('Fattura in avanti di').'", "name": "skip_time", "required": 1, "values": "list=\"Giorno\":\"'.tr('Un giorno').'\", \"Settimana\":\"'.tr('Una settimana').'\", \"Mese\":\"'.tr('Un mese').'\", \"Anno\":\"'.tr('Un anno').'\" ", "value": "Giorno" ]}<br>{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $id_module, 'is_sezionale' => 1]).', "value": "'.$_SESSION['module_'.$id_module]['id_segment'].'", "select-options-escape": true ]}<br>{[ "type": "checkbox", "label": "'.tr('Aggiungere i riferimenti ai documenti esterni?').'", "placeholder": "'.tr('Aggiungere i riferimenti ai documenti esterni?').'", "name": "riferimenti" ]}',
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
],
|
||||
];
|
||||
|
||||
if (App::debug()) {
|
||||
$operations['delete-bulk'] = [
|
||||
'text' => '<span><i class="fa fa-trash"></i> '.tr('Elimina selezionati').'</span> <span class="label label-danger">beta</span>',
|
||||
];
|
||||
}
|
||||
|
||||
if ($dir == 'entrata') {
|
||||
$operations['change-stato'] = [
|
||||
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Emetti fatture').'</span>',
|
||||
'data' => [
|
||||
'title' => tr('Emissione fatture'),
|
||||
'msg' => tr('Vuoi emettere le fatture selezionate? Verranno emesse solo le fatture in Bozza'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
$operations['export-csv'] = [
|
||||
'text' => '<span><i class="fa fa-download"></i> '.tr('Esporta selezionati').'</span>',
|
||||
'data' => [
|
||||
'msg' => tr('Vuoi esportare un CSV con le fatture selezionate?'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-success',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
|
||||
if ($module->name == 'Fatture di vendita') {
|
||||
$operations['export-bulk'] = [
|
||||
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta stampe').'</span>',
|
||||
'data' => [
|
||||
'title' => '',
|
||||
'msg' => tr('Vuoi davvero esportare i PDF delle fatture selezionate in un archivio ZIP?'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
}
|
||||
$operations['exportFE-bulk'] = [
|
||||
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta stampe FE').'</span>',
|
||||
'data' => [
|
||||
'title' => '',
|
||||
'msg' => tr('Vuoi davvero esportare i PDF delle fatture elettroniche selezionate in un archivio ZIP?'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
|
||||
$operations['export-ricevute-bulk'] = [
|
||||
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta ricevute').'</span>',
|
||||
'data' => [
|
||||
'title' => '',
|
||||
'msg' => tr('Vuoi davvero esportare le ricevute selezionate in un archivio ZIP?'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
|
||||
$operations['export-xml-bulk'] = [
|
||||
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta XML').'</span>',
|
||||
'data' => [
|
||||
'title' => '',
|
||||
'msg' => tr('Vuoi davvero esportare le fatture elettroniche selezionate in un archivio ZIP?'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
|
||||
if ($module->name == 'Fatture di vendita') {
|
||||
$operations['genera-xml'] = [
|
||||
'text' => '<span><i class="fa fa-file-code-o"></i> '.tr('Genera fatture elettroniche').'</span>',
|
||||
'data' => [
|
||||
'title' => '',
|
||||
'msg' => tr('Generare le fatture elettroniche per i documenti selezionati?<br><small>(le fatture dovranno trovarsi nello stato <i class="fa fa-clock-o text-info" title="Emessa"></i> <small>Emessa</small> e non essere mai state generate)</small>'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
$operations['registrazione-contabile'] = [
|
||||
'text' => '<span><i class="fa fa-calculator"></i> '.tr('Registrazione contabile').'</span>',
|
||||
'data' => [
|
||||
'title' => tr('Registrazione contabile'),
|
||||
'type' => 'modal',
|
||||
'origine' => 'fatture',
|
||||
'url' => base_path().'/add.php?id_module='.Modules::get('Prima nota')['id'],
|
||||
],
|
||||
];
|
||||
|
||||
if (Interaction::isEnabled()) {
|
||||
$operations['verify-notifiche'] = [
|
||||
'text' => '<i class="fa fa-question-circle"></i> '.tr('Verifica notifiche').'</span>',
|
||||
'data' => [
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -157,11 +157,16 @@ echo '
|
|||
echo '
|
||||
</td>';
|
||||
|
||||
$tiposconto = '';
|
||||
if ($riga['sconto'] == 0) {
|
||||
$tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
|
||||
}
|
||||
|
||||
// Sconto unitario
|
||||
if (!$block_edit) {
|
||||
echo '
|
||||
<td class="text-center">
|
||||
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.$riga->tipo_sconto.'" ]}
|
||||
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.($tipo_sconto ?: $riga->tipo_sconto).'" ]}
|
||||
</td>';
|
||||
}
|
||||
|
||||
|
|
|
@ -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'],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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,
|
||||
]);
|
||||
|
|
|
@ -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,
|
||||
];
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -239,11 +239,16 @@ foreach ($righe as $riga) {
|
|||
echo '
|
||||
</td>';
|
||||
|
||||
$tiposconto = '';
|
||||
if ($riga['sconto'] == 0) {
|
||||
$tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
|
||||
}
|
||||
|
||||
// Sconto unitario
|
||||
if (!$block_edit) {
|
||||
echo '
|
||||
<td class="text-center">
|
||||
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.$riga->tipo_sconto.'" ]}
|
||||
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.($tipo_sconto ?: $riga->tipo_sconto).'" ]}
|
||||
</td>';
|
||||
}
|
||||
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -206,11 +206,16 @@ foreach ($righe as $key => $riga) {
|
|||
echo '
|
||||
</td>';
|
||||
|
||||
$tiposconto = '';
|
||||
if ($riga['sconto'] == 0) {
|
||||
$tipo_sconto = (setting('Tipo di sconto predefinito') == '%' ? 'PRC' : 'UNT');
|
||||
}
|
||||
|
||||
// Sconto unitario
|
||||
if (!$block_edit) {
|
||||
echo '
|
||||
<td class="text-center">
|
||||
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.$riga->tipo_sconto.'" ]}
|
||||
{[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.($tipo_sconto ?: $riga->tipo_sconto).'" ]}
|
||||
</td>';
|
||||
}
|
||||
|
||||
|
@ -251,9 +256,9 @@ foreach ($righe as $key => $riga) {
|
|||
</td>
|
||||
</tr>';
|
||||
|
||||
$next = $righe->flatten()[$num];
|
||||
if ($has_gruppo && ($next->is_titolo || $next == null)) {
|
||||
echo '
|
||||
$next = $righe->flatten()[$num];
|
||||
if ($has_gruppo && ($next->is_titolo || $next == null)) {
|
||||
echo '
|
||||
<tr>
|
||||
<td style="background-color:'.$color_gruppo.'" colspan="'.$colspan.'" class="text-right">
|
||||
<b>'.tr('Subtotale', [], ['upper' => true]).':</b>
|
||||
|
@ -283,7 +288,7 @@ foreach ($righe as $key => $riga) {
|
|||
</td>
|
||||
<td style="background-color:'.$color_gruppo.'"></td>
|
||||
</tr>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo '
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -21,7 +21,7 @@ include_once __DIR__.'/../../core.php';
|
|||
|
||||
use Models\PrintTemplate;
|
||||
|
||||
$id_files = $dbo->select('zz_files_print', 'id_file', ['id_print' => $id_record]);
|
||||
$id_files = $dbo->select('zz_files_print', 'id_file', [], ['id_print' => $id_record]);
|
||||
|
||||
?><form action="" method="post" id="edit-form">
|
||||
<input type="hidden" name="backto" value="record-edit">
|
||||
|
|
|
@ -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!'));
|
||||
|
|
|
@ -29,34 +29,43 @@ include_once __DIR__.'/../../core.php';
|
|||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
{[ "type": "select", "label": "<?php echo tr('Direzione'); ?>", "name": "dir", "value": "$dir$", "values": "list=\"\": \"Non specificato\", \"entrata\": \"<?php echo tr('Entrata'); ?>\", \"uscita\": \"<?php echo tr('Uscita'); ?>\"", "required": 1 ]}
|
||||
{[ "type": "select", "label": "<?php echo tr('Direzione'); ?>", "name": "dir", "value": "$dir$", "values": "list=\"\": \"Non specificato\", \"entrata\": \"<?php echo tr('Entrata'); ?>\", \"uscita\": \"<?php echo tr('Uscita'); ?>\"", "required": 1]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
{[ "type": "select", "label": "<?php echo tr('Codice tipo documento FE'); ?>", "name": "codice_tipo_documento_fe", "value": "$codice_tipo_documento_fe$", "values": "query=SELECT codice AS id, CONCAT_WS(' - ', codice, descrizione) AS descrizione FROM fe_tipi_documento", "required": 1 ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="col-md-3">
|
||||
{[ "type": "checkbox", "label": "<?php echo tr('Tipo documento predefinito'); ?>", "name": "predefined", "value": "<?php echo intval($record['predefined']); ?>", "help":"<?php echo tr('Impostare questo tipo di documento predefinto per le fatture di '); echo ($record['dir'] == 'entrata') ? tr('Vendita') : tr('Acquisto'); ?>." ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="col-md-3">
|
||||
{[ "type": "checkbox", "label": "<?php echo tr('Attivo'); ?>", "name": "enabled", "disabled": "<?php echo ($record['predefined'] && $record['enabled']) ? 1 : 0; ?>", "value": "<?php echo intval($record['enabled']); ?>" ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="col-md-3">
|
||||
{[ "type": "checkbox", "label": "<?php echo tr('Reversed'); ?>", "name": "reversed", "value": "<?php echo intval($record['reversed']); ?>", "readonly": 1 ]}
|
||||
</div>
|
||||
|
||||
<?php
|
||||
|
||||
$id_module_acquisti = database()->fetchOne('SELECT id FROM zz_modules WHERE title = "Fatture di acquisto"')['id'];
|
||||
$id_module_vendite = database()->fetchOne('SELECT id FROM zz_modules WHERE title = "Fatture di vendita"')['id'];
|
||||
|
||||
echo'
|
||||
<div class="col-md-3">
|
||||
|
||||
{[ "type": "select", "label": "'.tr('Sezionale predefinito').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $record['dir'] == 'entrata' ? $id_module_vendite : $id_module_acquisti, 'is_sezionale' => 1]).', "value": "$id_segment$" ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-12">
|
||||
{[ "type": "text", "label": "<?php echo tr('Help'); ?>", "name": "help", "value": "$help$" ]}
|
||||
{[ "type": "text", "label": "'.tr('Help').'", "name": "help", "value": "$help$" ]}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
<?php
|
||||
</form>';
|
||||
// Collegamenti diretti (numerici)
|
||||
$numero_documenti = $dbo->fetchNum('SELECT id FROM co_documenti WHERE idtipodocumento='.prepare($id_record));
|
||||
|
||||
|
@ -73,3 +82,4 @@ if (!empty($numero_documenti)) {
|
|||
<a class="btn btn-danger ask" data-backto="record-list">
|
||||
<i class="fa fa-trash"></i> <?php echo tr('Elimina'); ?>
|
||||
</a>
|
||||
|
||||
|
|
|
@ -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'],
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -211,21 +211,23 @@ echo '
|
|||
</div>';
|
||||
|
||||
// Tipo del documento
|
||||
$query = "SELECT id, CONCAT (descrizione, IF((codice_tipo_documento_fe IS NULL), '', CONCAT(' (', codice_tipo_documento_fe, ')' ) )) AS descrizione FROM co_tipidocumento WHERE dir = 'uscita'";
|
||||
$query = "SELECT id, CONCAT('(', codice_tipo_documento_fe, ') ', descrizione) AS descrizione FROM co_tipidocumento WHERE dir = 'uscita'";
|
||||
$query_tipo = $query.' AND codice_tipo_documento_fe = '.prepare($dati_generali['TipoDocumento']);
|
||||
$numero_tipo = $database->fetchNum($query_tipo);
|
||||
if (!empty($numero_tipo)) {
|
||||
$query = $query_tipo;
|
||||
}
|
||||
|
||||
$id_tipodocumento = $database->fetchOne($query_tipo)['id'];
|
||||
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
{[ "type": "select", "label": "'.tr('Tipo fattura').'", "name": "id_tipo", "required": 1, "values": "query='.$query.'", "value": "'.($numero_tipo == 1 ? $database->fetchOne($query_tipo)['id'] : '').'" ]}
|
||||
{[ "type": "select", "label": "'.tr('Tipo fattura').'", "name": "id_tipo", "required": 1, "values": "query='.$query.'", "value": "'.($numero_tipo == 1 ? $id_tipodocumento : '').'" ]}
|
||||
</div>';
|
||||
|
||||
// Sezionale
|
||||
$id_segment = $is_autofattura ? setting('Sezionale per autofatture di acquisto') : $_SESSION['module_'.$id_module]['id_segment'];
|
||||
$id_segment = $database->table('co_tipidocumento')->where('id', '=', $id_tipodocumento)->value('id_segment');
|
||||
|
||||
echo '
|
||||
<div class="col-md-3">
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -28,9 +28,13 @@
|
|||
<xsl:template name="FormatIVA">
|
||||
<xsl:param name="Natura" />
|
||||
<xsl:param name="IVA" />
|
||||
<xsl:choose>
|
||||
|
||||
<xsl:choose>
|
||||
<xsl:when test="$Natura">
|
||||
<xsl:value-of select="$Natura" />
|
||||
<xsl:if test="number($IVA)" >
|
||||
<br/><xsl:value-of select="format-number($IVA, '###.###.##0,00', 'euro')" />
|
||||
</xsl:if>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:if test="$IVA">
|
||||
|
@ -493,7 +497,7 @@
|
|||
|
||||
<td class="import" >
|
||||
<xsl:if test="PrezzoUnitario">
|
||||
<xsl:if test="number(PrezzoTotale)">
|
||||
<xsl:if test="number(PrezzoUnitario)">
|
||||
|
||||
<xsl:value-of select="format-number(PrezzoUnitario, '###.###.##0,00######', 'euro')" />
|
||||
</xsl:if>
|
||||
|
@ -890,6 +894,7 @@
|
|||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</span>
|
||||
|
||||
</xsl:if>
|
||||
</div>
|
||||
|
||||
|
@ -1848,14 +1853,7 @@
|
|||
<tr>
|
||||
|
||||
<th>Tipologia documento</th>
|
||||
<xsl:if test="$IsFPRS='0'">
|
||||
<th class="perc">Art. 73</th>
|
||||
</xsl:if>
|
||||
|
||||
<xsl:if test="$IsFPRS='1'">
|
||||
<th class="perc">Imposta bollo</th>
|
||||
</xsl:if>
|
||||
|
||||
<th class="perc">Art. 73</th>
|
||||
<th >Numero documento</th>
|
||||
<th class="data">Data documento</th>
|
||||
<th >Codice destinatario</th>
|
||||
|
@ -1878,10 +1876,10 @@
|
|||
fattura
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD02'">
|
||||
acconto/anticipo su fattura
|
||||
acconto / anticipo su fattura
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD03'">
|
||||
acconto/anticipo su parcella
|
||||
acconto / anticipo su parcella
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD04'">
|
||||
nota di credito
|
||||
|
@ -1896,16 +1894,16 @@
|
|||
integrazione fattura reverse charge interno
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD17'">
|
||||
integrazione/autofattura per acquisto servizi da estero
|
||||
integrazione/autofattura per acquisto servizi dall'estero
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD18'">
|
||||
integrazione per acquisto beni intracomunitari
|
||||
integrazione per acquisto di beni intracomunitari
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD19'">
|
||||
integrazione/autofattura per acquisto beni ex art.17 c.2 DPR 633/72
|
||||
integrazione/autofattura per acquisto di beni ex art.17 c.2 DPR 633/72
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD20'">
|
||||
autofattura per regolarizzazione e integrazione delle fatture - art.6 c.8 d.lgs.471/97 o art.46 c.5 D.L.331/93
|
||||
autofattura per regolarizzazione e integrazione delle fatture (ex art.6 c.8 e 9-bis d.lgs.471/97 o art.46 c.5 D.L. 331/93
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD21'">
|
||||
autofattura per splafonamento
|
||||
|
@ -1914,22 +1912,22 @@
|
|||
estrazione beni da Deposito IVA
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD23'">
|
||||
estrazione beni da Deposito IVA con versamento IVA
|
||||
estrazione beni da Deposito IVA con versamento dell'IVA
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD24'">
|
||||
fattura differita - art.21 c.4 lett. a)
|
||||
fattura differita di cui all'art.21, comma 4, terzo periodo lett. a) DPR 633/72
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD25'">
|
||||
fattura differita - art.21 c.4 terzo periodo lett. b)
|
||||
fattura differita di cui all'art.21, comma 4, terzo periodo lett. b) DPR 633/72
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD26'">
|
||||
cessione di beni ammortizzabili e per passaggi interni - art.36 DPR 633/72
|
||||
cessione di beni ammortizzabili e per passaggi interni (ex art.36 DPR 633/72)
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD27'">
|
||||
fattura per autoconsumo o per cessioni gratuite senza rivalsa
|
||||
</xsl:when>
|
||||
<xsl:when test="$TD='TD28'">
|
||||
fattura per acquisti da San Marino
|
||||
<xsl:when test="$TD='TD28'">
|
||||
acquisti da San Marino con IVA (fattura cartacea)
|
||||
</xsl:when>
|
||||
|
||||
<!--FPRS-->
|
||||
|
@ -1944,26 +1942,19 @@
|
|||
</xsl:when>
|
||||
<xsl:when test="$TD=''">
|
||||
</xsl:when>
|
||||
<!--<xsl:otherwise>
|
||||
<span>(!!! codice non previsto !!!)</span>
|
||||
</xsl:otherwise>-->
|
||||
</xsl:choose>
|
||||
|
||||
</xsl:if>
|
||||
</td>
|
||||
|
||||
<xsl:if test="$IsFPRS='0'">
|
||||
<td class="ritenuta" >
|
||||
<xsl:if test="DatiGenerali/DatiGeneraliDocumento/Art73">
|
||||
<xsl:value-of select="DatiGenerali/DatiGeneraliDocumento/Art73" />
|
||||
</xsl:if>
|
||||
</td>
|
||||
</xsl:if>
|
||||
|
||||
<xsl:if test="$IsFPRS='1'">
|
||||
<td class="textCenter">
|
||||
<xsl:if test="DatiGenerali/DatiGeneraliDocumento/BolloVirtuale">
|
||||
<xsl:value-of select="DatiGenerali/DatiGeneraliDocumento/BolloVirtuale" />
|
||||
</xsl:if>
|
||||
</td>
|
||||
</xsl:if>
|
||||
<td class="ritenuta" >
|
||||
<xsl:if test="DatiGenerali/DatiGeneraliDocumento/Art73">
|
||||
<xsl:value-of select="DatiGenerali/DatiGeneraliDocumento/Art73" />
|
||||
</xsl:if>
|
||||
</td>
|
||||
|
||||
<td class="textCenter" >
|
||||
|
||||
|
@ -2018,8 +2009,7 @@
|
|||
<xsl:if test="DatiGenerali/DatiGeneraliDocumento/Causale">
|
||||
|
||||
<xsl:for-each select="DatiGenerali/DatiGeneraliDocumento/Causale" >
|
||||
<xsl:value-of select="." />
|
||||
<br/>
|
||||
<xsl:value-of select="." /><br/>
|
||||
</xsl:for-each>
|
||||
|
||||
</xsl:if>
|
||||
|
@ -2534,7 +2524,7 @@
|
|||
<tr >
|
||||
|
||||
<th colspan="2">
|
||||
Imposta bollo
|
||||
Importo bollo
|
||||
</th>
|
||||
<th colspan="3">
|
||||
Sconto/Maggiorazione
|
||||
|
@ -3163,4 +3153,4 @@
|
|||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
</xsl:stylesheet>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -70,7 +70,6 @@ class Note extends Model
|
|||
database()->delete('zz_notes', $data);
|
||||
}
|
||||
|
||||
|
||||
/* Relazioni Eloquent */
|
||||
|
||||
public function user()
|
||||
|
|
|
@ -695,7 +695,7 @@ class Prints
|
|||
$mpdf->WriteHTML('<div style="position:absolute; bottom: 13mm; margin-right: '.($settings['margins']['right']).'mm">'.$foot.'</div>');
|
||||
}
|
||||
|
||||
$id_files = $dbo->select('zz_files_print', 'id_file', ['id_print' => $id_print]);
|
||||
$id_files = $dbo->select('zz_files_print', 'id_file', [], ['id_print' => $id_print]);
|
||||
$has_pdf = false;
|
||||
foreach ($id_files as $id_file) {
|
||||
$fil = Models\Upload::find($id_file)->first();
|
||||
|
|
|
@ -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'],
|
||||
|
|
|
@ -172,7 +172,7 @@ if ($options['pricing']) {
|
|||
echo "
|
||||
<th class='text-center' style='width:15%'>".tr('Prezzo unitario', [], ['upper' => true])."</th>
|
||||
<th class='text-center' style='width:10%'>".tr('IVA', [], ['upper' => true])." (%)</th>
|
||||
<th class='text-center' style='width:15%'>".($options['hide-total'] ? tr('Importo ivato', [], ['upper' => true]) : tr('Importo', [], ['upper' => true]))."</th>";
|
||||
<th class='text-center' style='width:15%'>".($options['hide-total'] ? tr('Importo ivato', [], ['upper' => true]) : tr('Importo', [], ['upper' => true])).'</th>';
|
||||
}
|
||||
|
||||
echo '
|
||||
|
@ -280,8 +280,8 @@ foreach ($righe as $key => $riga) {
|
|||
'.Translator::numberToLocale($riga->aliquota->percentuale, 2).'
|
||||
</td>';
|
||||
|
||||
// Imponibile
|
||||
echo '
|
||||
// Imponibile
|
||||
echo '
|
||||
<td class="text-right" style="vertical-align: middle" >
|
||||
'.(($options['hide-total'] || $prezzi_ivati) ? moneyFormat($riga->totale) : moneyFormat($riga->totale_imponibile)).'
|
||||
</td>';
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
*
|
||||
!.gitignore
|
|
@ -1,110 +0,0 @@
|
|||
<?php
|
||||
|
||||
class AcceptanceTester extends \Codeception\Actor
|
||||
{
|
||||
use _generated\AcceptanceTesterActions;
|
||||
use \Codeception\Lib\Actor\Shared\Retry;
|
||||
|
||||
/**
|
||||
* Clicca sul pulsante e attende la conclusione del caricamento.
|
||||
*
|
||||
* @param $link
|
||||
* @param $context
|
||||
*/
|
||||
public function clickAndWait($link, $context = null)
|
||||
{
|
||||
$t = $this;
|
||||
|
||||
$t->retryClick($link, $context);
|
||||
|
||||
$t->waitForElementNotVisible('#main_loading');
|
||||
$t->waitForElementNotVisible('#mini-loader');
|
||||
}
|
||||
|
||||
/**
|
||||
* Clicca sul pulsante e attende la conclusione del caricamento del modal.
|
||||
*
|
||||
* @param $link
|
||||
* @param $context
|
||||
*/
|
||||
public function clickAndWaitModal($link, $context = null)
|
||||
{
|
||||
$t = $this;
|
||||
|
||||
$t->clickAndWait($link, $context);
|
||||
|
||||
$t->waitForElementVisible('.modal');
|
||||
$t->wait(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clicca sul pulsante dentro il modal.
|
||||
*
|
||||
* @param $link
|
||||
*/
|
||||
public function clickModalButton($link)
|
||||
{
|
||||
$t = $this;
|
||||
|
||||
$t->clickAndWait($link, '.modal-content');
|
||||
}
|
||||
|
||||
/**
|
||||
* Clicca sul pulsante e attende la conclusione del caricamento del modal SWAL.
|
||||
*
|
||||
* @param $link
|
||||
* @param $context
|
||||
*/
|
||||
public function clickAndWaitSwal($link, $context = null)
|
||||
{
|
||||
$t = $this;
|
||||
|
||||
$t->clickAndWait($link, $context);
|
||||
|
||||
$t->waitForElementVisible('.swal2-modal');
|
||||
}
|
||||
|
||||
/**
|
||||
* Clicca sul pulsante dentro il modal SWAL.
|
||||
*
|
||||
* @param $link
|
||||
*/
|
||||
public function clickSwalButton($link)
|
||||
{
|
||||
$t = $this;
|
||||
|
||||
$t->clickAndWait($link, '.swal2-buttonswrapper');
|
||||
}
|
||||
|
||||
public function navigateTo($link)
|
||||
{
|
||||
$this->wait(0.5);
|
||||
|
||||
$this->clickAndWait($link, '.sidebar');
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua il login dalla pagina principale.
|
||||
*
|
||||
* @param string $username
|
||||
* @param string $password
|
||||
*/
|
||||
public function login($username, $password)
|
||||
{
|
||||
$t = $this;
|
||||
|
||||
// Operazioni di login
|
||||
$t->amOnPage('/');
|
||||
|
||||
$t->fillField('username', $username);
|
||||
$t->fillField('password', $password);
|
||||
|
||||
$t->clickAndWait('Accedi');
|
||||
|
||||
// Controlla il completamento del login
|
||||
$t->see($username, '.user-panel');
|
||||
|
||||
// Rimozione barra di debug
|
||||
$t->executeJS('$(".phpdebugbar-close-btn").click()');
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Inherited Methods.
|
||||
*
|
||||
* @method void wantToTest($text)
|
||||
* @method void wantTo($text)
|
||||
* @method void execute($callable)
|
||||
* @method void expectTo($prediction)
|
||||
* @method void expect($prediction)
|
||||
* @method void amGoingTo($argumentation)
|
||||
* @method void am($role)
|
||||
* @method void lookForwardTo($achieveValue)
|
||||
* @method void comment($description)
|
||||
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
|
||||
*
|
||||
* @SuppressWarnings(PHPMD)
|
||||
*/
|
||||
class FunctionalTester extends \Codeception\Actor
|
||||
{
|
||||
use _generated\FunctionalTesterActions;
|
||||
|
||||
/*
|
||||
* Define custom actions here
|
||||
*/
|
||||
}
|
|
@ -1,73 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Helper;
|
||||
|
||||
// here you can define custom actions
|
||||
// all public methods declared in helper class will be available in $t
|
||||
|
||||
class Acceptance extends \Codeception\Module
|
||||
{
|
||||
/**
|
||||
* Imposta il valore di un select gestito dal framework Select2.
|
||||
*
|
||||
* @param $selector
|
||||
* @param $option
|
||||
* @param int $timeout seconds. Default to 1
|
||||
*/
|
||||
public function select2($selector, $option, $timeout = null)
|
||||
{
|
||||
$select2 = $this->getModule('\Helper\Select2');
|
||||
|
||||
$select2->openSelect2($selector);
|
||||
$select2->selectOptionForSelect2($selector, $option, $timeout);
|
||||
$select2->closeSelect2($selector);
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il valore di un select gestito dal framework Select2.
|
||||
*
|
||||
* @param $selector
|
||||
* @param $option
|
||||
* @param int $timeout seconds. Default to 1
|
||||
*/
|
||||
public function select2ajax($selector, $option, $timeout = null)
|
||||
{
|
||||
$select2 = $this->getModule('\Helper\Select2Ajax');
|
||||
$t = $this->getAcceptanceModule();
|
||||
|
||||
$select2->openSelect2($selector);
|
||||
$t->wait(1);
|
||||
$select2->selectByPosition($selector, $option, $timeout);
|
||||
$select2->closeSelect2($selector);
|
||||
}
|
||||
|
||||
public function seePageHasElement($element)
|
||||
{
|
||||
try {
|
||||
$this->getAcceptanceModule()->seeElement($element);
|
||||
} catch (\Exception $f) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function expandSidebarLink($link)
|
||||
{
|
||||
$t = $this->getAcceptanceModule();
|
||||
|
||||
if (!$this->seePageHasElement("descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' sidebar ')]/descendant-or-self::*/li[contains(., '".$link."') and @class and contains(concat(' ', normalize-space(@class), ' '), ' menu-open ')]")) {
|
||||
$t->click($link, '.sidebar');
|
||||
$t->wait(1);
|
||||
}
|
||||
}
|
||||
|
||||
protected function getAcceptanceModule()
|
||||
{
|
||||
if (!$this->hasModule('WebDriver')) {
|
||||
throw new \Exception('You must enable the WebDriver module', 1);
|
||||
}
|
||||
|
||||
return $this->getModule('WebDriver');
|
||||
}
|
||||
}
|
|
@ -1,225 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Helper\Common;
|
||||
|
||||
use AcceptanceTester;
|
||||
|
||||
class RowHelper extends \Codeception\Module
|
||||
{
|
||||
/** @param string */
|
||||
protected $tablePattern = "//div[@class='panel-heading' and contains(string(), 'Righe')]/parent::*//table//tr[contains(string(), '|name|')]";
|
||||
protected $dir;
|
||||
|
||||
/**
|
||||
* Aggiunge un nuovo sconto.
|
||||
*
|
||||
* @param string $value
|
||||
* @param int $type
|
||||
*/
|
||||
public function addDiscount(AcceptanceTester $t, $descrizione, $value, $type)
|
||||
{
|
||||
$t->wait(0.5);
|
||||
|
||||
// Apre il modal
|
||||
$t->clickAndWaitModal('Sconto/maggiorazione', '#tab_0');
|
||||
|
||||
$t->fillField('#descrizione_riga', $descrizione);
|
||||
|
||||
if ($type == 'UNT') {
|
||||
$t->fillField('#sconto_unitario', $value);
|
||||
} else {
|
||||
$t->fillField('#sconto_percentuale', $value);
|
||||
}
|
||||
|
||||
// Effettua il submit
|
||||
$t->clickAndWait('Aggiungi', '.modal');
|
||||
|
||||
// Controlla il salvataggio finale
|
||||
$t->see('Sconto/maggiorazione aggiunto');
|
||||
}
|
||||
|
||||
/**
|
||||
* Aggiunge una nuova riga.
|
||||
*
|
||||
* @param string $descrizione
|
||||
* @param int $qta
|
||||
* @param float $prezzo
|
||||
* @param int $sconto
|
||||
* @param string $tipo_sconto
|
||||
* @param int $id_iva
|
||||
* @param int $id_rivalsa_inps
|
||||
* @param int $id_ritenuta_acconto
|
||||
*/
|
||||
public function addRow(AcceptanceTester $t, $descrizione, $qta, $prezzo, $sconto = 0, $tipo_sconto = 'UNT', $id_iva = null, $id_rivalsa_inps = null, $id_ritenuta_acconto = null)
|
||||
{
|
||||
$t->wait(0.5);
|
||||
|
||||
// Apre il modal
|
||||
$t->clickAndWaitModal('Riga', '#tab_0');
|
||||
|
||||
$this->fill($t, $descrizione, $qta, $prezzo, $sconto, $tipo_sconto, $id_iva, $id_rivalsa_inps, $id_ritenuta_acconto);
|
||||
|
||||
// Effettua il submit
|
||||
$t->clickAndWait('Aggiungi', '.modal');
|
||||
|
||||
// Controlla il salvataggio finale
|
||||
$t->see('Riga aggiunta');
|
||||
}
|
||||
|
||||
/**
|
||||
* Aggiunge un nuovo articolo.
|
||||
*
|
||||
* @param string $descrizione
|
||||
* @param int $qta
|
||||
* @param float $prezzo
|
||||
* @param int $sconto
|
||||
* @param string $tipo_sconto
|
||||
* @param int $id_iva
|
||||
* @param int $id_rivalsa_inps
|
||||
* @param int $id_ritenuta_acconto
|
||||
*/
|
||||
public function addArticle(AcceptanceTester $t, $id_articolo, $descrizione, $qta, $prezzo, $sconto = 0, $tipo_sconto = 'UNT', $id_iva = null, $id_rivalsa_inps = null, $id_ritenuta_acconto = null)
|
||||
{
|
||||
$t->wait(0.5);
|
||||
|
||||
// Apre il modal
|
||||
$t->clickAndWaitModal('Articolo', '#tab_0');
|
||||
|
||||
$t->select2ajax('#idarticolo', $id_articolo);
|
||||
$this->fill($t, $descrizione, $qta, $prezzo, $sconto, $tipo_sconto, $id_iva, $id_rivalsa_inps, $id_ritenuta_acconto);
|
||||
|
||||
// Effettua il submit
|
||||
$t->clickAndWait('Aggiungi', '.modal');
|
||||
|
||||
// Controlla il salvataggio finale
|
||||
$t->see('Articolo aggiunto');
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function.
|
||||
*/
|
||||
public function testImporti(AcceptanceTester $t, $direzione = 'entrata')
|
||||
{
|
||||
$this->dir = $direzione;
|
||||
|
||||
// Righe di test (issue #98)
|
||||
$this->addRow($t, 'Riga 1', 1, 34);
|
||||
|
||||
$this->addRow($t, 'Riga 2', 1, 17.44);
|
||||
$this->addRow($t, 'Riga 3', 48, 0.52);
|
||||
$this->addRow($t, 'Riga 4', 66, 0.44);
|
||||
$this->addRow($t, 'Riga 5', 1, 104.90);
|
||||
$this->addRow($t, 'Riga 6', 1, 2);
|
||||
|
||||
$t->see('212,34', $this->getFinalValue('Imponibile'));
|
||||
$t->see('46,71', $this->getFinalValue('IVA'));
|
||||
$t->see('259,05', $this->getFinalValue('Totale'));
|
||||
|
||||
// Righe di controllo sugli sconti
|
||||
$this->addRow($t, 'Riga 7 con sconto in euro', 15, 12, 2);
|
||||
$this->addRow($t, 'Riga 8 con sconto percentuale', 15, 10, 20, 'PRC');
|
||||
|
||||
$t->see('542,34', $this->getFinalValue('Imponibile'));
|
||||
$t->see('60,00', $this->getFinalValue('Sconto'));
|
||||
$t->see('482,34', $this->getFinalValue('Totale imponibile'));
|
||||
$t->see('106,11', $this->getFinalValue('IVA'));
|
||||
$t->see('588,45', $this->getFinalValue('Totale'));
|
||||
|
||||
// Sconto globale in euro
|
||||
$this->addDiscount($t, 'Sconto unitario', 100, 'UNT');
|
||||
|
||||
$t->see('542,34', $this->getFinalValue('Imponibile'));
|
||||
$t->see('160,00', $this->getFinalValue('Sconto'));
|
||||
$t->see('382,34', $this->getFinalValue('Totale imponibile'));
|
||||
$t->see('84,11', $this->getFinalValue('IVA'));
|
||||
$t->see('466,45', $this->getFinalValue('Totale'));
|
||||
|
||||
// Sconto globale in percentuale
|
||||
$this->addDiscount($t, null, 10, 'PRC');
|
||||
|
||||
$this->delete($t, 'Sconto unitario');
|
||||
|
||||
$t->see('542,34', $this->getFinalValue('Imponibile'));
|
||||
$t->see('98,23', $this->getFinalValue('Sconto'));
|
||||
$t->see('444,11', $this->getFinalValue('Totale imponibile'));
|
||||
$t->see('97,70', $this->getFinalValue('IVA'));
|
||||
$t->see('541,81', $this->getFinalValue('Totale'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Completa le informazioni per la creazione di un nuovo elemento.
|
||||
*
|
||||
* @param [type] $descrizione
|
||||
* @param [type] $qta
|
||||
* @param [type] $prezzo
|
||||
* @param int $sconto
|
||||
* @param string $tipo_sconto
|
||||
* @param [type] $id_iva
|
||||
* @param [type] $id_rivalsa_inps
|
||||
* @param [type] $id_ritenuta_acconto
|
||||
*/
|
||||
protected function fill(AcceptanceTester $t, $descrizione, $qta, $prezzo, $sconto = 0, $tipo_sconto = 'UNT', $id_iva = null, $id_rivalsa_inps = null, $id_ritenuta_acconto = null)
|
||||
{
|
||||
$t->fillField('#descrizione_riga', $descrizione);
|
||||
$t->fillField('#qta', $qta);
|
||||
|
||||
$t->fillField('#prezzo_unitario', $prezzo);
|
||||
|
||||
if (!empty($sconto)) {
|
||||
$t->fillField('#sconto', $sconto);
|
||||
|
||||
if (in_array($tipo_sconto, ['PRC', 'UNT'])) {
|
||||
$t->select2ajax('#tipo_sconto', $tipo_sconto == 'PRC' ? 0 : 1);
|
||||
}
|
||||
}
|
||||
|
||||
if ($id_iva) {
|
||||
$t->select2('#idiva', $id_iva);
|
||||
}
|
||||
|
||||
if ($id_rivalsa_inps) {
|
||||
$t->select2('#id_rivalsa_inps', $id_rivalsa_inps);
|
||||
}
|
||||
if ($id_ritenuta_acconto) {
|
||||
$t->select2('#id_ritenuta_acconto', $id_ritenuta_acconto);
|
||||
}
|
||||
}
|
||||
|
||||
protected function delete(AcceptanceTester $t, $descrizione)
|
||||
{
|
||||
$path = $this->getPattern($descrizione).'//td[last()]';
|
||||
|
||||
$t->wait(0.5);
|
||||
$t->click('.btn-danger', $path);
|
||||
$t->acceptPopup();
|
||||
|
||||
$t->waitForElementNotVisible('#main_loading');
|
||||
$t->waitForElementNotVisible('#mini-loader');
|
||||
|
||||
$t->see('Riga eliminata!');
|
||||
|
||||
//$t->click('#save', '#tab_0');
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function.
|
||||
*
|
||||
* @param string $pattern
|
||||
*/
|
||||
protected function setPattern($pattern)
|
||||
{
|
||||
$this->tablePattern = $pattern;
|
||||
}
|
||||
|
||||
protected function getPattern($name)
|
||||
{
|
||||
return str_replace('|name|', $name, $this->tablePattern);
|
||||
}
|
||||
|
||||
protected function getFinalValue($name)
|
||||
{
|
||||
$name = strtoupper($name);
|
||||
|
||||
return $this->getPattern($name).'//td[2]';
|
||||
}
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Helper;
|
||||
|
||||
// here you can define custom actions
|
||||
// all public methods declared in helper class will be available in $I
|
||||
|
||||
class Functional extends \Codeception\Module
|
||||
{
|
||||
}
|
|
@ -1,232 +0,0 @@
|
|||
<?php
|
||||
|
||||
// @codingStandardsIgnoreFile
|
||||
|
||||
namespace Helper;
|
||||
|
||||
// Select2 version 4.0 or greater helpers for the jQuery based replacement for select boxes.
|
||||
// See: http://select2.github.io/select2
|
||||
// Author: Tortue Torche <tortuetorche@spam.me>
|
||||
// Author: Florian Krämer
|
||||
// Author: Tom Walsh
|
||||
// License: MIT
|
||||
//
|
||||
// Installation:
|
||||
// * Put this file in your 'tests/_support/Helper' directory
|
||||
// * Add it in your 'tests/acceptance.suite.yml' file, like this:
|
||||
// class_name: AcceptanceTester
|
||||
// modules:
|
||||
// enabled:
|
||||
// - WebDriver:
|
||||
// url: 'http://localhost:8000'
|
||||
// # ...
|
||||
// - \Helper\Select2
|
||||
//
|
||||
// * Then run ./vendor/bin/codecept build
|
||||
|
||||
class Select2 extends \Codeception\Module
|
||||
{
|
||||
/**
|
||||
* Wait until the select2 component is loaded.
|
||||
*
|
||||
* @param $selector
|
||||
* @param int $timeout seconds. Default to 5
|
||||
*/
|
||||
public function waitForSelect2($selector, $timeout = 5)
|
||||
{
|
||||
$t = $this->getAcceptanceModule();
|
||||
$selector = $this->getSelect2Selector($selector);
|
||||
$t->waitForJS('return !!jQuery("'.$selector.'").data("select2");', $timeout);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that the given option is not selected.
|
||||
*
|
||||
* @param $selector
|
||||
* @param $optionText
|
||||
* @param int $timeout seconds. Default to 5
|
||||
*/
|
||||
public function dontSeeOptionIsSelectedForSelect2($selector, $optionText, $timeout = 5)
|
||||
{
|
||||
$t = $this->getAcceptanceModule();
|
||||
$selector = $this->getSelect2Selector($selector);
|
||||
$this->waitForSelect2($selector, $timeout);
|
||||
$script = $this->_optionIsSelectedForSelect2($selector, $optionText, false);
|
||||
$t->waitForJS($script, $timeout);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that the given option is selected.
|
||||
*
|
||||
* @param $selector
|
||||
* @param $optionText
|
||||
* @param int $timeout seconds. Default to 5
|
||||
*/
|
||||
public function seeOptionIsSelectedForSelect2($selector, $optionText, $timeout = 5)
|
||||
{
|
||||
$t = $this->getAcceptanceModule();
|
||||
$selector = $this->getSelect2Selector($selector);
|
||||
$this->waitForSelect2($selector, $timeout);
|
||||
$script = $this->_optionIsSelectedForSelect2($selector, $optionText);
|
||||
$t->waitForJS($script, $timeout);
|
||||
}
|
||||
|
||||
/**
|
||||
* Selects an option in a select2 component.
|
||||
*
|
||||
* $t->selectOptionForSelect2('#my_select2', 'Option value');
|
||||
* $t->selectOptionForSelect2('#my_select2', ['Option value 1', 'Option value 2']);
|
||||
* $t->selectOptionForSelect2('#my_select2', ['text' => 'Option text']);
|
||||
* $t->selectOptionForSelect2('#my_select2', ['id' => 'Option value', 'text' => 'Option text']);
|
||||
*
|
||||
* @param $selector
|
||||
* @param $option
|
||||
* @param int $timeout seconds. Default to 1
|
||||
*/
|
||||
public function selectOptionForSelect2($selector, $option, $timeout = 5)
|
||||
{
|
||||
$t = $this->getAcceptanceModule();
|
||||
$selector = $this->getSelect2Selector($selector);
|
||||
$this->waitForSelect2($selector, $timeout);
|
||||
|
||||
if (is_int($option)) {
|
||||
$option = (string) $option;
|
||||
}
|
||||
|
||||
if (is_string($option) || (is_array($option) && array_values($option) === $option)) {
|
||||
$t->executeJS('jQuery("'.$selector.'").select2("val", '.json_encode($option).');', [$timeout]);
|
||||
$t->executeJS('jQuery("'.$selector.'").trigger("select2:select").trigger("change");', [$timeout]);
|
||||
} elseif (is_array($option)) {
|
||||
$optionId = 'null';
|
||||
if (isset($option['text']) && empty($option['id'])) {
|
||||
$optionText = $option['text'];
|
||||
$optionId = <<<EOT
|
||||
function() {
|
||||
if (!\$.expr[':'].textEquals) {
|
||||
// Source: http://stackoverflow.com/a/26431267
|
||||
\$.expr[':'].textEquals = function(el, i, m) {
|
||||
var searchText = m[3];
|
||||
return $(el).text().trim() === searchText;
|
||||
}
|
||||
}
|
||||
// Find select option by text
|
||||
return \$("$selector").find("option:textEquals('$optionText'):first").val();
|
||||
}();
|
||||
EOT;
|
||||
}
|
||||
$jsonOption = json_encode($option);
|
||||
$script = <<<EOT
|
||||
(function (\$) {
|
||||
var option = $jsonOption;
|
||||
if (!option.id) {
|
||||
option.id = $optionId;
|
||||
}
|
||||
\$("$selector").val(option.id).trigger('select2:select').trigger('change');
|
||||
}(jQuery));
|
||||
EOT;
|
||||
$t->executeJS($script, [$timeout]);
|
||||
} else {
|
||||
$t->fail();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unselect an option in the given select2 component.
|
||||
*
|
||||
* @param $selector
|
||||
* @param $option
|
||||
* @param int $timeout seconds. Default to 1
|
||||
*/
|
||||
public function unselectOptionForSelect2($selector, $option = null, $timeout = 1)
|
||||
{
|
||||
$t = $this->getAcceptanceModule();
|
||||
$selector = $this->getSelect2Selector($selector);
|
||||
$this->waitForSelect2($selector, $timeout);
|
||||
if ($option && is_string($option)) {
|
||||
$script = <<<EOT
|
||||
(function (\$) {
|
||||
var values = \$("$selector").select2("val");
|
||||
var index = values.indexOf("$option");
|
||||
if (index > -1) {
|
||||
values.splice(index, 1);
|
||||
}
|
||||
\$("$selector").select2("val", values);
|
||||
\$(\$("$selector").trigger("select2:select").trigger("change");
|
||||
}(jQuery));
|
||||
EOT;
|
||||
$t->executeJS($script, [$timeout]);
|
||||
} else {
|
||||
$t->executeJS('jQuery("'.$selector.'").select2("val", "");', [$timeout]);
|
||||
$t->executeJS('jQuery("'.$selector.'").trigger("select2:select").trigger("change");', [$timeout]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Open the Select2 component.
|
||||
*
|
||||
* @param string $selector
|
||||
*/
|
||||
public function openSelect2($selector)
|
||||
{
|
||||
$t = $this->getAcceptanceModule();
|
||||
$selector = $this->getSelect2Selector($selector);
|
||||
$this->waitForSelect2($selector);
|
||||
$t->executeJS('jQuery("'.$selector.'").select2("open");');
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the Select2 component.
|
||||
*
|
||||
* @param string $selector
|
||||
*/
|
||||
public function closeSelect2($selector)
|
||||
{
|
||||
$t = $this->getAcceptanceModule();
|
||||
$selector = $this->getSelect2Selector($selector);
|
||||
$this->waitForSelect2($selector);
|
||||
$t->executeJS('jQuery("'.$selector.'").select2("close");');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $selector
|
||||
* @param $optionText
|
||||
* @param bool $expectedReturn Default to true
|
||||
*
|
||||
* @return string JavaScript
|
||||
*/
|
||||
protected function _optionIsSelectedForSelect2($selector, $optionText, $expectedReturn = true)
|
||||
{
|
||||
$returnFlag = $expectedReturn === true ? '' : '!';
|
||||
|
||||
return $script = <<<EOT
|
||||
return (function (\$) {
|
||||
var isSelected = false;
|
||||
var values = \$("$selector").val();
|
||||
values = \$.isArray(values ) ? values : [values];
|
||||
if (values && values.length > 0) {
|
||||
isSelected = values.some(function (data) {
|
||||
if (data && data.text && data.text === "$optionText") {
|
||||
return data;
|
||||
}
|
||||
});
|
||||
}
|
||||
return ${returnFlag}isSelected;
|
||||
}(jQuery));
|
||||
EOT;
|
||||
}
|
||||
|
||||
protected function getSelect2Selector($selector)
|
||||
{
|
||||
return $selector;
|
||||
//return preg_replace("/^\#((?!s2id_).+)$/", '#s2id_$1', $selector);
|
||||
}
|
||||
|
||||
protected function getAcceptanceModule()
|
||||
{
|
||||
if (!$this->hasModule('WebDriver')) {
|
||||
throw new \Exception('You must enable the WebDriver module', 1);
|
||||
}
|
||||
|
||||
return $this->getModule('WebDriver');
|
||||
}
|
||||
}
|
|
@ -1,88 +0,0 @@
|
|||
<?php
|
||||
|
||||
// @codingStandardsIgnoreFile
|
||||
|
||||
namespace Helper;
|
||||
|
||||
/**
|
||||
* Select2 version 4.0 or greater helpers for the jQuery based replacement for select boxes (Ajax version).
|
||||
*
|
||||
* Installation:
|
||||
* - Put this file in your 'tests/_support/Helper' directory
|
||||
* - Add it in your 'tests/acceptance.suite.yml' file, like this:
|
||||
* class_name: AcceptanceTester
|
||||
* modules:
|
||||
* enabled:
|
||||
* - WebDriver:
|
||||
* # ...
|
||||
* - \Helper\Select2Ajax
|
||||
* - Run ./vendor/bin/codecept build
|
||||
*
|
||||
* @see http://select2.github.io/select2
|
||||
*
|
||||
* @author Thomas Zilio
|
||||
* @license MIT
|
||||
*/
|
||||
class Select2Ajax extends Select2
|
||||
{
|
||||
/**
|
||||
* Selects an option in a select2 component.
|
||||
*
|
||||
* @param $selector
|
||||
* @param $option
|
||||
* @param int $timeout seconds. Default to 1
|
||||
*/
|
||||
public function selectByTextOrId($selector, $option, $timeout = 5)
|
||||
{
|
||||
$code = '
|
||||
$(options).each(function () {
|
||||
if($(this).text == "'.$option.'" || $(this).id == "'.$option.'") {
|
||||
$("'.$selector.'").selectSetNew(this.id, this.text);
|
||||
}
|
||||
});';
|
||||
|
||||
$this->execute($selector, $timeout, $code);
|
||||
}
|
||||
|
||||
public function selectByPosition($selector, $position, $timeout = 5)
|
||||
{
|
||||
$code = '
|
||||
var result = options['.$position.'];
|
||||
$("'.$selector.'").selectSetNew(result.id, result.text);';
|
||||
|
||||
$this->execute($selector, $timeout, $code);
|
||||
}
|
||||
|
||||
protected function execute($selector, $timeout, $code)
|
||||
{
|
||||
$t = $this->getAcceptanceModule();
|
||||
$selector = $this->getSelect2Selector($selector);
|
||||
$this->waitForSelect2($selector, $timeout);
|
||||
|
||||
if (is_int($option)) {
|
||||
$option = (string) $option;
|
||||
}
|
||||
|
||||
$results_selector = str_replace('#', '', $selector);
|
||||
|
||||
$script = <<<EOT
|
||||
$(document).ready(function() {
|
||||
var children = $("#select2-$results_selector-results").children();
|
||||
|
||||
var options = [];
|
||||
children.each(function () {
|
||||
var data = $(this)[0];
|
||||
var output = Object.entries(data).map(([key, value]) => ({key,value}));
|
||||
|
||||
if(output[0]) {
|
||||
options.push(output[0].value.data);
|
||||
}
|
||||
})
|
||||
|
||||
$code
|
||||
});
|
||||
EOT;
|
||||
|
||||
$t->executeJS($script, [$timeout]);
|
||||
}
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Helper;
|
||||
|
||||
// here you can define custom actions
|
||||
// all public methods declared in helper class will be available in $I
|
||||
|
||||
class Unit extends \Codeception\Module
|
||||
{
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Inherited Methods.
|
||||
*
|
||||
* @method void wantToTest($text)
|
||||
* @method void wantTo($text)
|
||||
* @method void execute($callable)
|
||||
* @method void expectTo($prediction)
|
||||
* @method void expect($prediction)
|
||||
* @method void amGoingTo($argumentation)
|
||||
* @method void am($role)
|
||||
* @method void lookForwardTo($achieveValue)
|
||||
* @method void comment($description)
|
||||
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
|
||||
*
|
||||
* @SuppressWarnings(PHPMD)
|
||||
*/
|
||||
class UnitTester extends \Codeception\Actor
|
||||
{
|
||||
use _generated\UnitTesterActions;
|
||||
|
||||
/*
|
||||
* Define custom actions here
|
||||
*/
|
||||
}
|
|
@ -1,2 +0,0 @@
|
|||
*
|
||||
!.gitignore
|
|
@ -1,22 +0,0 @@
|
|||
# Codeception Test Suite Configuration
|
||||
#
|
||||
# Suite for acceptance tests.
|
||||
# Perform tests in browser using the WebDriver or PhpBrowser.
|
||||
# If you need both WebDriver and PHPBrowser tests - create a separate suite.
|
||||
|
||||
actor: AcceptanceTester
|
||||
modules:
|
||||
enabled:
|
||||
- WebDriver:
|
||||
browser: chrome
|
||||
port: 9515 # ChromeDriver port
|
||||
window_size: false
|
||||
capabilities:
|
||||
chromeOptions:
|
||||
args: ["--headless", "--disable-gpu"]
|
||||
- \Helper\Acceptance
|
||||
- \Helper\Select2
|
||||
- \Helper\Select2Ajax
|
||||
- \Helper\Common\RowHelper
|
||||
step_decorators:
|
||||
- \Codeception\Step\Retry
|
|
@ -1,92 +0,0 @@
|
|||
<?php
|
||||
|
||||
class AnagraficheCest
|
||||
{
|
||||
public function _before(AcceptanceTester $t)
|
||||
{
|
||||
// Effettua l'accesso con le credenziali fornite
|
||||
$t->login('admin', 'admin');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova anagrafica di tipo Cliente.
|
||||
*/
|
||||
public function testAnagraficaCliente(AcceptanceTester $t)
|
||||
{
|
||||
$this->addAnag($t, 'Cliente', 1, '05024030289');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova anagrafica di tipo Tecnico.
|
||||
*/
|
||||
public function testAnagraficaTecnico(AcceptanceTester $t)
|
||||
{
|
||||
$this->addAnag($t, 'Tecnico', 2, '05024030289');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova anagrafica di tipo Fornitore.
|
||||
*/
|
||||
public function testAnagraficaFornitore(AcceptanceTester $t)
|
||||
{
|
||||
$this->addAnag($t, 'Fornitore', 4, '05024030289');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova anagrafica di tipo Vettore.
|
||||
*/
|
||||
public function testAnagraficaVettore(AcceptanceTester $t)
|
||||
{
|
||||
$this->addAnag($t, 'Vettore', 5, '05024030289');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova anagrafica di tipo Agente.
|
||||
*/
|
||||
public function testAnagraficaAgente(AcceptanceTester $t)
|
||||
{
|
||||
$this->addAnag($t, 'Agente', 6, '05024030289');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova anagrafica.
|
||||
*/
|
||||
protected function addAnag(AcceptanceTester $t, $name = 'ANAGRAFICA DI PROVA', $tipo = 1, $partita_iva = '')
|
||||
{
|
||||
// Seleziona il modulo da aprire
|
||||
$t->navigateTo('Anagrafiche');
|
||||
|
||||
// Apre la schermata di nuovo elemento
|
||||
$t->clickAndWaitModal('.btn-primary', '#tabs');
|
||||
|
||||
// Completa i campi per il nuovo elemento
|
||||
$t->fillField('Denominazione', $name);
|
||||
$t->select2('#idtipoanagrafica', $tipo);
|
||||
$t->click('.btn-box-tool');
|
||||
$t->waitForElementVisible('#piva', 3);
|
||||
$t->fillField('Partita IVA', $partita_iva);
|
||||
|
||||
// Effettua il submit
|
||||
$t->clickAndWait('Aggiungi', '#add-form');
|
||||
|
||||
// Controlla il salvataggio finale
|
||||
$t->seeInField('Denominazione', $name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova anagrafica di tipo cliente e la elimina.
|
||||
*/
|
||||
protected function addAndDeleteAnag(AcceptanceTester $t, $name = 'ANAGRAFICA DI PROVA', $tipo = 1, $partita_iva = '')
|
||||
{
|
||||
$this->addAnag($t, $name, $tipo, $partita_iva);
|
||||
|
||||
// Seleziona l'azione di eliminazione
|
||||
$t->clickAndWaitSwal('Elimina', '#tab_0');
|
||||
|
||||
// Conferma l'eliminazione
|
||||
$t->clickSwalButton('Elimina');
|
||||
|
||||
// Controlla eliminazione
|
||||
$t->see('Anagrafica eliminata!', '.alert-success');
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
<?php
|
||||
|
||||
class BackupCest
|
||||
{
|
||||
public function _before(AcceptanceTester $t)
|
||||
{
|
||||
// Effettua l'accesso con le credenziali fornite
|
||||
$t->login('admin', 'admin');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea un nuovo backup.
|
||||
*/
|
||||
protected function createBackup(AcceptanceTester $t)
|
||||
{
|
||||
// Seleziona il modulo da aprire
|
||||
$t->expandSidebarLink('Strumenti');
|
||||
$t->navigateTo('Backup');
|
||||
|
||||
$t->clickAndWaitSwal('Crea backup');
|
||||
|
||||
// Conferma la creazione
|
||||
$t->clickSwalButton('Crea');
|
||||
|
||||
// Controlla il salvataggio finale
|
||||
$t->see('Nuovo backup creato correttamente!');
|
||||
}
|
||||
|
||||
/**
|
||||
* Ripristina un backup specifico.
|
||||
*/
|
||||
protected function restoreBackup(AcceptanceTester $t, $name = null)
|
||||
{
|
||||
// Seleziona il modulo da aprire
|
||||
$t->expandSidebarLink('Strumenti');
|
||||
$t->navigateTo('Backup');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova anagrafica di tipo Cliente.
|
||||
*/
|
||||
protected function testBackup(AcceptanceTester $t)
|
||||
{
|
||||
$name = $this->createBackup($t);
|
||||
}
|
||||
}
|
|
@ -1,74 +0,0 @@
|
|||
<?php
|
||||
|
||||
use Helper\Common\RowHelper;
|
||||
|
||||
class ContrattiCest
|
||||
{
|
||||
/**
|
||||
* @var Helper\SignUp
|
||||
*/
|
||||
protected $rowHelper;
|
||||
|
||||
public function _before(AcceptanceTester $t)
|
||||
{
|
||||
// Effettua l'accesso con le credenziali fornite
|
||||
$t->login('admin', 'admin');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea un nuovo contratto.
|
||||
*/
|
||||
public function testContratto(AcceptanceTester $t)
|
||||
{
|
||||
$this->addContratto($t, 'Contratto di test', 2);
|
||||
|
||||
$this->rowHelper->testImporti($t);
|
||||
|
||||
//$t->click('Stampa');
|
||||
}
|
||||
|
||||
protected function _inject(RowHelper $rowHelper)
|
||||
{
|
||||
$this->rowHelper = $rowHelper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea un nuovo contratto.
|
||||
*/
|
||||
protected function addContratto(AcceptanceTester $t, $name, $anagrafica)
|
||||
{
|
||||
// Seleziona il modulo da aprire
|
||||
$t->expandSidebarLink('Vendite');
|
||||
$t->navigateTo('Contratti');
|
||||
|
||||
// Apre la schermata di nuovo elemento
|
||||
$t->clickAndWaitModal('.btn-primary', '#tabs');
|
||||
|
||||
// Completa i campi per il nuovo elemento
|
||||
$t->fillField('Nome', $name);
|
||||
$t->select2ajax('#idanagrafica', $anagrafica);
|
||||
|
||||
// Effettua il submit
|
||||
$t->clickAndWait('Aggiungi', '#add-form');
|
||||
|
||||
// Controlla il salvataggio finale
|
||||
$t->see('Aggiunto contratto');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova anagrafica di tipo cliente e la elimina.
|
||||
*/
|
||||
protected function addAndDeleteContratto(AcceptanceTester $t, $name, $anagrafica = 2)
|
||||
{
|
||||
$this->addAnag($t, $name, $anagrafica);
|
||||
|
||||
// Seleziona l'azione di eliminazione
|
||||
$t->clickAndWaitSwal('Elimina', '#tab_0');
|
||||
|
||||
// Conferma l'eliminazione
|
||||
$t->clickSwalButton('Elimina');
|
||||
|
||||
// Controlla eliminazione
|
||||
$t->see('Contratto eliminato!', '.alert-success');
|
||||
}
|
||||
}
|
|
@ -1,84 +0,0 @@
|
|||
<?php
|
||||
|
||||
use Helper\Common\RowHelper;
|
||||
|
||||
class DDTCest
|
||||
{
|
||||
/**
|
||||
* @var Helper\SignUp
|
||||
*/
|
||||
protected $rowHelper;
|
||||
|
||||
public function _before(AcceptanceTester $t)
|
||||
{
|
||||
// Effettua l'accesso con le credenziali fornite
|
||||
$t->login('admin', 'admin');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea un nuovo ddt.
|
||||
*/
|
||||
public function testDdtDiVendita(AcceptanceTester $t)
|
||||
{
|
||||
$this->addDdt($t, true, 2, 2);
|
||||
|
||||
$this->rowHelper->testImporti($t);
|
||||
|
||||
//$t->click('Stampa');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea un nuovo ddt.
|
||||
*/
|
||||
public function testDdtDiAcquisto(AcceptanceTester $t)
|
||||
{
|
||||
$this->addDdt($t, false, 3, 1);
|
||||
|
||||
$this->rowHelper->testImporti($t, 'uscita');
|
||||
}
|
||||
|
||||
protected function _inject(RowHelper $rowHelper)
|
||||
{
|
||||
$this->rowHelper = $rowHelper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea un nuovo ddt.
|
||||
*/
|
||||
protected function addDdt(AcceptanceTester $t, $entrata, $anagrafica, $tipo)
|
||||
{
|
||||
// Seleziona il modulo da aprire
|
||||
$t->expandSidebarLink('Magazzino');
|
||||
$t->navigateTo($entrata == true ? 'Ddt in uscita' : 'Ddt in entrata');
|
||||
|
||||
// Apre la schermata di nuovo elemento
|
||||
$t->clickAndWaitModal('.btn-primary', '#tabs');
|
||||
|
||||
// Completa i campi per il nuovo elemento
|
||||
$t->select2ajax('#idanagrafica_add', $anagrafica);
|
||||
$t->select2('#idtipoddt', $tipo);
|
||||
|
||||
// Effettua il submit
|
||||
$t->clickAndWait('Aggiungi', '#add-form');
|
||||
|
||||
// Controlla il salvataggio finale
|
||||
$t->see('Aggiunto ddt');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova anagrafica di tipo cliente e la elimina.
|
||||
*/
|
||||
protected function addAndDeleteDdt(AcceptanceTester $t, $entrata, $anagrafica, $tipo)
|
||||
{
|
||||
$this->addAnag($t, $entrata, $anagrafica, $tipo);
|
||||
|
||||
// Seleziona l'azione di eliminazione
|
||||
$t->clickAndWaitSwal('Elimina', '#tab_0');
|
||||
|
||||
// Conferma l'eliminazione
|
||||
$t->clickSwalButton('Elimina');
|
||||
|
||||
// Controlla eliminazione
|
||||
$t->see('Ddt eliminato!', '.alert-success');
|
||||
}
|
||||
}
|
|
@ -1,86 +0,0 @@
|
|||
<?php
|
||||
|
||||
use Helper\Common\RowHelper;
|
||||
|
||||
class FattureCest
|
||||
{
|
||||
/**
|
||||
* @var Helper\SignUp
|
||||
*/
|
||||
protected $rowHelper;
|
||||
|
||||
public function _before(AcceptanceTester $t)
|
||||
{
|
||||
// Effettua l'accesso con le credenziali fornite
|
||||
$t->login('admin', 'admin');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova fattura di vendita.
|
||||
*/
|
||||
public function testFatturaDiVendita(AcceptanceTester $t)
|
||||
{
|
||||
$this->addFattura($t, true, 2, 2);
|
||||
|
||||
$this->rowHelper->testImporti($t);
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova fattura di acquisto.
|
||||
*/
|
||||
public function testFatturaDiAcquisto(AcceptanceTester $t)
|
||||
{
|
||||
$this->addFattura($t, false, 1, 4);
|
||||
|
||||
// Fix pagamento vuoto
|
||||
$t->select2('#idpagamento', 109);
|
||||
$t->clickAndWait('Salva');
|
||||
|
||||
$this->rowHelper->testImporti($t, 'uscita');
|
||||
}
|
||||
|
||||
protected function _inject(RowHelper $rowHelper)
|
||||
{
|
||||
$this->rowHelper = $rowHelper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova fattura.
|
||||
*/
|
||||
protected function addFattura(AcceptanceTester $t, $entrata, $tipo, $anagrafica)
|
||||
{
|
||||
// Seleziona il modulo da aprire
|
||||
$t->expandSidebarLink($entrata == true ? 'Vendite' : 'Acquisti');
|
||||
$t->navigateTo($entrata == true ? 'Fatture di vendita' : 'Fatture di acquisto');
|
||||
|
||||
// Apre la schermata di nuovo elemento
|
||||
$t->clickAndWaitModal('.btn-primary', '#tabs');
|
||||
|
||||
// Completa i campi per il nuovo elemento
|
||||
$t->select2ajax('#idanagrafica_add', $anagrafica);
|
||||
$t->select2('#idtipodocumento', $tipo);
|
||||
|
||||
// Effettua il submit
|
||||
$t->clickAndWait('Aggiungi', '#add-form');
|
||||
|
||||
// Controlla il salvataggio finale
|
||||
$t->see('Aggiunta fattura');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova fattura e la elimina.
|
||||
*/
|
||||
protected function addAndDeleteFattura(AcceptanceTester $t, $cliente, $tipo)
|
||||
{
|
||||
$this->addAnag($t, $cliente, $tipo);
|
||||
|
||||
// Seleziona l'azione di eliminazione
|
||||
$t->clickAndWaitSwal('Elimina', '#tab_0');
|
||||
|
||||
// Conferma l'eliminazione
|
||||
$t->clickSwalButton('Elimina');
|
||||
|
||||
// Controlla eliminazione
|
||||
$t->see('Fattura eliminata!', '.alert-success');
|
||||
}
|
||||
}
|
|
@ -1,87 +0,0 @@
|
|||
<?php
|
||||
|
||||
use Helper\Common\RowHelper;
|
||||
|
||||
class OrdiniCest
|
||||
{
|
||||
/**
|
||||
* @var Helper\SignUp
|
||||
*/
|
||||
protected $rowHelper;
|
||||
|
||||
public function _before(AcceptanceTester $t)
|
||||
{
|
||||
// Effettua l'accesso con le credenziali fornite
|
||||
$t->login('admin', 'admin');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea un nuovo ordine.
|
||||
*/
|
||||
public function testOrdineCliente(AcceptanceTester $t)
|
||||
{
|
||||
$this->addOrdine($t, true, 2);
|
||||
|
||||
$this->rowHelper->testImporti($t);
|
||||
|
||||
//$t->click('Stampa');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea un nuovo ordine.
|
||||
*/
|
||||
public function testOrdineFornitore(AcceptanceTester $t)
|
||||
{
|
||||
$this->addOrdine($t, false, 4);
|
||||
|
||||
// Fix pagamento vuoto
|
||||
$t->select2('#idpagamento', 109);
|
||||
$t->clickAndWait('Salva');
|
||||
|
||||
$this->rowHelper->testImporti($t, 'uscita');
|
||||
}
|
||||
|
||||
protected function _inject(RowHelper $rowHelper)
|
||||
{
|
||||
$this->rowHelper = $rowHelper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea un nuovo ordine.
|
||||
*/
|
||||
protected function addOrdine(AcceptanceTester $t, $entrata, $anagrafica)
|
||||
{
|
||||
// Seleziona il modulo da aprire
|
||||
$t->expandSidebarLink($entrata == true ? 'Vendite' : 'Acquisti');
|
||||
$t->navigateTo($entrata == true ? 'Ordini cliente' : 'Ordini fornitore');
|
||||
|
||||
// Apre la schermata di nuovo elemento
|
||||
$t->clickAndWaitModal('.btn-primary', '#tabs');
|
||||
|
||||
// Completa i campi per il nuovo elemento
|
||||
$t->select2ajax('#idanagrafica', $anagrafica);
|
||||
|
||||
// Effettua il submit
|
||||
$t->clickAndWait('Aggiungi', '#add-form');
|
||||
|
||||
// Controlla il salvataggio finale
|
||||
$t->see('Aggiunto ordine');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova anagrafica di tipo cliente e la elimina.
|
||||
*/
|
||||
protected function addAndDeleteOrdine(AcceptanceTester $t, $entrata, $anagrafica = 2)
|
||||
{
|
||||
$this->addAnag($t, $entrata, $anagrafica);
|
||||
|
||||
// Seleziona l'azione di eliminazione
|
||||
$t->clickAndWaitSwal('Elimina', '#tab_0');
|
||||
|
||||
// Conferma l'eliminazione
|
||||
$t->clickSwalButton('Elimina');
|
||||
|
||||
// Controlla eliminazione
|
||||
$t->see('Ordine eliminato!', '.alert-success');
|
||||
}
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
<?php
|
||||
|
||||
use Helper\Common\RowHelper;
|
||||
|
||||
class PreventiviCest
|
||||
{
|
||||
/**
|
||||
* @var Helper\SignUp
|
||||
*/
|
||||
protected $rowHelper;
|
||||
|
||||
public function _before(AcceptanceTester $t)
|
||||
{
|
||||
// Effettua l'accesso con le credenziali fornite
|
||||
$t->login('admin', 'admin');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea un nuovo preventivo.
|
||||
*/
|
||||
public function testPreventivo(AcceptanceTester $t)
|
||||
{
|
||||
$this->addPreventivo($t, 'Preventivo di test', 2);
|
||||
|
||||
$this->rowHelper->testImporti($t);
|
||||
|
||||
//$t->click('Stampa');
|
||||
}
|
||||
|
||||
protected function _inject(RowHelper $rowHelper)
|
||||
{
|
||||
$this->rowHelper = $rowHelper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea un nuovo preventivo.
|
||||
*/
|
||||
protected function addPreventivo(AcceptanceTester $t, $name, $anagrafica, $tipo = 'GEN')
|
||||
{
|
||||
// Seleziona il modulo da aprire
|
||||
$t->expandSidebarLink('Vendite');
|
||||
$t->navigateTo('Preventivi');
|
||||
|
||||
// Apre la schermata di nuovo elemento
|
||||
$t->clickAndWaitModal('.btn-primary', '#tabs');
|
||||
|
||||
// Completa i campi per il nuovo elemento
|
||||
$t->fillField('Nome preventivo', $name);
|
||||
$t->select2ajax('#idanagrafica', $anagrafica);
|
||||
$t->select2ajax('#idtipointervento', $tipo);
|
||||
|
||||
// Effettua il submit
|
||||
$t->clickAndWait('Aggiungi', '#add-form');
|
||||
|
||||
// Controlla il salvataggio finale
|
||||
$t->see('Aggiunto preventivo');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova anagrafica di tipo cliente e la elimina.
|
||||
*/
|
||||
protected function addAndDeletePreventivo(AcceptanceTester $t, $name, $anagrafica = 2, $tipo = 'GEN')
|
||||
{
|
||||
$this->addAnag($t, $name, $anagrafica, $tipo);
|
||||
|
||||
// Seleziona l'azione di eliminazione
|
||||
$t->clickAndWaitSwal('Elimina', '#tab_0');
|
||||
|
||||
// Conferma l'eliminazione
|
||||
$t->clickSwalButton('Elimina');
|
||||
|
||||
// Controlla eliminazione
|
||||
$t->see('Preventivo eliminato!', '.alert-success');
|
||||
}
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
<?php
|
|
@ -1,12 +0,0 @@
|
|||
# Codeception Test Suite Configuration
|
||||
#
|
||||
# Suite for functional tests
|
||||
# Emulate web requests and make application process them
|
||||
# Include one of framework modules (Symfony2, Yii2, Laravel5) to use it
|
||||
# Remove this suite if you don't use frameworks
|
||||
|
||||
actor: FunctionalTester
|
||||
modules:
|
||||
enabled:
|
||||
# add a framework module here
|
||||
- \Helper\Functional
|
|
@ -1 +0,0 @@
|
|||
<?php
|
|
@ -1,9 +0,0 @@
|
|||
# Codeception Test Suite Configuration
|
||||
#
|
||||
# Suite for unit or integration tests.
|
||||
|
||||
actor: UnitTester
|
||||
modules:
|
||||
enabled:
|
||||
- Asserts
|
||||
- \Helper\Unit
|
|
@ -1,70 +0,0 @@
|
|||
<?php
|
||||
|
||||
use Util\Generator;
|
||||
|
||||
class GeneratorTest extends \Codeception\Test\Unit
|
||||
{
|
||||
public function testNumbersWithPrefix()
|
||||
{
|
||||
$this->test(null, '|TEST');
|
||||
}
|
||||
|
||||
public function testNumbersWithSuffix()
|
||||
{
|
||||
$this->test('|TEST');
|
||||
}
|
||||
|
||||
public function testCommonNumbers()
|
||||
{
|
||||
$this->test();
|
||||
}
|
||||
|
||||
public function testDates()
|
||||
{
|
||||
$this->test('/YYYY');
|
||||
$this->test('/yy');
|
||||
|
||||
$this->test(null, 'YYYY-');
|
||||
$this->test(null, 'yy-');
|
||||
}
|
||||
|
||||
protected function test($prefix = null, $suffix = null)
|
||||
{
|
||||
$date = date('Y-m-d H:i:s');
|
||||
$info = Generator::dateToPattern($date);
|
||||
|
||||
// Individuazione valori relativi a suffisso e prefisso
|
||||
$prefix_value = Generator::complete($prefix, $info);
|
||||
$suffix_value = Generator::complete($suffix, $info);
|
||||
|
||||
$step = 3;
|
||||
|
||||
// Pattern di base con numero di caratteri incrementale
|
||||
$pattern = $prefix.'#'.$suffix;
|
||||
|
||||
$previous = null;
|
||||
for ($i = 0; $i < 10000; $i = $i + $step) {
|
||||
$value = $prefix_value.$this->pad($i + 1, $length).$suffix_value;
|
||||
$this->assertEquals($value, Generator::generate($pattern, $previous, $step, $info));
|
||||
|
||||
$previous = $value;
|
||||
}
|
||||
|
||||
// Pattern con padding
|
||||
$length = 5;
|
||||
$pattern = $prefix.str_repeat('#', $length).$suffix;
|
||||
|
||||
$previous = null;
|
||||
for ($i = 0; $i < 10000; $i = $i + $step) {
|
||||
$value = $prefix_value.$this->pad($i + 1, $length).$suffix_value;
|
||||
$this->assertEquals($value, Generator::generate($pattern, $previous, $step, $info));
|
||||
|
||||
$previous = $value;
|
||||
}
|
||||
}
|
||||
|
||||
protected function pad($number, $length)
|
||||
{
|
||||
return str_pad($number, $length, '0', STR_PAD_LEFT);
|
||||
}
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
<?php
|
||||
|
||||
use Codeception\Util\Autoload;
|
||||
|
||||
// Caricamento delle dipendenze e delle librerie del progetto
|
||||
$namespaces = require_once __DIR__.'/../../config/namespaces.php';
|
||||
foreach ($namespaces as $path => $namespace) {
|
||||
Autoload::addNamespace($namespace.'\\', __DIR__.'/../../'.$path.'/custom/src');
|
||||
Autoload::addNamespace($namespace.'\\', __DIR__.'/../../'.$path.'/src');
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
<?php
|
||||
|
||||
// File e cartelle deprecate
|
||||
$files = [
|
||||
'tests/',
|
||||
];
|
||||
|
||||
foreach ($files as $key => $value) {
|
||||
$files[$key] = realpath(base_dir().'/'.$value);
|
||||
}
|
||||
|
||||
delete($files);
|
|
@ -64,7 +64,60 @@ UPDATE `zz_widgets` SET `text` = 'Listini disattivati' WHERE `zz_widgets`.`name`
|
|||
|
||||
INSERT INTO `zz_widgets` (`id`, `name`, `type`, `id_module`, `location`, `class`, `query`, `bgcolor`, `icon`, `print_link`, `more_link`, `more_link_type`, `php_include`, `text`, `enabled`, `help`) VALUES (NULL, 'Preventivi da fatturare', 'stats', '1', 'controller_top', NULL, 'SELECT COUNT(id) AS dato FROM co_preventivi WHERE idstato IN (SELECT id FROM co_statipreventivi WHERE is_fatturabile=1) AND default_revision=1', '#44aae4', 'fa fa-file', '', './modules/preventivi/widgets/preventivi.fatturare.dashboard.php', 'popup', '', 'Preventivi da fatturare', 0, NULL);
|
||||
|
||||
INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `html_format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Articoli'), '_bg_', 'IF(threshold_qta!=0, IF(mg_articoli.qta>threshold_qta, \'#CCFFCC\', \'#FFCCEB\'), \'\')', '14', '0', '0', '0', '0', '', '', '0', '0', '0');
|
||||
INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `html_format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Articoli'), '_bg_', 'IF(threshold_qta!=0, IF(mg_articoli.qta>=threshold_qta, \'#CCFFCC\', \'#FFCCEB\'), \'\')', '14', '0', '0', '0', '0', '', '', '0', '0', '0');
|
||||
|
||||
-- Aggiunto titolo righe preventivi
|
||||
ALTER TABLE `co_righe_preventivi` ADD `is_titolo` BOOLEAN NOT NULL AFTER `confermato`;
|
||||
ALTER TABLE `co_righe_preventivi` ADD `is_titolo` BOOLEAN NOT NULL AFTER `confermato`;
|
||||
|
||||
ALTER TABLE `co_documenti` CHANGE `numero_esterno` `numero_esterno` VARCHAR(100) NOT NULL;
|
||||
|
||||
INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES ('Tipo di sconto predefinito', '%', 'list[%,€]', '1', 'Generali', '1', NULL);
|
||||
|
||||
ALTER TABLE `co_tipidocumento` ADD `id_segment` INT NOT NULL AFTER `predefined`;
|
||||
UPDATE `co_tipidocumento` SET `id_segment`= (SELECT `zz_segments`.`id` FROM `zz_segments` INNER JOIN `zz_modules` ON `zz_segments`.`id_module` = `zz_modules`.`id` WHERE `zz_modules`.`name` = 'Fatture di vendita' AND `zz_segments`.`predefined` = 1) WHERE `co_tipidocumento`.`dir` = 'entrata';
|
||||
UPDATE `co_tipidocumento` SET `id_segment`= (SELECT `zz_segments`.`id` FROM `zz_segments` INNER JOIN `zz_modules` ON `zz_segments`.`id_module` = `zz_modules`.`id` WHERE `zz_modules`.`name` = 'Fatture di acquisto' AND `zz_segments`.`predefined` = 1) WHERE `co_tipidocumento`.`dir` = 'uscita';
|
||||
UPDATE `co_tipidocumento` SET `id_segment`=(SELECT `zz_segments`.`id` FROM `zz_segments` INNER JOIN `zz_modules` ON `zz_segments`.`id_module` = `zz_modules`.`id` WHERE `zz_segments`.`name` = 'Autofatture' AND `zz_modules`.`name` = 'Fatture di vendita') WHERE `co_tipidocumento`.`dir` = 'entrata' AND `co_tipidocumento`.`descrizione` LIKE "%autofattura%";
|
||||
UPDATE `co_tipidocumento` SET `id_segment`=(SELECT `zz_segments`.`id` FROM `zz_segments` INNER JOIN `zz_modules` ON `zz_segments`.`id_module` = `zz_modules`.`id` WHERE `zz_segments`.`name` = 'Autofatture' AND `zz_modules`.`name` = 'Fatture di acquisto') WHERE `co_tipidocumento`.`dir` = 'uscita' AND `co_tipidocumento`.`descrizione` LIKE "%autofattura%";
|
||||
|
||||
-- Fix query Fatture di acquisto
|
||||
UPDATE `zz_modules` SET `options` = "
|
||||
SELECT
|
||||
|select|
|
||||
FROM
|
||||
`co_documenti`
|
||||
LEFT JOIN `an_anagrafiche` ON `co_documenti`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`
|
||||
LEFT JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`
|
||||
LEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id`
|
||||
LEFT JOIN `co_ritenuta_contributi` ON `co_documenti`.`id_ritenuta_contributi` = `co_ritenuta_contributi`.`id`
|
||||
LEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`
|
||||
LEFT JOIN (SELECT `co_banche`.`id`, CONCAT(`nome`, ' - ', `iban`) AS `descrizione` FROM `co_banche`) AS `banche` ON `banche`.`id` = `co_documenti`.`id_banca_azienda`
|
||||
LEFT JOIN (SELECT `iddocumento`, GROUP_CONCAT(`co_pianodeiconti3`.`descrizione`) AS `descrizione` FROM `co_righe_documenti` INNER JOIN `co_pianodeiconti3` ON `co_pianodeiconti3`.`id` = `co_righe_documenti`.`idconto` GROUP BY iddocumento) AS `conti` ON `conti`.`iddocumento` = `co_documenti`.`id`
|
||||
LEFT JOIN (SELECT `iddocumento`, SUM(`subtotale` - `sconto`) AS `totale_imponibile`, SUM(`iva`) AS `iva` FROM `co_righe_documenti` GROUP BY `iddocumento`) AS `righe` ON `co_documenti`.`id` = `righe`.`iddocumento`
|
||||
LEFT JOIN (SELECT COUNT(`d`.`id`) AS `conteggio`, IF(`d`.`numero_esterno` = '', `d`.`numero`, `d`.`numero_esterno`) AS `numero_documento`, `d`.`idanagrafica` AS `anagrafica`, `d`.`id_segment` FROM `co_documenti` AS `d`
|
||||
LEFT JOIN `co_tipidocumento` AS `d_tipo` ON `d`.`idtipodocumento` = `d_tipo`.`id` WHERE 1=1 AND `d_tipo`.`dir` = 'uscita' AND('|period_start|' <= `d`.`data` AND '|period_end|' >= `d`.`data` OR '|period_start|' <= `d`.`data_competenza` AND '|period_end|' >= `d`.`data_competenza`) GROUP BY `d`.`id_segment`, `numero_documento`, `d`.`idanagrafica`) AS `d` ON (`d`.`numero_documento` = IF(`co_documenti`.`numero_esterno` = '',`co_documenti`.`numero`,`co_documenti`.`numero_esterno`) AND `d`.`anagrafica` = `co_documenti`.`idanagrafica` AND `d`.`id_segment` = `co_documenti`.`id_segment`)
|
||||
WHERE
|
||||
1=1
|
||||
AND
|
||||
`dir` = 'uscita' |segment(`co_documenti`.`id_segment`)| |date_period(custom, '|period_start|' <= `co_documenti`.`data` AND '|period_end|' >= `co_documenti`.`data`, '|period_start|' <= `co_documenti`.`data_competenza` AND '|period_end|' >= `co_documenti`.`data_competenza` )|
|
||||
GROUP BY
|
||||
`co_documenti`.`id`, `d`.`conteggio`
|
||||
HAVING
|
||||
2=2
|
||||
ORDER BY
|
||||
`co_documenti`.`data` DESC,
|
||||
CAST(IF(`co_documenti`.`numero` = '', `co_documenti`.`numero_esterno`, `co_documenti`.`numero`) AS UNSIGNED) DESC" WHERE `name` = 'Fatture di acquisto';
|
||||
|
||||
-- Fix widget Acquisti
|
||||
UPDATE `zz_widgets` SET `query` = 'SELECT\n CONCAT_WS(\' \', REPLACE(REPLACE(REPLACE(FORMAT((\n SELECT SUM(\n (co_righe_documenti.subtotale - co_righe_documenti.sconto) * IF(co_tipidocumento.reversed, -1, 1)\n )\n ), 2), \',\', \'#\'), \'.\', \',\'), \'#\', \'.\'), \'€\') 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");
|
Loading…
Reference in New Issue