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. 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.23 (2021-05-18)](#2423-2021-05-18)
- [2.4.22 (2021-03-01)](#2422-2021-03-01) - [2.4.22 (2021-03-01)](#2422-2021-03-01)
- [2.4.21 (2021-01-14)](#2421-2021-01-14) - [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.2 (2016-11-10)](#22-2016-11-10)
- [2.1 (2015-04-02)](#21-2015-04-02) - [2.1 (2015-04-02)](#21-2015-04-02)
## 2.4.24 (2021-00-00) ## 2.4.24 (2021-07-28)
### Aggiunto (Added) ### Aggiunto (Added)
- Aggiunta nel calendario della Dashboard visualizzazione dei preventivi pianificabili in corrispondenza alla data di accettazione e conclusione. - 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 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 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** - 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 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 impostazione per la rimozione del blocco sulle quantità massime importabili fra documenti
- Aggiunta colonna **Rif. fattura** nei moduli Ordini cliente e fornitore - 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 ### Fixed
- Sostituito plugin **Componenti** nel modulo Impianti con la possibilità di inserire gli articoli di magazzino - 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 - 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) ## 2.4.23 (2021-05-18)
### Aggiunto (Added) ### Aggiunto (Added)
- Nuovo *Sconto finale* per gli **Ordini**, **Preventivi**, **DDT** e **Contratti**, influenza il valore *Netto a pagare* del documento. - 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 attività per mostrare al tecnico solo le attività assegnate.
- Nuovo filtro in contratti per mostrare al cliente solo i contratti collegati. - Nuovo filtro in contratti per mostrare al cliente solo i contratti collegati.
- Nuovo pulsante **Duplica Template** per copiare un template già esistente. - 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. - 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. - 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 // 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 // Database
$dbo = $database = 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\Components\Articolo as ArticoloPreventivo;
use Modules\Preventivi\Preventivo; use Modules\Preventivi\Preventivo;
use Modules\TipiIntervento\Tipo as TipoSessione; use Modules\TipiIntervento\Tipo as TipoSessione;
use Plugins\DettagliArticolo\DettaglioPrezzo; use Plugins\ListinoClienti\DettaglioPrezzo;
use Prints; use Prints;
switch (post('op')) { switch (post('op')) {

View File

@ -26,7 +26,7 @@ use Modules\Anagrafiche\Sede;
use Modules\Articoli\Articolo; use Modules\Articoli\Articolo;
use Modules\Articoli\Categoria; use Modules\Articoli\Categoria;
use Modules\Iva\Aliquota; use Modules\Iva\Aliquota;
use Plugins\DettagliArticolo\DettaglioPrezzo; use Plugins\ListinoClienti\DettaglioPrezzo;
/** /**
* Struttura per la gestione delle operazioni di importazione (da CSV) degli Articoli. * 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 // Collegamenti diretti
// Fatture o interventi collegati a questo contratto // 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 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)) { if (!empty($elementi)) {
echo ' echo '
@ -455,31 +458,15 @@ if (!empty($elementi)) {
<ul>'; <ul>';
// Elenco attività o contratti collegati // Elenco attività o contratti collegati
foreach ($elementi as $riga) { foreach ($elementi as $elemento) {
if (!empty($riga['dir'])) { $descrizione = tr('_DOC_ num. _NUM_ del _DATE_', [
$descrizione = tr('_DOC_ num. _NUM_ del _DATE_', [ '_DOC_' => $elemento['tipo_documento'],
'_DOC_' => $riga['tipo_documento'], '_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'],
'_NUM_' => !empty($riga['numero_esterno']) ? $riga['numero_esterno'] : $riga['numero'], '_DATE_' => Translator::dateToLocale($elemento['data']),
'_DATE_' => Translator::dateToLocale($riga['data']), ]);
]);
$modulo = ($riga['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto'; echo '
$id = $riga['id']; <li>'.Modules::link($elemento['modulo'], $elemento['id'], $descrizione).'</li>';
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 ' echo '

View File

@ -51,8 +51,8 @@ echo '
$rs = $dbo->fetchArray('SELECT $rs = $dbo->fetchArray('SELECT
in_interventi.id, 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(\'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(\'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\')) AS info,
CONCAT(\'\n\', in_interventi.descrizione) AS descrizione_intervento, CONCAT(\'\n\', in_interventi.descrizione) AS descrizione_intervento,
IF(idclientefinale='.prepare($idanagrafica).', \'Interventi conto terzi\', \'Interventi diretti\') AS `optgroup` IF(idclientefinale='.prepare($idanagrafica).', \'Interventi conto terzi\', \'Interventi diretti\') AS `optgroup`
FROM FROM

View File

@ -634,7 +634,7 @@ if (!$block_edit) {
echo ' echo '
<div class="tip" data-toggle="tooltip" title="'.tr('Attività completate non collegate a preventivi o contratti e che non siano già state fatturate.').'"> <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à').' <i class="fa fa-plus"></i> '.tr('Attività').'
</a> </a>
</div>'; </div>';
@ -644,7 +644,7 @@ if (!$block_edit) {
$preventivi = $dbo->fetchArray($prev_query)[0]['tot']; $preventivi = $dbo->fetchArray($prev_query)[0]['tot'];
echo ' echo '
<div class="tip"> <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').' <i class="fa fa-plus"></i> '.tr('Preventivo').'
</a> </a>
</div>'; </div>';
@ -654,7 +654,7 @@ if (!$block_edit) {
$contratti = $dbo->fetchArray($contr_query)[0]['tot']; $contratti = $dbo->fetchArray($contr_query)[0]['tot'];
echo ' echo '
<div class="tip"> <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').' <i class="fa fa-plus"></i> '.tr('Contratto').'
</a> </a>
</div>'; </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)'; 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']; $ddt = $dbo->fetchArray($ddt_query)[0]['tot'];
echo ' 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').'"> <div class="tip">
<i class="fa fa-plus"></i> '.tr('Ddt').' <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').'">
</a>'; <i class="fa fa-plus"></i> '.tr('Ddt').'
</a>
</div>';
// Lettura ordini (cliente o fornitore) // 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_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']; $ordini = $dbo->fetchArray($ordini_query)[0]['tot'];
echo ' 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').'"> <div class="tip">
<i class="fa fa-plus"></i> '.tr('Ordine').' <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').'">
</a>'; <i class="fa fa-plus"></i> '.tr('Ordine').'
</a>
</div>';
} }
// Lettura articoli // 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'], '_NUM_' => $intervento['codice_intervento'],
'_DATE_' => Translator::dateToLocale($intervento['data']), '_DATE_' => Translator::dateToLocale($intervento['data']),
'_STATE_' => $intervento['stato'], '_STATE_' => $intervento['stato'],

View File

@ -416,6 +416,26 @@ echo '
<?php <?php
if (!$block_edit) { 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) // Lettura ddt (entrata o uscita)
$ddt_query = 'SELECT COUNT(*) AS tot FROM dt_ddt $ddt_query = 'SELECT COUNT(*) AS tot FROM dt_ddt
LEFT JOIN `dt_causalet` ON `dt_causalet`.`id` = `dt_ddt`.`idcausalet` 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)'; 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']; $ddt = $dbo->fetchArray($ddt_query)[0]['tot'];
echo ' 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.').'"> <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="'.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').'"> <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').' <i class="fa fa-plus"></i> '.tr('Ddt').'
</button> </button>
</div>'; </div>';

View File

@ -158,7 +158,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$sessioni = $intervento->sessioni; $sessioni = $intervento->sessioni;
if (empty($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, '_NUM_' => $codice,
])); ]));
} else { } else {
@ -171,7 +171,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$sessione = $gruppo->first(); $sessione = $gruppo->first();
$riga = Riga::build($fattura); $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, '_NUM_' => $codice,
'_DATE_' => dateFormat($data), '_DATE_' => dateFormat($data),
]); ]);
@ -202,7 +202,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$diritto_chiamata = $gruppo->first(); $diritto_chiamata = $gruppo->first();
$riga = Riga::build($fattura); $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, '_NUM_' => $codice,
'_DATE_' => dateFormat($data), '_DATE_' => dateFormat($data),
]); ]);
@ -236,7 +236,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$viaggio = $gruppo->first(); $viaggio = $gruppo->first();
$riga = Riga::build($fattura); $riga = Riga::build($fattura);
$riga->descrizione = tr("Trasferta dell'intervento _NUM_ del _DATE_", [ $riga->descrizione = tr("Trasferta dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice, '_NUM_' => $codice,
'_DATE_' => dateFormat($data), '_DATE_' => dateFormat($data),
]); ]);

View File

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

View File

@ -364,11 +364,14 @@ $(document).ready(function() {
}); });
</script>'; </script>';
//fatture, ordini collegate a questo preventivo // 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).') $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 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`'); ORDER BY `data`');
@ -393,15 +396,8 @@ if (!empty($elementi)) {
'_DATE_' => Translator::dateToLocale($elemento['data']), '_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 ' echo '
<li>'.Modules::link($modulo, $id, $descrizione).'</li>'; <li>'.Modules::link($elemento['modulo'], $elemento['id'], $descrizione).'</li>';
} }
echo ' echo '

View File

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

View File

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

View File

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

View File

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