Compare commits

...

9 Commits

Author SHA1 Message Date
Luca 016dfdf098 Update CHANGELOG.md 2021-07-28 16:22:52 +02:00
Dasc3er 40ba5847d1 Fix gestione log API 2021-07-28 15:17:56 +02:00
Dasc3er 19cc037b75 Miglioramento CHANGELOG 2021-07-28 14:41:42 +02:00
MatteoPistorello 4331a1b654 Aggiornato changelog 2021-07-28 14:28:13 +02:00
MatteoPistorello f004bea56f Aggiunta colonna reddito nella stampa bilancio 2021-07-28 14:26:22 +02:00
Dasc3er 7e12db4850 Fix namespace classi per aggiornamento Listini Articoli 2021-07-28 12:06:29 +02:00
Dasc3er 905d23247e Aggiunta query per collegamento Fatture - Note di credito 2021-07-28 11:54:57 +02:00
Dasc3er c663f7f2a6 Introduzione collegamento al documento di origine per righe importate
Aggiunti campi original_document_id e original_document_type per favorire la flessibilità nei collegamento tra documenti attraverso l'importazione delle righe.
Miglioramento del supporto all'individuazione dei documenti collegati a Contratti e Preventivi, con l'introduzione del collegamento visibile agli Interventi.
2021-07-28 11:50:02 +02:00
Dasc3er 62e250873f Introduzione importazione Preventivi e Contratti in Attività 2021-07-28 10:32:33 +02:00
21 changed files with 3944 additions and 2462 deletions

View File

@ -4,7 +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.24 (2021-00-00)](#2424-2021-00-00)
- [2.4.24 (2021-07-28)](#2424-2021-07-28)
- [2.4.23 (2021-05-18)](#2423-2021-05-18)
- [2.4.22 (2021-03-01)](#2422-2021-03-01)
- [2.4.21 (2021-01-14)](#2421-2021-01-14)
@ -35,29 +35,47 @@ 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.24 (2021-00-00)
## 2.4.24 (2021-07-28)
### Aggiunto (Added)
- Aggiunta nel calendario della Dashboard visualizzazione dei preventivi pianificabili in corrispondenza alla data di accettazione e conclusione.
- Aggiunta impostazione per la visualizzazione delle ore nella stampa intervento (Decimale, Sessantesimi).
- Aggiunta possibilità di selezionare la sede di partenza della merce in fase di aggiunta articolo da un'attività
- Aggiunta colonna Scaduto nel modulo Scadenzario
- Aggiunta colonna *Scaduto* nel modulo **Scadenzario**
- Aggiunto campi confermato, data e ora evasione nel modulo **Preventivi**
- Aggiunta possibilità di creare un nuovi conti di secondo livello dal modulo **Piano dei conti**
- Aggiunta impostazione per la rimozione del blocco sulle quantità massime importabili fra documenti
- Aggiunta colonna **Rif. fattura** nei moduli Ordini cliente e fornitore
- Aggiunta gestione come costo e ricavo per i conti di secondo livello
- Aggiunta gestione come costo e ricavo per i conti di secondo livello
- Aggiunta gestione di DDT di trasporto interno tra sedi dell'anagrafica Azienda, con creazione semplificata del DDT di direzione opposta
- Aggiunto codice e prezzo nella stampa *Barcode*
- Aggiunto riquadro destinazione diversa nella stampe documenti (se presente)
- Aggiunta azione di gruppo in **Fatture di acquisto** per l'esportazione delle fatture FE in PDF
- Separazione plugin per la visualizzazione di *Listini Clienti* e *Listini Fornitori*
- Introduzione importazione Preventivi e Contratti in Attività
- Aggiunta colonna reddito nella stampa del **Bilancio**
- Aggiunta autenticazione OAuth2 per gli **Account email** (funzionante con Google, sperimentale con Microsoft)
- Aggiunta importazione di **Preventivi** e **Contratti** in **Attività**, senza collegamento contabile per i *Consuntivi*
- Aggiunta sezione di riepilogo dettagli Cliente in apertura di nuove **Attività**
### Modificato (Changed)
- Rimossa dipendenza JQuery per la gestione dell'ordinamento (righe e widget) e per la ricerca generale
- Modifica del sistema di selezione delle righe nelle tabelle principali, per aggiungere un contatore delle righe selezionate
### Fixed
- Sostituito plugin **Componenti** nel modulo Impianti con la possibilità di inserire gli articoli di magazzino
- Possibilità di ripristinare un conto cliente/fornitore dal modulo **Anagrafiche** se eliminato
- Fix visualizzazione referenti nel plugin **Sedi**
- Fix stampa *Registro IVA*
- Fix inclusione CSS personalizzato da **Impostazioni**
- Fix esportazione footer delle tabelle principali
## 2.4.23 (2021-05-18)
### Aggiunto (Added)
- Nuovo *Sconto finale* per gli **Ordini**, **Preventivi**, **DDT** e **Contratti**, influenza il valore *Netto a pagare* del documento.
- Nuovo filtro in attività per mostrare al tecnico solo le attività assegnate.
- Nuovo filtro in contratti per mostrare al cliente solo i contratti collegati.
- Nuovo filtro in attività per mostrare al tecnico solo le attività assegnate.
- Nuovo filtro in contratti per mostrare al cliente solo i contratti collegati.
- Nuovo pulsante **Duplica Template** per copiare un template già esistente.
- Aggiunto controllo nelle fatture di vendita per segnalare l'eventuale fatturazione di un'attività con la data di una sessione futura rispetto alla data della fattura.
- Aggiunta possibilità di creare un ordine fornitore da un preventivo.

View File

@ -144,7 +144,12 @@ foreach ($handlers as $handler) {
}
// Imposta Monolog come gestore degli errori
Monolog\ErrorHandler::register($logger, [], Monolog\Logger::ERROR, Monolog\Logger::ERROR);
$handler = new Monolog\ErrorHandler($logger);
if (!API\Response::isAPIRequest()) {
$handler->registerErrorHandler([]);
$handler->registerExceptionHandler(Monolog\Logger::ERROR);
}
$handler->registerFatalHandler(Monolog\Logger::ERROR);
// Database
$dbo = $database = database();

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,7 @@ use Modules\Articoli\Articolo;
use Modules\Preventivi\Components\Articolo as ArticoloPreventivo;
use Modules\Preventivi\Preventivo;
use Modules\TipiIntervento\Tipo as TipoSessione;
use Plugins\DettagliArticolo\DettaglioPrezzo;
use Plugins\ListinoClienti\DettaglioPrezzo;
use Prints;
switch (post('op')) {

View File

@ -26,7 +26,7 @@ use Modules\Anagrafiche\Sede;
use Modules\Articoli\Articolo;
use Modules\Articoli\Categoria;
use Modules\Iva\Aliquota;
use Plugins\DettagliArticolo\DettaglioPrezzo;
use Plugins\ListinoClienti\DettaglioPrezzo;
/**
* Struttura per la gestione delle operazioni di importazione (da CSV) degli Articoli.

View File

@ -436,9 +436,12 @@ $("#codice_cig, #codice_cup").bind("keyup change", function(e) {
// Collegamenti diretti
// Fatture o interventi collegati a questo contratto
$elementi = $dbo->fetchArray('SELECT 0 AS `codice`, `co_documenti`.`id` AS `id`, `co_documenti`.`numero` AS `numero`, `co_documenti`.`numero_esterno` AS `numero_esterno`, `co_documenti`.`data`, `co_tipidocumento`.`descrizione` AS `tipo_documento`, `co_tipidocumento`.`dir` AS `dir` FROM `co_documenti` JOIN `co_tipidocumento` ON `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento` WHERE `co_documenti`.`id` IN (SELECT `iddocumento` FROM `co_righe_documenti` WHERE `idcontratto` = '.prepare($id_record).')'.'
$elementi = $dbo->fetchArray('SELECT `co_documenti`.`id`, `co_documenti`.`data`, `co_documenti`.`numero`, `co_documenti`.`numero_esterno`, `co_tipidocumento`.`descrizione` AS tipo_documento, IF(`co_tipidocumento`.`dir` = \'entrata\', \'Fatture di vendita\', \'Fatture di acquisto\') AS modulo FROM `co_documenti` JOIN `co_tipidocumento` ON `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento` WHERE `co_documenti`.`id` IN (SELECT `iddocumento` FROM `co_righe_documenti` WHERE `idcontratto` = '.prepare($id_record).')
UNION
SELECT `in_interventi`.`codice` AS `codice`, `in_interventi`.`id` AS `id`, 0 AS `numero`, 0 AS `numero_esterno`, `in_interventi`.`data_richiesta` AS `data`, 0 AS `tipo_documento`, 0 AS `dir` FROM `in_interventi` WHERE `in_interventi`.`id_contratto` = '.prepare($id_record).' ORDER BY `data` ');
SELECT `in_interventi`.`id`, `in_interventi`.`data_richiesta`, `in_interventi`.`codice`, NULL, \'Attività\', \'Interventi\' FROM `in_interventi` JOIN `in_righe_interventi` ON `in_righe_interventi`.`idintervento` = `in_interventi`.`id` WHERE (`in_righe_interventi`.`original_document_id` = '.prepare($contratto->id).' AND `in_righe_interventi`.`original_document_type` = '.prepare(get_class($contratto)).') OR `in_interventi`.`id_contratto` = '.prepare($id_record).'
ORDER BY `data` ');
if (!empty($elementi)) {
echo '
@ -455,31 +458,15 @@ if (!empty($elementi)) {
<ul>';
// Elenco attività o contratti collegati
foreach ($elementi as $riga) {
if (!empty($riga['dir'])) {
$descrizione = tr('_DOC_ num. _NUM_ del _DATE_', [
'_DOC_' => $riga['tipo_documento'],
'_NUM_' => !empty($riga['numero_esterno']) ? $riga['numero_esterno'] : $riga['numero'],
'_DATE_' => Translator::dateToLocale($riga['data']),
]);
foreach ($elementi as $elemento) {
$descrizione = tr('_DOC_ num. _NUM_ del _DATE_', [
'_DOC_' => $elemento['tipo_documento'],
'_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'],
'_DATE_' => Translator::dateToLocale($elemento['data']),
]);
$modulo = ($riga['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto';
$id = $riga['id'];
echo '
<li>'.Modules::link($modulo, $id, $descrizione).'</li>';
} else {
$descrizione = tr('Intervento num. _NUM_ del _DATE_', [
'_NUM_' => $riga['codice'],
'_DATE_' => Translator::dateToLocale($riga['data']),
]);
$modulo = 'Interventi';
$id = $riga['id'];
echo '
<li>'.Modules::link($modulo, $id, $descrizione).'</li>';
}
echo '
<li>'.Modules::link($elemento['modulo'], $elemento['id'], $descrizione).'</li>';
}
echo '

View File

@ -51,8 +51,8 @@ echo '
$rs = $dbo->fetchArray('SELECT
in_interventi.id,
CONCAT(\'Intervento numero \', in_interventi.codice, \' del \', DATE_FORMAT(IFNULL((SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), in_interventi.data_richiesta), \'%d/%m/%Y\'), " [", `in_statiintervento`.`descrizione` , "]") AS descrizione,
CONCAT(\'Intervento numero \', in_interventi.codice, \' del \', DATE_FORMAT(IFNULL((SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), in_interventi.data_richiesta), \'%d/%m/%Y\')) AS info,
CONCAT(\'Attività numero \', in_interventi.codice, \' del \', DATE_FORMAT(IFNULL((SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), in_interventi.data_richiesta), \'%d/%m/%Y\'), " [", `in_statiintervento`.`descrizione` , "]") AS descrizione,
CONCAT(\'Attività numero \', in_interventi.codice, \' del \', DATE_FORMAT(IFNULL((SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), in_interventi.data_richiesta), \'%d/%m/%Y\')) AS info,
CONCAT(\'\n\', in_interventi.descrizione) AS descrizione_intervento,
IF(idclientefinale='.prepare($idanagrafica).', \'Interventi conto terzi\', \'Interventi diretti\') AS `optgroup`
FROM

View File

@ -634,7 +634,7 @@ if (!$block_edit) {
echo '
<div class="tip" data-toggle="tooltip" title="'.tr('Attività completate non collegate a preventivi o contratti e che non siano già state fatturate.').'">
<a class="btn btn-sm btn-primary '.(!empty($interventi) ? '' : ' disabled').'" data-href="'.base_path().'/modules/fatture/add_intervento.php?id_module='.$id_module.'&id_record='.$id_record.'" data-title="'.tr('Aggiungi attività').'">
<a class="btn btn-sm btn-primary '.(!empty($interventi) ? '' : ' disabled').'" data-href="'.$structure->fileurl('add_intervento.php').'?id_module='.$id_module.'&id_record='.$id_record.'" data-title="'.tr('Aggiungi attività').'">
<i class="fa fa-plus"></i> '.tr('Attività').'
</a>
</div>';
@ -644,7 +644,7 @@ if (!$block_edit) {
$preventivi = $dbo->fetchArray($prev_query)[0]['tot'];
echo '
<div class="tip">
<a class="btn btn-sm btn-primary '.(!empty($preventivi) ? '' : ' disabled').'" data-href="'.base_path().'/modules/fatture/add_preventivo.php?id_module='.$id_module.'&id_record='.$id_record.'" data-title="'.tr('Aggiungi preventivo').'" data-toggle="tooltip">
<a class="btn btn-sm btn-primary '.(!empty($preventivi) ? '' : ' disabled').'" data-href="'.$structure->fileurl('add_preventivo.php').'?id_module='.$id_module.'&id_record='.$id_record.'" data-title="'.tr('Aggiungi preventivo').'" data-toggle="tooltip">
<i class="fa fa-plus"></i> '.tr('Preventivo').'
</a>
</div>';
@ -654,7 +654,7 @@ if (!$block_edit) {
$contratti = $dbo->fetchArray($contr_query)[0]['tot'];
echo '
<div class="tip">
<a class="btn btn-sm btn-primary '.(!empty($contratti) ? '' : ' disabled').'" data-href="'.base_path().'/modules/fatture/add_contratto.php?id_module='.$id_module.'&id_record='.$id_record.'" data-title="'.tr('Aggiungi contratto').'">
<a class="btn btn-sm btn-primary '.(!empty($contratti) ? '' : ' disabled').'" data-href="'.$structure->fileurl('add_contratto.php').'?id_module='.$id_module.'&id_record='.$id_record.'" data-title="'.tr('Aggiungi contratto').'">
<i class="fa fa-plus"></i> '.tr('Contratto').'
</a>
</div>';
@ -672,17 +672,21 @@ if (!$block_edit) {
AND dt_ddt.id IN (SELECT idddt FROM dt_righe_ddt WHERE dt_righe_ddt.idddt = dt_ddt.id AND (qta - qta_evasa) > 0)';
$ddt = $dbo->fetchArray($ddt_query)[0]['tot'];
echo '
<a class="btn btn-sm btn-primary'.(!empty($ddt) ? '' : ' disabled').'" data-href="'.base_path().'/modules/fatture/add_ddt.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="'.tr('Aggiungi ddt').'">
<i class="fa fa-plus"></i> '.tr('Ddt').'
</a>';
<div class="tip">
<a class="btn btn-sm btn-primary'.(!empty($ddt) ? '' : ' disabled').'" data-href="'.$structure->fileurl('add_ddt.php').'.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="'.tr('Aggiungi ddt').'">
<i class="fa fa-plus"></i> '.tr('Ddt').'
</a>
</div>';
// Lettura ordini (cliente o fornitore)
$ordini_query = 'SELECT COUNT(*) AS tot FROM or_ordini WHERE idanagrafica='.prepare($record['idanagrafica']).' AND idstatoordine IN (SELECT id FROM or_statiordine WHERE descrizione IN(\'Accettato\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoordine=(SELECT id FROM or_tipiordine WHERE dir='.prepare($dir).') AND or_ordini.id IN (SELECT idordine FROM or_righe_ordini WHERE or_righe_ordini.idordine = or_ordini.id AND (qta - qta_evasa) > 0)';
$ordini = $dbo->fetchArray($ordini_query)[0]['tot'];
echo '
<a class="btn btn-sm btn-primary'.(!empty($ordini) ? '' : ' disabled').'" data-href="'.base_path().'/modules/fatture/add_ordine.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="'.tr('Aggiungi ordine').'">
<i class="fa fa-plus"></i> '.tr('Ordine').'
</a>';
<div class="tip">
<a class="btn btn-sm btn-primary'.(!empty($ordini) ? '' : ' disabled').'" data-href="'.$structure->fileurl('add_ordine.php').'?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="'.tr('Aggiungi ordine').'">
<i class="fa fa-plus"></i> '.tr('Ordine').'
</a>
</div>';
}
// Lettura articoli

View File

@ -0,0 +1,86 @@
<?php
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
include_once __DIR__.'/../../core.php';
use Modules\Contratti\Contratto;
use Modules\Interventi\Intervento;
$documento_finale = Intervento::find($id_record);
$dir = $documento_finale->direzione;
$id_documento = get('id_documento');
if (!empty($id_documento)) {
$documento = Contratto::find($id_documento);
$options = [
'op' => 'add_documento',
'type' => 'contratto',
'button' => tr('Aggiungi'),
'documento' => $documento,
'documento_finale' => $documento_finale,
'tipo_documento_finale' => Intervento::class,
'superamento_soglia_qta' => setting('Permetti il superamento della soglia quantità dei documenti di origine'),
];
echo App::load('importa.php', [], $options, true);
return;
}
$id_anagrafica = $documento_finale->idanagrafica;
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "select", "label": "'.tr('Contratto').'", "name": "id_documento", "ajax-source": "contratti", "select-options": {"idanagrafica": '.$id_anagrafica.', "stato": "is_fatturabile"} ]}
</div>
</div>
<div id="righe_documento">
</div>
<div class="alert alert-info" id="box-loading">
<i class="fa fa-spinner fa-spin"></i> '.tr('Caricamento in corso').'...
</div>';
$file = basename(__FILE__);
echo '
<script>$(document).ready(init)</script>
<script>
var content = $("#righe_documento");
var loader = $("#box-loading");
$(document).ready(function() {
loader.hide();
});
$("#id_documento").on("change", function() {
loader.show();
var id = $(this).selectData() ? $(this).selectData().id : "";
content.html("");
content.load("'.$structure->fileurl($file).'?id_module='.$id_module.'&id_record='.$id_record.'&id_documento=" + id, function() {
loader.hide();
});
});
</script>';

View File

@ -0,0 +1,86 @@
<?php
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
include_once __DIR__.'/../../core.php';
use Modules\Interventi\Intervento;
use Modules\Preventivi\Preventivo;
$documento_finale = Intervento::find($id_record);
$dir = $documento_finale->direzione;
$id_documento = get('id_documento');
if (!empty($id_documento)) {
$documento = Preventivo::find($id_documento);
$options = [
'op' => 'add_documento',
'type' => 'preventivo',
'button' => tr('Aggiungi'),
'documento' => $documento,
'documento_finale' => $documento_finale,
'tipo_documento_finale' => Intervento::class,
'superamento_soglia_qta' => setting('Permetti il superamento della soglia quantità dei documenti di origine'),
];
echo App::load('importa.php', [], $options, true);
return;
}
$id_anagrafica = $documento_finale->idanagrafica;
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "select", "label": "'.tr('Preventivo').'", "name": "id_documento", "ajax-source": "preventivi", "select-options": {"idanagrafica": '.$id_anagrafica.', "stato": "is_fatturabile"} ]}
</div>
</div>
<div id="righe_documento">
</div>
<div class="alert alert-info" id="box-loading">
<i class="fa fa-spinner fa-spin"></i> '.tr('Caricamento in corso').'...
</div>';
$file = basename(__FILE__);
echo '
<script>$(document).ready(init)</script>
<script>
var content = $("#righe_documento");
var loader = $("#box-loading");
$(document).ready(function() {
loader.hide();
});
$("#id_documento").on("change", function() {
loader.show();
var id = $(this).selectData() ? $(this).selectData().id : "";
content.html("");
content.load("'.$structure->fileurl($file).'?id_module='.$id_module.'&id_record='.$id_record.'&id_documento=" + id, function() {
loader.hide();
});
});
</script>';

View File

@ -112,7 +112,7 @@ switch (post('op')) {
}
}
$descrizione = tr('Intervento numero _NUM_ del _DATE_ [_STATE_]', [
$descrizione = tr('Attività numero _NUM_ del _DATE_ [_STATE_]', [
'_NUM_' => $intervento['codice_intervento'],
'_DATE_' => Translator::dateToLocale($intervento['data']),
'_STATE_' => $intervento['stato'],

View File

@ -416,6 +416,26 @@ echo '
<?php
if (!$block_edit) {
// Lettura preventivi accettati, in attesa di conferma o in lavorazione
$prev_query = 'SELECT COUNT(*) AS tot FROM co_preventivi WHERE idanagrafica='.prepare($record['idanagrafica']).' AND idstato IN(SELECT id FROM co_statipreventivi WHERE is_fatturabile = 1) AND default_revision=1 AND co_preventivi.id IN (SELECT idpreventivo FROM co_righe_preventivi WHERE co_righe_preventivi.idpreventivo = co_preventivi.id AND (qta - qta_evasa) > 0)';
$preventivi = $dbo->fetchArray($prev_query)[0]['tot'];
echo '
<div class="tip" data-toggle="tooltip" title="'.tr("L'aggiunta del documento secondo questa procedura non associa l'attività al relativo consuntivo del documento: utilizzare i campi soprastanti a questo fine").'.">
<a class="btn btn-sm btn-primary '.(!empty($preventivi) ? '' : ' disabled').'" data-href="'.$structure->fileurl('add_preventivo.php').'?id_module='.$id_module.'&id_record='.$id_record.'" data-title="'.tr('Aggiungi preventivo').'" data-toggle="tooltip">
<i class="fa fa-plus"></i> '.tr('Preventivo').'
</a>
</div>';
// Lettura contratti accettati, in attesa di conferma o in lavorazione
$contr_query = 'SELECT COUNT(*) AS tot FROM co_contratti WHERE idanagrafica='.prepare($record['idanagrafica']).' AND idstato IN( SELECT id FROM co_staticontratti WHERE is_fatturabile = 1) AND co_contratti.id IN (SELECT idcontratto FROM co_righe_contratti WHERE co_righe_contratti.idcontratto = co_contratti.id AND (qta - qta_evasa) > 0)';
$contratti = $dbo->fetchArray($contr_query)[0]['tot'];
echo '
<div class="tip" data-toggle="tooltip" title="'.tr("L'aggiunta del documento secondo questa procedura non associa l'attività al relativo consuntivo del documento: utilizzare i campi soprastanti a questo fine").'.">
<a class="btn btn-sm btn-primary '.(!empty($contratti) ? '' : ' disabled').'" data-href="'.$structure->fileurl('add_contratto.php').'?id_module='.$id_module.'&id_record='.$id_record.'" data-title="'.tr('Aggiungi contratto').'">
<i class="fa fa-plus"></i> '.tr('Contratto').'
</a>
</div>';
// Lettura ddt (entrata o uscita)
$ddt_query = 'SELECT COUNT(*) AS tot FROM dt_ddt
LEFT JOIN `dt_causalet` ON `dt_causalet`.`id` = `dt_ddt`.`idcausalet`
@ -428,8 +448,8 @@ if (!$block_edit) {
AND dt_ddt.id IN (SELECT idddt FROM dt_righe_ddt WHERE dt_righe_ddt.idddt = dt_ddt.id AND (qta - qta_evasa) > 0)';
$ddt = $dbo->fetchArray($ddt_query)[0]['tot'];
echo '
<div class="tip" data-toggle="tooltip" title="'.tr('DDT in uscita per il Cliente che si trovano nello stato di Evaso o Parzialmente Evaso con una Causale importabile.').'">
<button type="button" class="btn btn-sm btn-primary'.(!empty($ddt) ? '' : ' disabled').'" data-href="'.base_path().'/modules/interventi/add_ddt.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="'.tr('Aggiungi DDT in uscita').'">
<div class="tip" data-toggle="tooltip" title="'.tr('DDT in uscita per il Cliente che si trovano nello stato di Evaso o Parzialmente Evaso con una Causale importabile').'. '.tr("L'aggiunta del documento secondo questa procedura non associa l'attività al relativo consuntivo del documento: utilizzare i campi soprastanti a questo fine").'.">
<button type="button" class="btn btn-sm btn-primary'.(!empty($ddt) ? '' : ' disabled').'" data-href="'.$structure->fileurl('add_ddt.php').'?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="'.tr('Aggiungi DDT in uscita').'">
<i class="fa fa-plus"></i> '.tr('Ddt').'
</button>
</div>';

View File

@ -158,7 +158,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$sessioni = $intervento->sessioni;
if (empty($sessioni)) {
flash()->warning(tr("L'intervento _NUM_ non ha sessioni di lavoro!", [
flash()->warning(tr("L'attività _NUM_ non ha sessioni di lavoro!", [
'_NUM_' => $codice,
]));
} else {
@ -171,7 +171,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$sessione = $gruppo->first();
$riga = Riga::build($fattura);
$riga->descrizione = tr("Ore di lavoro dell'intervento _NUM_ del _DATE_", [
$riga->descrizione = tr("Ore di lavoro dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
@ -202,7 +202,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$diritto_chiamata = $gruppo->first();
$riga = Riga::build($fattura);
$riga->descrizione = tr("Diritto di chiamata dell'intervento _NUM_ del _DATE_", [
$riga->descrizione = tr("Diritto di chiamata dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
@ -236,7 +236,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$viaggio = $gruppo->first();
$riga = Riga::build($fattura);
$riga->descrizione = tr("Trasferta dell'intervento _NUM_ del _DATE_", [
$riga->descrizione = tr("Trasferta dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);

View File

@ -28,7 +28,7 @@ use Modules\Ordini\Components\Sconto;
use Modules\Ordini\Ordine;
use Modules\Ordini\Tipo;
use Modules\Preventivi\Preventivo;
use Plugins\DettagliArticolo\DettaglioPrezzo;
use Plugins\ListinoClienti\DettaglioPrezzo;
$module = Modules::get($id_module);

View File

@ -364,11 +364,14 @@ $(document).ready(function() {
});
</script>';
//fatture, ordini collegate a questo preventivo
$elementi = $dbo->fetchArray('SELECT `co_documenti`.`id`, `co_documenti`.`data`, `co_documenti`.`numero`, `co_documenti`.`numero_esterno`, `co_tipidocumento`.`descrizione` AS tipo_documento, `co_tipidocumento`.`dir` FROM `co_documenti` JOIN `co_tipidocumento` ON `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento` WHERE `co_documenti`.`id` IN (SELECT `iddocumento` FROM `co_righe_documenti` WHERE `idpreventivo` = '.prepare($id_record).')
// Fatture, ordini collegate a questo preventivo
$elementi = $dbo->fetchArray('SELECT `co_documenti`.`id`, `co_documenti`.`data`, `co_documenti`.`numero`, `co_documenti`.`numero_esterno`, `co_tipidocumento`.`descrizione` AS tipo_documento, IF(`co_tipidocumento`.`dir` = \'entrata\', \'Fatture di vendita\', \'Fatture di acquisto\') AS modulo FROM `co_documenti` JOIN `co_tipidocumento` ON `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento` WHERE `co_documenti`.`id` IN (SELECT `iddocumento` FROM `co_righe_documenti` WHERE `idpreventivo` = '.prepare($id_record).')
UNION
SELECT `or_ordini`.`id`, `or_ordini`.`data`, `or_ordini`.`numero`, `or_ordini`.`numero_esterno`, "Ordine cliente" AS tipo_documento, 0 AS dir FROM `or_ordini` JOIN `or_righe_ordini` ON `or_righe_ordini`.`idordine` = `or_ordini`.`id` WHERE `or_righe_ordini`.`idpreventivo` = '.prepare($id_record).'
SELECT `or_ordini`.`id`, `or_ordini`.`data`, `or_ordini`.`numero`, `or_ordini`.`numero_esterno`, \'Ordine cliente\', \'Ordini cliente\' FROM `or_ordini` JOIN `or_righe_ordini` ON `or_righe_ordini`.`idordine` = `or_ordini`.`id` WHERE `or_righe_ordini`.`idpreventivo` = '.prepare($id_record).'
UNION
SELECT `in_interventi`.`id`, `in_interventi`.`data_richiesta`, `in_interventi`.`codice`, NULL, \'Attività\', \'Interventi\' FROM `in_interventi` JOIN `in_righe_interventi` ON `in_righe_interventi`.`idintervento` = `in_interventi`.`id` WHERE (`in_righe_interventi`.`original_document_id` = '.prepare($preventivo->id).' AND `in_righe_interventi`.`original_document_type` = '.prepare(get_class($preventivo)).') OR `in_interventi`.`id_preventivo` = '.prepare($id_record).'
ORDER BY `data`');
@ -393,15 +396,8 @@ if (!empty($elementi)) {
'_DATE_' => Translator::dateToLocale($elemento['data']),
]);
if (in_array($elemento['tipo_documento'], ['Ordine cliente'])) {
$modulo = 'Ordini cliente';
} else {
$modulo = ($elemento['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto';
}
$id = $elemento['id'];
echo '
<li>'.Modules::link($modulo, $id, $descrizione).'</li>';
<li>'.Modules::link($elemento['modulo'], $elemento['id'], $descrizione).'</li>';
}
echo '

View File

@ -19,13 +19,14 @@
namespace Plugins\ImportFE;
use Common\Components\Component;
use Modules\Anagrafiche\Anagrafica;
use Modules\Articoli\Articolo as ArticoloOriginale;
use Modules\Articoli\Categoria;
use Modules\Fatture\Components\Articolo;
use Modules\Fatture\Components\Riga;
use Modules\Fatture\Fattura;
use Plugins\DettagliArticolo\DettaglioPrezzo;
use Plugins\ListinoClienti\DettaglioPrezzo;
use UnexpectedValueException;
use Util\XML;
@ -173,8 +174,9 @@ class FatturaOrdinaria extends FatturaElettronica
$obj->descrizione = $riga['Descrizione'];
// Collegamento al documento di riferimento
if (!empty($tipi_riferimenti[$key])) {
list($riferimento_precedente, $nuovo_riferimento) = $obj->impostaOrigine($tipi_riferimenti[$key], $id_riferimenti[$key]);
if (!empty($tipi_riferimenti[$key]) && is_subclass_of($tipi_riferimenti[$key], Component::class)) {
$riga_origine = ($tipi_riferimenti[$key])::find($id_riferimenti[$key]);
list($riferimento_precedente, $nuovo_riferimento) = $obj->impostaOrigine($riga_origine);
// Correzione della descrizione
$obj->descrizione = str_replace($riferimento_precedente, '', $obj->descrizione);

View File

@ -24,7 +24,7 @@ use Common\SimpleModelTrait;
use Illuminate\Database\Eloquent\Builder;
use Modules\Articoli\Articolo as Original;
use Modules\Articoli\Movimento;
use Plugins\DettagliArticolo\DettaglioFornitore;
use Plugins\ListinoFornitori\DettaglioFornitore;
use UnexpectedValueException;
abstract class Article extends Accounting

View File

@ -34,6 +34,8 @@ use InvalidArgumentException;
*
* @property string original_type
* @property string original_id
* @property string original_document_id
* @property string original_document_type
*
* @template T
*
@ -201,8 +203,10 @@ abstract class Component extends Model
// Attributi dell'oggetto da copiare
$attributes = $this->getAttributes();
unset($attributes['id']);
unset($attributes['order']);
// Rimozione attributi problematici
$remove = ['id', 'order', 'original_id', 'original_type', 'original_document_id', 'original_document_type'];
$attributes = array_diff_key($attributes, array_flip($remove));
if ($qta !== null) {
$attributes['qta'] = $qta;
@ -219,18 +223,17 @@ abstract class Component extends Model
// Riferimento di origine per l'evasione automatica della riga
if ($evadi_qta_parent) {
// Mantenimento dell'origine della riga precedente
$model->original_id = $attributes['original_id'];
$model->original_type = $attributes['original_type'];
// Utilizzato per la rimozione del riferimento precedente dalla descrizione
$model->original_id = $this->original_id;
$model->original_type = $this->original_type;
// Aggiornamento dei riferimenti
list($riferimento_precedente, $nuovo_riferimento) = $model->impostaOrigine($current, $this->id);
list($riferimento_precedente, $nuovo_riferimento) = $model->impostaOrigine($this);
// Correzione della descrizione
$attributes['descrizione'] = str_replace($riferimento_precedente, '', $attributes['descrizione']);
$attributes['descrizione'] .= $nuovo_riferimento;
}
unset($attributes['original_id']);
unset($attributes['original_type']);
// Impostazione del genitore
$model->setDocument($document);
@ -266,30 +269,50 @@ abstract class Component extends Model
*
* @return array
*/
public function impostaOrigine($type, $id)
public function impostaOrigine($riga)
{
$riferimento_precedente = null;
$nuovo_riferimento = null;
// Rimozione del riferimento precedente dalla descrizione
if ($this->hasOriginalComponent()) {
$riferimento = $this->getOriginalComponent()->getDocument()->getReference();
$riferimento_precedente = "\nRif. ".strtolower($riferimento);
$riferimento_precedente = self::getDescrizioneRiferimento(
$this->getOriginalComponent()->getDocument()
);
}
$this->original_id = $id;
$this->original_type = $type;
// Informazioni del nuovo riferimento
if (!empty($riga)) {
$this->original_id = $riga->id;
$this->original_type = get_class($riga);
// Aggiunta del riferimento nella descrizione
$origine = $type::find($id);
if (!empty($origine)) {
$riferimento = $origine->getDocument()->getReference();
$nuovo_riferimento = "\nRif. ".strtolower($riferimento);
$documento_origine = $riga->getDocument();
$this->original_document_id = $documento_origine->id;
$this->original_document_type = get_class($documento_origine);
// Aggiunta del riferimento nella descrizione
$nuovo_riferimento = self::getDescrizioneRiferimento(
$documento_origine
);
}
// Rimozione dei riferimenti precedenti
else {
$this->original_id = null;
$this->original_type = null;
$this->original_document_id = null;
$this->original_document_type = null;
}
return [$riferimento_precedente, $nuovo_riferimento];
}
public static function getDescrizioneRiferimento(Document $origine)
{
$riferimento = $origine->getReference();
return "\nRif. ".strtolower($riferimento);
}
/**
* Imposta il proprietario dell'oggetto e l'ordine relativo all'interno delle righe.
*

View File

@ -80,17 +80,17 @@ echo '
echo '
<tr>
<td colspan="2"><h6><b>Totale Attività</b></h6></td>
<td class="text-right"><h6><b>'.numberFormat(abs($totale_attivita)).'</b></h6></td>
<td class="text-right" style="font-size:8pt;"><b>'.numberFormat(abs($totale_attivita)).'</b></td>
</tr>';
if ($utile_perdita > 0) {
echo '
<tr>
<td colspan="2"><h6><b>Perdita</b></h6></td>
<td class="text-right"><h6><b>'.numberFormat(abs($utile_perdita)).'</b></h6></td>
<td class="text-right" style="font-size:8pt;"><b>'.numberFormat(abs($utile_perdita)).'</b></td>
</tr>
<tr>
<td colspan="2"><h6><b>Totale a pareggio</b></h6></td>
<td class="text-right"><h6><b>'.numberFormat(abs($totale_attivita) + abs($utile_perdita)).'</b></h6></td>
<td class="text-right" style="font-size:8pt;"><b>'.numberFormat(abs($totale_attivita) + abs($utile_perdita)).'</b></td>
</tr>';
}
echo '
@ -155,17 +155,17 @@ echo '
echo '
<tr>
<td colspan="2"><h6><b>Totale Passività</b></h6></td>
<td class="text-right"><h6><b>'.numberFormat(abs($totale_passivita)).'</b></h6></td>
<td class="text-right" style="font-size:8pt;"><b>'.numberFormat(abs($totale_passivita)).'</b></td>
</tr>';
if ($utile_perdita < 0) {
echo '
<tr>
<td colspan="2"><h6><b>Utile</b></h6></td>
<td class="text-right"><h6><b>'.numberFormat(abs($utile_perdita)).'</b></h6></td>
<td class="text-right" style="font-size:8pt;"><b>'.numberFormat(abs($utile_perdita)).'</b></td>
</tr>
<tr>
<td colspan="2"><h6><b>Totale a pareggio</b></h6></td>
<td class="text-right"><h6><b>'.numberFormat(abs($totale_passivita) + abs($utile_perdita)).'</b></h6></td>
<td class="text-right" style="font-size:8pt;"><b>'.numberFormat(abs($totale_passivita) + abs($utile_perdita)).'</b></td>
</tr>';
}
echo '
@ -187,13 +187,13 @@ echo '
<table class="table table-striped table-bordered" style=" overflow:hidden;" id="contents">
<thead>
<tr>
<th colspan="3"><h5>Costi</h5></th>
<th colspan="4"><h5>Costi</h5></th>
</tr>
<tr>
<th width="15%">CONTO</th>
<th width="60%">DESCRIZIONE</th>
<th width="25%">SALDO</th>
<th width="12%">CONTO</th>
<th>DESCRIZIONE</th>
<th width="21%">SALDO</th>
<th width="21%">REDDITO</th>
</tr>
</thead>
<tbody>';
@ -206,6 +206,7 @@ echo '
<td><b>'.$liv2_e['numero'].'</b></td>
<td><b>'.$liv2_e['descrizione'].'</b></td>
<td class="text-right"><b>'.numberFormat($liv2_e['totale']).'</b></td>
<td class="text-right"><b>'.numberFormat($liv2_e['totale_reddito']).'</b></td>
</tr>';
foreach ($liv3_economico as $liv3_e) {
@ -215,6 +216,7 @@ echo '
<td>'.$liv3_e['numero'].'</td>
<td>'.$liv3_e['descrizione'].'</td>
<td class="text-right">'.numberFormat($liv3_e['totale']).'</td>
<td class="text-right">'.numberFormat($liv3_e['totale_reddito']).'</td>
</tr>';
}
}
@ -223,17 +225,20 @@ echo '
echo '
<tr>
<td colspan="2"><h6><b>Totale costi</b></h6></td>
<td class="text-right"><h6><b>'.numberFormat(abs($totale_costi)).'</b></h6></td>
<td class="text-right" style="font-size:8pt;"><b>'.numberFormat(abs($totale_costi)).'</b></td>
<td></td>
</tr>';
if ($utile_perdita < 0) {
echo '
<tr>
<td colspan="2"><h6><b>Utile</b></h6></td>
<td class="text-right"><h6><b>'.numberFormat(abs($utile_perdita)).'</b></h6></td>
<td class="text-right" style="font-size:8pt;"><b>'.numberFormat(abs($utile_perdita)).'</b></td>
<td></td>
</tr>
<tr>
<td colspan="2"><h6><b>Totale a pareggio</b></h6></td>
<td class="text-right"><h6><b>'.numberFormat(abs($totale_costi) + abs($utile_perdita)).'</b></h6></td>
<td class="text-right" style="font-size:8pt;"><b>'.numberFormat(abs($totale_costi) + abs($utile_perdita)).'</b></td>
<td></td>
</tr>';
}
echo '
@ -246,14 +251,13 @@ echo '
<table class="table table-striped table-bordered" style=" overflow:hidden;" id="contents">
<thead>
<tr>
<th colspan="3"><h5>Ricavi</h5></th>
<th colspan="4"><h5>Ricavi</h5></th>
</tr>
<tr>
<th width="15%">CONTO</th>
<th width="60%">DESCRIZIONE</th>
<th width="25%">SALDO</th>
<th width="12%">CONTO</th>
<th>DESCRIZIONE</th>
<th width="21%">SALDO</th>
<th width="21%">REDDITO</th>
</tr>
</thead>
<tbody>';
@ -266,6 +270,7 @@ echo '
<td><b>'.$liv2_e['numero'].'</b></td>
<td><b>'.$liv2_e['descrizione'].'</b></td>
<td class="text-right"><b>'.numberFormat(abs($liv2_e['totale'])).'</b></td>
<td class="text-right"><b>'.numberFormat(abs($liv2_e['totale_reddito'])).'</b></td>
</tr>';
foreach ($liv3_economico as $liv3_e) {
@ -275,6 +280,7 @@ echo '
<td>'.$liv3_e['numero'].'</td>
<td>'.$liv3_e['descrizione'].'</td>
<td class="text-right">'.numberFormat(abs($liv3_e['totale'])).'</td>
<td class="text-right">'.numberFormat(abs($liv3_e['totale_reddito'])).'</td>
</tr>';
}
}
@ -283,17 +289,19 @@ echo '
echo '
<tr>
<td colspan="2"><h6><b>Totale ricavi</b></h6></td>
<td class="text-right"><h6><b>'.numberFormat(abs($totale_ricavi)).'</b></h6></td>
<td style="font-size:8pt;" class="text-right"><b>'.numberFormat(abs($totale_ricavi)).'</b></td>
<td></td>
</tr>';
if ($utile_perdita > 0) {
echo '
<tr>
<td colspan="2"><h6><b>Perdita</b></h6></td>
<td class="text-right"><h6><b>'.numberFormat(abs($utile_perdita)).'</b></h6></td>
<td class="text-right" style="font-size:8pt;"><b>'.numberFormat(abs($utile_perdita)).'</b></td>
</tr>
<tr>
<td colspan="2"><h6><b>Totale a pareggio</b></td>
<td class="text-right"><h6><b>'.numberFormat(abs($totale_ricavi) + abs($utile_perdita)).'</b></h6></td>
<td class="text-right" style="font-size:8pt;"><b>'.numberFormat(abs($totale_ricavi) + abs($utile_perdita)).'</b></td>
<td></td>
</tr>';
}
echo '

View File

@ -29,11 +29,11 @@ $esercizio = $esercizio->format('Y');
$liv2_patrimoniale = $dbo->fetchArray('SELECT co_pianodeiconti2.numero AS numero, co_pianodeiconti2.descrizione AS descrizione, SUM(totale) AS totale, co_pianodeiconti2.id AS id FROM `co_movimenti` INNER JOIN co_pianodeiconti3 ON co_movimenti.idconto=co_pianodeiconti3.id INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE idconto IN(SELECT id FROM co_pianodeiconti3 WHERE idpianodeiconti2 IN(SELECT id FROM co_pianodeiconti2 WHERE idpianodeiconti1=(SELECT id FROM co_pianodeiconti1 WHERE descrizione="Patrimoniale"))) AND co_movimenti.data>='.prepare($date_start).' AND co_movimenti.data<='.prepare($date_end).' GROUP BY idpianodeiconti2 ORDER BY co_pianodeiconti2.numero');
$liv2_economico = $dbo->fetchArray('SELECT co_pianodeiconti2.numero AS numero, co_pianodeiconti2.descrizione AS descrizione, SUM(totale) AS totale, co_pianodeiconti2.id AS id FROM `co_movimenti` INNER JOIN co_pianodeiconti3 ON co_movimenti.idconto=co_pianodeiconti3.id INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE idconto IN(SELECT id FROM co_pianodeiconti3 WHERE idpianodeiconti2 IN(SELECT id FROM co_pianodeiconti2 WHERE idpianodeiconti1=(SELECT id FROM co_pianodeiconti1 WHERE descrizione="Economico"))) AND co_movimenti.data>='.prepare($date_start).' AND co_movimenti.data<='.prepare($date_end).' GROUP BY idpianodeiconti2 ORDER BY co_pianodeiconti2.numero');
$liv2_economico = $dbo->fetchArray('SELECT co_pianodeiconti2.numero AS numero, co_pianodeiconti2.descrizione AS descrizione, SUM(totale) AS totale, SUM(totale_reddito) AS totale_reddito, co_pianodeiconti2.id AS id FROM `co_movimenti` INNER JOIN co_pianodeiconti3 ON co_movimenti.idconto=co_pianodeiconti3.id INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE idconto IN(SELECT id FROM co_pianodeiconti3 WHERE idpianodeiconti2 IN(SELECT id FROM co_pianodeiconti2 WHERE idpianodeiconti1=(SELECT id FROM co_pianodeiconti1 WHERE descrizione="Economico"))) AND co_movimenti.data>='.prepare($date_start).' AND co_movimenti.data<='.prepare($date_end).' GROUP BY idpianodeiconti2 ORDER BY co_pianodeiconti2.numero');
$liv3_patrimoniale = $dbo->fetchArray('SELECT co_pianodeiconti3.numero AS numero, co_pianodeiconti3.descrizione AS descrizione, SUM(totale) AS totale, co_pianodeiconti3.idpianodeiconti2 AS idpianodeiconti2 FROM `co_movimenti` INNER JOIN co_pianodeiconti3 ON co_movimenti.idconto=co_pianodeiconti3.id INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE idconto IN(SELECT id FROM co_pianodeiconti3 WHERE idpianodeiconti2 IN(SELECT id FROM co_pianodeiconti2 WHERE idpianodeiconti1=(SELECT id FROM co_pianodeiconti1 WHERE descrizione="Patrimoniale"))) AND idpianodeiconti2!='.prepare($fornitori).' AND co_pianodeiconti3.id NOT IN (SELECT idconto_cliente FROM an_anagrafiche) AND co_pianodeiconti3.id NOT IN (SELECT idconto_fornitore FROM an_anagrafiche) AND co_movimenti.data>='.prepare($date_start).' AND co_movimenti.data<='.prepare($date_end).' GROUP BY idconto ORDER BY co_pianodeiconti2.numero');
$liv3_patrimoniale = $dbo->fetchArray('SELECT co_pianodeiconti3.numero AS numero, co_pianodeiconti3.descrizione AS descrizione, SUM(totale) AS totale, co_pianodeiconti3.idpianodeiconti2 AS idpianodeiconti2 FROM `co_movimenti` INNER JOIN co_pianodeiconti3 ON co_movimenti.idconto=co_pianodeiconti3.id INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE idconto IN(SELECT id FROM co_pianodeiconti3 WHERE idpianodeiconti2 IN(SELECT id FROM co_pianodeiconti2 WHERE idpianodeiconti1=(SELECT id FROM co_pianodeiconti1 WHERE descrizione="Patrimoniale"))) AND idpianodeiconti2!='.prepare($fornitori).' AND co_pianodeiconti3.id NOT IN (SELECT idconto_cliente FROM an_anagrafiche) AND co_pianodeiconti3.id NOT IN (SELECT idconto_fornitore FROM an_anagrafiche) AND co_movimenti.data>='.prepare($date_start).' AND co_movimenti.data<='.prepare($date_end).' GROUP BY idconto ORDER BY co_pianodeiconti3.numero');
$liv3_economico = $dbo->fetchArray('SELECT co_pianodeiconti3.numero AS numero, co_pianodeiconti3.descrizione AS descrizione, SUM(totale) AS totale, co_pianodeiconti3.idpianodeiconti2 AS idpianodeiconti2 FROM `co_movimenti` INNER JOIN co_pianodeiconti3 ON co_movimenti.idconto=co_pianodeiconti3.id INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE idconto IN(SELECT id FROM co_pianodeiconti3 WHERE idpianodeiconti2 IN(SELECT id FROM co_pianodeiconti2 WHERE idpianodeiconti1=(SELECT id FROM co_pianodeiconti1 WHERE descrizione="Economico"))) AND co_movimenti.data>='.prepare($date_start).' AND co_movimenti.data<='.prepare($date_end).' GROUP BY idconto ORDER BY co_pianodeiconti2.numero');
$liv3_economico = $dbo->fetchArray('SELECT co_pianodeiconti3.numero AS numero, co_pianodeiconti3.descrizione AS descrizione, SUM(totale) AS totale, SUM(totale_reddito) AS totale_reddito, co_pianodeiconti3.idpianodeiconti2 AS idpianodeiconti2 FROM `co_movimenti` INNER JOIN co_pianodeiconti3 ON co_movimenti.idconto=co_pianodeiconti3.id INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE idconto IN(SELECT id FROM co_pianodeiconti3 WHERE idpianodeiconti2 IN(SELECT id FROM co_pianodeiconti2 WHERE idpianodeiconti1=(SELECT id FROM co_pianodeiconti1 WHERE descrizione="Economico"))) AND co_movimenti.data>='.prepare($date_start).' AND co_movimenti.data<='.prepare($date_end).' GROUP BY idconto ORDER BY co_pianodeiconti3.numero');
$utile_perdita = $dbo->fetchOne('SELECT SUM(totale) AS totale FROM `co_movimenti` WHERE idconto IN(SELECT id FROM co_pianodeiconti3 WHERE idpianodeiconti2 IN(SELECT id FROM co_pianodeiconti2 WHERE idpianodeiconti1=(SELECT id FROM co_pianodeiconti1 WHERE descrizione="Economico")))AND co_movimenti.data>='.prepare($date_start).' AND co_movimenti.data<='.prepare($date_end))['totale'];

View File

@ -158,3 +158,23 @@ INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`,
(NULL, 'Piani di sconto/maggiorazione', 'Piani di sconto/magg.', (SELECT `id` FROM `zz_modules` WHERE `name`='Articoli'), (SELECT `id` FROM `zz_modules` WHERE `name`='Articoli'), 'tab', 'piani_sconto_maggiorazione', 'custom');
UPDATE `zz_modules` SET `name` = 'Piani di sconto/maggiorazione' WHERE `name` = 'Piani di sconto/magg.';
-- Aggiunta riferimento documenti
ALTER TABLE `co_righe_promemoria` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
ALTER TABLE `in_righe_interventi` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
ALTER TABLE `co_righe_contratti` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
ALTER TABLE `co_righe_preventivi` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
ALTER TABLE `co_righe_documenti` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
ALTER TABLE `or_righe_ordini` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
ALTER TABLE `dt_righe_ddt` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
UPDATE `co_righe_documenti` SET `original_document_id` = `idcontratto`, `original_document_type` = 'Modules\\Contratti\\Contratto' WHERE `idcontratto` != 0;
UPDATE `co_righe_documenti` SET `original_document_id` = `idpreventivo`, `original_document_type` = 'Modules\\Preventivi\\Preventivo' WHERE `idpreventivo` != 0;
UPDATE `co_righe_documenti` SET `original_document_id` = `idintervento`, `original_document_type` = 'Modules\\Interventi\\Intervento' WHERE `idintervento` IS NOT NULL;
UPDATE `co_righe_documenti` SET `original_document_id` = `idordine`, `original_document_type` = 'Modules\\Ordini\\Ordine' WHERE `idordine` != 0;
UPDATE `co_righe_documenti` SET `original_document_id` = `idintervento`, `original_document_type` = 'Modules\\DDT\\DDT' WHERE `idddt` != 0;
UPDATE `co_righe_documenti` INNER JOIN `co_righe_documenti` AS origine ON `origine`.`id` = `co_righe_documenti`.`ref_riga_documento` SET `co_righe_documenti`.`original_document_id` = `origine`.`iddocumento`, `co_righe_documenti`.`original_document_type` = 'Modules\\Fatture\\Fattura' WHERE `co_righe_documenti`.`ref_riga_documento` IS NOT NULL;
UPDATE `dt_righe_ddt` SET `original_document_id` = `idordine`, `original_document_type` = 'Modules\\Ordini\\Ordine' WHERE `idordine` != 0;
UPDATE `or_righe_ordini` SET `original_document_id` = `idpreventivo`, `original_document_type` = 'Modules\\Preventivi\\Preventivo' WHERE `idpreventivo` != 0;