Merge branch 'master' of https://github.com/devcode-it/openstamanager
This commit is contained in:
commit
f16395151a
65
CHANGELOG.md
65
CHANGELOG.md
|
@ -4,7 +4,8 @@ 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.52 ](#2452)
|
||||
- [2.4.53 (2024-00-00)](#2453-2024-00-00)
|
||||
- [2.4.52 (2023-12-08)](#2452-2023-12-08)
|
||||
- [2.4.51 (2023-10-30)](#2451-2023-10-30)
|
||||
- [2.4.50 (2023-10-06)](#2450-2023-10-06)
|
||||
- [2.4.49 (2023-09-22)](#2449-2023-09-25)
|
||||
|
@ -63,16 +64,66 @@ 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.52
|
||||
## 2.4.53 (2024-00-00)
|
||||
### Aggiunto (Added)
|
||||
- Aggiunta la gestione delle sedi definite come automezzi con pratico modulo per il carico/scarico degli articoli nell'automezzo, l'assegnazione di tecnici/autisti con date di validità e stampe di carico filtrabili
|
||||
- Aggiunta sezione **dettagli aggiuntivi** nel plugin sedi per compilare i dettagli dell'automezzo (nome, descrizione, targa)
|
||||
|
||||
### Modificato (Changed)
|
||||
- Aggiunta una limitazione sulle quantità scaricabili nei documenti di vendita in modo da non poter vendere più articoli di quelli presenti fisicamente nel magazzino selezionato. Questa limitazione è legata all'impostazione **Permetti selezione articoli con quantità minore o uguale a zero in Documenti di Vendita**
|
||||
|
||||
### Fixed
|
||||
- Risolto il problema di visualizzazione dei PDF negli allegati
|
||||
- Risolto un problema di movimentazione magazzino: gli articoli nelle attività venivano sempre movimentati da sede legale anche se specificata diversa sede di partenza nel documento (solo da popup di modifica articolo)
|
||||
- Corretto filtro articoli negli automezzi prendendo correttamente la giacenza della sede centrale
|
||||
|
||||
## 2.4.52 (2023-12-08)
|
||||
### Aggiunto (Added)
|
||||
- Aggiunta la gestione delle sedi definite come automezzi con pratico modulo per il carico/scarico degli articoli nell'automezzo, l'assegnazione di tecnici/autisti con date di validità e stampe di carico filtrabili
|
||||
- Aggiunta una limitazione sulle quantità scaricabili nei documenti di vendita in modo da non poter vendere più articoli di quelli presenti fisicamente nel magazzino selezionato. Questa limitazione è legata all'impostazione **Permetti selezione articoli con quantità minore o uguale a zero in Documenti di Vendita**
|
||||
- Aggiunti costi e margine negli ordini cliente
|
||||
- Aggiunta la possibilità di importare tramite CSV Impianti e Attività
|
||||
- Aggiunte le sottocategorie in Impianti
|
||||
- Aggiunti i DDT alla lista dei documenti collegati nel modulo Preventivi
|
||||
- Aggiunto il calcolo della provvigione in pianificazione fatturazione
|
||||
- Aggiunta una seconda ricerca delle coordinate anagrafica da azione di gruppo con Google Maps
|
||||
- Aggiunta la gestione dei seriali da riferimento documento in fase di importazione di una fattura elettronica
|
||||
- Aggiunta la gestione dei seriali nei contratti
|
||||
- Aggiunta la stampa preventivo (solo totale imponibile)
|
||||
- Aggiunta la selezione delle sottocategorie in fase di aggiunta impianto
|
||||
- Aggiunta la creazione al volo dei referenti in attività
|
||||
- Aggiunto colore in base allo stato in modifica stato da azioni di gruppo in Preventivi, Contratti e Ordini
|
||||
- Aggiunta la gestione del rappresentante fiscale negli XML
|
||||
- Aggiunte le impostazioni per definire il numero di decimali per gli importi, per le quantità e per i totali nelle stampe
|
||||
- Aggiunta la variabile Nome preventivo nei Preventivi
|
||||
- Aggiunto il tipo di pagamento e banca di accredito e addebito nelle scadenze
|
||||
|
||||
### Modificato (Changed)
|
||||
- Migliorata l'importazione degli articoli tramite CSV, le anagrafiche relative a clienti e fornitori vengono ora create se non presenti a gestionale
|
||||
- Migliorato il controllo sulle chiavi esterne nel controllo del database
|
||||
- Ripristinata la funzionalità di duplicazione degli ordini
|
||||
- La modifica della data competenza di una fattura aggiorna ora la data del movimento relativo
|
||||
- Migliorato il caricamento della lista allegati
|
||||
- L'aggiunta di note aggiuntive e la modifica della data competenza è ora sempre possibile nelle fatture
|
||||
- Spostati tutti gli avvisi in basso a destra
|
||||
- Modificate le funzioni nei file modutil.php per permettere l'aggiunta di file custom
|
||||
|
||||
### Fixed
|
||||
- Corretto il problema di visualizzazione dei PDF negli allegati
|
||||
- Corretto un problema di movimentazione magazzino: gli articoli nelle attività venivano sempre movimentati da sede legale anche se specificata diversa sede di partenza nel documento (solo da popup di modifica articolo)
|
||||
- Corretta la selezione degli impianti in pianificazione ciclica delle attività
|
||||
- Corretta la rimozione del referente nelle sedi
|
||||
- Corretta la visualizzazione del modulo fatture di vendita per schermi a bassa risoluzione
|
||||
- Corretti i calcoli della ritenuta e rivalsa in fattura
|
||||
- Corretta l'importazione delle anagrafiche da CSV
|
||||
- Corretta l'importazione di fatture elettroniche con aliquote IVA multiple
|
||||
- Corretta la stampa del consuntivo ordine, della scadenza e del consuntivo
|
||||
- Corretta la validazione di password contenenti il carattere '&'
|
||||
- Corretto il calcolo del totale nei consuntivi
|
||||
- Corretta l'applicazione della marca da bollo in fattura
|
||||
- Corretta la visualizzazione della quantità articoli in fase di selezione
|
||||
- Corretta la visualizzazione delle righe nei documenti in presenza di articoli con quantità 0
|
||||
- Corretta la movimentazione degli articoli
|
||||
- Corretta la creazione del conto del piano dei conti per le anagrafiche
|
||||
- Corretto il funzionamento dei campi personalizzati
|
||||
- Corretta la vista Fatture di vendita per l'icona email
|
||||
- Corretta la crezione di attività da documenti, viene ora mantenuto il collegamento
|
||||
|
||||
## 2.4.51 (2023-10-30)
|
||||
### Aggiunto (Added)
|
||||
|
|
|
@ -496,6 +496,8 @@ if ($structure->permission == 'rw') {
|
|||
foreach ($customs as $custom) {
|
||||
if (post($custom['name']) !== null) {
|
||||
$values[$custom['id']] = post($custom['name']);
|
||||
} else {
|
||||
$values[$custom['id']] = '';
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -520,6 +522,7 @@ if ($structure->permission == 'rw') {
|
|||
$customs_present = array_column($customs_present, 'id_field');
|
||||
|
||||
foreach ($values as $key => $value) {
|
||||
$value = (!is_array($value) ? $value : json_encode($value));
|
||||
if (in_array($key, $customs_present)) {
|
||||
$dbo->update('zz_field_record', [
|
||||
'value' => $value,
|
||||
|
|
|
@ -792,6 +792,18 @@ input.small-width {
|
|||
background-clip: padding-box;
|
||||
}
|
||||
|
||||
.ui-menu .ui-menu-item-wrapper {
|
||||
padding: 3px 1em 3px .4em;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.ui-menu .ui-menu-item-wrapper:hover {
|
||||
border: 1px solid #003eff;
|
||||
background: #007fff;
|
||||
font-weight: 400;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.parsley-errors-list {
|
||||
color: red;
|
||||
}
|
||||
|
|
|
@ -139,7 +139,7 @@
|
|||
],
|
||||
"config": {
|
||||
"sort-packages": true,
|
||||
"optimize-autoloader": false,
|
||||
"optimize-autoloader": true,
|
||||
"apcu-autoloader": true,
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
|
|
2946
locale/catalog.pot
2946
locale/catalog.pot
File diff suppressed because it is too large
Load Diff
|
@ -9796,7 +9796,7 @@ msgstr ""
|
|||
#: plugins/receiptFE/edit.php:25
|
||||
msgid ""
|
||||
"Le ricevute delle Fatture Elettroniche permettono di individuare se una "
|
||||
"determinata fattura tramessa è stata accettata dal Sistema Di Interscambio"
|
||||
"determinata fattura trasmessa è stata accettata dal Sistema Di Interscambio"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/receiptFE/edit.php:29 plugins/receiptFE/edit.php:87
|
||||
|
|
|
@ -10853,7 +10853,7 @@ msgstr "Within"
|
|||
#: plugins/receiptFE/edit.php:27
|
||||
msgid ""
|
||||
"Le ricevute delle Fatture Elettroniche permettono di individuare se una "
|
||||
"determinata fattura tramessa è stata accettata dal Sistema Di Interscambio"
|
||||
"determinata fattura trasmessa è stata accettata dal Sistema Di Interscambio"
|
||||
msgstr ""
|
||||
"The receipts of the electronic invoice allow to detect if a determinate "
|
||||
"released invoice is been accepted from Interchange system and the associated "
|
||||
|
|
|
@ -17,25 +17,43 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
/*
|
||||
* Controlla se il database presenta alcune sezioni personalizzate.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function customStructure()
|
||||
{
|
||||
$results = [];
|
||||
|
||||
$dirs = [
|
||||
'modules',
|
||||
'templates',
|
||||
'plugins',
|
||||
];
|
||||
if (!function_exists('customStructure')) {
|
||||
function customStructure()
|
||||
{
|
||||
$results = [];
|
||||
|
||||
// Controlli di personalizzazione fisica
|
||||
foreach ($dirs as $dir) {
|
||||
$files = glob(base_dir().'/'.$dir.'/*/custom/*.{php,html}', GLOB_BRACE);
|
||||
$recursive_files = glob(base_dir().'/'.$dir.'/*/custom/**/*.{php,html}', GLOB_BRACE);
|
||||
$dirs = [
|
||||
'modules',
|
||||
'templates',
|
||||
'plugins',
|
||||
];
|
||||
|
||||
// Controlli di personalizzazione fisica
|
||||
foreach ($dirs as $dir) {
|
||||
$files = glob(base_dir().'/'.$dir.'/*/custom/*.{php,html}', GLOB_BRACE);
|
||||
$recursive_files = glob(base_dir().'/'.$dir.'/*/custom/**/*.{php,html}', GLOB_BRACE);
|
||||
|
||||
$files = array_merge($files, $recursive_files);
|
||||
|
||||
foreach ($files as $file) {
|
||||
$file = str_replace(base_dir().'/', '', $file);
|
||||
$result = explode('/custom/', $file)[0];
|
||||
|
||||
if (!in_array($result, $results)) {
|
||||
$results[] = $result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Gestione cartella include
|
||||
$files = glob(base_dir().'/include/custom/*.{php,html}', GLOB_BRACE);
|
||||
$recursive_files = glob(base_dir().'/include/custom/**/*.{php,html}', GLOB_BRACE);
|
||||
|
||||
$files = array_merge($files, $recursive_files);
|
||||
|
||||
|
@ -47,90 +65,82 @@ function customStructure()
|
|||
$results[] = $result;
|
||||
}
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
// Gestione cartella include
|
||||
$files = glob(base_dir().'/include/custom/*.{php,html}', GLOB_BRACE);
|
||||
$recursive_files = glob(base_dir().'/include/custom/**/*.{php,html}', GLOB_BRACE);
|
||||
|
||||
$files = array_merge($files, $recursive_files);
|
||||
|
||||
foreach ($files as $file) {
|
||||
$file = str_replace(base_dir().'/', '', $file);
|
||||
$result = explode('/custom/', $file)[0];
|
||||
|
||||
if (!in_array($result, $results)) {
|
||||
$results[] = $result;
|
||||
}
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Controlla se il database presenta alcune sezioni personalizzate.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function customTables()
|
||||
{
|
||||
$tables = include base_dir().'/update/tables.php';
|
||||
if (!function_exists('customTables')) {
|
||||
function customTables()
|
||||
{
|
||||
$tables = include base_dir().'/update/tables.php';
|
||||
|
||||
$names = [];
|
||||
foreach ($tables as $table) {
|
||||
$names[] = prepare($table);
|
||||
$names = [];
|
||||
foreach ($tables as $table) {
|
||||
$names[] = prepare($table);
|
||||
}
|
||||
|
||||
$database = database();
|
||||
|
||||
$results = $database->fetchArray('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '.prepare($database->getDatabaseName()).' AND TABLE_NAME NOT IN ('.implode(',', $names).") AND TABLE_NAME != 'updates'");
|
||||
|
||||
return array_column($results, 'TABLE_NAME');
|
||||
}
|
||||
|
||||
$database = database();
|
||||
|
||||
$results = $database->fetchArray('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '.prepare($database->getDatabaseName()).' AND TABLE_NAME NOT IN ('.implode(',', $names).") AND TABLE_NAME != 'updates'");
|
||||
|
||||
return array_column($results, 'TABLE_NAME');
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Controlla se il database presenta alcune sezioni personalizzate.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function customDatabase()
|
||||
{
|
||||
$database = database();
|
||||
$modules = $database->fetchArray("SELECT name, CONCAT('modules/', directory) AS directory FROM zz_modules WHERE options2 != ''");
|
||||
$plugins = $database->fetchArray("SELECT name, CONCAT('plugins/', directory) AS directory FROM zz_plugins WHERE options2 != ''");
|
||||
|
||||
$results = array_merge($modules, $plugins);
|
||||
if (!function_exists('customDatabase')) {
|
||||
function customDatabase()
|
||||
{
|
||||
$database = database();
|
||||
$modules = $database->fetchArray("SELECT name, CONCAT('modules/', directory) AS directory FROM zz_modules WHERE options2 != ''");
|
||||
$plugins = $database->fetchArray("SELECT name, CONCAT('plugins/', directory) AS directory FROM zz_plugins WHERE options2 != ''");
|
||||
|
||||
return $results;
|
||||
$results = array_merge($modules, $plugins);
|
||||
|
||||
return $results;
|
||||
}
|
||||
}
|
||||
|
||||
function customComponents()
|
||||
{
|
||||
$database_check = customDatabase();
|
||||
$structure_check = customStructure();
|
||||
if (!function_exists('customComponents')) {
|
||||
function customComponents()
|
||||
{
|
||||
$database_check = customDatabase();
|
||||
$structure_check = customStructure();
|
||||
|
||||
$list = [];
|
||||
foreach ($database_check as $element) {
|
||||
$pos = array_search($element['directory'], $structure_check);
|
||||
$list = [];
|
||||
foreach ($database_check as $element) {
|
||||
$pos = array_search($element['directory'], $structure_check);
|
||||
|
||||
$list[] = [
|
||||
'path' => $element['directory'],
|
||||
'database' => true,
|
||||
'directory' => $pos !== false,
|
||||
];
|
||||
$list[] = [
|
||||
'path' => $element['directory'],
|
||||
'database' => true,
|
||||
'directory' => $pos !== false,
|
||||
];
|
||||
|
||||
if ($pos !== false) {
|
||||
unset($structure_check[$pos]);
|
||||
if ($pos !== false) {
|
||||
unset($structure_check[$pos]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($structure_check as $element) {
|
||||
$list[] = [
|
||||
'path' => $element,
|
||||
'database' => false,
|
||||
'directory' => true,
|
||||
];
|
||||
}
|
||||
foreach ($structure_check as $element) {
|
||||
$list[] = [
|
||||
'path' => $element,
|
||||
'database' => false,
|
||||
'directory' => true,
|
||||
];
|
||||
}
|
||||
|
||||
return $list;
|
||||
return $list;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@ switch (post('op')) {
|
|||
|
||||
case 'ricerca-coordinate-google':
|
||||
$curl = new CurlHttpAdapter();
|
||||
$geocoder = new GoogleMaps($curl, null, null, true, $google);
|
||||
$geocoder = new GoogleMaps($curl, 'IT-it', null, true, $google);
|
||||
|
||||
foreach ($id_records as $id) {
|
||||
$anagrafica = Anagrafica::find($id);
|
||||
|
|
|
@ -27,8 +27,9 @@ $is_fornitore = in_array($id_fornitore, $tipi_anagrafica);
|
|||
$is_cliente = in_array($id_cliente, $tipi_anagrafica);
|
||||
$is_tecnico = in_array($id_tecnico, $tipi_anagrafica);
|
||||
$is_agente = in_array($id_agente, $tipi_anagrafica);
|
||||
$is_azienda = in_array($id_azienda, $tipi_anagrafica);
|
||||
|
||||
if (!$is_cliente && !$is_fornitore && $is_tecnico) {
|
||||
if (!$is_cliente && !$is_fornitore && !$is_azienda && $is_tecnico) {
|
||||
$ignore = $dbo->fetchArray("SELECT id FROM zz_plugins WHERE name='Sedi' OR name='Referenti' OR name='Dichiarazioni d\'intento'");
|
||||
|
||||
foreach ($ignore as $plugin) {
|
||||
|
|
|
@ -65,6 +65,9 @@ echo '
|
|||
<script>$(document).ready(init)</script>
|
||||
|
||||
<script>
|
||||
var indirizzi = [];
|
||||
var coords = [];
|
||||
|
||||
$("#modals > div").on("shown.bs.modal", function () {
|
||||
if (input("lat").get() && input("lng").get()) {
|
||||
caricaMappa();
|
||||
|
@ -77,10 +80,26 @@ function initGeocomplete() {
|
|||
type : "GET",
|
||||
dataType: "JSON",
|
||||
success: function(data){
|
||||
input("lat").set(data[0].lat);
|
||||
input("lng").set(data[0].lon);
|
||||
input("gaddress").set(data[0].display_name);
|
||||
caricaMappa();
|
||||
// Estrazione lista luoghi
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
indirizzi.push(data[i].display_name);
|
||||
coords[data[i].display_name] = [data[i].lat, data[i].lon];
|
||||
}
|
||||
|
||||
// Autocompletamento indirizzi con risposta da Nominatim
|
||||
$("#gaddress").autocomplete({
|
||||
source: indirizzi,
|
||||
minLength: 0,
|
||||
select: function(event, ui) {
|
||||
input("lat").set(coords[ui.item.value][0]);
|
||||
input("lng").set(coords[ui.item.value][1]);
|
||||
input("gaddress").set(ui.item.value);
|
||||
caricaMappa();
|
||||
}
|
||||
}).autocomplete("search", "");
|
||||
|
||||
// Azzeramento indirizzi raccolti
|
||||
indirizzi = [];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -147,4 +166,12 @@ function caricaMappa() {
|
|||
$("#modals > div button.close").on("click", function() {
|
||||
location.reload();
|
||||
});
|
||||
|
||||
// Avvio ricerca indirizzo premendo Invio
|
||||
$("#gaddress").on("keypress", function(e){
|
||||
if(e.which == 13){
|
||||
e.preventDefault();
|
||||
initGeocomplete();
|
||||
}
|
||||
});
|
||||
</script>';
|
||||
|
|
|
@ -19,30 +19,32 @@
|
|||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
/**
|
||||
/*
|
||||
* Funzione per aggiornare le sedi nei movimenti di magazzino.
|
||||
*/
|
||||
function aggiorna_sedi_movimenti($module, $id)
|
||||
{
|
||||
$dbo = database();
|
||||
if (!function_exists('aggiorna_sedi_movimenti')) {
|
||||
function aggiorna_sedi_movimenti($module, $id)
|
||||
{
|
||||
$dbo = database();
|
||||
|
||||
if ($module == 'ddt') {
|
||||
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM dt_ddt INNER JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt WHERE dt_ddt.id='.prepare($id));
|
||||
if ($module == 'ddt') {
|
||||
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM dt_ddt INNER JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt WHERE dt_ddt.id='.prepare($id));
|
||||
|
||||
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
|
||||
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
|
||||
|
||||
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\DDT\DDT').' AND reference_id='.prepare($id));
|
||||
} elseif ($module == 'documenti') {
|
||||
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM co_documenti INNER JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento WHERE co_documenti.id='.prepare($id));
|
||||
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\DDT\DDT').' AND reference_id='.prepare($id));
|
||||
} elseif ($module == 'documenti') {
|
||||
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM co_documenti INNER JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento WHERE co_documenti.id='.prepare($id));
|
||||
|
||||
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
|
||||
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
|
||||
|
||||
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Fatture\Fattura').' AND reference_id='.prepare($id));
|
||||
} elseif ($module == 'interventi') {
|
||||
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione FROM in_interventi WHERE in_interventi.id='.prepare($id));
|
||||
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Fatture\Fattura').' AND reference_id='.prepare($id));
|
||||
} elseif ($module == 'interventi') {
|
||||
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione FROM in_interventi WHERE in_interventi.id='.prepare($id));
|
||||
|
||||
$idsede = $rs[0]['idsede_partenza'];
|
||||
$idsede = $rs[0]['idsede_partenza'];
|
||||
|
||||
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Interventi\Intervento').' AND reference_id='.prepare($id));
|
||||
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Interventi\Intervento').' AND reference_id='.prepare($id));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ echo '
|
|||
// Seleziona articolo
|
||||
echo '
|
||||
<div class="col-md-8">
|
||||
{[ "type": "select", "label": "'.tr('Articolo').'", "name": "idarticolo", "required": 1, "value": "'.$idarticolo.'", "ajax-source": "articoli" ]}
|
||||
{[ "type": "select", "label": "'.tr('Articolo').'", "name": "idarticolo", "required": 1, "value": "'.$idarticolo.'", "ajax-source": "articoli", "select-options": '.json_encode(['idsede_partenza' => 0]).' ]}
|
||||
</div>';
|
||||
|
||||
// Quantità
|
||||
|
|
|
@ -77,6 +77,7 @@ echo '
|
|||
var bank_code = input("bank_code");
|
||||
var id_nazione = input("id_nazione");
|
||||
var bic = input("bic");
|
||||
var id_module = <?php echo $id_module; ?>;
|
||||
|
||||
var components = [branch_code, bank_code, id_nazione];
|
||||
|
||||
|
@ -112,7 +113,7 @@ echo '
|
|||
$.ajax({
|
||||
url: globals.rootdir + '/actions.php',
|
||||
data: {
|
||||
id_module: globals.id_module,
|
||||
id_module: id_module,
|
||||
op: "decompose",
|
||||
iban: iban.get(),
|
||||
},
|
||||
|
|
|
@ -17,185 +17,191 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
function renderChecklist($check, $level = 1, $parent = 0)
|
||||
{
|
||||
global $structure;
|
||||
if (!function_exists('renderChecklist')) {
|
||||
function renderChecklist($check, $level = 1, $parent = 0)
|
||||
{
|
||||
global $structure;
|
||||
|
||||
$user = auth()->getUser();
|
||||
$enabled = $check->assignedUsers ? ($check->assignedUsers->pluck('id')->search($user->id) !== false || ($user->idgruppo) == 1) : true;
|
||||
$user = auth()->getUser();
|
||||
$enabled = $check->assignedUsers ? ($check->assignedUsers->pluck('id')->search($user->id) !== false || ($user->idgruppo) == 1) : true;
|
||||
|
||||
$margin = ($level * 20);
|
||||
$margin = ($level * 20);
|
||||
|
||||
$result = '
|
||||
<tr id="check_'.$check->id.'" data-id="'.$check->id.'" class="sortablerow sonof_'.$parent.'" >
|
||||
<td style="padding-top:0px;padding-bottom:0px;border-top:0px;">
|
||||
<table class="table" style="margin-bottom:0px;">
|
||||
<tr>';
|
||||
if ($check->is_titolo) {
|
||||
$result .= '
|
||||
<td style="width:40px;"></td>
|
||||
<td colspan="3" style="border-top:0px;">
|
||||
<span class="text unblockable"><big>'.$check->content.'</big></span>
|
||||
</td>';
|
||||
} else {
|
||||
$result .= '
|
||||
<td style="width:40px;text-align:center;border-top:0px;border-left:3px solid #eaeaea;">
|
||||
<input type="checkbox" class="checkbox unblockable" data-id="'.$check->id.'" value="'.(!empty($check->checked_at) ? '1' : '0').'" '.(!empty($check->checked_at) ? 'checked' : '').' '.(!$enabled ? 'disabled' : '').'>
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
<td style="border-top:0px;">
|
||||
<span class="text unblockable" style="'.(!empty($check->checked_at) ? 'text-decoration:line-through;' : '').'">'.$check->content.' </span>
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
<td style="border-top:0px;">
|
||||
<span class="label label-default pull-right verificato '.(!$check->checked_at ? 'hidden' : '').'" style="margin-right:5px;padding:6px 8px;">'.(!empty($check->checked_at) ? tr('Verificato da _NAME_ il _DATE_', [
|
||||
'_NAME_' => $check->checkUser->username,
|
||||
'_DATE_' => timestampFormat($check->checked_at),
|
||||
]) : '').'
|
||||
</span>
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
<td style="width:500px;border-top:0px;">
|
||||
{[ "type": "textarea", "class": "unblockable", "name": "note_checklist", "placeholder": "'.tr('Note').'...", "id": "note_'.$check->id.'", "value": "'.$check->note.'" ]}
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
<td style="width:150px;border-top:0px;">
|
||||
<button class="btn btn-default btn-xs '.(!$enabled ? 'disabled' : '').' save-nota" onclick="saveNota(\''.$check->id.'\')"><i class="fa fa-check"></i> '.tr('Salva nota').'</button>';
|
||||
|
||||
if (intval($check->assignedUsers->pluck('id')->toArray()) > 0) {
|
||||
$result .= ' <span class="label label-info pull-right" style="padding:6px 8px;" data-toggle="tooltip" title="Assegnato a '.implode(', ', $check->assignedUsers->pluck('username')->toArray()).'"><i class="fa fa-user"></i></span>';
|
||||
$result = '
|
||||
<tr id="check_'.$check->id.'" data-id="'.$check->id.'" class="sortablerow sonof_'.$parent.'" >
|
||||
<td style="padding-top:0px;padding-bottom:0px;border-top:0px;">
|
||||
<table class="table" style="margin-bottom:0px;">
|
||||
<tr>';
|
||||
if ($check->is_titolo) {
|
||||
$result .= '
|
||||
<td style="width:40px;"></td>
|
||||
<td colspan="3" style="border-top:0px;">
|
||||
<span class="text unblockable"><big>'.$check->content.'</big></span>
|
||||
</td>';
|
||||
} else {
|
||||
$result .= ' <span class="label label-danger pull-right" style="padding:6px 8px;" data-toggle="tooltip" title="'.tr('Nessun utente assegnato').'"><i class="fa fa-user-times"></i></span>';
|
||||
$result .= '
|
||||
<td style="width:40px;text-align:center;border-top:0px;border-left:3px solid #eaeaea;">
|
||||
<input type="checkbox" class="checkbox unblockable" data-id="'.$check->id.'" value="'.(!empty($check->checked_at) ? '1' : '0').'" '.(!empty($check->checked_at) ? 'checked' : '').' '.(!$enabled ? 'disabled' : '').'>
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
<td style="border-top:0px;">
|
||||
<span class="text unblockable" style="'.(!empty($check->checked_at) ? 'text-decoration:line-through;' : '').'">'.$check->content.' </span>
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
<td style="border-top:0px;">
|
||||
<span class="label label-default pull-right verificato '.(!$check->checked_at ? 'hidden' : '').'" style="margin-right:5px;padding:6px 8px;">'.(!empty($check->checked_at) ? tr('Verificato da _NAME_ il _DATE_', [
|
||||
'_NAME_' => $check->checkUser->username,
|
||||
'_DATE_' => timestampFormat($check->checked_at),
|
||||
]) : '').'
|
||||
</span>
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
<td style="width:500px;border-top:0px;">
|
||||
{[ "type": "textarea", "class": "unblockable", "name": "note_checklist", "placeholder": "'.tr('Note').'...", "id": "note_'.$check->id.'", "value": "'.$check->note.'" ]}
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
<td style="width:150px;border-top:0px;">
|
||||
<button class="btn btn-default btn-xs '.(!$enabled ? 'disabled' : '').' save-nota" onclick="saveNota(\''.$check->id.'\')"><i class="fa fa-check"></i> '.tr('Salva nota').'</button>';
|
||||
|
||||
if (intval($check->assignedUsers->pluck('id')->toArray()) > 0) {
|
||||
$result .= ' <span class="label label-info pull-right" style="padding:6px 8px;" data-toggle="tooltip" title="Assegnato a '.implode(', ', $check->assignedUsers->pluck('username')->toArray()).'"><i class="fa fa-user"></i></span>';
|
||||
} else {
|
||||
$result .= ' <span class="label label-danger pull-right" style="padding:6px 8px;" data-toggle="tooltip" title="'.tr('Nessun utente assegnato').'"><i class="fa fa-user-times"></i></span>';
|
||||
}
|
||||
|
||||
$result .= '
|
||||
</td>';
|
||||
}
|
||||
|
||||
$result .= '
|
||||
</td>';
|
||||
}
|
||||
<td style="width:10px;text-align:center;border-top:0px;">
|
||||
<div class="input-group-btn">
|
||||
<button class="btn btn-warning btn-xs '.(!$enabled ? 'disabled' : '').'" onclick="edit_check(\''.$check->id.'\')"><i class="fa fa-edit"></i></button>
|
||||
<button class="btn btn-danger btn-xs '.(!$enabled ? 'disabled' : '').'" onclick="delete_check(\''.$check->id.'\')"><i class="fa fa-trash"></i></button>
|
||||
<button class="btn btn-xs btn-default handle" title="Modifica ordine delle righe" draggable="true"><i class="fa fa-sort"></i></button>
|
||||
</div>
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
<td style="width:10px;text-align:center;border-top:0px;">
|
||||
<div class="input-group-btn">
|
||||
<button class="btn btn-warning btn-xs '.(!$enabled ? 'disabled' : '').'" onclick="edit_check(\''.$check->id.'\')"><i class="fa fa-edit"></i></button>
|
||||
<button class="btn btn-danger btn-xs '.(!$enabled ? 'disabled' : '').'" onclick="delete_check(\''.$check->id.'\')"><i class="fa fa-trash"></i></button>
|
||||
<button class="btn btn-xs btn-default handle" title="Modifica ordine delle righe" draggable="true"><i class="fa fa-sort"></i></button>
|
||||
</div>
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
</tr>';
|
||||
|
||||
if (sizeof($check->children) > 0) {
|
||||
$result .= '
|
||||
<tr>
|
||||
<td colspan="5" style="padding-left:'.$margin.'px;padding-right:10px;padding-top:0px;padding-bottom:0px;border-top:0px;">
|
||||
<table class="table" style="margin-bottom:0px;">
|
||||
<tbody class="sort" data-sonof="'.$check->id.'">';
|
||||
$children = $structure->checks()->where('id_parent', $check->id)->orderBy('order')->get();
|
||||
</tr>';
|
||||
|
||||
if (sizeof($check->children) > 0) {
|
||||
$result .= '
|
||||
<tr>
|
||||
<td colspan="5" style="padding-left:'.$margin.'px;padding-right:10px;padding-top:0px;padding-bottom:0px;border-top:0px;">
|
||||
<table class="table" style="margin-bottom:0px;">
|
||||
<tbody class="sort" data-sonof="'.$check->id.'">';
|
||||
$children = $structure->checks()->where('id_parent', $check->id)->orderBy('order')->get();
|
||||
foreach ($children as $child) {
|
||||
$result .= renderChecklist($child, $level + 1, $check->id);
|
||||
}
|
||||
$result .= '
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
$result .= '
|
||||
</table>
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('renderChecklistInserimento')) {
|
||||
function renderChecklistInserimento($check, $level = 1, $parent = 0)
|
||||
{
|
||||
global $record;
|
||||
|
||||
$margin = ($level * 20);
|
||||
|
||||
$result = '
|
||||
<tr id="check_'.$check->id.'" data-id="'.$check->id.'" class="sortablerow sonof_'.$parent.'" >
|
||||
<td style="padding-top:0px;padding-bottom:0px;border-top:0px;">
|
||||
<table class="table" style="margin-bottom:0px;">
|
||||
<tr>';
|
||||
|
||||
$result .= '
|
||||
<td style="width:40px;border-top:0px;border-left:3px solid #eaeaea;">';
|
||||
$result .= '
|
||||
<span class="text">'.$check->content.'</span>';
|
||||
$result .= '
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
<td style="width:40px;text-align:right;border-top:0px;">
|
||||
<div class="input-group-btn">
|
||||
<button class="btn btn-warning btn-xs" onclick="edit_check(\''.$check->id.'\')"><i class="fa fa-edit"></i></button>
|
||||
<button class="btn btn-danger btn-xs" onclick="delete_check(\''.$check->id.'\')"><i class="fa fa-trash"></i></button>
|
||||
</div>
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
</tr>';
|
||||
|
||||
if (sizeof($check->children) > 0) {
|
||||
$result .= '
|
||||
<tr>
|
||||
<td colspan="4" style="padding-left:'.$margin.'px;padding-right:0px;padding-top:0px;padding-bottom:0px;border-top:0px;">
|
||||
<table class="table" style="margin-bottom:0px;">
|
||||
<tbody class="sort" data-sonof="'.$check->id.'">';
|
||||
$children = $record->checks()->where('id_parent', $check->id)->orderBy('order')->get();
|
||||
foreach ($children as $child) {
|
||||
$result .= renderChecklistInserimento($child, $level + 1, $check->id);
|
||||
}
|
||||
$result .= '
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
$result .= '
|
||||
</table>
|
||||
</td>
|
||||
|
||||
<td style="width:40px;text-align:center;border-top:0px;">
|
||||
<button class="btn btn-xs btn-default handle" title="Modifica ordine delle righe" draggable="true">
|
||||
<i class="fa fa-sort"></i>
|
||||
</button>
|
||||
</td>
|
||||
|
||||
</tr>';
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('renderChecklistHtml')) {
|
||||
function renderChecklistHtml($check, $level = 0)
|
||||
{
|
||||
$user = auth()->getUser();
|
||||
$enabled = $check->assignedUsers ? $check->assignedUsers->pluck('id')->search($user->id) !== false : true;
|
||||
|
||||
$width = 10 + 20 * $level;
|
||||
|
||||
$result = '
|
||||
<tr>
|
||||
<td class="text-center" style="width:30px;">
|
||||
'.(!empty($check->checked_at) ? '<img src="'.ROOTDIR.'/templates/interventi/check.png" style="width:10px;">' : '').'
|
||||
</td>
|
||||
<td style="padding-left:'.$width.'px;">
|
||||
<span class="text"><b>'.$check->content.'</b>'.(!empty($check->value) ? ': '.$check->value : '').'</span>
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
$children = $check->children;
|
||||
foreach ($children as $child) {
|
||||
$result .= renderChecklist($child, $level + 1, $check->id);
|
||||
$result .= renderChecklistHtml($child, $level + 1);
|
||||
}
|
||||
$result .= '
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
$result .= '
|
||||
</table>
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
function renderChecklistInserimento($check, $level = 1, $parent = 0)
|
||||
{
|
||||
global $record;
|
||||
|
||||
$margin = ($level * 20);
|
||||
|
||||
$result = '
|
||||
<tr id="check_'.$check->id.'" data-id="'.$check->id.'" class="sortablerow sonof_'.$parent.'" >
|
||||
<td style="padding-top:0px;padding-bottom:0px;border-top:0px;">
|
||||
<table class="table" style="margin-bottom:0px;">
|
||||
<tr>';
|
||||
|
||||
$result .= '
|
||||
<td style="width:40px;border-top:0px;border-left:3px solid #eaeaea;">';
|
||||
$result .= '
|
||||
<span class="text">'.$check->content.'</span>';
|
||||
$result .= '
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
<td style="width:40px;text-align:right;border-top:0px;">
|
||||
<div class="input-group-btn">
|
||||
<button class="btn btn-warning btn-xs" onclick="edit_check(\''.$check->id.'\')"><i class="fa fa-edit"></i></button>
|
||||
<button class="btn btn-danger btn-xs" onclick="delete_check(\''.$check->id.'\')"><i class="fa fa-trash"></i></button>
|
||||
</div>
|
||||
</td>';
|
||||
|
||||
$result .= '
|
||||
</tr>';
|
||||
|
||||
if (sizeof($check->children) > 0) {
|
||||
$result .= '
|
||||
<tr>
|
||||
<td colspan="4" style="padding-left:'.$margin.'px;padding-right:0px;padding-top:0px;padding-bottom:0px;border-top:0px;">
|
||||
<table class="table" style="margin-bottom:0px;">
|
||||
<tbody class="sort" data-sonof="'.$check->id.'">';
|
||||
$children = $record->checks()->where('id_parent', $check->id)->orderBy('order')->get();
|
||||
foreach ($children as $child) {
|
||||
$result .= renderChecklistInserimento($child, $level + 1, $check->id);
|
||||
}
|
||||
$result .= '
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
$result .= '
|
||||
</table>
|
||||
</td>
|
||||
|
||||
<td style="width:40px;text-align:center;border-top:0px;">
|
||||
<button class="btn btn-xs btn-default handle" title="Modifica ordine delle righe" draggable="true">
|
||||
<i class="fa fa-sort"></i>
|
||||
</button>
|
||||
</td>
|
||||
|
||||
</tr>';
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
function renderChecklistHtml($check, $level = 0)
|
||||
{
|
||||
$user = auth()->getUser();
|
||||
$enabled = $check->assignedUsers ? $check->assignedUsers->pluck('id')->search($user->id) !== false : true;
|
||||
|
||||
$width = 10 + 20 * $level;
|
||||
|
||||
$result = '
|
||||
<tr>
|
||||
<td class="text-center" style="width:30px;">
|
||||
'.(!empty($check->checked_at) ? '<img src="'.ROOTDIR.'/templates/interventi/check.png" style="width:10px;">' : '').'
|
||||
</td>
|
||||
<td style="padding-left:'.$width.'px;">
|
||||
<span class="text"><b>'.$check->content.'</b>'.(!empty($check->value) ? ': '.$check->value : '').'</span>
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
$children = $check->children;
|
||||
foreach ($children as $child) {
|
||||
$result .= renderChecklistHtml($child, $level + 1);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
|
|
@ -7,22 +7,24 @@
|
|||
*
|
||||
* @return array|array[]
|
||||
*/
|
||||
function cartesian($input)
|
||||
{
|
||||
$result = [[]];
|
||||
if (!function_exists('cartesian')) {
|
||||
function cartesian($input)
|
||||
{
|
||||
$result = [[]];
|
||||
|
||||
foreach ($input as $key => $values) {
|
||||
$append = [];
|
||||
foreach ($input as $key => $values) {
|
||||
$append = [];
|
||||
|
||||
foreach ($result as $product) {
|
||||
foreach ($values as $item) {
|
||||
$product[$key] = $item;
|
||||
$append[] = $product;
|
||||
foreach ($result as $product) {
|
||||
foreach ($values as $item) {
|
||||
$product[$key] = $item;
|
||||
$append[] = $product;
|
||||
}
|
||||
}
|
||||
|
||||
$result = $append;
|
||||
}
|
||||
|
||||
$result = $append;
|
||||
return $result;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
|
|
@ -22,22 +22,26 @@ include_once __DIR__.'/../../core.php';
|
|||
use Modules\Contratti\Contratto;
|
||||
use Modules\Interventi\Intervento;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo imponibile contratto (totale_righe - sconto).
|
||||
*/
|
||||
function get_imponibile_contratto($idcontratto)
|
||||
{
|
||||
$contratto = Contratto::find($idcontratto);
|
||||
if (!function_exists('get_imponibile_contratto')) {
|
||||
function get_imponibile_contratto($idcontratto)
|
||||
{
|
||||
$contratto = Contratto::find($idcontratto);
|
||||
|
||||
return $contratto->totale_imponibile;
|
||||
return $contratto->totale_imponibile;
|
||||
}
|
||||
}
|
||||
|
||||
function get_totale_interventi_contratto($idcontratto)
|
||||
{
|
||||
$interventi = Intervento::where('id_contratto', $idcontratto)->get();
|
||||
$array_interventi = $interventi->toArray();
|
||||
if (!function_exists('get_totale_interventi_contratto')) {
|
||||
function get_totale_interventi_contratto($idcontratto)
|
||||
{
|
||||
$interventi = Intervento::where('id_contratto', $idcontratto)->get();
|
||||
$array_interventi = $interventi->toArray();
|
||||
|
||||
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
|
||||
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
|
||||
|
||||
return $totale;
|
||||
return $totale;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -145,8 +145,8 @@ foreach ($righe as $riga) {
|
|||
$evasione_bar['or_righe_ordini'] = 'success';
|
||||
foreach ($evasione_bar as $table => $color) {
|
||||
$righe_ev = $dbo->table($table)->where('original_id', $riga->id)->where('original_type', get_class($riga))->get();
|
||||
$perc_ev = $righe_ev->sum('qta') * 100 / $riga->qta;
|
||||
if ($perc_ev > 0) {
|
||||
if ($righe_ev->count() > 0) {
|
||||
$perc_ev = $righe_ev->sum('qta') * 100 / $riga->qta;
|
||||
echo '
|
||||
<div class="progress-bar progress-bar-'.$color.'" style="width:'.$perc_ev.'%"></div>';
|
||||
}
|
||||
|
|
|
@ -22,92 +22,105 @@ include_once __DIR__.'/../../core.php';
|
|||
use Modules\DDT\DDT;
|
||||
use Util\Generator;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Funzione per generare un nuovo numero per il ddt.
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_new_numeroddt($data)
|
||||
{
|
||||
global $dir;
|
||||
if (!function_exists('get_new_numeroddt')) {
|
||||
function get_new_numeroddt($data)
|
||||
{
|
||||
global $dir;
|
||||
|
||||
return DDT::getNextNumero($data, $dir);
|
||||
return DDT::getNextNumero($data, $dir);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Funzione per calcolare il numero secondario successivo utilizzando la maschera dalle impostazioni.
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_new_numerosecondarioddt($data)
|
||||
{
|
||||
global $dir;
|
||||
global $id_segment;
|
||||
if (!function_exists('get_new_numerosecondarioddt')) {
|
||||
function get_new_numerosecondarioddt($data)
|
||||
{
|
||||
global $dir;
|
||||
global $id_segment;
|
||||
|
||||
return DDT::getNextNumeroSecondario($data, $dir, $id_segment);
|
||||
return DDT::getNextNumeroSecondario($data, $dir, $id_segment);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo imponibile ddt (totale_righe - sconto).
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_imponibile_ddt($id_ddt)
|
||||
{
|
||||
$ddt = DDT::find($id_ddt);
|
||||
if (!function_exists('get_imponibile_ddt')) {
|
||||
function get_imponibile_ddt($id_ddt)
|
||||
{
|
||||
$ddt = DDT::find($id_ddt);
|
||||
|
||||
return $ddt->imponibile;
|
||||
return $ddt->imponibile;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo totale ddt (imponibile + iva).
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_totale_ddt($id_ddt)
|
||||
{
|
||||
$ddt = DDT::find($id_ddt);
|
||||
if (!function_exists('get_totale_ddt')) {
|
||||
function get_totale_ddt($id_ddt)
|
||||
{
|
||||
$ddt = DDT::find($id_ddt);
|
||||
|
||||
return $ddt->totale;
|
||||
return $ddt->totale;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo netto a pagare ddt (totale - ritenute - bolli).
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_netto_ddt($id_ddt)
|
||||
{
|
||||
$ddt = DDT::find($id_ddt);
|
||||
if (!function_exists('get_netto_ddt')) {
|
||||
function get_netto_ddt($id_ddt)
|
||||
{
|
||||
$ddt = DDT::find($id_ddt);
|
||||
|
||||
return $ddt->netto;
|
||||
return $ddt->netto;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo iva detraibile ddt.
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_ivadetraibile_ddt($id_ddt)
|
||||
{
|
||||
$ddt = DDT::find($id_ddt);
|
||||
if (!function_exists('get_ivadetraibile_ddt')) {
|
||||
function get_ivadetraibile_ddt($id_ddt)
|
||||
{
|
||||
$ddt = DDT::find($id_ddt);
|
||||
|
||||
return $ddt->iva_detraibile;
|
||||
return $ddt->iva_detraibile;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo iva indetraibile ddt.
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_ivaindetraibile_ddt($id_ddt)
|
||||
{
|
||||
$ddt = DDT::find($id_ddt);
|
||||
if (!function_exists('get_ivaindetraibile_ddt')) {
|
||||
function get_ivaindetraibile_ddt($id_ddt)
|
||||
{
|
||||
$ddt = DDT::find($id_ddt);
|
||||
|
||||
return $ddt->iva_indetraibile;
|
||||
return $ddt->iva_indetraibile;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Ricalcola i costi aggiuntivi in ddt (rivalsa inps, ritenuta d'acconto, marca da bollo)
|
||||
* Deve essere eseguito ogni volta che si aggiunge o toglie una riga
|
||||
* $idddt int ID del ddt
|
||||
|
@ -115,148 +128,154 @@ function get_ivaindetraibile_ddt($id_ddt)
|
|||
* $idritenutaacconto int ID della ritenuta d'acconto da applicare. Se omesso viene utilizzata quella impostata di default
|
||||
* $bolli float Costi aggiuntivi delle marche da bollo. Se omesso verrà usata la cifra predefinita.
|
||||
*/
|
||||
function ricalcola_costiagg_ddt($idddt, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
|
||||
{
|
||||
global $dir;
|
||||
if (!function_exists('ricalcola_costiagg_ddt')) {
|
||||
function ricalcola_costiagg_ddt($idddt, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
|
||||
{
|
||||
global $dir;
|
||||
|
||||
$dbo = database();
|
||||
$dbo = database();
|
||||
|
||||
// Se ci sono righe nel ddt faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
|
||||
$query = "SELECT COUNT(id) AS righe FROM dt_righe_ddt WHERE idddt='$idddt'";
|
||||
$rs = $dbo->fetchArray($query);
|
||||
if ($rs[0]['righe'] > 0) {
|
||||
$totale_imponibile = get_imponibile_ddt($idddt);
|
||||
$totale_ddt = get_totale_ddt($idddt);
|
||||
|
||||
// Leggo gli id dei costi aggiuntivi
|
||||
if ($dir == 'uscita') {
|
||||
$query2 = "SELECT idrivalsainps, idritenutaacconto, bollo FROM dt_ddt WHERE id='$idddt'";
|
||||
$rs2 = $dbo->fetchArray($query2);
|
||||
$idrivalsainps = $rs2[0]['idrivalsainps'];
|
||||
$idritenutaacconto = $rs2[0]['idritenutaacconto'];
|
||||
$bollo = $rs2[0]['bollo'];
|
||||
}
|
||||
|
||||
// Leggo la rivalsa inps se c'è (per i ddt di vendita lo leggo dalle impostazioni)
|
||||
if ($dir == 'entrata') {
|
||||
if (!empty($idrivalsainps)) {
|
||||
$idrivalsainps = setting('Cassa previdenziale predefinita');
|
||||
}
|
||||
}
|
||||
|
||||
$query = "SELECT percentuale FROM co_rivalse WHERE id='".$idrivalsainps."'";
|
||||
// Se ci sono righe nel ddt faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
|
||||
$query = "SELECT COUNT(id) AS righe FROM dt_righe_ddt WHERE idddt='$idddt'";
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$rivalsainps = $totale_imponibile / 100 * $rs[0]['percentuale'];
|
||||
if ($rs[0]['righe'] > 0) {
|
||||
$totale_imponibile = get_imponibile_ddt($idddt);
|
||||
$totale_ddt = get_totale_ddt($idddt);
|
||||
|
||||
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
|
||||
$qi = "SELECT percentuale FROM co_iva WHERE id='".setting('Iva predefinita')."'";
|
||||
$rsi = $dbo->fetchArray($qi);
|
||||
$iva_rivalsainps = $rivalsainps / 100 * $rsi[0]['percentuale'];
|
||||
// Leggo gli id dei costi aggiuntivi
|
||||
if ($dir == 'uscita') {
|
||||
$query2 = "SELECT idrivalsainps, idritenutaacconto, bollo FROM dt_ddt WHERE id='$idddt'";
|
||||
$rs2 = $dbo->fetchArray($query2);
|
||||
$idrivalsainps = $rs2[0]['idrivalsainps'];
|
||||
$idritenutaacconto = $rs2[0]['idritenutaacconto'];
|
||||
$bollo = $rs2[0]['bollo'];
|
||||
}
|
||||
|
||||
// Aggiorno la rivalsa inps
|
||||
$dbo->query("UPDATE dt_ddt SET rivalsainps='$rivalsainps', iva_rivalsainps='$iva_rivalsainps' WHERE id='$idddt'");
|
||||
|
||||
$totale_ddt = get_totale_ddt($idddt);
|
||||
|
||||
// Leggo la ritenuta d'acconto se c'è (per i ddt di vendita lo leggo dalle impostazioni)
|
||||
if (!empty($idritenutaacconto)) {
|
||||
// Leggo la rivalsa inps se c'è (per i ddt di vendita lo leggo dalle impostazioni)
|
||||
if ($dir == 'entrata') {
|
||||
$idritenutaacconto = setting("Ritenuta d'acconto predefinita");
|
||||
}
|
||||
}
|
||||
|
||||
$query = "SELECT percentuale FROM co_ritenutaacconto WHERE id='".$idritenutaacconto."'";
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$ritenutaacconto = $totale_ddt / 100 * $rs[0]['percentuale'];
|
||||
$netto_a_pagare = $totale_ddt - $ritenutaacconto;
|
||||
|
||||
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
|
||||
$bolli = str_replace(',', '.', $bolli);
|
||||
$bolli = floatval($bolli);
|
||||
if ($dir == 'uscita') {
|
||||
if ($bolli != 0.00) {
|
||||
$bolli = str_replace(',', '.', $bolli);
|
||||
if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) {
|
||||
$marca_da_bollo = str_replace(',', '.', $bolli);
|
||||
} else {
|
||||
$marca_da_bollo = 0.00;
|
||||
if (!empty($idrivalsainps)) {
|
||||
$idrivalsainps = setting('Cassa previdenziale predefinita');
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$marca_da_bollo = 0.00;
|
||||
}
|
||||
|
||||
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='$ritenutaacconto', bollo='$marca_da_bollo' WHERE id='$idddt'");
|
||||
} else {
|
||||
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='0', bollo='0', rivalsainps='0', iva_rivalsainps='0' WHERE id='$idddt'");
|
||||
$query = "SELECT percentuale FROM co_rivalse WHERE id='".$idrivalsainps."'";
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$rivalsainps = $totale_imponibile / 100 * $rs[0]['percentuale'];
|
||||
|
||||
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
|
||||
$qi = "SELECT percentuale FROM co_iva WHERE id='".setting('Iva predefinita')."'";
|
||||
$rsi = $dbo->fetchArray($qi);
|
||||
$iva_rivalsainps = $rivalsainps / 100 * $rsi[0]['percentuale'];
|
||||
|
||||
// Aggiorno la rivalsa inps
|
||||
$dbo->query("UPDATE dt_ddt SET rivalsainps='$rivalsainps', iva_rivalsainps='$iva_rivalsainps' WHERE id='$idddt'");
|
||||
|
||||
$totale_ddt = get_totale_ddt($idddt);
|
||||
|
||||
// Leggo la ritenuta d'acconto se c'è (per i ddt di vendita lo leggo dalle impostazioni)
|
||||
if (!empty($idritenutaacconto)) {
|
||||
if ($dir == 'entrata') {
|
||||
$idritenutaacconto = setting("Ritenuta d'acconto predefinita");
|
||||
}
|
||||
}
|
||||
|
||||
$query = "SELECT percentuale FROM co_ritenutaacconto WHERE id='".$idritenutaacconto."'";
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$ritenutaacconto = $totale_ddt / 100 * $rs[0]['percentuale'];
|
||||
$netto_a_pagare = $totale_ddt - $ritenutaacconto;
|
||||
|
||||
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
|
||||
$bolli = str_replace(',', '.', $bolli);
|
||||
$bolli = floatval($bolli);
|
||||
if ($dir == 'uscita') {
|
||||
if ($bolli != 0.00) {
|
||||
$bolli = str_replace(',', '.', $bolli);
|
||||
if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) {
|
||||
$marca_da_bollo = str_replace(',', '.', $bolli);
|
||||
} else {
|
||||
$marca_da_bollo = 0.00;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$marca_da_bollo = 0.00;
|
||||
}
|
||||
|
||||
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='$ritenutaacconto', bollo='$marca_da_bollo' WHERE id='$idddt'");
|
||||
} else {
|
||||
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='0', bollo='0', rivalsainps='0', iva_rivalsainps='0' WHERE id='$idddt'");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Restituisce lo stato del ddt in base alle righe.
|
||||
*/
|
||||
function get_stato_ddt($idddt)
|
||||
{
|
||||
$dbo = database();
|
||||
if (!function_exists('get_stato_ddt')) {
|
||||
function get_stato_ddt($idddt)
|
||||
{
|
||||
$dbo = database();
|
||||
|
||||
$rs = $dbo->fetchArray('SELECT SUM(qta) AS qta, SUM(qta_evasa) AS qta_evasa FROM dt_righe_ddt GROUP BY idddt HAVING idddt='.prepare($idddt));
|
||||
$rs = $dbo->fetchArray('SELECT SUM(qta) AS qta, SUM(qta_evasa) AS qta_evasa FROM dt_righe_ddt GROUP BY idddt HAVING idddt='.prepare($idddt));
|
||||
|
||||
if ($rs[0]['qta'] == 0) {
|
||||
return 'Bozza';
|
||||
} else {
|
||||
if ($rs[0]['qta_evasa'] > 0) {
|
||||
if ($rs[0]['qta'] > $rs[0]['qta_evasa']) {
|
||||
return 'Parzialmente fatturato';
|
||||
} elseif ($rs[0]['qta'] == $rs[0]['qta_evasa']) {
|
||||
return 'Fatturato';
|
||||
}
|
||||
if ($rs[0]['qta'] == 0) {
|
||||
return 'Bozza';
|
||||
} else {
|
||||
return 'Evaso';
|
||||
if ($rs[0]['qta_evasa'] > 0) {
|
||||
if ($rs[0]['qta'] > $rs[0]['qta_evasa']) {
|
||||
return 'Parzialmente fatturato';
|
||||
} elseif ($rs[0]['qta'] == $rs[0]['qta_evasa']) {
|
||||
return 'Fatturato';
|
||||
}
|
||||
} else {
|
||||
return 'Evaso';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function verifica_numero_ddt(DDT $ddt)
|
||||
{
|
||||
global $dbo;
|
||||
if (!function_exists('verifica_numero_ddt')) {
|
||||
function verifica_numero_ddt(DDT $ddt)
|
||||
{
|
||||
global $dbo;
|
||||
|
||||
$data = $ddt->data;
|
||||
$tipo = $ddt->tipo;
|
||||
$dir = $ddt->direzione;
|
||||
$numero = ($dir == 'entrata' ? $ddt->numero_esterno : $ddt->numero);
|
||||
$campo = ($dir == 'entrata' ? 'numero_esterno' : 'numero');
|
||||
$data = $ddt->data;
|
||||
$tipo = $ddt->tipo;
|
||||
$dir = $ddt->direzione;
|
||||
$numero = ($dir == 'entrata' ? $ddt->numero_esterno : $ddt->numero);
|
||||
$campo = ($dir == 'entrata' ? 'numero_esterno' : 'numero');
|
||||
|
||||
if (empty($numero)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$documenti = DDT::where('idtipoddt', $tipo->id)
|
||||
->where('data', $data)
|
||||
->get();
|
||||
|
||||
// Recupero maschera per questo segmento
|
||||
$maschera = setting('Formato numero secondario ddt');
|
||||
|
||||
$ultimo = Generator::getPreviousFrom($maschera, 'dt_ddt', $campo, [
|
||||
'data < '.prepare(date('Y-m-d', strtotime($data))),
|
||||
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
|
||||
'idtipoddt = '.prepare($tipo->id),
|
||||
], $data);
|
||||
|
||||
do {
|
||||
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
|
||||
|
||||
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
|
||||
return $item->numero_esterno == $numero;
|
||||
});
|
||||
|
||||
if ($documenti->count() == $filtered->count()) {
|
||||
return $numero;
|
||||
}
|
||||
|
||||
$documenti = $filtered;
|
||||
$ultimo = $numero;
|
||||
} while ($numero != $ddt->numero_esterno);
|
||||
|
||||
if (empty($numero)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$documenti = DDT::where('idtipoddt', $tipo->id)
|
||||
->where('data', $data)
|
||||
->get();
|
||||
|
||||
// Recupero maschera per questo segmento
|
||||
$maschera = setting('Formato numero secondario ddt');
|
||||
|
||||
$ultimo = Generator::getPreviousFrom($maschera, 'dt_ddt', $campo, [
|
||||
'data < '.prepare(date('Y-m-d', strtotime($data))),
|
||||
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
|
||||
'idtipoddt = '.prepare($tipo->id),
|
||||
], $data);
|
||||
|
||||
do {
|
||||
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
|
||||
|
||||
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
|
||||
return $item->numero_esterno == $numero;
|
||||
});
|
||||
|
||||
if ($documenti->count() == $filtered->count()) {
|
||||
return $numero;
|
||||
}
|
||||
|
||||
$documenti = $filtered;
|
||||
$ultimo = $numero;
|
||||
} while ($numero != $ddt->numero_esterno);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -297,6 +297,7 @@ switch ($op) {
|
|||
}
|
||||
|
||||
$totale_documento = abs($totale_documento);
|
||||
$totale_documento = $dati_generali['ImportoTotaleDocumento'] ? $dati_generali['ImportoTotaleDocumento'] : $totale_documento;
|
||||
} catch (Exception $e) {
|
||||
}
|
||||
|
||||
|
|
|
@ -20,105 +20,122 @@
|
|||
use Modules\Fatture\Fattura;
|
||||
use Util\Generator;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Funzione per generare un nuovo numero per la fattura.
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_new_numerofattura($data)
|
||||
{
|
||||
global $dir;
|
||||
global $id_segment;
|
||||
if (!function_exists('get_new_numerofattura')) {
|
||||
function get_new_numerofattura($data)
|
||||
{
|
||||
global $dir;
|
||||
global $id_segment;
|
||||
|
||||
return Fattura::getNextNumero($data, $dir, $id_segment);
|
||||
return Fattura::getNextNumero($data, $dir, $id_segment);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Funzione per calcolare il numero secondario successivo utilizzando la maschera dalle impostazioni.
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_new_numerosecondariofattura($data)
|
||||
{
|
||||
global $dir;
|
||||
global $id_segment;
|
||||
|
||||
return Fattura::getNextNumeroSecondario($data, $dir, $id_segment);
|
||||
if (!function_exists('get_new_numerosecondariofattura')) {
|
||||
function get_new_numerosecondariofattura($data)
|
||||
{
|
||||
global $dir;
|
||||
global $id_segment;
|
||||
|
||||
return Fattura::getNextNumeroSecondario($data, $dir, $id_segment);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo imponibile fattura (totale_righe - sconto).
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_imponibile_fattura($iddocumento)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
|
||||
return $fattura->imponibile;
|
||||
if (!function_exists('get_imponibile_fattura')) {
|
||||
function get_imponibile_fattura($iddocumento)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
|
||||
return $fattura->imponibile;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo totale fattura (imponibile + iva).
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_totale_fattura($iddocumento)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
if (!function_exists('get_totale_fattura')) {
|
||||
function get_totale_fattura($iddocumento)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
|
||||
return $fattura->totale;
|
||||
return $fattura->totale;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo netto a pagare fattura (totale - ritenute - bolli).
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_netto_fattura($iddocumento)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
if (!function_exists('get_netto_fattura')) {
|
||||
function get_netto_fattura($iddocumento)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
|
||||
return $fattura->netto;
|
||||
return $fattura->netto;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo iva detraibile fattura.
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_ivadetraibile_fattura($iddocumento)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
if (!function_exists('get_ivadetraibile_fattura')) {
|
||||
function get_ivadetraibile_fattura($iddocumento)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
|
||||
return $fattura->iva_detraibile;
|
||||
return $fattura->iva_detraibile;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo iva indetraibile fattura.
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_ivaindetraibile_fattura($iddocumento)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
|
||||
return $fattura->iva_indetraibile;
|
||||
if (!function_exists('get_ivaindetraibile_fattura')) {
|
||||
function get_ivaindetraibile_fattura($iddocumento)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
|
||||
return $fattura->iva_indetraibile;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Elimina una scadenza in base al codice documento.
|
||||
*
|
||||
* @deprecated 2.4.17
|
||||
*/
|
||||
function elimina_scadenze($iddocumento)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
if (!function_exists('elimina_scadenze')) {
|
||||
function elimina_scadenze($iddocumento)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
|
||||
$fattura->rimuoviScadenze();
|
||||
$fattura->rimuoviScadenze();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Funzione per ricalcolare lo scadenzario di una determinata fattura
|
||||
* $iddocumento string E' l'id del documento di cui ricalcolare lo scadenzario
|
||||
* $pagamento string Nome del tipo di pagamento. Se è vuoto lo leggo da co_pagamenti_documenti, perché significa che devo solo aggiornare gli importi.
|
||||
|
@ -126,14 +143,16 @@ function elimina_scadenze($iddocumento)
|
|||
*
|
||||
* @deprecated 2.4.17
|
||||
*/
|
||||
function aggiungi_scadenza($iddocumento, $pagamento = '', $pagato = false)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
if (!function_exists('aggiungi_scadenza')) {
|
||||
function aggiungi_scadenza($iddocumento, $pagamento = '', $pagato = false)
|
||||
{
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
|
||||
$fattura->registraScadenze($pagato);
|
||||
$fattura->registraScadenze($pagato);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Elimina i movimenti collegati ad una fattura.
|
||||
* Se il flag $prima_nota è impostato a 1 elimina solo i movimenti di Prima Nota, altrimenti rimuove quelli automatici.
|
||||
*
|
||||
|
@ -142,17 +161,20 @@ function aggiungi_scadenza($iddocumento, $pagamento = '', $pagato = false)
|
|||
*
|
||||
* @deprecated 2.4.17
|
||||
*/
|
||||
function elimina_movimenti($id_documento, $prima_nota = 0)
|
||||
{
|
||||
$dbo = database();
|
||||
|
||||
$idmastrino = $dbo->fetchOne('SELECT idmastrino FROM co_movimenti WHERE iddocumento='.prepare($id_documento).' AND primanota='.prepare($prima_nota))['idmastrino'];
|
||||
if (!function_exists('elimina_movimenti')) {
|
||||
function elimina_movimenti($id_documento, $prima_nota = 0)
|
||||
{
|
||||
$dbo = database();
|
||||
|
||||
$query2 = 'DELETE FROM co_movimenti WHERE idmastrino='.prepare($idmastrino).' AND primanota='.prepare($prima_nota);
|
||||
$dbo->query($query2);
|
||||
$idmastrino = $dbo->fetchOne('SELECT idmastrino FROM co_movimenti WHERE iddocumento='.prepare($id_documento).' AND primanota='.prepare($prima_nota))['idmastrino'];
|
||||
|
||||
$query2 = 'DELETE FROM co_movimenti WHERE idmastrino='.prepare($idmastrino).' AND primanota='.prepare($prima_nota);
|
||||
$dbo->query($query2);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Funzione per aggiungere la fattura in prima nota
|
||||
* $iddocumento string E' l'id del documento da collegare alla prima nota
|
||||
* $dir string Direzione dell'importo (entrata, uscita)
|
||||
|
@ -160,277 +182,285 @@ function elimina_movimenti($id_documento, $prima_nota = 0)
|
|||
*
|
||||
* @deprecated 2.4.17
|
||||
*/
|
||||
function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
|
||||
{
|
||||
$dbo = database();
|
||||
if (!function_exists('aggiungi_movimento')) {
|
||||
function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
|
||||
{
|
||||
$dbo = database();
|
||||
|
||||
$fattura = Modules\Fatture\Fattura::find($iddocumento);
|
||||
$is_nota = $fattura->isNota();
|
||||
$fattura = Modules\Fatture\Fattura::find($iddocumento);
|
||||
$is_nota = $fattura->isNota();
|
||||
|
||||
// Totale marca da bollo, inps, ritenuta, idagente
|
||||
$query = 'SELECT data, bollo, ritenutaacconto, rivalsainps, split_payment FROM co_documenti WHERE id='.prepare($iddocumento);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$totale_bolli = $is_nota ? -$rs[0]['bollo'] : $rs[0]['bollo'];
|
||||
$totale_ritenutaacconto = $is_nota ? -$rs[0]['ritenutaacconto'] : $rs[0]['ritenutaacconto'];
|
||||
$totale_ritenutacontributi = $is_nota ? -$fattura->totale_ritenuta_contributi : $fattura->totale_ritenuta_contributi;
|
||||
$totale_rivalsainps = $is_nota ? -$rs[0]['rivalsainps'] : $rs[0]['rivalsainps'];
|
||||
$data_documento = $rs[0]['data'];
|
||||
$split_payment = $rs[0]['split_payment'];
|
||||
|
||||
$netto_fattura = get_netto_fattura($iddocumento);
|
||||
$totale_fattura = get_totale_fattura($iddocumento);
|
||||
$totale_fattura = $is_nota ? -$totale_fattura : $totale_fattura;
|
||||
|
||||
$imponibile_fattura = get_imponibile_fattura($iddocumento);
|
||||
|
||||
// Calcolo l'iva della rivalsa inps
|
||||
$iva_rivalsainps = 0;
|
||||
|
||||
$rsr = $dbo->fetchArray('SELECT idiva, rivalsainps FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento));
|
||||
|
||||
for ($r = 0; $r < sizeof($rsr); ++$r) {
|
||||
$qi = 'SELECT percentuale FROM co_iva WHERE id='.prepare($rsr[$r]['idiva']);
|
||||
$rsi = $dbo->fetchArray($qi);
|
||||
$iva_rivalsainps += $rsr[$r]['rivalsainps'] / 100 * $rsi[0]['percentuale'];
|
||||
}
|
||||
|
||||
// Lettura iva indetraibile fattura
|
||||
$query = 'SELECT SUM(iva_indetraibile) AS iva_indetraibile FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$iva_indetraibile_fattura = $is_nota ? -$rs[0]['iva_indetraibile'] : $rs[0]['iva_indetraibile'];
|
||||
|
||||
// Lettura iva delle righe in fattura
|
||||
$query = 'SELECT iva FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$iva_fattura = sum(array_column($rs, 'iva'), null) + $iva_rivalsainps - $iva_indetraibile_fattura;
|
||||
$iva_fattura = $is_nota ? -$iva_fattura : $iva_fattura;
|
||||
|
||||
// Imposto i segni + e - in base se la fattura è di acquisto o vendita
|
||||
if ($dir == 'uscita') {
|
||||
$segno_mov1_cliente = -1;
|
||||
$segno_mov2_ricavivendite = 1;
|
||||
$segno_mov3_iva = 1;
|
||||
|
||||
$segno_mov4_inps = 1;
|
||||
$segno_mov5_ritenutaacconto = -1;
|
||||
|
||||
// Lettura conto fornitore
|
||||
$query = 'SELECT idconto_fornitore FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
|
||||
// Totale marca da bollo, inps, ritenuta, idagente
|
||||
$query = 'SELECT data, bollo, ritenutaacconto, rivalsainps, split_payment FROM co_documenti WHERE id='.prepare($iddocumento);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$idconto_controparte = $rs[0]['idconto_fornitore'];
|
||||
$totale_bolli = $is_nota ? -$rs[0]['bollo'] : $rs[0]['bollo'];
|
||||
$totale_ritenutaacconto = $is_nota ? -$rs[0]['ritenutaacconto'] : $rs[0]['ritenutaacconto'];
|
||||
$totale_ritenutacontributi = $is_nota ? -$fattura->totale_ritenuta_contributi : $fattura->totale_ritenuta_contributi;
|
||||
$totale_rivalsainps = $is_nota ? -$rs[0]['rivalsainps'] : $rs[0]['rivalsainps'];
|
||||
$data_documento = $rs[0]['data'];
|
||||
$split_payment = $rs[0]['split_payment'];
|
||||
|
||||
if ($idconto_controparte == '') {
|
||||
$idconto_controparte = setting('Conto per Riepilogativo fornitori');
|
||||
$netto_fattura = get_netto_fattura($iddocumento);
|
||||
$totale_fattura = get_totale_fattura($iddocumento);
|
||||
$totale_fattura = $is_nota ? -$totale_fattura : $totale_fattura;
|
||||
|
||||
$imponibile_fattura = get_imponibile_fattura($iddocumento);
|
||||
|
||||
// Calcolo l'iva della rivalsa inps
|
||||
$iva_rivalsainps = 0;
|
||||
|
||||
$rsr = $dbo->fetchArray('SELECT idiva, rivalsainps FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento));
|
||||
|
||||
for ($r = 0; $r < sizeof($rsr); ++$r) {
|
||||
$qi = 'SELECT percentuale FROM co_iva WHERE id='.prepare($rsr[$r]['idiva']);
|
||||
$rsi = $dbo->fetchArray($qi);
|
||||
$iva_rivalsainps += $rsr[$r]['rivalsainps'] / 100 * $rsi[0]['percentuale'];
|
||||
}
|
||||
} else {
|
||||
$segno_mov1_cliente = 1;
|
||||
$segno_mov2_ricavivendite = -1;
|
||||
$segno_mov3_iva = -1;
|
||||
|
||||
$segno_mov4_inps = -1;
|
||||
$segno_mov5_ritenutaacconto = 1;
|
||||
|
||||
// Lettura conto cliente
|
||||
$query = 'SELECT idconto_cliente FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
|
||||
// Lettura iva indetraibile fattura
|
||||
$query = 'SELECT SUM(iva_indetraibile) AS iva_indetraibile FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$idconto_controparte = $rs[0]['idconto_cliente'];
|
||||
$iva_indetraibile_fattura = $is_nota ? -$rs[0]['iva_indetraibile'] : $rs[0]['iva_indetraibile'];
|
||||
|
||||
if ($idconto_controparte == '') {
|
||||
$idconto_controparte = setting('Conto per Riepilogativo clienti');
|
||||
// Lettura iva delle righe in fattura
|
||||
$query = 'SELECT iva FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$iva_fattura = sum(array_column($rs, 'iva'), null) + $iva_rivalsainps - $iva_indetraibile_fattura;
|
||||
$iva_fattura = $is_nota ? -$iva_fattura : $iva_fattura;
|
||||
|
||||
// Imposto i segni + e - in base se la fattura è di acquisto o vendita
|
||||
if ($dir == 'uscita') {
|
||||
$segno_mov1_cliente = -1;
|
||||
$segno_mov2_ricavivendite = 1;
|
||||
$segno_mov3_iva = 1;
|
||||
|
||||
$segno_mov4_inps = 1;
|
||||
$segno_mov5_ritenutaacconto = -1;
|
||||
|
||||
// Lettura conto fornitore
|
||||
$query = 'SELECT idconto_fornitore FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$idconto_controparte = $rs[0]['idconto_fornitore'];
|
||||
|
||||
if ($idconto_controparte == '') {
|
||||
$idconto_controparte = setting('Conto per Riepilogativo fornitori');
|
||||
}
|
||||
} else {
|
||||
$segno_mov1_cliente = 1;
|
||||
$segno_mov2_ricavivendite = -1;
|
||||
$segno_mov3_iva = -1;
|
||||
|
||||
$segno_mov4_inps = -1;
|
||||
$segno_mov5_ritenutaacconto = 1;
|
||||
|
||||
// Lettura conto cliente
|
||||
$query = 'SELECT idconto_cliente FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$idconto_controparte = $rs[0]['idconto_cliente'];
|
||||
|
||||
if ($idconto_controparte == '') {
|
||||
$idconto_controparte = setting('Conto per Riepilogativo clienti');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Lettura info fattura
|
||||
$query = 'SELECT *, co_documenti.data_competenza, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipo` FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$n = sizeof($rs);
|
||||
$data = $rs[0]['data_competenza'];
|
||||
$idanagrafica = $rs[0]['idanagrafica'];
|
||||
$ragione_sociale = $rs[0]['ragione_sociale'];
|
||||
$stato = $rs[0]['stato'];
|
||||
// Lettura info fattura
|
||||
$query = 'SELECT *, co_documenti.data_competenza, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipo` FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$n = sizeof($rs);
|
||||
$data = $rs[0]['data_competenza'];
|
||||
$idanagrafica = $rs[0]['idanagrafica'];
|
||||
$ragione_sociale = $rs[0]['ragione_sociale'];
|
||||
$stato = $rs[0]['stato'];
|
||||
|
||||
$idmastrino = get_new_idmastrino();
|
||||
$idmastrino = get_new_idmastrino();
|
||||
|
||||
// Prendo il numero doc. esterno se c'è, altrimenti quello normale
|
||||
if (!empty($rs[0]['numero_esterno'])) {
|
||||
$numero = $rs[0]['numero_esterno'];
|
||||
} else {
|
||||
$numero = $rs[0]['numero'];
|
||||
}
|
||||
// Prendo il numero doc. esterno se c'è, altrimenti quello normale
|
||||
if (!empty($rs[0]['numero_esterno'])) {
|
||||
$numero = $rs[0]['numero_esterno'];
|
||||
} else {
|
||||
$numero = $rs[0]['numero'];
|
||||
}
|
||||
|
||||
// Abbreviazioni contabili dei movimenti
|
||||
$tipodoc = '';
|
||||
if ($rs[0]['descrizione_tipo'] == 'Nota di credito') {
|
||||
$tipodoc = 'Nota di credito';
|
||||
} elseif ($rs[0]['descrizione_tipo'] == 'Nota di debito') {
|
||||
$tipodoc = 'Nota di debito';
|
||||
} else {
|
||||
$tipodoc = 'Fattura';
|
||||
}
|
||||
// Abbreviazioni contabili dei movimenti
|
||||
$tipodoc = '';
|
||||
if ($rs[0]['descrizione_tipo'] == 'Nota di credito') {
|
||||
$tipodoc = 'Nota di credito';
|
||||
} elseif ($rs[0]['descrizione_tipo'] == 'Nota di debito') {
|
||||
$tipodoc = 'Nota di debito';
|
||||
} else {
|
||||
$tipodoc = 'Fattura';
|
||||
}
|
||||
|
||||
$descrizione = $tipodoc.' num. '.$numero;
|
||||
$descrizione = $tipodoc.' num. '.$numero;
|
||||
|
||||
/*
|
||||
Il mastrino si apre con almeno 3 righe di solito (esempio fattura di vendita):
|
||||
1) dare imponibile+iva al conto cliente
|
||||
2) avere imponibile sul conto dei ricavi
|
||||
3) avere iva sul conto dell'iva a credito (ed eventuale iva indetraibile sul rispettivo conto)
|
||||
/*
|
||||
Il mastrino si apre con almeno 3 righe di solito (esempio fattura di vendita):
|
||||
1) dare imponibile+iva al conto cliente
|
||||
2) avere imponibile sul conto dei ricavi
|
||||
3) avere iva sul conto dell'iva a credito (ed eventuale iva indetraibile sul rispettivo conto)
|
||||
|
||||
aggiuntivo:
|
||||
4) eventuale rivalsa inps
|
||||
5) eventuale ritenuta d'acconto
|
||||
*/
|
||||
// 1) Aggiungo la riga del conto cliente
|
||||
$importo_cliente = $totale_fattura;
|
||||
aggiuntivo:
|
||||
4) eventuale rivalsa inps
|
||||
5) eventuale ritenuta d'acconto
|
||||
*/
|
||||
// 1) Aggiungo la riga del conto cliente
|
||||
$importo_cliente = $totale_fattura;
|
||||
|
||||
if ($split_payment) {
|
||||
$importo_cliente = sum($importo_cliente, -$iva_fattura, 2);
|
||||
}
|
||||
if ($split_payment) {
|
||||
$importo_cliente = sum($importo_cliente, -$iva_fattura, 2);
|
||||
}
|
||||
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($importo_cliente + $totale_bolli) * $segno_mov1_cliente).', '.prepare($primanota).' )';
|
||||
$dbo->query($query2);
|
||||
|
||||
// 2) Aggiungo il totale sul conto dei ricavi/spese scelto
|
||||
// Lettura descrizione conto ricavi/spese per ogni riga del documento
|
||||
$righe = $dbo->fetchArray('SELECT idconto, SUM(subtotale - sconto) AS imponibile FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento).' GROUP BY idconto');
|
||||
|
||||
foreach ($righe as $riga) {
|
||||
// Retrocompatibilità
|
||||
$idconto_riga = !empty($riga['idconto']) ? $riga['idconto'] : $idconto;
|
||||
$riga['imponibile'] = $is_nota ? -$riga['imponibile'] : $riga['imponibile'];
|
||||
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_riga).', '.prepare($riga['imponibile'] * $segno_mov2_ricavivendite).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
}
|
||||
|
||||
// 3) Aggiungo il totale sul conto dell'iva
|
||||
// Lettura id conto iva
|
||||
if ($iva_fattura != 0 && !$split_payment) {
|
||||
$descrizione_conto_iva = ($dir == 'entrata') ? 'Iva su vendite' : 'Iva su acquisti';
|
||||
$idconto_iva = setting('Conto per '.$descrizione_conto_iva);
|
||||
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva).', '.prepare($iva_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
}
|
||||
|
||||
// Lettura id conto iva indetraibile
|
||||
if ($iva_indetraibile_fattura != 0 && !$split_payment) {
|
||||
$idconto_iva2 = setting('Conto per Iva indetraibile');
|
||||
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva2).', '.prepare($iva_indetraibile_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
}
|
||||
|
||||
// 4) Aggiungo la rivalsa INPS se c'è
|
||||
// Lettura id conto inps
|
||||
if ($totale_rivalsainps != 0) {
|
||||
$idconto_inps = setting('Conto per Erario c/INPS');
|
||||
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_inps).', '.prepare($totale_rivalsainps * $segno_mov4_inps).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
}
|
||||
|
||||
// 5) Aggiungo la ritenuta d'acconto se c'è
|
||||
// Lettura id conto ritenuta e la storno subito
|
||||
if ($totale_ritenutaacconto != 0) {
|
||||
$idconto_ritenutaacconto = setting("Conto per Erario c/ritenute d'acconto");
|
||||
|
||||
// DARE nel conto ritenuta
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaacconto).', '.prepare($totale_ritenutaacconto * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($importo_cliente + $totale_bolli) * $segno_mov1_cliente).', '.prepare($primanota).' )';
|
||||
$dbo->query($query2);
|
||||
|
||||
// AVERE nel riepilogativo clienti
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutaacconto * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
}
|
||||
// 2) Aggiungo il totale sul conto dei ricavi/spese scelto
|
||||
// Lettura descrizione conto ricavi/spese per ogni riga del documento
|
||||
$righe = $dbo->fetchArray('SELECT idconto, SUM(subtotale - sconto) AS imponibile FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento).' GROUP BY idconto');
|
||||
|
||||
// 6) Aggiungo la ritenuta enasarco se c'è
|
||||
// Lettura id conto ritenuta e la storno subito
|
||||
if ($totale_ritenutacontributi != 0) {
|
||||
$idconto_ritenutaenasarco = setting('Conto per Erario c/enasarco');
|
||||
foreach ($righe as $riga) {
|
||||
// Retrocompatibilità
|
||||
$idconto_riga = !empty($riga['idconto']) ? $riga['idconto'] : $idconto;
|
||||
$riga['imponibile'] = $is_nota ? -$riga['imponibile'] : $riga['imponibile'];
|
||||
|
||||
// DARE nel conto ritenuta
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaenasarco).', '.prepare($totale_ritenutacontributi * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_riga).', '.prepare($riga['imponibile'] * $segno_mov2_ricavivendite).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
}
|
||||
|
||||
// AVERE nel riepilogativo clienti
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutacontributi * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
// 3) Aggiungo il totale sul conto dell'iva
|
||||
// Lettura id conto iva
|
||||
if ($iva_fattura != 0 && !$split_payment) {
|
||||
$descrizione_conto_iva = ($dir == 'entrata') ? 'Iva su vendite' : 'Iva su acquisti';
|
||||
$idconto_iva = setting('Conto per '.$descrizione_conto_iva);
|
||||
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva).', '.prepare($iva_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
}
|
||||
|
||||
// Lettura id conto iva indetraibile
|
||||
if ($iva_indetraibile_fattura != 0 && !$split_payment) {
|
||||
$idconto_iva2 = setting('Conto per Iva indetraibile');
|
||||
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva2).', '.prepare($iva_indetraibile_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
}
|
||||
|
||||
// 4) Aggiungo la rivalsa INPS se c'è
|
||||
// Lettura id conto inps
|
||||
if ($totale_rivalsainps != 0) {
|
||||
$idconto_inps = setting('Conto per Erario c/INPS');
|
||||
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_inps).', '.prepare($totale_rivalsainps * $segno_mov4_inps).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
}
|
||||
|
||||
// 5) Aggiungo la ritenuta d'acconto se c'è
|
||||
// Lettura id conto ritenuta e la storno subito
|
||||
if ($totale_ritenutaacconto != 0) {
|
||||
$idconto_ritenutaacconto = setting("Conto per Erario c/ritenute d'acconto");
|
||||
|
||||
// DARE nel conto ritenuta
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaacconto).', '.prepare($totale_ritenutaacconto * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
|
||||
// AVERE nel riepilogativo clienti
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutaacconto * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
}
|
||||
|
||||
// 6) Aggiungo la ritenuta enasarco se c'è
|
||||
// Lettura id conto ritenuta e la storno subito
|
||||
if ($totale_ritenutacontributi != 0) {
|
||||
$idconto_ritenutaenasarco = setting('Conto per Erario c/enasarco');
|
||||
|
||||
// DARE nel conto ritenuta
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaenasarco).', '.prepare($totale_ritenutacontributi * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
|
||||
// AVERE nel riepilogativo clienti
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutacontributi * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
|
||||
$dbo->query($query2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Funzione per generare un nuovo codice per il mastrino.
|
||||
*
|
||||
* @deprecated 2.4.17
|
||||
*/
|
||||
function get_new_idmastrino($table = 'co_movimenti')
|
||||
{
|
||||
$dbo = database();
|
||||
if (!function_exists('get_new_idmastrino')) {
|
||||
function get_new_idmastrino($table = 'co_movimenti')
|
||||
{
|
||||
$dbo = database();
|
||||
|
||||
$query = 'SELECT MAX(idmastrino) AS maxidmastrino FROM '.$table;
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$query = 'SELECT MAX(idmastrino) AS maxidmastrino FROM '.$table;
|
||||
$rs = $dbo->fetchArray($query);
|
||||
|
||||
return intval($rs[0]['maxidmastrino']) + 1;
|
||||
return intval($rs[0]['maxidmastrino']) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Ricalcola i costi aggiuntivi in fattura (rivalsa inps, ritenuta d'acconto, marca da bollo)
|
||||
* Deve essere eseguito ogni volta che si aggiunge o toglie una riga
|
||||
* $iddocumento int ID della fattura.
|
||||
*
|
||||
* @deprecated 2.4.17
|
||||
*/
|
||||
function ricalcola_costiagg_fattura($iddocumento)
|
||||
{
|
||||
global $dir;
|
||||
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
$fattura->save();
|
||||
if (!function_exists('ricalcola_costiagg_fattura')) {
|
||||
function ricalcola_costiagg_fattura($iddocumento)
|
||||
{
|
||||
global $dir;
|
||||
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
$fattura->save();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Verifica che il numero_esterno della fattura indicata sia correttamente impostato, a partire dai valori delle fatture ai giorni precedenti.
|
||||
* Restituisce il numero_esterno mancante in caso di numero errato.
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
function verifica_numero_fattura(Fattura $fattura)
|
||||
{
|
||||
if (empty($fattura->numero_esterno)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$id_segment = $fattura->id_segment;
|
||||
$data = $fattura->data;
|
||||
|
||||
$documenti = Fattura::where('id_segment', '=', $id_segment)
|
||||
->where('data', '=', $data)
|
||||
->get();
|
||||
|
||||
// Recupero maschera per questo segmento
|
||||
$maschera = Generator::getMaschera($id_segment);
|
||||
|
||||
$ultimo = Generator::getPreviousFrom($maschera, 'co_documenti', 'numero_esterno', [
|
||||
'data < '.prepare(date('Y-m-d', strtotime($data))),
|
||||
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
|
||||
'id_segment = '.prepare($id_segment),
|
||||
], $data);
|
||||
|
||||
do {
|
||||
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
|
||||
|
||||
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
|
||||
return $item->numero_esterno == $numero;
|
||||
});
|
||||
|
||||
if ($documenti->count() == $filtered->count()) {
|
||||
return $numero;
|
||||
if (!function_exists('verifica_numero_fattura')) {
|
||||
function verifica_numero_fattura(Fattura $fattura)
|
||||
{
|
||||
if (empty($fattura->numero_esterno)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$documenti = $filtered;
|
||||
$ultimo = $numero;
|
||||
} while ($numero != $fattura->numero_esterno);
|
||||
$id_segment = $fattura->id_segment;
|
||||
$data = $fattura->data;
|
||||
|
||||
return null;
|
||||
$documenti = Fattura::where('id_segment', '=', $id_segment)
|
||||
->where('data', '=', $data)
|
||||
->get();
|
||||
|
||||
// Recupero maschera per questo segmento
|
||||
$maschera = Generator::getMaschera($id_segment);
|
||||
|
||||
$ultimo = Generator::getPreviousFrom($maschera, 'co_documenti', 'numero_esterno', [
|
||||
'data < '.prepare(date('Y-m-d', strtotime($data))),
|
||||
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
|
||||
'id_segment = '.prepare($id_segment),
|
||||
], $data);
|
||||
|
||||
do {
|
||||
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
|
||||
|
||||
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
|
||||
return $item->numero_esterno == $numero;
|
||||
});
|
||||
|
||||
if ($documenti->count() == $filtered->count()) {
|
||||
return $numero;
|
||||
}
|
||||
|
||||
$documenti = $filtered;
|
||||
$ultimo = $numero;
|
||||
} while ($numero != $fattura->numero_esterno);
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,18 +21,20 @@ use Util\Ini;
|
|||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
function crea_form_componente($contenuto)
|
||||
{
|
||||
$fields = Ini::getFields($contenuto);
|
||||
$title = array_shift($fields);
|
||||
if (!function_exists('crea_form_componente')) {
|
||||
function crea_form_componente($contenuto)
|
||||
{
|
||||
$fields = Ini::getFields($contenuto);
|
||||
$title = array_shift($fields);
|
||||
|
||||
foreach ($fields as $key => $value) {
|
||||
$fields[$key] = '<div class="col-md-4">'.$value.'</div>';
|
||||
foreach ($fields as $key => $value) {
|
||||
$fields[$key] = '<div class="col-md-4">'.$value.'</div>';
|
||||
}
|
||||
|
||||
echo $title.'
|
||||
<div class="row">
|
||||
'.implode(PHP_EOL, $fields).'
|
||||
<script>restart_inputs()</script>
|
||||
</div>';
|
||||
}
|
||||
|
||||
echo $title.'
|
||||
<div class="row">
|
||||
'.implode(PHP_EOL, $fields).'
|
||||
<script>restart_inputs()</script>
|
||||
</div>';
|
||||
}
|
||||
|
|
|
@ -616,6 +616,15 @@ switch (post('op')) {
|
|||
$intervento->idreferente = $documento->idreferente;
|
||||
$intervento->idagente = $documento->idagente;
|
||||
|
||||
if ($class == 'Modules\Preventivi\Preventivo') {
|
||||
$intervento->id_preventivo = $documento->id;
|
||||
$intervento->richiesta = 'Attività creata da preventivo num. '.$documento->numero.'<br>'.$documento->nome;
|
||||
}
|
||||
if ($class == 'Modules\Ordini\Ordine') {
|
||||
$intervento->id_ordine = $documento->id;
|
||||
$intervento->richiesta = 'Attività creata da ordine num. '.$documento->numero_esterno;
|
||||
}
|
||||
|
||||
$intervento->save();
|
||||
|
||||
$id_record = $intervento->id;
|
||||
|
|
|
@ -32,21 +32,24 @@ use Modules\Interventi\Intervento;
|
|||
use Util\Generator;
|
||||
use Util\Ini;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Recupera il totale delle ore spese per un intervento.
|
||||
*
|
||||
* @param int $id_intervento
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
function get_ore_intervento($id_intervento)
|
||||
{
|
||||
$intervento = Intervento::find($id_intervento);
|
||||
|
||||
return $intervento->ore_totali;
|
||||
if (!function_exists('get_ore_intervento')) {
|
||||
function get_ore_intervento($id_intervento)
|
||||
{
|
||||
$intervento = Intervento::find($id_intervento);
|
||||
|
||||
return $intervento->ore_totali;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Funzione per collegare gli articoli, usati in un intervento, ai rispettivi impianti.
|
||||
*
|
||||
* @param int $id_intervento
|
||||
|
@ -56,80 +59,84 @@ function get_ore_intervento($id_intervento)
|
|||
*
|
||||
* @deprecated 2.4.25
|
||||
*/
|
||||
function link_componente_to_articolo($id_intervento, $id_impianto, $id_articolo, $qta)
|
||||
{
|
||||
if (empty($id_impianto) || empty($id_intervento)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$dbo = database();
|
||||
$intervento = Intervento::find($id_intervento);
|
||||
|
||||
// Data di inizio dell'intervento (data_richiesta in caso di assenza di sessioni)
|
||||
$data = $intervento->inizio ?: $intervento->data_richiesta;
|
||||
|
||||
// Se l'articolo aggiunto è collegato a un componente, aggiungo il componente all'impianto selezionato
|
||||
$componente_articolo = $dbo->fetchOne('SELECT componente_filename, contenuto FROM mg_articoli WHERE id = '.prepare($id_articolo));
|
||||
if (!empty($componente_articolo) && !empty($componente_articolo['componente_filename'])) {
|
||||
$contenuto_ini = Ini::read($componente_articolo['contenuto']);
|
||||
$nome_componente = Ini::getValue($contenuto_ini, 'Nome');
|
||||
|
||||
$dati = [
|
||||
'idimpianto' => $id_impianto,
|
||||
'idintervento' => $id_intervento,
|
||||
'nome' => $nome_componente,
|
||||
'data' => $data,
|
||||
'filename' => $componente_articolo['componente_filename'],
|
||||
'contenuto' => $componente_articolo['contenuto'],
|
||||
];
|
||||
|
||||
// Inserisco il componente tante volte quante la quantità degli articoli inseriti
|
||||
for ($q = 0; $q < $qta; ++$q) {
|
||||
$dbo->insert('my_impianto_componenti', $dati);
|
||||
if (!function_exists('link_componente_to_articolo')) {
|
||||
function link_componente_to_articolo($id_intervento, $id_impianto, $id_articolo, $qta)
|
||||
{
|
||||
if (empty($id_impianto) || empty($id_intervento)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function add_tecnico($id_intervento, $idtecnico, $inizio, $fine, $idcontratto = null)
|
||||
{
|
||||
$intervento = Intervento::find($id_intervento);
|
||||
$anagrafica = Anagrafica::find($idtecnico);
|
||||
$dbo = database();
|
||||
$intervento = Intervento::find($id_intervento);
|
||||
|
||||
$sessione = Sessione::build($intervento, $anagrafica, $inizio, $fine);
|
||||
// Data di inizio dell'intervento (data_richiesta in caso di assenza di sessioni)
|
||||
$data = $intervento->inizio ?: $intervento->data_richiesta;
|
||||
|
||||
// Notifica nuovo intervento al tecnico
|
||||
if (setting('Notifica al tecnico l\'aggiunta della sessione nell\'attività')) {
|
||||
if (!empty($anagrafica['email'])) {
|
||||
$template = Template::pool('Notifica intervento');
|
||||
// Se l'articolo aggiunto è collegato a un componente, aggiungo il componente all'impianto selezionato
|
||||
$componente_articolo = $dbo->fetchOne('SELECT componente_filename, contenuto FROM mg_articoli WHERE id = '.prepare($id_articolo));
|
||||
if (!empty($componente_articolo) && !empty($componente_articolo['componente_filename'])) {
|
||||
$contenuto_ini = Ini::read($componente_articolo['contenuto']);
|
||||
$nome_componente = Ini::getValue($contenuto_ini, 'Nome');
|
||||
|
||||
if (!empty($template)) {
|
||||
$mail = Mail::build(auth()->getUser(), $template, $id_intervento);
|
||||
$mail->addReceiver($anagrafica['email']);
|
||||
$mail->save();
|
||||
$dati = [
|
||||
'idimpianto' => $id_impianto,
|
||||
'idintervento' => $id_intervento,
|
||||
'nome' => $nome_componente,
|
||||
'data' => $data,
|
||||
'filename' => $componente_articolo['componente_filename'],
|
||||
'contenuto' => $componente_articolo['contenuto'],
|
||||
];
|
||||
|
||||
// Inserisco il componente tante volte quante la quantità degli articoli inseriti
|
||||
for ($q = 0; $q < $qta; ++$q) {
|
||||
$dbo->insert('my_impianto_componenti', $dati);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Inserisco le righe aggiuntive previste dal tipo di intervento
|
||||
$righe_aggiuntive = database()->fetchArray('SELECT * FROM in_righe_tipiinterventi WHERE id_tipointervento='.prepare($sessione->idtipointervento));
|
||||
|
||||
foreach ($righe_aggiuntive as $riga_aggiuntiva) {
|
||||
$riga = RigaIntervento::build($intervento);
|
||||
|
||||
$riga->descrizione = $riga_aggiuntiva['descrizione'];
|
||||
$riga->um = $riga_aggiuntiva['um'];
|
||||
|
||||
$riga->costo_unitario = $riga_aggiuntiva['prezzo_acquisto'];
|
||||
$riga->setPrezzoUnitario($riga_aggiuntiva['prezzo_vendita'], $riga_aggiuntiva['idiva']);
|
||||
$riga->qta = $riga_aggiuntiva['qta'];
|
||||
|
||||
$riga->save();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
if (!function_exists('add_tecnico')) {
|
||||
function add_tecnico($id_intervento, $idtecnico, $inizio, $fine, $idcontratto = null)
|
||||
{
|
||||
$intervento = Intervento::find($id_intervento);
|
||||
$anagrafica = Anagrafica::find($idtecnico);
|
||||
|
||||
$sessione = Sessione::build($intervento, $anagrafica, $inizio, $fine);
|
||||
|
||||
// Notifica nuovo intervento al tecnico
|
||||
if (setting('Notifica al tecnico l\'aggiunta della sessione nell\'attività')) {
|
||||
if (!empty($anagrafica['email'])) {
|
||||
$template = Template::pool('Notifica intervento');
|
||||
|
||||
if (!empty($template)) {
|
||||
$mail = Mail::build(auth()->getUser(), $template, $id_intervento);
|
||||
$mail->addReceiver($anagrafica['email']);
|
||||
$mail->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Inserisco le righe aggiuntive previste dal tipo di intervento
|
||||
$righe_aggiuntive = database()->fetchArray('SELECT * FROM in_righe_tipiinterventi WHERE id_tipointervento='.prepare($sessione->idtipointervento));
|
||||
|
||||
foreach ($righe_aggiuntive as $riga_aggiuntiva) {
|
||||
$riga = RigaIntervento::build($intervento);
|
||||
|
||||
$riga->descrizione = $riga_aggiuntiva['descrizione'];
|
||||
$riga->um = $riga_aggiuntiva['um'];
|
||||
|
||||
$riga->costo_unitario = $riga_aggiuntiva['prezzo_acquisto'];
|
||||
$riga->setPrezzoUnitario($riga_aggiuntiva['prezzo_vendita'], $riga_aggiuntiva['idiva']);
|
||||
$riga->qta = $riga_aggiuntiva['qta'];
|
||||
|
||||
$riga->save();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Calcola le ore presenti tra due date.
|
||||
*
|
||||
* @param string $orario_inizio
|
||||
|
@ -139,236 +146,242 @@ function add_tecnico($id_intervento, $idtecnico, $inizio, $fine, $idcontratto =
|
|||
*
|
||||
* @deprecated
|
||||
*/
|
||||
function calcola_ore_intervento($orario_inizio, $orario_fine)
|
||||
{
|
||||
$inizio = new DateTime($orario_inizio);
|
||||
$diff = $inizio->diff(new DateTime($orario_fine));
|
||||
if (!function_exists('calcola_ore_intervento')) {
|
||||
function calcola_ore_intervento($orario_inizio, $orario_fine)
|
||||
{
|
||||
$inizio = new DateTime($orario_inizio);
|
||||
$diff = $inizio->diff(new DateTime($orario_fine));
|
||||
|
||||
$ore = $diff->i / 60 + $diff->h + ($diff->days * 24);
|
||||
$ore = $diff->i / 60 + $diff->h + ($diff->days * 24);
|
||||
|
||||
return $ore;
|
||||
return $ore;
|
||||
}
|
||||
}
|
||||
|
||||
function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizione, $id_iva, $id_conto, $id_rivalsa_inps = false, $id_ritenuta_acconto = false, $calcolo_ritenuta_acconto = false)
|
||||
{
|
||||
$dbo = database();
|
||||
if (!function_exists('aggiungi_intervento_in_fattura')) {
|
||||
function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizione, $id_iva, $id_conto, $id_rivalsa_inps = false, $id_ritenuta_acconto = false, $calcolo_ritenuta_acconto = false)
|
||||
{
|
||||
$dbo = database();
|
||||
|
||||
$id_rivalsa_inps = $id_rivalsa_inps !== false ? $id_rivalsa_inps : setting('Cassa previdenziale predefinita');
|
||||
$id_ritenuta_acconto = $id_ritenuta_acconto !== false ? $id_ritenuta_acconto : setting("Ritenuta d'acconto predefinita");
|
||||
$calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto !== false ? $calcolo_ritenuta_acconto : setting("Metodologia calcolo ritenuta d'acconto predefinito");
|
||||
$id_rivalsa_inps = $id_rivalsa_inps !== false ? $id_rivalsa_inps : setting('Cassa previdenziale predefinita');
|
||||
$id_ritenuta_acconto = $id_ritenuta_acconto !== false ? $id_ritenuta_acconto : setting("Ritenuta d'acconto predefinita");
|
||||
$calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto !== false ? $calcolo_ritenuta_acconto : setting("Metodologia calcolo ritenuta d'acconto predefinito");
|
||||
|
||||
$fattura = Fattura::find($id_fattura);
|
||||
$intervento = Intervento::find($id_intervento);
|
||||
$fattura = Fattura::find($id_fattura);
|
||||
$intervento = Intervento::find($id_intervento);
|
||||
|
||||
$data = $intervento->fine;
|
||||
$codice = $intervento->codice;
|
||||
$data = $intervento->fine;
|
||||
$codice = $intervento->codice;
|
||||
|
||||
// Riga di descrizione
|
||||
$riga = Descrizione::build($fattura);
|
||||
$riga->descrizione = $descrizione;
|
||||
$riga->idintervento = $id_intervento;
|
||||
$riga->save();
|
||||
// Riga di descrizione
|
||||
$riga = Descrizione::build($fattura);
|
||||
$riga->descrizione = $descrizione;
|
||||
$riga->idintervento = $id_intervento;
|
||||
$riga->save();
|
||||
|
||||
// Ore di lavoro raggruppate per costo orario
|
||||
$sessioni = $intervento->sessioni;
|
||||
// Ore di lavoro raggruppate per costo orario
|
||||
$sessioni = $intervento->sessioni;
|
||||
|
||||
if (empty($sessioni)) {
|
||||
flash()->warning(tr("L'attività _NUM_ non ha sessioni di lavoro!", [
|
||||
'_NUM_' => $codice,
|
||||
]));
|
||||
} else {
|
||||
$decimals = setting('Cifre decimali per quantità');
|
||||
|
||||
$ore_di_lavoro = $sessioni->groupBy(function ($item, $key) {
|
||||
return $item['prezzo_orario'].'|'.$item['sconto_unitario'].'|'.$item['tipo_sconto'];
|
||||
});
|
||||
foreach ($ore_di_lavoro as $gruppo) {
|
||||
$sessione = $gruppo->first();
|
||||
$riga = Riga::build($fattura);
|
||||
|
||||
$riga->descrizione = tr("Ore di lavoro dell'attività _NUM_ del _DATE_", [
|
||||
if (empty($sessioni)) {
|
||||
flash()->warning(tr("L'attività _NUM_ non ha sessioni di lavoro!", [
|
||||
'_NUM_' => $codice,
|
||||
'_DATE_' => dateFormat($data),
|
||||
]);
|
||||
$riga->idintervento = $id_intervento;
|
||||
$riga->um = 'ore';
|
||||
]));
|
||||
} else {
|
||||
$decimals = setting('Cifre decimali per quantità');
|
||||
|
||||
$riga->id_iva = $id_iva;
|
||||
$riga->idconto = $id_conto;
|
||||
$ore_di_lavoro = $sessioni->groupBy(function ($item, $key) {
|
||||
return $item['prezzo_orario'].'|'.$item['sconto_unitario'].'|'.$item['tipo_sconto'];
|
||||
});
|
||||
foreach ($ore_di_lavoro as $gruppo) {
|
||||
$sessione = $gruppo->first();
|
||||
$riga = Riga::build($fattura);
|
||||
|
||||
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
|
||||
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
|
||||
$riga->id_rivalsa_inps = $id_rivalsa_inps;
|
||||
$riga->descrizione = tr("Ore di lavoro dell'attività _NUM_ del _DATE_", [
|
||||
'_NUM_' => $codice,
|
||||
'_DATE_' => dateFormat($data),
|
||||
]);
|
||||
$riga->idintervento = $id_intervento;
|
||||
$riga->um = 'ore';
|
||||
|
||||
$riga->prezzo_unitario = $sessione->prezzo_orario;
|
||||
$riga->costo_unitario = $sessione->prezzo_ore_unitario_tecnico;
|
||||
//Calcolo lo sconto unitario della sessione in base all'impostazione sui prezzi ivati
|
||||
$iva = $dbo->table('co_iva')->where('id', $id_iva)->first();
|
||||
if ($sessione->tipo_sconto == 'UNT' && setting('Utilizza prezzi di vendita comprensivi di IVA')) {
|
||||
$sconto_unitario = $sessione->sconto_unitario + (($sessione->sconto_unitario * $iva->percentuale) / 100);
|
||||
} else {
|
||||
$sconto_unitario = $sessione->sconto_unitario;
|
||||
$riga->id_iva = $id_iva;
|
||||
$riga->idconto = $id_conto;
|
||||
|
||||
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
|
||||
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
|
||||
$riga->id_rivalsa_inps = $id_rivalsa_inps;
|
||||
|
||||
$riga->prezzo_unitario = $sessione->prezzo_orario;
|
||||
$riga->costo_unitario = $sessione->prezzo_ore_unitario_tecnico;
|
||||
//Calcolo lo sconto unitario della sessione in base all'impostazione sui prezzi ivati
|
||||
$iva = $dbo->table('co_iva')->where('id', $id_iva)->first();
|
||||
if ($sessione->tipo_sconto == 'UNT' && setting('Utilizza prezzi di vendita comprensivi di IVA')) {
|
||||
$sconto_unitario = $sessione->sconto_unitario + (($sessione->sconto_unitario * $iva->percentuale) / 100);
|
||||
} else {
|
||||
$sconto_unitario = $sessione->sconto_unitario;
|
||||
}
|
||||
|
||||
$riga->setSconto($sconto_unitario, $sessione->tipo_sconto);
|
||||
|
||||
$qta_gruppo = $gruppo->sum('ore');
|
||||
$riga->qta = round($qta_gruppo, $decimals);
|
||||
|
||||
// Riferimento al documento di origine
|
||||
$riga->original_document_type = get_class($intervento);
|
||||
$riga->original_document_id = $intervento->id;
|
||||
|
||||
$riga->save();
|
||||
}
|
||||
|
||||
$riga->setSconto($sconto_unitario, $sessione->tipo_sconto);
|
||||
// Diritti di chiamata raggruppati per costo
|
||||
$diritti_chiamata = $sessioni->where('prezzo_diritto_chiamata', '>', 0)->groupBy(function ($item, $key) {
|
||||
return $item['prezzo_diritto_chiamata'];
|
||||
});
|
||||
foreach ($diritti_chiamata as $gruppo) {
|
||||
$diritto_chiamata = $gruppo->first();
|
||||
$riga = Riga::build($fattura);
|
||||
|
||||
$qta_gruppo = $gruppo->sum('ore');
|
||||
$riga->qta = round($qta_gruppo, $decimals);
|
||||
$riga->descrizione = tr("Diritto di chiamata dell'attività _NUM_ del _DATE_", [
|
||||
'_NUM_' => $codice,
|
||||
'_DATE_' => dateFormat($data),
|
||||
]);
|
||||
$riga->idintervento = $id_intervento;
|
||||
//$riga->um = 'ore';
|
||||
|
||||
// Riferimento al documento di origine
|
||||
$riga->original_document_type = get_class($intervento);
|
||||
$riga->original_document_id = $intervento->id;
|
||||
$riga->id_iva = $id_iva;
|
||||
$riga->idconto = $id_conto;
|
||||
|
||||
$riga->save();
|
||||
}
|
||||
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
|
||||
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
|
||||
$riga->id_rivalsa_inps = $id_rivalsa_inps;
|
||||
|
||||
// Diritti di chiamata raggruppati per costo
|
||||
$diritti_chiamata = $sessioni->where('prezzo_diritto_chiamata', '>', 0)->groupBy(function ($item, $key) {
|
||||
return $item['prezzo_diritto_chiamata'];
|
||||
});
|
||||
foreach ($diritti_chiamata as $gruppo) {
|
||||
$diritto_chiamata = $gruppo->first();
|
||||
$riga = Riga::build($fattura);
|
||||
$riga->prezzo_unitario = $diritto_chiamata->prezzo_diritto_chiamata;
|
||||
$riga->costo_unitario = $sessione->prezzo_dirittochiamata_tecnico;
|
||||
$riga->qta = $gruppo->count();
|
||||
|
||||
$riga->descrizione = tr("Diritto di chiamata dell'attività _NUM_ del _DATE_", [
|
||||
'_NUM_' => $codice,
|
||||
'_DATE_' => dateFormat($data),
|
||||
]);
|
||||
$riga->idintervento = $id_intervento;
|
||||
//$riga->um = 'ore';
|
||||
// Riferimento al documento di origine
|
||||
$riga->original_document_type = get_class($intervento);
|
||||
$riga->original_document_id = $intervento->id;
|
||||
|
||||
$riga->id_iva = $id_iva;
|
||||
$riga->idconto = $id_conto;
|
||||
|
||||
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
|
||||
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
|
||||
$riga->id_rivalsa_inps = $id_rivalsa_inps;
|
||||
|
||||
$riga->prezzo_unitario = $diritto_chiamata->prezzo_diritto_chiamata;
|
||||
$riga->costo_unitario = $sessione->prezzo_dirittochiamata_tecnico;
|
||||
$riga->qta = $gruppo->count();
|
||||
|
||||
// Riferimento al documento di origine
|
||||
$riga->original_document_type = get_class($intervento);
|
||||
$riga->original_document_id = $intervento->id;
|
||||
|
||||
$riga->save();
|
||||
}
|
||||
|
||||
// Viaggi raggruppati per costo
|
||||
$viaggi = $sessioni->where('prezzo_km_unitario', '>', 0)->groupBy(function ($item, $key) {
|
||||
return $item['prezzo_km_unitario'].'|'.$item['scontokm_unitario'].'|'.$item['tipo_scontokm'];
|
||||
});
|
||||
foreach ($viaggi as $gruppo) {
|
||||
$qta_trasferta = $gruppo->sum('km');
|
||||
if ($qta_trasferta == 0) {
|
||||
continue;
|
||||
$riga->save();
|
||||
}
|
||||
|
||||
$viaggio = $gruppo->first();
|
||||
$riga = Riga::build($fattura);
|
||||
// Viaggi raggruppati per costo
|
||||
$viaggi = $sessioni->where('prezzo_km_unitario', '>', 0)->groupBy(function ($item, $key) {
|
||||
return $item['prezzo_km_unitario'].'|'.$item['scontokm_unitario'].'|'.$item['tipo_scontokm'];
|
||||
});
|
||||
foreach ($viaggi as $gruppo) {
|
||||
$qta_trasferta = $gruppo->sum('km');
|
||||
if ($qta_trasferta == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$riga->descrizione = tr("Trasferta dell'attività _NUM_ del _DATE_", [
|
||||
'_NUM_' => $codice,
|
||||
'_DATE_' => dateFormat($data),
|
||||
]);
|
||||
$riga->idintervento = $id_intervento;
|
||||
$riga->um = 'km';
|
||||
$viaggio = $gruppo->first();
|
||||
$riga = Riga::build($fattura);
|
||||
|
||||
$riga->id_iva = $id_iva;
|
||||
$riga->idconto = $id_conto;
|
||||
$riga->descrizione = tr("Trasferta dell'attività _NUM_ del _DATE_", [
|
||||
'_NUM_' => $codice,
|
||||
'_DATE_' => dateFormat($data),
|
||||
]);
|
||||
$riga->idintervento = $id_intervento;
|
||||
$riga->um = 'km';
|
||||
|
||||
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
|
||||
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
|
||||
$riga->id_rivalsa_inps = $id_rivalsa_inps;
|
||||
$riga->id_iva = $id_iva;
|
||||
$riga->idconto = $id_conto;
|
||||
|
||||
$riga->prezzo_unitario = $viaggio->prezzo_km_unitario;
|
||||
$riga->costo_unitario = $sessione->prezzo_km_unitario_tecnico;
|
||||
$riga->setSconto($viaggio->scontokm_unitario, $viaggio->tipo_scontokm);
|
||||
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
|
||||
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
|
||||
$riga->id_rivalsa_inps = $id_rivalsa_inps;
|
||||
|
||||
// Riferimento al documento di origine
|
||||
$riga->original_document_type = get_class($intervento);
|
||||
$riga->original_document_id = $intervento->id;
|
||||
$riga->prezzo_unitario = $viaggio->prezzo_km_unitario;
|
||||
$riga->costo_unitario = $sessione->prezzo_km_unitario_tecnico;
|
||||
$riga->setSconto($viaggio->scontokm_unitario, $viaggio->tipo_scontokm);
|
||||
|
||||
$riga->qta = $qta_trasferta;
|
||||
// Riferimento al documento di origine
|
||||
$riga->original_document_type = get_class($intervento);
|
||||
$riga->original_document_id = $intervento->id;
|
||||
|
||||
$riga->save();
|
||||
}
|
||||
}
|
||||
$riga->qta = $qta_trasferta;
|
||||
|
||||
// Articoli, righe, sconti e descrizioni collegati all'intervento
|
||||
$righe = $intervento->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$qta = $riga->qta;
|
||||
$copia = $riga->copiaIn($fattura, $qta);
|
||||
|
||||
$copia->id_conto = $id_conto;
|
||||
|
||||
$copia->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
|
||||
$copia->id_ritenuta_acconto = $id_ritenuta_acconto;
|
||||
$copia->id_rivalsa_inps = $id_rivalsa_inps;
|
||||
|
||||
// Aggiornamento seriali dalla riga dell'ordine
|
||||
if ($copia->isArticolo()) {
|
||||
$copia->serials = $riga->serials;
|
||||
$articolo = ArticoloOriginale::find($copia->idarticolo);
|
||||
$copia->id_conto = ($articolo->idconto_vendita ? $articolo->idconto_vendita : $id_conto);
|
||||
$riga->save();
|
||||
}
|
||||
}
|
||||
|
||||
$copia->save();
|
||||
// Articoli, righe, sconti e descrizioni collegati all'intervento
|
||||
$righe = $intervento->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$qta = $riga->qta;
|
||||
$copia = $riga->copiaIn($fattura, $qta);
|
||||
|
||||
$copia->id_conto = $id_conto;
|
||||
|
||||
$copia->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
|
||||
$copia->id_ritenuta_acconto = $id_ritenuta_acconto;
|
||||
$copia->id_rivalsa_inps = $id_rivalsa_inps;
|
||||
|
||||
// Aggiornamento seriali dalla riga dell'ordine
|
||||
if ($copia->isArticolo()) {
|
||||
$copia->serials = $riga->serials;
|
||||
$articolo = ArticoloOriginale::find($copia->idarticolo);
|
||||
$copia->id_conto = ($articolo->idconto_vendita ? $articolo->idconto_vendita : $id_conto);
|
||||
}
|
||||
|
||||
$copia->save();
|
||||
}
|
||||
|
||||
// Ricalcolo inps, ritenuta e bollo
|
||||
ricalcola_costiagg_fattura($id_fattura);
|
||||
|
||||
// Metto l'intervento in stato "Fatturato"
|
||||
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE codice='FAT') WHERE id=".prepare($id_intervento));
|
||||
}
|
||||
|
||||
// Ricalcolo inps, ritenuta e bollo
|
||||
ricalcola_costiagg_fattura($id_fattura);
|
||||
|
||||
// Metto l'intervento in stato "Fatturato"
|
||||
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE codice='FAT') WHERE id=".prepare($id_intervento));
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Verifica che il numero_esterno della fattura indicata sia correttamente impostato, a partire dai valori delle fatture ai giorni precedenti.
|
||||
* Restituisce il numero_esterno mancante in caso di numero errato.
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
function verifica_numero_intervento(Intervento $intervento)
|
||||
{
|
||||
if (empty($intervento->codice)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$data = $intervento->data_richiesta;
|
||||
$documenti = Intervento::whereDate('data_richiesta', '=', $data->format('Y-m-d'))
|
||||
->get();
|
||||
|
||||
// Recupero maschera per questo segmento
|
||||
$maschera = setting('Formato codice attività');
|
||||
|
||||
if ((strpos($maschera, 'YYYY') == false) or (strpos($maschera, 'yy') == false)) {
|
||||
$ultimo = Generator::getPreviousFrom($maschera, 'in_interventi', 'codice', [
|
||||
'DATE(data_richiesta) < '.prepare($data->format('Y-m-d')),
|
||||
'YEAR(data_richiesta) = '.prepare($data->format('Y')),
|
||||
], $data);
|
||||
} else {
|
||||
$ultimo = Generator::getPreviousFrom($maschera, 'in_interventi', 'codice', [
|
||||
'DATE(data_richiesta) < '.prepare($data->format('Y-m-d')),
|
||||
]);
|
||||
}
|
||||
|
||||
do {
|
||||
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data), $data);
|
||||
|
||||
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
|
||||
return $item->codice == $numero;
|
||||
});
|
||||
|
||||
if ($documenti->count() == $filtered->count()) {
|
||||
return $numero;
|
||||
if (!function_exists('verifica_numero_intervento')) {
|
||||
function verifica_numero_intervento(Intervento $intervento)
|
||||
{
|
||||
if (empty($intervento->codice)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$documenti = $filtered;
|
||||
$ultimo = $numero;
|
||||
} while ($numero != $intervento->codice);
|
||||
$data = $intervento->data_richiesta;
|
||||
$documenti = Intervento::whereDate('data_richiesta', '=', $data->format('Y-m-d'))
|
||||
->get();
|
||||
|
||||
return null;
|
||||
// Recupero maschera per questo segmento
|
||||
$maschera = setting('Formato codice attività');
|
||||
|
||||
if ((strpos($maschera, 'YYYY') == false) or (strpos($maschera, 'yy') == false)) {
|
||||
$ultimo = Generator::getPreviousFrom($maschera, 'in_interventi', 'codice', [
|
||||
'DATE(data_richiesta) < '.prepare($data->format('Y-m-d')),
|
||||
'YEAR(data_richiesta) = '.prepare($data->format('Y')),
|
||||
], $data);
|
||||
} else {
|
||||
$ultimo = Generator::getPreviousFrom($maschera, 'in_interventi', 'codice', [
|
||||
'DATE(data_richiesta) < '.prepare($data->format('Y-m-d')),
|
||||
]);
|
||||
}
|
||||
|
||||
do {
|
||||
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data), $data);
|
||||
|
||||
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
|
||||
return $item->codice == $numero;
|
||||
});
|
||||
|
||||
if ($documenti->count() == $filtered->count()) {
|
||||
return $numero;
|
||||
}
|
||||
|
||||
$documenti = $filtered;
|
||||
$ultimo = $numero;
|
||||
} while ($numero != $intervento->codice);
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -415,7 +415,7 @@ class Sessione extends Model
|
|||
*/
|
||||
public function getRicaricoPercentualeAttribute()
|
||||
{
|
||||
return $this->imponibile ? (($this->imponibile / $this->spesa) - 1) * 100 : 100;
|
||||
return $this->imponibile ? (($this->imponibile / $this->spesa) - 1) * 100 : 0;
|
||||
}
|
||||
|
||||
public function getIvaIndetraibileAttribute()
|
||||
|
|
|
@ -69,9 +69,18 @@ echo '
|
|||
</div>
|
||||
</div>
|
||||
</form>';
|
||||
?>
|
||||
|
||||
echo '
|
||||
<script>
|
||||
$(document).ready(init);
|
||||
content_was_modified = false;
|
||||
</script>';
|
||||
var is_add = <?php echo empty(get('id')) ? '1' : '0'; ?>;
|
||||
|
||||
$(document).ready(function(){
|
||||
init();
|
||||
|
||||
// Inizializzazione prezzo di vendita articolo
|
||||
if (is_add) {
|
||||
$('#prezzo_unitario').val( $('#id_articolo').selectData().prezzo_vendita );
|
||||
}
|
||||
});
|
||||
content_was_modified = false;
|
||||
</script>
|
||||
|
|
|
@ -284,8 +284,8 @@ if (!$block_edit) {
|
|||
if ($dir == 'entrata') {
|
||||
echo '
|
||||
<div class="pull-right">
|
||||
<a class="btn btn-sm btn-info" data-href="'.$structure->fileurl('quantita_impegnate.php').'?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="'.tr('Controllo sulle quantità impegnate').'" onclick="saveForm()">
|
||||
<i class="fa fa-question-circle"></i> '.tr('Verifica disponibilità').'
|
||||
<a class="btn btn-info" data-href="'.$structure->fileurl('quantita_impegnate.php').'?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="'.tr('Controllo sulle quantità impegnate').'" onclick="saveForm()">
|
||||
<i class="fa fa-question-circle"></i> '.tr('Disponibilità').'
|
||||
</a>
|
||||
</div>';
|
||||
}
|
||||
|
|
|
@ -22,92 +22,107 @@ include_once __DIR__.'/../../core.php';
|
|||
use Modules\Interventi\Intervento;
|
||||
use Modules\Ordini\Ordine;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Funzione per generare un nuovo numero per l'ordine.
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_new_numeroordine($data)
|
||||
{
|
||||
global $dir;
|
||||
if (!function_exists('get_new_numeroordine')) {
|
||||
function get_new_numeroordine($data)
|
||||
{
|
||||
global $dir;
|
||||
|
||||
return Ordine::getNextNumero($data, $dir);
|
||||
return Ordine::getNextNumero($data, $dir);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Funzione per calcolare il numero secondario successivo utilizzando la maschera dalle impostazioni.
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_new_numerosecondarioordine($data)
|
||||
{
|
||||
global $dir;
|
||||
global $id_segment;
|
||||
|
||||
return Ordine::getNextNumeroSecondario($data, $dir, $id_segment);
|
||||
if (!function_exists('get_new_numerosecondarioordine')) {
|
||||
function get_new_numerosecondarioordine($data)
|
||||
{
|
||||
global $dir;
|
||||
global $id_segment;
|
||||
|
||||
return Ordine::getNextNumeroSecondario($data, $dir, $id_segment);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo imponibile ordine (totale_righe - sconto).
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_imponibile_ordine($idordine)
|
||||
{
|
||||
$ordine = Ordine::find($idordine);
|
||||
|
||||
return $ordine->imponibile;
|
||||
if (!function_exists('get_imponibile_ordine')) {
|
||||
function get_imponibile_ordine($idordine)
|
||||
{
|
||||
$ordine = Ordine::find($idordine);
|
||||
|
||||
return $ordine->imponibile;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo totale ordine (imponibile + iva).
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_totale_ordine($idordine)
|
||||
{
|
||||
$ordine = Ordine::find($idordine);
|
||||
if (!function_exists('get_totale_ordine')) {
|
||||
function get_totale_ordine($idordine)
|
||||
{
|
||||
$ordine = Ordine::find($idordine);
|
||||
|
||||
return $ordine->totale;
|
||||
return $ordine->totale;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo netto a pagare ordine (totale - ritenute - bolli).
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_netto_ordine($idordine)
|
||||
{
|
||||
$ordine = Ordine::find($idordine);
|
||||
|
||||
return $ordine->netto;
|
||||
if (!function_exists('get_netto_ordine')) {
|
||||
function get_netto_ordine($idordine)
|
||||
{
|
||||
$ordine = Ordine::find($idordine);
|
||||
|
||||
return $ordine->netto;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo iva detraibile ordine.
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_ivadetraibile_ordine($idordine)
|
||||
{
|
||||
$ordine = Ordine::find($idordine);
|
||||
if (!function_exists('get_ivadetraibile_ordine')) {
|
||||
function get_ivadetraibile_ordine($idordine)
|
||||
{
|
||||
$ordine = Ordine::find($idordine);
|
||||
|
||||
return $ordine->iva_detraibile;
|
||||
return $ordine->iva_detraibile;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Calcolo iva indetraibile ordine.
|
||||
*
|
||||
* @deprecated 2.4.5
|
||||
*/
|
||||
function get_ivaindetraibile_ordine($idordine)
|
||||
{
|
||||
$ordine = Ordine::find($idordine);
|
||||
if (!function_exists('get_ivaindetraibile_ordine')) {
|
||||
function get_ivaindetraibile_ordine($idordine)
|
||||
{
|
||||
$ordine = Ordine::find($idordine);
|
||||
|
||||
return $ordine->iva_indetraibile;
|
||||
return $ordine->iva_indetraibile;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Ricalcola i costi aggiuntivi in ordine (rivalsa inps, ritenuta d'acconto, marca da bollo)
|
||||
* Deve essere eseguito ogni volta che si aggiunge o toglie una riga
|
||||
* $idordine int ID del ordine
|
||||
|
@ -115,140 +130,145 @@ function get_ivaindetraibile_ordine($idordine)
|
|||
* $idritenutaacconto int ID della ritenuta d'acconto da applicare. Se omesso viene utilizzata quella impostata di default
|
||||
* $bolli float Costi aggiuntivi delle marche da bollo. Se omesso verrà usata la cifra predefinita.
|
||||
*/
|
||||
function ricalcola_costiagg_ordine($idordine, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
|
||||
{
|
||||
global $dir;
|
||||
if (!function_exists('ricalcola_costiagg_ordine')) {
|
||||
function ricalcola_costiagg_ordine($idordine, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
|
||||
{
|
||||
global $dir;
|
||||
|
||||
$dbo = database();
|
||||
$dbo = database();
|
||||
|
||||
// Se ci sono righe nel ordine faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
|
||||
$query = 'SELECT COUNT(id) AS righe FROM or_righe_ordini WHERE idordine='.prepare($idordine);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
if ($rs[0]['righe'] > 0) {
|
||||
$totale_imponibile = get_imponibile_ordine($idordine);
|
||||
$totale_ordine = get_totale_ordine($idordine);
|
||||
|
||||
// Leggo gli id dei costi aggiuntivi
|
||||
if ($dir == 'uscita') {
|
||||
$query2 = 'SELECT idrivalsainps, idritenutaacconto, bollo FROM or_ordini WHERE id='.prepare($idordine);
|
||||
$rs2 = $dbo->fetchArray($query2);
|
||||
$idrivalsainps = $rs2[0]['idrivalsainps'];
|
||||
$idritenutaacconto = $rs2[0]['idritenutaacconto'];
|
||||
$bollo = $rs2[0]['bollo'];
|
||||
}
|
||||
|
||||
// Leggo la rivalsa inps se c'è (per i ordine di vendita lo leggo dalle impostazioni)
|
||||
if ($dir == 'entrata') {
|
||||
if (!empty($idrivalsainps)) {
|
||||
$idrivalsainps = setting('Cassa previdenziale predefinita');
|
||||
}
|
||||
}
|
||||
|
||||
$query = 'SELECT percentuale FROM co_rivalse WHERE id='.prepare($idrivalsainps);
|
||||
// Se ci sono righe nel ordine faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
|
||||
$query = 'SELECT COUNT(id) AS righe FROM or_righe_ordini WHERE idordine='.prepare($idordine);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$rivalsainps = $totale_imponibile / 100 * $rs[0]['percentuale'];
|
||||
if ($rs[0]['righe'] > 0) {
|
||||
$totale_imponibile = get_imponibile_ordine($idordine);
|
||||
$totale_ordine = get_totale_ordine($idordine);
|
||||
|
||||
// Aggiorno la rivalsa inps
|
||||
$dbo->query("UPDATE or_ordini SET rivalsainps='$rivalsainps' WHERE id=".prepare($idordine));
|
||||
// Leggo gli id dei costi aggiuntivi
|
||||
if ($dir == 'uscita') {
|
||||
$query2 = 'SELECT idrivalsainps, idritenutaacconto, bollo FROM or_ordini WHERE id='.prepare($idordine);
|
||||
$rs2 = $dbo->fetchArray($query2);
|
||||
$idrivalsainps = $rs2[0]['idrivalsainps'];
|
||||
$idritenutaacconto = $rs2[0]['idritenutaacconto'];
|
||||
$bollo = $rs2[0]['bollo'];
|
||||
}
|
||||
|
||||
// Leggo la ritenuta d'acconto se c'è
|
||||
$totale_ordine = get_totale_ordine($idordine);
|
||||
|
||||
// Leggo la rivalsa inps se c'è (per i ordine di vendita lo leggo dalle impostazioni)
|
||||
if (!empty($idritenutaacconto)) {
|
||||
// Leggo la rivalsa inps se c'è (per i ordine di vendita lo leggo dalle impostazioni)
|
||||
if ($dir == 'entrata') {
|
||||
$idritenutaacconto = setting("Ritenuta d'acconto predefinita");
|
||||
}
|
||||
}
|
||||
|
||||
$query = 'SELECT percentuale FROM co_ritenutaacconto WHERE id='.prepare($idritenutaacconto);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$ritenutaacconto = $totale_ordine / 100 * $rs[0]['percentuale'];
|
||||
$netto_a_pagare = $totale_ordine - $ritenutaacconto;
|
||||
|
||||
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
|
||||
$bolli = str_replace(',', '.', $bolli);
|
||||
$bolli = floatval($bolli);
|
||||
if ($dir == 'uscita') {
|
||||
if ($bolli != 0.00) {
|
||||
$bolli = str_replace(',', '.', $bolli);
|
||||
if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) {
|
||||
$marca_da_bollo = str_replace(',', '.', $bolli);
|
||||
} else {
|
||||
$marca_da_bollo = 0.00;
|
||||
if (!empty($idrivalsainps)) {
|
||||
$idrivalsainps = setting('Cassa previdenziale predefinita');
|
||||
}
|
||||
}
|
||||
|
||||
$query = 'SELECT percentuale FROM co_rivalse WHERE id='.prepare($idrivalsainps);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$rivalsainps = $totale_imponibile / 100 * $rs[0]['percentuale'];
|
||||
|
||||
// Aggiorno la rivalsa inps
|
||||
$dbo->query("UPDATE or_ordini SET rivalsainps='$rivalsainps' WHERE id=".prepare($idordine));
|
||||
|
||||
// Leggo la ritenuta d'acconto se c'è
|
||||
$totale_ordine = get_totale_ordine($idordine);
|
||||
|
||||
// Leggo la rivalsa inps se c'è (per i ordine di vendita lo leggo dalle impostazioni)
|
||||
if (!empty($idritenutaacconto)) {
|
||||
if ($dir == 'entrata') {
|
||||
$idritenutaacconto = setting("Ritenuta d'acconto predefinita");
|
||||
}
|
||||
}
|
||||
|
||||
$query = 'SELECT percentuale FROM co_ritenutaacconto WHERE id='.prepare($idritenutaacconto);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$ritenutaacconto = $totale_ordine / 100 * $rs[0]['percentuale'];
|
||||
$netto_a_pagare = $totale_ordine - $ritenutaacconto;
|
||||
|
||||
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
|
||||
$bolli = str_replace(',', '.', $bolli);
|
||||
$bolli = floatval($bolli);
|
||||
if ($dir == 'uscita') {
|
||||
if ($bolli != 0.00) {
|
||||
$bolli = str_replace(',', '.', $bolli);
|
||||
if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) {
|
||||
$marca_da_bollo = str_replace(',', '.', $bolli);
|
||||
} else {
|
||||
$marca_da_bollo = 0.00;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$marca_da_bollo = 0.00;
|
||||
}
|
||||
|
||||
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
|
||||
$qi = 'SELECT percentuale FROM co_iva WHERE id='.prepare(setting('Iva predefinita'));
|
||||
$rsi = $dbo->fetchArray($qi);
|
||||
$iva_rivalsainps = $rivalsainps / 100 * $rsi[0]['percentuale'];
|
||||
|
||||
$dbo->query('UPDATE or_ordini SET ritenutaacconto='.prepare($ritenutaacconto).', bollo='.prepare($marca_da_bollo).', iva_rivalsainps='.prepare($iva_rivalsainps).' WHERE id='.prepare($idordine));
|
||||
} else {
|
||||
$marca_da_bollo = 0.00;
|
||||
$dbo->query("UPDATE or_ordini SET ritenutaacconto='0', bollo='0', rivalsainps='0' WHERE id=".prepare($idordine));
|
||||
}
|
||||
|
||||
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
|
||||
$qi = 'SELECT percentuale FROM co_iva WHERE id='.prepare(setting('Iva predefinita'));
|
||||
$rsi = $dbo->fetchArray($qi);
|
||||
$iva_rivalsainps = $rivalsainps / 100 * $rsi[0]['percentuale'];
|
||||
|
||||
$dbo->query('UPDATE or_ordini SET ritenutaacconto='.prepare($ritenutaacconto).', bollo='.prepare($marca_da_bollo).', iva_rivalsainps='.prepare($iva_rivalsainps).' WHERE id='.prepare($idordine));
|
||||
} else {
|
||||
$dbo->query("UPDATE or_ordini SET ritenutaacconto='0', bollo='0', rivalsainps='0' WHERE id=".prepare($idordine));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Restituisce lo stato dell'ordine in base alle righe.
|
||||
*/
|
||||
function get_stato_ordine($idordine)
|
||||
{
|
||||
$dbo = database();
|
||||
if (!function_exists('get_stato_ordine')) {
|
||||
function get_stato_ordine($idordine)
|
||||
{
|
||||
$dbo = database();
|
||||
|
||||
$rs_ordine = $dbo->fetchArray("SELECT IFNULL(SUM(qta), 0) AS qta FROM or_righe_ordini WHERE idordine='".$idordine."'");
|
||||
$qta_ordine = $rs_ordine[0]['qta'];
|
||||
$rs_ordine = $dbo->fetchArray("SELECT IFNULL(SUM(qta), 0) AS qta FROM or_righe_ordini WHERE idordine='".$idordine."'");
|
||||
$qta_ordine = $rs_ordine[0]['qta'];
|
||||
|
||||
//Righe dell'ordine in ddt
|
||||
$rs_ddt = $dbo->fetchArray('SELECT IFNULL(SUM(qta), 0) AS qta FROM dt_righe_ddt WHERE idordine='.prepare($idordine));
|
||||
$qta_ddt = $rs_ddt[0]['qta'];
|
||||
//Righe dell'ordine in ddt
|
||||
$rs_ddt = $dbo->fetchArray('SELECT IFNULL(SUM(qta), 0) AS qta FROM dt_righe_ddt WHERE idordine='.prepare($idordine));
|
||||
$qta_ddt = $rs_ddt[0]['qta'];
|
||||
|
||||
//Righe dell'ordine in fattura
|
||||
$rs_fattura = $dbo->fetchArray('SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idordine='.prepare($idordine));
|
||||
$qta_fattura = $rs_fattura[0]['qta'];
|
||||
//Righe dell'ordine in fattura
|
||||
$rs_fattura = $dbo->fetchArray('SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idordine='.prepare($idordine));
|
||||
$qta_fattura = $rs_fattura[0]['qta'];
|
||||
|
||||
//Righe dell'ordine in fattura passando da ddt
|
||||
$rs_ddt_fattura = $dbo->fetchArray("SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idddt IN(SELECT DISTINCT idddt FROM dt_righe_ddt WHERE idordine='".$idordine."')");
|
||||
$qta_ddt_fattura = $rs_ddt_fattura[0]['qta'];
|
||||
//Righe dell'ordine in fattura passando da ddt
|
||||
$rs_ddt_fattura = $dbo->fetchArray("SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idddt IN(SELECT DISTINCT idddt FROM dt_righe_ddt WHERE idordine='".$idordine."')");
|
||||
$qta_ddt_fattura = $rs_ddt_fattura[0]['qta'];
|
||||
|
||||
if ($qta_ddt == 0) {
|
||||
$stato = 'Accettato';
|
||||
}
|
||||
if ($qta_fattura == 0) {
|
||||
$stato = 'Accettato';
|
||||
}
|
||||
if ($qta_ddt > 0 && $qta_ddt < $qta_ordine && $qta_ordine > 0) {
|
||||
$stato = 'Parzialmente evaso';
|
||||
}
|
||||
if ($qta_ddt == $qta_ordine && $qta_ordine > 0) {
|
||||
$stato = 'Evaso';
|
||||
}
|
||||
if ($qta_fattura > 0 && $qta_fattura < $qta_ordine && $qta_ordine > 0) {
|
||||
$stato = 'Parzialmente fatturato';
|
||||
}
|
||||
if ($qta_fattura == $qta_ordine && $qta_ordine > 0) {
|
||||
$stato = 'Fatturato';
|
||||
}
|
||||
if ($qta_ddt_fattura > 0 && $qta_ddt_fattura < $qta_ordine && $qta_ordine > 0) {
|
||||
$stato = 'Parzialmente fatturato';
|
||||
}
|
||||
if ($qta_ddt_fattura == $qta_ordine && $qta_ordine > 0) {
|
||||
$stato = 'Fatturato';
|
||||
}
|
||||
if ($qta_ddt == 0) {
|
||||
$stato = 'Accettato';
|
||||
}
|
||||
if ($qta_fattura == 0) {
|
||||
$stato = 'Accettato';
|
||||
}
|
||||
if ($qta_ddt > 0 && $qta_ddt < $qta_ordine && $qta_ordine > 0) {
|
||||
$stato = 'Parzialmente evaso';
|
||||
}
|
||||
if ($qta_ddt == $qta_ordine && $qta_ordine > 0) {
|
||||
$stato = 'Evaso';
|
||||
}
|
||||
if ($qta_fattura > 0 && $qta_fattura < $qta_ordine && $qta_ordine > 0) {
|
||||
$stato = 'Parzialmente fatturato';
|
||||
}
|
||||
if ($qta_fattura == $qta_ordine && $qta_ordine > 0) {
|
||||
$stato = 'Fatturato';
|
||||
}
|
||||
if ($qta_ddt_fattura > 0 && $qta_ddt_fattura < $qta_ordine && $qta_ordine > 0) {
|
||||
$stato = 'Parzialmente fatturato';
|
||||
}
|
||||
if ($qta_ddt_fattura == $qta_ordine && $qta_ordine > 0) {
|
||||
$stato = 'Fatturato';
|
||||
}
|
||||
|
||||
return $stato;
|
||||
return $stato;
|
||||
}
|
||||
}
|
||||
|
||||
function get_totale_interventi_ordine($idordine)
|
||||
{
|
||||
$interventi = Intervento::where('id_ordine', $idordine)->get();
|
||||
$array_interventi = $interventi->toArray();
|
||||
if (!function_exists('get_totale_interventi_ordine')) {
|
||||
function get_totale_interventi_ordine($idordine)
|
||||
{
|
||||
$interventi = Intervento::where('id_ordine', $idordine)->get();
|
||||
$array_interventi = $interventi->toArray();
|
||||
|
||||
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
|
||||
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
|
||||
|
||||
return $totale;
|
||||
return $totale;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
* 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;
|
||||
|
@ -381,8 +380,8 @@ if ($diff > 0) {
|
|||
foreach ($materiali_array1 as $materiali_array2) {
|
||||
foreach ($materiali_array2 as $materiale) {
|
||||
$margine = $materiale['ricavo'] - $materiale['costo'];
|
||||
$margine_prc = (int) (1 - ($materiale['costo'] / $materiale['ricavo'])) * 100;
|
||||
$ricarico_prc = ($materiale['ricavo'] && $materiale['costo']) ? (int) ((($materiale['ricavo'] / $materiale['costo']) - 1) * 100) : 100;
|
||||
$margine_prc = (int) (1 - ($materiale['costo'] / ($materiale['ricavo'] ? $materiale['ricavo'] : 1))) * 100;
|
||||
$ricarico_prc = ($materiale['ricavo'] && $materiale['costo']) ? (int) ((($materiale['ricavo'] / ($materiale['costo'] ? $materiale['costo'] : 1)) - 1) * 100) : 100;
|
||||
echo '
|
||||
<tr>
|
||||
<td>'.Modules::link('Articoli', $materiale['id'], $key).'</td>
|
||||
|
@ -399,9 +398,9 @@ if ($diff > 0) {
|
|||
ksort($materiali_righe);
|
||||
foreach ($materiali_righe as $key => $materiale) {
|
||||
$margine = $materiale['ricavo'] - $materiale['costo'];
|
||||
$margine_prc = (int) (1 - ($materiale['costo'] / $materiale['ricavo'])) * 100;
|
||||
$ricarico_prc = ($materiale['ricavo'] && $materiale['costo']) ? (int) ((($materiale['ricavo'] / $materiale['costo']) - 1) * 100) : 100;
|
||||
echo '
|
||||
$margine_prc = (int) (1 - ($materiale['costo'] / ($materiale['ricavo'] ? $materiale['ricavo'] : 1))) * 100;
|
||||
$ricarico_prc = ($materiale['ricavo'] && $materiale['costo']) ? (int) ((($materiale['ricavo'] / ($materiale['costo'] ? $materiale['costo'] : 1)) - 1) * 100) : 100;
|
||||
echo'
|
||||
<tr>
|
||||
<td>'.$key.'</td>
|
||||
<td class="text-center">'.$materiale['qta'].'</td>
|
||||
|
|
|
@ -213,8 +213,8 @@ foreach ($righe as $riga) {
|
|||
$evasione_bar['in_righe_interventi'] = 'warning';
|
||||
$evasione_bar['or_righe_ordini'] = 'success';
|
||||
foreach ($evasione_bar as $table => $color) {
|
||||
$righe_ev = $dbo->table($table)->where('original_id', $riga->id)->where('original_type', get_class($riga))->get();
|
||||
if ($righe_ev->count() > 0) {
|
||||
$righe_ev = $dbo->table($table)->where('original_id', $riga->id)->where('original_type', get_class($riga))->get();
|
||||
$perc_ev = $righe_ev->sum('qta') * 100 / $riga->qta;
|
||||
if ($perc_ev > 0) {
|
||||
echo '
|
||||
|
|
|
@ -22,39 +22,46 @@ include_once __DIR__.'/../../core.php';
|
|||
use Modules\Interventi\Intervento;
|
||||
use Modules\Preventivi\Preventivo;
|
||||
|
||||
function get_imponibile_preventivo($idpreventivo)
|
||||
{
|
||||
$preventivo = Preventivo::find($idpreventivo);
|
||||
if (!function_exists('get_imponibile_preventivo')) {
|
||||
function get_imponibile_preventivo($idpreventivo)
|
||||
{
|
||||
$preventivo = Preventivo::find($idpreventivo);
|
||||
|
||||
return $preventivo->totale_imponibile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce lo stato del preventivo in base alle righe.
|
||||
*/
|
||||
function get_stato_preventivo($idpreventivo)
|
||||
{
|
||||
$dbo = database();
|
||||
|
||||
$rs = $dbo->fetchArray('SELECT SUM(qta) AS qta, SUM(qta_evasa) AS qta_evasa FROM co_righe_preventivi GROUP BY idpreventivo HAVING idpreventivo='.prepare($idpreventivo));
|
||||
|
||||
if ($rs[0]['qta_evasa'] > 0) {
|
||||
if ($rs[0]['qta'] > $rs[0]['qta_evasa']) {
|
||||
return 'Parzialmente evaso';
|
||||
} elseif ($rs[0]['qta'] == $rs[0]['qta_evasa']) {
|
||||
return 'Evaso';
|
||||
}
|
||||
} else {
|
||||
return 'Non evaso';
|
||||
return $preventivo->totale_imponibile;
|
||||
}
|
||||
}
|
||||
|
||||
function get_totale_interventi_preventivo($idpreventivo)
|
||||
{
|
||||
$interventi = Intervento::where('id_preventivo', $idpreventivo)->get();
|
||||
$array_interventi = $interventi->toArray();
|
||||
/*
|
||||
* Restituisce lo stato del preventivo in base alle righe.
|
||||
*/
|
||||
|
||||
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
|
||||
if (!function_exists('get_stato_preventivo')) {
|
||||
function get_stato_preventivo($idpreventivo)
|
||||
{
|
||||
$dbo = database();
|
||||
|
||||
return $totale;
|
||||
$rs = $dbo->fetchArray('SELECT SUM(qta) AS qta, SUM(qta_evasa) AS qta_evasa FROM co_righe_preventivi GROUP BY idpreventivo HAVING idpreventivo='.prepare($idpreventivo));
|
||||
|
||||
if ($rs[0]['qta_evasa'] > 0) {
|
||||
if ($rs[0]['qta'] > $rs[0]['qta_evasa']) {
|
||||
return 'Parzialmente evaso';
|
||||
} elseif ($rs[0]['qta'] == $rs[0]['qta_evasa']) {
|
||||
return 'Evaso';
|
||||
}
|
||||
} else {
|
||||
return 'Non evaso';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('get_totale_interventi_preventivo')) {
|
||||
function get_totale_interventi_preventivo($idpreventivo)
|
||||
{
|
||||
$interventi = Intervento::where('id_preventivo', $idpreventivo)->get();
|
||||
$array_interventi = $interventi->toArray();
|
||||
|
||||
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
|
||||
|
||||
return $totale;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -434,8 +434,8 @@ echo '
|
|||
|
||||
<tr>
|
||||
<td colspan="'.$colspan.'" class="text-right">
|
||||
'.tr('Ricarico (_PRC_%)', [
|
||||
'_PRC_' => numberFormat($preventivo->ricarico_percentuale),
|
||||
'.tr('Ricarico (_PRC_)', [
|
||||
'_PRC_' => ($preventivo->ricarico_percentuale != 0 ? numberFormat($preventivo->ricarico_percentuale).'%' : 'N.D.'),
|
||||
]).':
|
||||
</td>
|
||||
</tr>';
|
||||
|
|
|
@ -17,10 +17,18 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
$r = $dbo->fetchOne('SELECT *,
|
||||
an_anagrafiche.ragione_sociale, co_preventivi.idanagrafica, an_referenti.nome,
|
||||
IF( (an_referenti.email IS NOT NULL AND an_referenti.email!=""), an_referenti.email, an_anagrafiche.email) AS email
|
||||
FROM co_preventivi INNER JOIN an_anagrafiche ON co_preventivi.idanagrafica=an_anagrafiche.idanagrafica LEFT OUTER JOIN an_referenti ON an_referenti.id=co_preventivi.idreferente WHERE co_preventivi.id='.prepare($id_record));
|
||||
$r = $dbo->fetchOne('SELECT *,
|
||||
co_preventivi.nome as nome_preventivo,
|
||||
an_anagrafiche.ragione_sociale,
|
||||
co_preventivi.idanagrafica,
|
||||
an_referenti.nome as nome_referente,
|
||||
IF((an_referenti.email IS NOT NULL AND an_referenti.email!=""), an_referenti.email, an_anagrafiche.email) AS email
|
||||
FROM
|
||||
co_preventivi
|
||||
INNER JOIN an_anagrafiche ON co_preventivi.idanagrafica=an_anagrafiche.idanagrafica
|
||||
LEFT JOIN an_referenti ON an_referenti.id=co_preventivi.idreferente
|
||||
WHERE
|
||||
co_preventivi.id='.prepare($id_record));
|
||||
|
||||
$revisione = $dbo->fetchNum('SELECT * FROM co_preventivi WHERE master_revision = (SELECT master_revision FROM co_preventivi WHERE id = '.prepare($id_record).') AND id < '.prepare($id_record));
|
||||
|
||||
|
@ -33,5 +41,6 @@ return [
|
|||
'data' => Translator::dateToLocale($r['data_bozza']),
|
||||
'id_anagrafica' => $r['idanagrafica'],
|
||||
'revisione' => $revisione,
|
||||
'nome_referente' => $r['nome'],
|
||||
'nome_referente' => $r['nome_referente'],
|
||||
'nome_preventivo' => $r['nome_preventivo'],
|
||||
];
|
||||
|
|
|
@ -229,13 +229,13 @@ foreach ($scadenze as $i => $scadenza) {
|
|||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td class="text-right"></td>
|
||||
<td class="text-right"></td>
|
||||
<td class="text-right"></td>
|
||||
<td class="text-right"></td>
|
||||
<td class="text-right"></td>
|
||||
<td class="text-right"><b>'.tr('Totale').'</b></td>
|
||||
<td class="text-right" id="totale_utente">'.numberFormat($totale_da_pagare).'</td>
|
||||
<td class="text-right"></td>
|
||||
<td class="text-right"></td>
|
||||
<td class="text-right"></td>
|
||||
<td class="text-right"></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
|
|
|
@ -22,7 +22,7 @@ include_once __DIR__.'/../../core.php';
|
|||
echo '
|
||||
|
||||
<div class="alert alert-warning">
|
||||
<i class="fa fa-warning"></i> <b>'.tr('Attenzione', [], ['upper']).':</b> '.tr('le suddette stampe contabili non sono da considerarsi valide ai fini fiscali').'.
|
||||
<i class="fa fa-warning"></i> <b>'.tr('Attenzione', [], ['upper']).':</b> '.tr('le seguenti stampe contabili possono essere utilizzate per fini fiscali previa verifica delle informazioni inserite nel gestionale.<br/> Rimane esclusiva responsabilità dell\'utente controllare la correttezza dei documenti qui prodotti').'.
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
|
|
@ -19,53 +19,55 @@
|
|||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
function menuSelection($element, $group_id, $depth, $permessi_disponibili)
|
||||
{
|
||||
$dbo = database();
|
||||
++$depth;
|
||||
if (!function_exists('menuSelection')) {
|
||||
function menuSelection($element, $group_id, $depth, $permessi_disponibili)
|
||||
{
|
||||
$dbo = database();
|
||||
++$depth;
|
||||
|
||||
// Permessi impostati per il gruppo
|
||||
$permesso_salvato = $dbo->fetchOne('SELECT permessi FROM zz_permissions WHERE idgruppo = '.prepare($group_id).' AND idmodule = '.prepare($element['id']));
|
||||
// Permessi impostati per il gruppo
|
||||
$permesso_salvato = $dbo->fetchOne('SELECT permessi FROM zz_permissions WHERE idgruppo = '.prepare($group_id).' AND idmodule = '.prepare($element['id']));
|
||||
|
||||
$permessi = $permesso_salvato ? $permesso_salvato['permessi'] : '-';
|
||||
$permessi = $permesso_salvato ? $permesso_salvato['permessi'] : '-';
|
||||
|
||||
$result = '
|
||||
<tr>
|
||||
<td>'.str_repeat(' ', $depth).'<span>'.$element['title'].'</span></td>
|
||||
<td>
|
||||
<select name="permesso_'.$element['id'].'" id="permesso_'.$element['id'].'" class="form-control superselect openstamanager-input select-input" onchange="update_permissions('.$element['id'].', $(this).find(\'option:selected\').val(), $(this).find(\'option:selected\').data(\'color\'))">';
|
||||
$result = '
|
||||
<tr>
|
||||
<td>'.str_repeat(' ', $depth).'<span>'.$element['title'].'</span></td>
|
||||
<td>
|
||||
<select name="permesso_'.$element['id'].'" id="permesso_'.$element['id'].'" class="form-control superselect openstamanager-input select-input" onchange="update_permissions('.$element['id'].', $(this).find(\'option:selected\').val(), $(this).find(\'option:selected\').data(\'color\'))">';
|
||||
|
||||
foreach ($permessi_disponibili as $id => $nome) {
|
||||
switch ($id) {
|
||||
case 'rw':
|
||||
$bgcolor = 'green';
|
||||
break;
|
||||
case 'r':
|
||||
$bgcolor = 'orange';
|
||||
break;
|
||||
case '-':
|
||||
$bgcolor = 'red';
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
foreach ($permessi_disponibili as $id => $nome) {
|
||||
switch ($id) {
|
||||
case 'rw':
|
||||
$bgcolor = 'green';
|
||||
break;
|
||||
case 'r':
|
||||
$bgcolor = 'orange';
|
||||
break;
|
||||
case '-':
|
||||
$bgcolor = 'red';
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
$attr = ($id == $permessi) ? ' selected="selected"' : '';
|
||||
|
||||
$result .= '
|
||||
<option data-color="text-'.$bgcolor.'" _bgcolor_="'.$bgcolor.'" value="'.$id.'" '.$attr.'>'.$nome.'</option>';
|
||||
}
|
||||
$attr = ($id == $permessi) ? ' selected="selected"' : '';
|
||||
|
||||
$result .= '
|
||||
<option data-color="text-'.$bgcolor.'" _bgcolor_="'.$bgcolor.'" value="'.$id.'" '.$attr.'>'.$nome.'</option>';
|
||||
}
|
||||
</select>
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
$result .= '
|
||||
</select>
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
$submenus = $element['all_children'];
|
||||
if (!empty($submenus)) {
|
||||
foreach ($submenus as $submenu) {
|
||||
$result .= menuSelection($submenu, $group_id, $depth, $permessi_disponibili, $perms_names);
|
||||
$submenus = $element['all_children'];
|
||||
if (!empty($submenus)) {
|
||||
foreach ($submenus as $submenu) {
|
||||
$result .= menuSelection($submenu, $group_id, $depth, $permessi_disponibili, $perms_names);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1778,7 +1778,7 @@ class FatturaElettronica
|
|||
{
|
||||
$documento = $fattura->getDocumento();
|
||||
$rappresentante_fiscale = null;
|
||||
|
||||
|
||||
//Fattura per conto terzi, il cliente diventa il cedente al posto della mia Azienda (fornitore)
|
||||
if ($documento['is_fattura_conto_terzi']) {
|
||||
$azienda = $fattura->getCliente();
|
||||
|
|
|
@ -417,7 +417,7 @@ switch (filter('op')) {
|
|||
$codici = $riga['CodiceArticolo'] ?: [];
|
||||
$codici = !empty($codici) && !isset($codici[0]) ? [$codici] : $codici;
|
||||
|
||||
// Ricerca dell'articolo collegato al codice
|
||||
// Ricerca dell'articolo collegato a ogni codice associato alla riga
|
||||
$id_articolo = null;
|
||||
foreach ($codici as $codice) {
|
||||
if (!empty($anagrafica) && empty($id_articolo)) {
|
||||
|
@ -434,6 +434,15 @@ switch (filter('op')) {
|
|||
if (empty($id_articolo)) {
|
||||
$id_articolo = $database->fetchOne('SELECT id FROM mg_articoli WHERE REPLACE(codice, " ", "") = '.prepare($codice['CodiceValore']).' AND deleted_at IS NULL')['id'];
|
||||
}
|
||||
|
||||
// Controllo se esistono articoli con barcode corrispondente al codice
|
||||
if (empty($id_articolo)) {
|
||||
$id_articolo = $database->fetchOne('SELECT id FROM mg_articoli WHERE barcode = '.prepare($codice['CodiceValore']).' AND deleted_at IS NULL')['id'];
|
||||
}
|
||||
|
||||
if (empty($id_articolo)) {
|
||||
$id_articolo = $database->fetchOne('SELECT id FROM mg_articoli WHERE REPLACE(barcode, " ", "") = '.prepare($codice['CodiceValore']).' AND deleted_at IS NULL')['id'];
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($id_articolo)) {
|
||||
|
|
|
@ -2,40 +2,42 @@
|
|||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
function variables($descrizione = '', $inizio = null, $fine = null, $rata = null, $numero_fatture = null)
|
||||
{
|
||||
$mese = [
|
||||
'01' => 'Gennaio',
|
||||
'02' => 'Febbraio',
|
||||
'03' => 'Marzo',
|
||||
'04' => 'Aprile',
|
||||
'05' => 'Maggio',
|
||||
'06' => 'Giugno',
|
||||
'07' => 'Luglio',
|
||||
'08' => 'Agosto',
|
||||
'09' => 'Settembre',
|
||||
'10' => 'Ottobre',
|
||||
'11' => 'Novembre',
|
||||
'12' => 'Dicembre',
|
||||
];
|
||||
if (!function_exists('variables')) {
|
||||
function variables($descrizione = '', $inizio = null, $fine = null, $rata = null, $numero_fatture = null)
|
||||
{
|
||||
$mese = [
|
||||
'01' => 'Gennaio',
|
||||
'02' => 'Febbraio',
|
||||
'03' => 'Marzo',
|
||||
'04' => 'Aprile',
|
||||
'05' => 'Maggio',
|
||||
'06' => 'Giugno',
|
||||
'07' => 'Luglio',
|
||||
'08' => 'Agosto',
|
||||
'09' => 'Settembre',
|
||||
'10' => 'Ottobre',
|
||||
'11' => 'Novembre',
|
||||
'12' => 'Dicembre',
|
||||
];
|
||||
|
||||
$result['list'] = '<ul>
|
||||
<li><code>{periodo}</code></li>
|
||||
<li><code>{data_inizio}</code></li>
|
||||
<li><code>{data_fine}</code></li>
|
||||
<li><code>{mese_fatturazione}</code></li>
|
||||
<li><code>{rata_attuale}</code></li>
|
||||
<li><code>{numero_rate}</code></li>
|
||||
</ul>';
|
||||
$result['list'] = '<ul>
|
||||
<li><code>{periodo}</code></li>
|
||||
<li><code>{data_inizio}</code></li>
|
||||
<li><code>{data_fine}</code></li>
|
||||
<li><code>{mese_fatturazione}</code></li>
|
||||
<li><code>{rata_attuale}</code></li>
|
||||
<li><code>{numero_rate}</code></li>
|
||||
</ul>';
|
||||
|
||||
if (!empty($descrizione)) {
|
||||
$result['descrizione'] = str_replace('{periodo}', 'durata dal '.Translator::dateToLocale($inizio).' al '.Translator::dateToLocale($fine), $descrizione);
|
||||
$result['descrizione'] = str_replace('{data_inizio}', Translator::dateToLocale($inizio), $result['descrizione']);
|
||||
$result['descrizione'] = str_replace('{data_fine}', Translator::dateToLocale($fine), $result['descrizione']);
|
||||
$result['descrizione'] = str_replace('{mese_fatturazione}', $mese[date('m', strtotime($inizio))], $result['descrizione']);
|
||||
$result['descrizione'] = str_replace('{rata_attuale}', $rata, $result['descrizione']);
|
||||
$result['descrizione'] = str_replace('{numero_rate}', $numero_fatture, $result['descrizione']);
|
||||
if (!empty($descrizione)) {
|
||||
$result['descrizione'] = str_replace('{periodo}', 'durata dal '.Translator::dateToLocale($inizio).' al '.Translator::dateToLocale($fine), $descrizione);
|
||||
$result['descrizione'] = str_replace('{data_inizio}', Translator::dateToLocale($inizio), $result['descrizione']);
|
||||
$result['descrizione'] = str_replace('{data_fine}', Translator::dateToLocale($fine), $result['descrizione']);
|
||||
$result['descrizione'] = str_replace('{mese_fatturazione}', $mese[date('m', strtotime($inizio))], $result['descrizione']);
|
||||
$result['descrizione'] = str_replace('{rata_attuale}', $rata, $result['descrizione']);
|
||||
$result['descrizione'] = str_replace('{numero_rate}', $numero_fatture, $result['descrizione']);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ use Plugins\ReceiptFE\Interaction;
|
|||
use Util\XML;
|
||||
|
||||
echo '
|
||||
<p>'.tr('Le ricevute delle Fatture Elettroniche permettono di individuare se una determinata fattura tramessa è stata accettata dal Sistema Di Interscambio').'.</p>';
|
||||
<p>'.tr('Le ricevute delle Fatture Elettroniche permettono di individuare se una determinata fattura trasmessa è stata accettata dal Sistema Di Interscambio').'.</p>';
|
||||
|
||||
if (Interaction::isEnabled()) {
|
||||
echo '
|
||||
|
|
|
@ -44,6 +44,9 @@ switch ($operazione) {
|
|||
'codice_destinatario' => post('codice_destinatario'),
|
||||
'is_automezzo' => post('is_automezzo'),
|
||||
'is_rappresentante_fiscale' => post('is_rappresentante_fiscale'),
|
||||
'targa' => post('targa'),
|
||||
'nome' => post('nome'),
|
||||
'descrizione' => post('descrizione'),
|
||||
]);
|
||||
|
||||
$id_record = $dbo->lastInsertedID();
|
||||
|
@ -65,7 +68,7 @@ switch ($operazione) {
|
|||
} else {
|
||||
flash()->warning(tr('Errore durante aggiunta della sede'));
|
||||
}
|
||||
|
||||
|
||||
$sede = Sede::find($id_record);
|
||||
$sede->save();
|
||||
|
||||
|
@ -97,6 +100,9 @@ switch ($operazione) {
|
|||
'gaddress' => post('gaddress'),
|
||||
'lat' => post('lat'),
|
||||
'lng' => post('lng'),
|
||||
'targa' => post('targa'),
|
||||
'nome' => post('nome'),
|
||||
'descrizione' => post('descrizione'),
|
||||
], ['id' => $id_record]);
|
||||
|
||||
$referenti = $dbo->fetchArray('SELECT id FROM an_referenti WHERE idsede = '.$id_record);
|
||||
|
|
|
@ -97,8 +97,40 @@ echo '
|
|||
<div class="col-md-12">
|
||||
{[ "type": "select", "multiple": "1", "label": "'.tr('Referenti').'", "name": "id_referenti[]", "ajax-source": "referenti", "select-options": {"idanagrafica": '.$id_parent.'}, "icon-after": "add|'.Modules::get('Anagrafiche')['id'].'|id_plugin='.Plugins::get('Referenti')['id'].'&id_parent='.$id_parent.'" ]}
|
||||
</div>
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
$espandi_dettagli = setting('Espandi automaticamente la sezione "Dettagli aggiuntivi"');
|
||||
echo '
|
||||
<!-- DATI AGGIUNTIVI -->
|
||||
<div class="box box-info collapsable '.(empty($espandi_dettagli) ? 'collapsed-box' : '').'">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">'.tr('Dettagli aggiuntivi').'</h3>
|
||||
<div class="box-tools pull-right">
|
||||
<button type="button" class="btn btn-box-tool" data-widget="collapse">
|
||||
<i class="fa fa-'.(empty($espandi_dettagli) ? 'plus' : 'minus').'"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="box-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "text", "label": "'.tr('Nome').'", "name": "nome", "value": "" ]}
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
{[ "type": "text", "label": "'.tr('Targa').'", "name": "targa", "maxlength": 10, "class": "alphanumeric-mask", "value": "" ]}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "descrizione", "value": "" ]}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
<!-- PULSANTI -->
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-right">
|
||||
|
|
|
@ -191,6 +191,37 @@ if (!empty($elementi)) {
|
|||
$disabled = 'disabled';
|
||||
}
|
||||
|
||||
$espandi_dettagli = setting('Espandi automaticamente la sezione "Dettagli aggiuntivi"');
|
||||
echo '
|
||||
<!-- DATI AGGIUNTIVI -->
|
||||
<div class="box box-info collapsable '.(empty($espandi_dettagli) ? 'collapsed-box' : '').'">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">'.tr('Dettagli aggiuntivi').'</h3>
|
||||
<div class="box-tools pull-right">
|
||||
<button type="button" class="btn btn-box-tool" data-widget="collapse">
|
||||
<i class="fa fa-'.(empty($espandi_dettagli) ? 'plus' : 'minus').'"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="box-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "text", "label": "'.tr('Nome').'", "name": "nome", "value": "$nome$" ]}
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
{[ "type": "text", "label": "'.tr('Targa').'", "name": "targa", "maxlength": 10, "class": "alphanumeric-mask", "value": "$targa$" ]}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "descrizione", "value": "$descrizione$" ]}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
<!-- PULSANTI -->
|
||||
<div class="row">
|
||||
|
|
|
@ -361,7 +361,7 @@ abstract class Accounting extends Component
|
|||
*/
|
||||
public function getRicaricoPercentualeAttribute()
|
||||
{
|
||||
return ($this->totale_imponibile && ($this->spesa || $this->provvigione)) ? (($this->totale_imponibile / ($this->spesa + $this->provvigione)) - 1) * 100 : 100;
|
||||
return ($this->totale_imponibile && ($this->spesa || $this->provvigione)) ? (($this->totale_imponibile / ($this->spesa + $this->provvigione)) - 1) * 100 : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -308,7 +308,7 @@ abstract class Article extends Accounting
|
|||
->groupBy('idarticolo')
|
||||
->sum('qta');
|
||||
|
||||
$qta_modifica = $this->attributes['qta']-$this->original['qta'];
|
||||
$qta_modifica = $this->attributes['qta'] - $this->original['qta'];
|
||||
|
||||
//Se la quantità supera la giacenza in sede allora movimento solo quello che resta
|
||||
if (($qta_sede + $qta_finale) < 0 && $qta_sede >= 0) {
|
||||
|
@ -334,7 +334,6 @@ abstract class Article extends Accounting
|
|||
'reference_id' => $documento->id,
|
||||
'idsede' => $id_sede,
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
protected static function boot()
|
||||
|
|
|
@ -246,7 +246,7 @@ abstract class Document extends Model implements ReferenceInterface, DocumentInt
|
|||
*/
|
||||
public function getRicaricoPercentualeAttribute()
|
||||
{
|
||||
return ($this->totale_imponibile && ($this->spesa || $this->provvigione)) ? (($this->totale_imponibile / ($this->spesa + $this->provvigione)) - 1) * 100 : 100;
|
||||
return ($this->totale_imponibile && ($this->spesa || $this->provvigione)) ? (($this->totale_imponibile / ($this->spesa + $this->provvigione)) - 1) * 100 : 0;
|
||||
}
|
||||
|
||||
public function delete()
|
||||
|
|
|
@ -332,6 +332,26 @@ class HTMLBuilder
|
|||
self::$record = $record;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodifica i tag personalizzati e li converte in un array basato sul formato JSON.
|
||||
*
|
||||
* @param string $string
|
||||
* @param string $type
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function decode($string, $type)
|
||||
{
|
||||
$string = '{'.substr($string, strlen(self::$open[$type]), -strlen(self::$close[$type])).'}';
|
||||
|
||||
// Fix per contenuti con newline integrati
|
||||
$string = str_replace(["\n", "\r"], ['\\n', '\\r'], $string);
|
||||
|
||||
$json = (array) json_decode($string, true);
|
||||
|
||||
return $json;
|
||||
}
|
||||
|
||||
/**
|
||||
* Genera il codice HTML per i singoli tag di input.
|
||||
*
|
||||
|
@ -366,26 +386,6 @@ class HTMLBuilder
|
|||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodifica i tag personalizzati e li converte in un array basato sul formato JSON.
|
||||
*
|
||||
* @param string $string
|
||||
* @param string $type
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected static function decode($string, $type)
|
||||
{
|
||||
$string = '{'.substr($string, strlen(self::$open[$type]), -strlen(self::$close[$type])).'}';
|
||||
|
||||
// Fix per contenuti con newline integrati
|
||||
$string = str_replace(["\n", "\r"], ['\\n', '\\r'], $string);
|
||||
|
||||
$json = (array) json_decode($string, true);
|
||||
|
||||
return $json;
|
||||
}
|
||||
|
||||
/**
|
||||
* Elabora l'array contenente le impostazioni del tag per renderlo fruibile alla conversione in HTML (per i tag di input).
|
||||
*
|
||||
|
|
|
@ -206,7 +206,7 @@ class SelectHandler implements HandlerInterface
|
|||
}
|
||||
}
|
||||
|
||||
$element['text'] = empty($element['text']) ? $element['descrizione'] : $element['text'];
|
||||
$element['text'] = ($element['text'] == '' || $element['text'] == null) ? $element['descrizione'] : $element['text'];
|
||||
|
||||
if ($link == 'stampa') {
|
||||
$element['title'] = ' ';
|
||||
|
|
|
@ -82,6 +82,12 @@ class FieldManager implements ManagerInterface
|
|||
|
||||
$field['value'] = isset($field['value']) ? $field['value'] : '';
|
||||
|
||||
//Gestione valori multipli
|
||||
$values = json_decode((string) $field['value'], true);
|
||||
if (is_array($values)) {
|
||||
$field['value'] = implode(',', $values);
|
||||
}
|
||||
|
||||
$replace = [
|
||||
'value' => $field['value'],
|
||||
'label' => $field['name'],
|
||||
|
@ -101,6 +107,10 @@ class FieldManager implements ManagerInterface
|
|||
$result .= '
|
||||
</div>';
|
||||
}
|
||||
|
||||
// Forzatura inizializzazione componente
|
||||
$component = \HTMLBuilder\HTMLBuilder::decode(\Filter::sanitize($field['content']), 'manager');
|
||||
$result .= '<script>$(document).ready( function(){ input("#'.(!empty($component['id']) ? $component['id'] : $component['name']).'").init(); });</script>';
|
||||
}
|
||||
|
||||
if (($key + 1) % 3 != 0) {
|
||||
|
|
|
@ -127,51 +127,97 @@ echo '
|
|||
|
||||
// Righe documento
|
||||
$righe = $documento->getRighe();
|
||||
|
||||
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
|
||||
$riferimenti = [];
|
||||
$id_rif = [];
|
||||
|
||||
foreach ($righe as $riga) {
|
||||
$riferimento = ($riga->getOriginalComponent() ? $riga->getOriginalComponent()->getDocument()->getReference() : null);
|
||||
if (!empty($riferimento)) {
|
||||
if (!array_key_exists($riferimento, $riferimenti)) {
|
||||
$riferimenti[$riferimento] = [];
|
||||
}
|
||||
|
||||
if (!in_array($riga->id, $riferimenti[$riferimento])) {
|
||||
$id_rif[] = $riga->id;
|
||||
$riferimenti[$riferimento][] = $riga->id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($righe as $riga) {
|
||||
$r = $riga->toArray();
|
||||
|
||||
$autofill->count($r['descrizione']);
|
||||
|
||||
echo '
|
||||
<tr>
|
||||
<td>
|
||||
'.nl2br($r['descrizione']);
|
||||
<tr>
|
||||
<td>';
|
||||
$text = '';
|
||||
|
||||
foreach ($riferimenti as $key => $riferimento) {
|
||||
if (in_array($riga->id, $riferimento)) {
|
||||
if ($riga->id === $riferimento[0]) {
|
||||
$riga_ordine = $database->fetchOne('SELECT numero_cliente, data_cliente FROM or_ordini WHERE id = '.prepare($riga->idordine));
|
||||
if (!empty($riga_ordine['numero_cliente']) && !empty($riga_ordine['data_cliente'])) {
|
||||
$text = $text.'<b>Ordine n. '.$riga_ordine['numero_cliente'].' del '.Translator::dateToLocale($riga_ordine['data_cliente']).'</b><br>';
|
||||
}
|
||||
|
||||
$text = '<b>'.$key.'</b><br>';
|
||||
|
||||
if ($options['pricing']) {
|
||||
$text = $text.'<td></td><td></td>';
|
||||
}
|
||||
$text = $text.'</td><td></td></tr><tr><td>';
|
||||
|
||||
echo nl2br($text);
|
||||
}
|
||||
}
|
||||
$r['descrizione'] = str_replace('Rif. '.strtolower($key), '', $r['descrizione']);
|
||||
}
|
||||
|
||||
$source_type = get_class($riga);
|
||||
|
||||
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
|
||||
echo $r['descrizione'];
|
||||
} else {
|
||||
echo nl2br($r['descrizione']);
|
||||
}
|
||||
|
||||
if ($riga->isArticolo()) {
|
||||
// Codice articolo
|
||||
$text = tr('COD. _COD_', [
|
||||
'_COD_' => $riga->codice,
|
||||
]);
|
||||
echo '
|
||||
<br><small>'.$text.'</small>';
|
||||
|
||||
$autofill->count($text, true);
|
||||
echo nl2br('<br><small>'.$riga->codice.'</small>');
|
||||
} else {
|
||||
echo '-';
|
||||
}
|
||||
|
||||
if ($riga->isArticolo()) {
|
||||
// Seriali
|
||||
$seriali = $riga->serials;
|
||||
if (!empty($seriali)) {
|
||||
$text = tr('SN').': '.implode(', ', $seriali);
|
||||
echo '
|
||||
<br><small>'.$text.'</small>';
|
||||
<small>'.$text.'</small>';
|
||||
|
||||
$autofill->count($text, true);
|
||||
}
|
||||
}
|
||||
|
||||
echo '
|
||||
</td>';
|
||||
</td>';
|
||||
|
||||
if (!$riga->isDescrizione()) {
|
||||
echo '
|
||||
<td class="text-center">
|
||||
'.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
|
||||
'.Translator::numberToLocale(abs($riga->qta), $d_qta).' '.$r['um'].'
|
||||
</td>';
|
||||
|
||||
if ($options['pricing']) {
|
||||
// Prezzo unitario
|
||||
echo '
|
||||
<td class="text-right">
|
||||
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario);
|
||||
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario, $d_importi);
|
||||
|
||||
if ($riga->sconto > 0) {
|
||||
$text = discountInfo($riga, false);
|
||||
|
@ -188,7 +234,7 @@ foreach ($righe as $riga) {
|
|||
// Imponibile
|
||||
echo '
|
||||
<td class="text-right">
|
||||
'.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile).'
|
||||
'.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile, $d_importi).'
|
||||
</td>';
|
||||
}
|
||||
} else {
|
||||
|
@ -233,7 +279,7 @@ if ($options['pricing']) {
|
|||
</td>
|
||||
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'</b>
|
||||
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -246,7 +292,7 @@ if ($options['pricing']) {
|
|||
</td>
|
||||
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($sconto, 2).'</b>
|
||||
<b>'.moneyFormat($sconto, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -258,7 +304,7 @@ if ($options['pricing']) {
|
|||
</td>
|
||||
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($totale_imponibile, 2).'</b>
|
||||
<b>'.moneyFormat($totale_imponibile, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
}
|
||||
|
@ -271,7 +317,7 @@ if ($options['pricing']) {
|
|||
</td>
|
||||
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($totale_iva, 2).'</b>
|
||||
<b>'.moneyFormat($totale_iva, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -282,7 +328,7 @@ if ($options['pricing']) {
|
|||
<b>'.tr('Totale documento', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($totale, 2).'</b>
|
||||
<b>'.moneyFormat($totale, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -294,7 +340,7 @@ if ($options['pricing']) {
|
|||
<b>'.tr('Sconto in fattura', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($sconto_finale, 2).'</b>
|
||||
<b>'.moneyFormat($sconto_finale, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -305,7 +351,7 @@ if ($options['pricing']) {
|
|||
<b>'.tr('Netto a pagare', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($netto_a_pagare, 2).'</b>
|
||||
<b>'.moneyFormat($netto_a_pagare, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
}
|
||||
|
|
|
@ -22,6 +22,9 @@ include_once __DIR__.'/../../core.php';
|
|||
use Modules\Contratti\Contratto;
|
||||
|
||||
$documento = Contratto::find($id_record);
|
||||
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
|
||||
$d_importi = (int) setting('Cifre decimali per importi in stampa');
|
||||
$d_totali = (int) setting('Cifre decimali per totali in stampa');
|
||||
|
||||
$id_cliente = $documento['idanagrafica'];
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ include_once __DIR__.'/../../core.php';
|
|||
$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
|
||||
|
||||
// Creazione righe fantasma
|
||||
$autofill = new \Util\Autofill($options['pricing'] ? 7 : 4);
|
||||
$autofill = new \Util\Autofill($options['pricing'] ? 6 : 3);
|
||||
$rows_per_page = 16;
|
||||
if (!empty($options['last-page-footer'])) {
|
||||
$rows_per_page += 10;
|
||||
|
@ -35,7 +35,6 @@ echo "
|
|||
<thead>
|
||||
<tr>
|
||||
<th class='text-center' style='width:5%'>".tr('#', [], ['upper' => true])."</th>
|
||||
<th class='text-center'>".tr('Cod.', [], ['upper' => true])."</th>
|
||||
<th class='text-center'>".tr('Descrizione', [], ['upper' => true])."</th>
|
||||
<th class='text-center'>".tr('Q.tà', [], ['upper' => true]).'</th>';
|
||||
|
||||
|
@ -55,6 +54,26 @@ if ($options['pricing']) {
|
|||
// Righe documento
|
||||
$righe = $documento->getRighe();
|
||||
$num = 0;
|
||||
|
||||
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
|
||||
$riferimenti = [];
|
||||
$id_rif = [];
|
||||
|
||||
foreach ($righe as $riga) {
|
||||
$riferimento = ($riga->getOriginalComponent() ? $riga->getOriginalComponent()->getDocument()->getReference() : null);
|
||||
if (!empty($riferimento)) {
|
||||
if (!array_key_exists($riferimento, $riferimenti)) {
|
||||
$riferimenti[$riferimento] = [];
|
||||
}
|
||||
|
||||
if (!in_array($riga->id, $riferimenti[$riferimento])) {
|
||||
$id_rif[] = $riga->id;
|
||||
$riferimenti[$riferimento][] = $riga->id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($righe as $riga) {
|
||||
++$num;
|
||||
$r = $riga->toArray();
|
||||
|
@ -63,88 +82,85 @@ foreach ($righe as $riga) {
|
|||
|
||||
echo '
|
||||
<tr>
|
||||
<td class="text-center" style="vertical-align: middle">
|
||||
'.$num.'
|
||||
</td>
|
||||
<td class="text-center" style="vertical-align: middle">';
|
||||
|
||||
<td class="text-center" nowrap="nowrap" style="vertical-align: middle">';
|
||||
$text = '';
|
||||
|
||||
foreach ($riferimenti as $key => $riferimento) {
|
||||
if (in_array($riga->id, $riferimento)) {
|
||||
if ($riga->id === $riferimento[0]) {
|
||||
$riga_ordine = $database->fetchOne('SELECT numero_cliente, data_cliente FROM or_ordini WHERE id = '.prepare($riga->idordine));
|
||||
if (!empty($riga_ordine['numero_cliente']) && !empty($riga_ordine['data_cliente'])) {
|
||||
$text = $text.'<b>Ordine n. '.$riga_ordine['numero_cliente'].' del '.Translator::dateToLocale($riga_ordine['data_cliente']).'</b><br>';
|
||||
}
|
||||
$r['descrizione'] = str_replace('Rif. '.strtolower($key), '', $r['descrizione']);
|
||||
preg_match("/Rif\.(.*)/s", $r['descrizione'], $rif2);
|
||||
$r['descrizione'] = str_replace('Rif.'.strtolower($rif2[1]), '', $r['descrizione']);
|
||||
if (!empty($rif2)) {
|
||||
$text .= '<b>'.$rif2[0].'</b>';
|
||||
}
|
||||
$text .= '<b>'.$key.'</b>';
|
||||
|
||||
if ($options['pricing']) {
|
||||
$text .= '</td><td></td><td></td><td>';
|
||||
}
|
||||
$text .= '</td><td></td></tr><tr><td class="text-center" nowrap="nowrap" style="vertical-align: middle">';
|
||||
|
||||
echo '
|
||||
</td>
|
||||
|
||||
<td>
|
||||
'.nl2br($text);
|
||||
}
|
||||
}
|
||||
$r['descrizione'] = preg_replace("/Rif\.(.*)/s", '', $r['descrizione']);
|
||||
$autofill->count($r['descrizione']);
|
||||
}
|
||||
|
||||
$source_type = get_class($riga);
|
||||
|
||||
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
|
||||
echo $num.'
|
||||
</td>
|
||||
<td>'.$r['descrizione'];
|
||||
} else {
|
||||
echo $num.'
|
||||
</td>
|
||||
<td>'.nl2br($r['descrizione']);
|
||||
}
|
||||
|
||||
if ($riga->isArticolo()) {
|
||||
echo $riga->codice;
|
||||
echo '<br><small>'.$riga->codice.'</small>';
|
||||
} else {
|
||||
echo '-';
|
||||
}
|
||||
|
||||
echo '
|
||||
</td>
|
||||
|
||||
<td>
|
||||
'.nl2br($r['descrizione']);
|
||||
|
||||
//Riferimenti ordini/ddt righe
|
||||
if ($riga->referenceTargets()->count()) {
|
||||
$source = $source_type::find($riga->id);
|
||||
$riferimenti = $source->referenceTargets;
|
||||
|
||||
foreach ($riferimenti as $riferimento) {
|
||||
$documento_riferimento = $riferimento->target->getDocument();
|
||||
echo '
|
||||
<br><small>'.$riferimento->target->descrizione.'<br>'.tr('Rif. _DOCUMENT_', [
|
||||
'_DOCUMENT_' => strtolower($documento_riferimento->getReference()),
|
||||
]).'</small>';
|
||||
}
|
||||
}
|
||||
|
||||
if ($riga->isArticolo()) {
|
||||
// Codice articolo
|
||||
$text = tr('COD. _COD_', [
|
||||
'_COD_' => $riga->codice,
|
||||
]);
|
||||
echo '
|
||||
<br><small>'.$text.'</small>';
|
||||
|
||||
$autofill->count($text, true);
|
||||
|
||||
// Seriali
|
||||
$seriali = $riga->serials;
|
||||
if (!empty($seriali)) {
|
||||
$text = tr('SN').': '.implode(', ', $seriali);
|
||||
echo '
|
||||
<br><small>'.$text.'</small>';
|
||||
<small>'.$text.'</small>';
|
||||
|
||||
$autofill->count($text, true);
|
||||
}
|
||||
}
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
/*
|
||||
if (setting('Riferimento dei documenti nelle stampe') && $riga->hasOriginal()) {
|
||||
$ref = $riga->getOriginal()->getDocument()->getReference();
|
||||
|
||||
if (!empty($ref)) {
|
||||
echo '
|
||||
<br><small>'.$ref.'</small>';
|
||||
|
||||
$autofill->count($ref, true);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
echo '
|
||||
</td>';
|
||||
|
||||
if (!$riga->isDescrizione()) {
|
||||
echo '
|
||||
<td class="text-center" nowrap="nowrap">
|
||||
'.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
|
||||
'.Translator::numberToLocale(abs($riga->qta), $d_qta).' '.$r['um'].'
|
||||
</td>';
|
||||
|
||||
if ($options['pricing']) {
|
||||
// Prezzo unitario
|
||||
echo '
|
||||
<td class="text-right" nowrap="nowrap">
|
||||
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario);
|
||||
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario, $d_importi);
|
||||
|
||||
if ($riga->sconto > 0) {
|
||||
$text = discountInfo($riga, false);
|
||||
|
@ -161,13 +177,13 @@ foreach ($righe as $riga) {
|
|||
// Imponibile
|
||||
echo '
|
||||
<td class="text-right" nowrap="nowrap">
|
||||
'.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile).'
|
||||
'.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile, $d_importi).'
|
||||
</td>';
|
||||
|
||||
// Iva
|
||||
echo '
|
||||
<td class="text-center" nowrap="nowrap">
|
||||
'.Translator::numberToLocale($riga->aliquota->percentuale, 2).'
|
||||
'.Translator::numberToLocale($riga->aliquota->percentuale, $d_importi).'
|
||||
</td>';
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -54,7 +54,7 @@ if ($options['pricing']) {
|
|||
echo "
|
||||
<tr>
|
||||
<td class='cell-padded text-right'>
|
||||
".moneyFormat($totale_imponibile, 2).'
|
||||
".moneyFormat($totale_imponibile, $d_totali).'
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
|
@ -68,7 +68,7 @@ if ($options['pricing']) {
|
|||
|
||||
<tr>
|
||||
<td class='cell-padded text-right'>
|
||||
".moneyFormat($totale_iva, 2).'
|
||||
".moneyFormat($totale_iva, $d_totali).'
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
|
@ -82,7 +82,7 @@ if ($options['pricing']) {
|
|||
|
||||
<tr>
|
||||
<td class='cell-padded text-right'>
|
||||
".moneyFormat($totale, 2).'
|
||||
".moneyFormat($totale, $d_totali).'
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
|
@ -97,7 +97,7 @@ if ($options['pricing']) {
|
|||
|
||||
<tr>
|
||||
<td class='cell-padded text-right'>
|
||||
".moneyFormat($sconto_finale, 2).'
|
||||
".moneyFormat($sconto_finale, $d_totali).'
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
|
@ -111,7 +111,7 @@ if ($options['pricing']) {
|
|||
|
||||
<tr>
|
||||
<td class='cell-padded text-right'>
|
||||
".moneyFormat($netto_a_pagare, 2).'
|
||||
".moneyFormat($netto_a_pagare, $d_totali).'
|
||||
</td>
|
||||
</tr>';
|
||||
}
|
||||
|
|
|
@ -22,6 +22,9 @@ include_once __DIR__.'/../../core.php';
|
|||
use Modules\DDT\DDT;
|
||||
|
||||
$documento = DDT::find($id_record);
|
||||
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
|
||||
$d_importi = (int) setting('Cifre decimali per importi in stampa');
|
||||
$d_totali = (int) setting('Cifre decimali per totali in stampa');
|
||||
|
||||
$id_cliente = $documento['idanagrafica'];
|
||||
$id_sede = $record['idsede_partenza'];
|
||||
|
|
|
@ -17,8 +17,6 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
use Modules\Interventi\Intervento;
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
$v_iva = [];
|
||||
|
@ -53,6 +51,26 @@ echo "
|
|||
// Righe documento
|
||||
$righe = $documento->getRighe();
|
||||
$num = 0;
|
||||
|
||||
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
|
||||
$riferimenti = [];
|
||||
$id_rif = [];
|
||||
|
||||
foreach ($righe as $riga) {
|
||||
$riferimento = ($riga->getOriginalComponent() ? $riga->getOriginalComponent()->getDocument()->getReference() : null);
|
||||
if (!empty($riferimento)) {
|
||||
if (!array_key_exists($riferimento, $riferimenti)) {
|
||||
$riferimenti[$riferimento] = [];
|
||||
}
|
||||
|
||||
if (!in_array($riga->id, $riferimenti[$riferimento])) {
|
||||
$id_rif[] = $riga->id;
|
||||
$riferimenti[$riferimento][] = $riga->id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($righe as $riga) {
|
||||
++$num;
|
||||
$r = $riga->toArray();
|
||||
|
@ -62,90 +80,67 @@ foreach ($righe as $riga) {
|
|||
$v_iva[$r['desc_iva']] = sum($v_iva[$r['desc_iva']], $riga->iva);
|
||||
$v_totale[$r['desc_iva']] = sum($v_totale[$r['desc_iva']], $riga->totale_imponibile);
|
||||
|
||||
// Descrizione della riga
|
||||
$descrizione = $riga->descrizione;
|
||||
echo '
|
||||
<tr>
|
||||
<td class="text-center" style="vertical-align: middle">';
|
||||
|
||||
// Aggiunta riferimento più profondo per DDT attraverso Interventi
|
||||
if ($riga->hasOriginalComponent() && $riga->original_document_type == Intervento::class) {
|
||||
$riga_origine = $riga->getOriginalComponent();
|
||||
$text = '';
|
||||
|
||||
if ($riga_origine->hasOriginalComponent()) {
|
||||
$riferimento = $riga_origine->getOriginalComponent()
|
||||
->getDocument()->getReference();
|
||||
foreach ($riferimenti as $key => $riferimento) {
|
||||
if (in_array($riga->id, $riferimento)) {
|
||||
if ($riga->id === $riferimento[0]) {
|
||||
$riga_ordine = $database->fetchOne('SELECT numero_cliente, data_cliente FROM or_ordini WHERE id = '.prepare($riga->idordine));
|
||||
if (!empty($riga_ordine['numero_cliente']) && !empty($riga_ordine['data_cliente'])) {
|
||||
$text = $text.'<b>Ordine n. '.$riga_ordine['numero_cliente'].' del '.Translator::dateToLocale($riga_ordine['data_cliente']).'</b><br>';
|
||||
}
|
||||
$r['descrizione'] = str_replace('Rif. '.strtolower($key), '', $r['descrizione']);
|
||||
preg_match("/Rif\.(.*)/s", $r['descrizione'], $rif2);
|
||||
$r['descrizione'] = str_replace('Rif.'.strtolower($rif2[1]), '', $r['descrizione']);
|
||||
if (!empty($rif2)) {
|
||||
$text .= '<b>'.$rif2[0].'</b>';
|
||||
}
|
||||
$text .= '<b>'.$key.'</b></td><td></td><td></td><td></td><td></td></tr><tr><td class="text-center" nowrap="nowrap" style="vertical-align: middle">';
|
||||
|
||||
$descrizione .= "\n".tr('Rif. _DOCUMENT_', [
|
||||
'_DOCUMENT_' => strtolower($riferimento),
|
||||
]);
|
||||
echo '
|
||||
</td>
|
||||
|
||||
<td>
|
||||
'.nl2br($text);
|
||||
}
|
||||
}
|
||||
$r['descrizione'] = preg_replace("/Rif\.(.*)/s", '', $r['descrizione']);
|
||||
$autofill->count($r['descrizione']);
|
||||
}
|
||||
|
||||
echo '
|
||||
<tr>';
|
||||
|
||||
echo '
|
||||
<td class="text-center" style="vertical-align: middle">
|
||||
'.$num.'
|
||||
</td>';
|
||||
|
||||
echo '
|
||||
<td>
|
||||
'.nl2br(strip_tags($descrizione));
|
||||
$source_type = get_class($riga);
|
||||
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
|
||||
echo $num.'
|
||||
</td>
|
||||
<td>'.$r['descrizione'];
|
||||
} else {
|
||||
echo $num.'
|
||||
</td>
|
||||
<td>'.nl2br($r['descrizione']);
|
||||
}
|
||||
|
||||
if ($riga->isArticolo()) {
|
||||
// Codice articolo
|
||||
$text = tr('COD. _COD_', [
|
||||
'_COD_' => $riga->codice,
|
||||
]);
|
||||
echo '
|
||||
<br><small>'.$text.'</small>';
|
||||
|
||||
$autofill->count($text, true);
|
||||
echo '<br><small>'.$riga->codice.'</small>';
|
||||
} else {
|
||||
echo '-';
|
||||
}
|
||||
|
||||
if ($riga->isArticolo()) {
|
||||
// Seriali
|
||||
$seriali = $riga->serials;
|
||||
if (!empty($seriali)) {
|
||||
$text = tr('SN').': '.implode(', ', $seriali);
|
||||
echo '
|
||||
<br><small>'.$text.'</small>';
|
||||
<small>'.$text.'</small>';
|
||||
|
||||
$autofill->count($text, true);
|
||||
}
|
||||
}
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
if (!empty($record['ref_documento'])) {
|
||||
$data = $dbo->fetchArray("SELECT IF(numero_esterno != '', numero_esterno, numero) AS numero, data FROM co_documenti WHERE id = ".prepare($record['ref_documento']));
|
||||
|
||||
$text = tr('Rif. fattura _NUM_ del _DATE_', [
|
||||
'_NUM_' => $data[0]['numero'],
|
||||
'_DATE_' => Translator::dateToLocale($data[0]['data']),
|
||||
]);
|
||||
|
||||
echo '
|
||||
<br><small>'.$text.'</small>';
|
||||
|
||||
$autofill->count($text, true);
|
||||
}
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
/*
|
||||
if (setting('Riferimento dei documenti nelle stampe') && $riga->hasOriginal()) {
|
||||
$ref = $riga->getOriginal()->getDcocument()->getReference();
|
||||
if (!empty($riga->getOriginal()->getDcocument()->numero_cliente)) {
|
||||
$ref .= '<br>'.tr('_DOC_ num. _NUM_ del _DATE_', [
|
||||
'_DOC_' => 'Rif. Vs. ordine cliente',
|
||||
'_NUM_' => $riga->getOriginalComponent()->getDocument()->numero_cliente,
|
||||
'_DATE_' => dateFormat($riga->getOriginalComponent()->getDocument()->data_cliente),
|
||||
]);
|
||||
}
|
||||
if (!empty($ref)) {
|
||||
echo '
|
||||
<br><small>'.$ref.'</small>';
|
||||
|
||||
$autofill->count($ref, true);
|
||||
}
|
||||
}*/
|
||||
|
||||
// Informazioni su CIG, CUP, ...
|
||||
if ($riga->hasOriginalComponent()) {
|
||||
$documento_originale = $riga->getOriginalComponent()->getDocument();
|
||||
|
@ -169,18 +164,18 @@ foreach ($righe as $riga) {
|
|||
}
|
||||
|
||||
echo '
|
||||
</td>';
|
||||
</td>';
|
||||
|
||||
if (!$riga->isDescrizione()) {
|
||||
echo '
|
||||
<td class="text-center">
|
||||
'.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
|
||||
'.Translator::numberToLocale(abs($riga->qta), $d_qta).' '.$r['um'].'
|
||||
</td>';
|
||||
|
||||
// Prezzo unitario
|
||||
echo '
|
||||
<td class="text-right">
|
||||
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario);
|
||||
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario, $d_importi);
|
||||
|
||||
if ($riga->sconto > 0) {
|
||||
$text = discountInfo($riga, false);
|
||||
|
@ -197,13 +192,13 @@ foreach ($righe as $riga) {
|
|||
// Imponibile
|
||||
echo '
|
||||
<td class="text-right">
|
||||
'.moneyFormat($prezzi_ivati ? ($riga->totale_imponibile + $riga->iva) : $riga->totale_imponibile).'
|
||||
'.moneyFormat($prezzi_ivati ? ($riga->totale_imponibile + $riga->iva) : $riga->totale_imponibile, $d_importi).'
|
||||
</td>';
|
||||
|
||||
// Iva
|
||||
echo '
|
||||
<td class="text-center">
|
||||
'.Translator::numberToLocale($riga->aliquota->percentuale, 2).'
|
||||
'.Translator::numberToLocale($riga->aliquota->percentuale, $d_qta).'
|
||||
</td>';
|
||||
} else {
|
||||
echo '
|
||||
|
|
|
@ -83,7 +83,7 @@ if (!empty($rs2)) {
|
|||
".(($rs2[$i]['pagato'] == $rs2[$i]['da_pagare']) ? '<small>PAGATO</small>' : '')."
|
||||
</td>
|
||||
<td style='width:15%;' class='text-right'>
|
||||
<small>".moneyFormat($rs2[$i]['da_pagare'], 2).'</small>
|
||||
<small>".moneyFormat($rs2[$i]['da_pagare'], $d_totali).'</small>
|
||||
</td>
|
||||
<td style=\'width:15%;\'>
|
||||
<small>'.$pagamento.'</small>
|
||||
|
@ -130,11 +130,11 @@ if (!empty($v_iva)) {
|
|||
</td>
|
||||
|
||||
<td class='text-right'>
|
||||
<small>".moneyFormat($v_totale[$desc_iva], 2)."</small>
|
||||
<small>".moneyFormat($v_totale[$desc_iva], $d_totali)."</small>
|
||||
</td>
|
||||
|
||||
<td class='text-right'>
|
||||
<small>".moneyFormat($v_iva[$desc_iva], 2).'</small>
|
||||
<small>".moneyFormat($v_iva[$desc_iva], $d_totali).'</small>
|
||||
</td>
|
||||
</tr>';
|
||||
}
|
||||
|
@ -190,28 +190,28 @@ echo "
|
|||
|
||||
<tr>
|
||||
<td class='cell-padded text-center'>
|
||||
".moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'
|
||||
".moneyFormat($show_sconto ? $imponibile : $totale_imponibile, $d_totali).'
|
||||
</td>';
|
||||
|
||||
if ($show_sconto) {
|
||||
echo "
|
||||
|
||||
<td class='cell-padded text-center'>
|
||||
".moneyFormat(abs($sconto), 2)."
|
||||
".moneyFormat(abs($sconto), $d_totali)."
|
||||
</td>
|
||||
|
||||
<td class='cell-padded text-center'>
|
||||
".moneyFormat($totale_imponibile, 2).'
|
||||
".moneyFormat($totale_imponibile, $d_totali).'
|
||||
</td>';
|
||||
}
|
||||
|
||||
echo "
|
||||
<td class='cell-padded text-center'>
|
||||
".moneyFormat($totale_iva, 2)."
|
||||
".moneyFormat($totale_iva, $d_totali)."
|
||||
</td>
|
||||
|
||||
<td class='cell-padded text-center'>
|
||||
".moneyFormat($totale, 2).'
|
||||
".moneyFormat($totale, $d_totali).'
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
|
|
|
@ -23,6 +23,9 @@ use Modules\Fatture\Fattura;
|
|||
|
||||
$documento = Fattura::find($id_record);
|
||||
$banca = $documento->getBanca();
|
||||
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
|
||||
$d_importi = (int) setting('Cifre decimali per importi in stampa');
|
||||
$d_totali = (int) setting('Cifre decimali per totali in stampa');
|
||||
|
||||
// Lettura info fattura
|
||||
$record = $dbo->fetchOne('SELECT *,
|
||||
|
|
|
@ -21,6 +21,10 @@ use Carbon\Carbon;
|
|||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
|
||||
$d_importi = (int) setting('Cifre decimali per importi in stampa');
|
||||
$d_totali = (int) setting('Cifre decimali per totali in stampa');
|
||||
|
||||
/*
|
||||
Dati intervento
|
||||
*/
|
||||
|
@ -147,6 +151,25 @@ echo '
|
|||
|
||||
$righe = $documento->getRighe();
|
||||
|
||||
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
|
||||
$riferimenti = [];
|
||||
$id_rif = [];
|
||||
|
||||
foreach ($righe as $riga) {
|
||||
$riferimento = ($riga->getOriginalComponent() ? $riga->getOriginalComponent()->getDocument()->getReference() : null);
|
||||
if (!empty($riferimento)) {
|
||||
if (!array_key_exists($riferimento, $riferimenti)) {
|
||||
$riferimenti[$riferimento] = [];
|
||||
}
|
||||
|
||||
if (!in_array($riga->id, $riferimenti[$riferimento])) {
|
||||
$id_rif[] = $riga->id;
|
||||
$riferimenti[$riferimento][] = $riga->id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$righe->isEmpty()) {
|
||||
echo '
|
||||
<table class="table table-bordered">
|
||||
|
@ -183,36 +206,60 @@ if (!$righe->isEmpty()) {
|
|||
if ($riga->um == 'ore') {
|
||||
$qta = Translator::numberToHours($riga->qta);
|
||||
} else {
|
||||
$qta = Translator::numberToLocale($riga->qta, 'qta');
|
||||
$qta = Translator::numberToLocale($riga->qta, $d_qta);
|
||||
}
|
||||
} else {
|
||||
$qta = Translator::numberToLocale($riga->qta, 'qta');
|
||||
$qta = Translator::numberToLocale($riga->qta, $d_qta);
|
||||
}
|
||||
// Articolo
|
||||
echo '
|
||||
<tr>
|
||||
<td>
|
||||
'.nl2br(strip_tags($riga->descrizione));
|
||||
<tr>
|
||||
<td>';
|
||||
$text = '';
|
||||
|
||||
foreach ($riferimenti as $key => $riferimento) {
|
||||
if (in_array($riga->id, $riferimento)) {
|
||||
if ($riga->id === $riferimento[0]) {
|
||||
$riga_ordine = $riga->getOriginalComponent()->getDocument();
|
||||
$text = '<b>'.$key.'</b><br>';
|
||||
|
||||
if ($options['pricing']) {
|
||||
$text = $text.'</td><td></td><td>';
|
||||
}
|
||||
$text = $text.'</td><td></td></tr><tr><td>';
|
||||
|
||||
echo nl2br($text);
|
||||
}
|
||||
}
|
||||
$riga['descrizione'] = str_replace('Rif. '.strtolower($key), '', $riga['descrizione']);
|
||||
}
|
||||
|
||||
$source_type = get_class($riga);
|
||||
|
||||
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
|
||||
echo $riga['descrizione'];
|
||||
} else {
|
||||
echo nl2br($riga['descrizione']);
|
||||
}
|
||||
|
||||
if ($riga->isArticolo()) {
|
||||
// Codice articolo
|
||||
$text = tr('COD. _COD_', [
|
||||
'_COD_' => $riga->codice,
|
||||
]);
|
||||
echo '
|
||||
<br><small>'.$text.'</small>';
|
||||
echo nl2br('<br><small>'.$riga->codice.'</small>');
|
||||
}
|
||||
|
||||
if ($riga->isArticolo()) {
|
||||
// Seriali
|
||||
$seriali = $riga->serials;
|
||||
if (!empty($seriali)) {
|
||||
$text = tr('SN').': '.implode(', ', $seriali);
|
||||
echo '
|
||||
<br><small>'.$text.'</small>';
|
||||
<small>'.$text.'</small>';
|
||||
|
||||
$autofill->count($text, true);
|
||||
}
|
||||
}
|
||||
|
||||
echo '
|
||||
</td>';
|
||||
</td>';
|
||||
|
||||
// Quantità
|
||||
echo '
|
||||
|
@ -223,7 +270,7 @@ if (!$righe->isEmpty()) {
|
|||
// Prezzo unitario
|
||||
echo '
|
||||
<td class="text-center">
|
||||
'.($options['pricing'] ? moneyFormat($riga->prezzo_unitario_corrente) : '-');
|
||||
'.($options['pricing'] ? moneyFormat($riga->prezzo_unitario_corrente, $d_importi) : '-');
|
||||
|
||||
if ($options['pricing'] && $riga->sconto > 0) {
|
||||
$text = discountInfo($riga, false);
|
||||
|
@ -238,7 +285,7 @@ if (!$righe->isEmpty()) {
|
|||
// Prezzo totale
|
||||
echo '
|
||||
<td class="text-center">
|
||||
'.($options['pricing'] ? Translator::numberToLocale($riga->importo) : '-').'
|
||||
'.($options['pricing'] ? Translator::numberToLocale($riga->importo, $d_importi) : '-').'
|
||||
</td>
|
||||
</tr>';
|
||||
}
|
||||
|
@ -255,7 +302,7 @@ if (!$righe->isEmpty()) {
|
|||
</td>
|
||||
|
||||
<th class="text-center">
|
||||
<b>'.moneyFormat($righe->sum('importo'), 2).'</b>
|
||||
<b>'.moneyFormat($righe->sum('importo'), $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
}
|
||||
|
@ -335,7 +382,7 @@ foreach ($sessioni as $i => $sessione) {
|
|||
if (setting('Formato ore in stampa') == 'Sessantesimi') {
|
||||
$ore_totali = Translator::numberToHours($documento->ore_totali);
|
||||
} else {
|
||||
$ore_totali = Translator::numberToLocale($documento->ore_totali, 2);
|
||||
$ore_totali = Translator::numberToLocale($documento->ore_totali, $d_totali);
|
||||
}
|
||||
|
||||
echo '
|
||||
|
@ -348,7 +395,7 @@ echo '
|
|||
if ($options['pricing']) {
|
||||
echo '
|
||||
<td colspan="3" class="text-center">
|
||||
<small>'.tr('Totale manodopera').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_manodopera'), 2).'</b>
|
||||
<small>'.tr('Totale manodopera').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_manodopera'), $d_totali).'</b>
|
||||
</td>';
|
||||
} else {
|
||||
echo '
|
||||
|
@ -376,14 +423,14 @@ echo '
|
|||
echo '
|
||||
<tr>
|
||||
<td class="text-center">
|
||||
<small>'.tr('Km percorsi').':</small><br/><b>'.Translator::numberToLocale($documento->km_totali, 2).'</b>
|
||||
<small>'.tr('Km percorsi').':</small><br/><b>'.Translator::numberToLocale($documento->km_totali, $d_qta).'</b>
|
||||
</td>';
|
||||
|
||||
// Costo trasferta
|
||||
if ($options['pricing']) {
|
||||
echo '
|
||||
<td class="text-center">
|
||||
<small>'.tr('Costi di trasferta').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_viaggio'), 2).'</b>
|
||||
<small>'.tr('Costi di trasferta').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_viaggio'), $d_totali).'</b>
|
||||
</td>';
|
||||
} else {
|
||||
echo '
|
||||
|
@ -394,7 +441,7 @@ if ($options['pricing']) {
|
|||
if ($options['pricing']) {
|
||||
echo '
|
||||
<td class="text-center" colspan="2" width="120px" >
|
||||
<small>'.tr('Diritto di chiamata').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_diritto_chiamata'), 2).'</b>
|
||||
<small>'.tr('Diritto di chiamata').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_diritto_chiamata'), $d_totali).'</b>
|
||||
</td>';
|
||||
} else {
|
||||
echo '
|
||||
|
@ -421,7 +468,7 @@ if ($options['pricing']) {
|
|||
</td>
|
||||
|
||||
<th class="text-center">
|
||||
'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'
|
||||
'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, $d_totali).'
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -434,7 +481,7 @@ if ($options['pricing']) {
|
|||
</td>
|
||||
|
||||
<th class="text-center">
|
||||
<b>'.moneyFormat($sconto, 2).'</b>
|
||||
<b>'.moneyFormat($sconto, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -446,7 +493,7 @@ if ($options['pricing']) {
|
|||
</td>
|
||||
|
||||
<th class="text-center">
|
||||
<b>'.moneyFormat($totale_imponibile, 2).'</b>
|
||||
<b>'.moneyFormat($totale_imponibile, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
}
|
||||
|
@ -460,7 +507,7 @@ if ($options['pricing']) {
|
|||
</td>
|
||||
|
||||
<th class="text-center">
|
||||
<b>'.moneyFormat($totale_iva, 2).'</b>
|
||||
<b>'.moneyFormat($totale_iva, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -471,7 +518,7 @@ if ($options['pricing']) {
|
|||
<b>'.tr('Totale intervento', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th class="text-center">
|
||||
<b>'.moneyFormat($totale, 2).'</b>
|
||||
<b>'.moneyFormat($totale, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
}
|
||||
|
|
|
@ -24,6 +24,25 @@ $prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
|
|||
// Righe documento
|
||||
$righe = $documento->getRighe();
|
||||
|
||||
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
|
||||
$riferimenti = [];
|
||||
$id_rif = [];
|
||||
|
||||
foreach ($righe as $riga) {
|
||||
$riferimento = ($riga->getOriginalComponent() ? $riga->getOriginalComponent()->getDocument()->getReference() : null);
|
||||
if (!empty($riferimento)) {
|
||||
if (!array_key_exists($riferimento, $riferimenti)) {
|
||||
$riferimenti[$riferimento] = [];
|
||||
}
|
||||
|
||||
if (!in_array($riga->id, $riferimenti[$riferimento])) {
|
||||
$id_rif[] = $riga->id;
|
||||
$riferimenti[$riferimento][] = $riga->id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$columns = 7;
|
||||
|
||||
$has_image = $righe->search(function ($item) {
|
||||
|
@ -54,12 +73,6 @@ echo "
|
|||
<tr>
|
||||
<th class='text-center' style='width:4%'>".tr('#', [], ['upper' => true]).'</th>';
|
||||
|
||||
if ($documento->direzione == 'uscita') {
|
||||
echo "
|
||||
<th class='text-center' style='width:11%'>".tr('Codice', [], ['upper' => true])."</th>
|
||||
<th class='text-center' style='width:11%'>".tr('Codice fornitore', [], ['upper' => true]).'</th>';
|
||||
}
|
||||
|
||||
if ($has_image) {
|
||||
echo "
|
||||
<th class='text-center' style='width:20%'>".tr('Immagine', [], ['upper' => true]).'</th>';
|
||||
|
@ -67,6 +80,14 @@ echo "
|
|||
|
||||
echo "
|
||||
<th class='text-center'>".tr('Descrizione', [], ['upper' => true])."</th>
|
||||
";
|
||||
|
||||
if ($documento->direzione == 'uscita') {
|
||||
echo "
|
||||
<th class='text-center' style='width:11%'>".tr('Codice', [], ['upper' => true])."</th>
|
||||
<th class='text-center' style='width:11%'>".tr('Codice fornitore', [], ['upper' => true]).'</th>';
|
||||
}
|
||||
echo"
|
||||
<th class='text-center' style='width:9%'>".tr('Q.tà', [], ['upper' => true]).'</th>';
|
||||
|
||||
if ($options['pricing']) {
|
||||
|
@ -92,24 +113,73 @@ foreach ($righe as $riga) {
|
|||
|
||||
echo '
|
||||
<tr>
|
||||
<td class="text-center" style="vertical-align: middle">
|
||||
'.$num.'
|
||||
</td>';
|
||||
<td class="text-center" style="vertical-align: middle">';
|
||||
|
||||
if ($has_image) {
|
||||
if ($riga->isArticolo() && !empty($riga->articolo->image)) {
|
||||
echo '
|
||||
<td align="center">
|
||||
<img src="'.$riga->articolo->image.'" style="max-height: 80px; max-width:120px">
|
||||
</td>';
|
||||
$text = '';
|
||||
|
||||
$autofill->set(5);
|
||||
} else {
|
||||
echo '
|
||||
<td></td>';
|
||||
foreach ($riferimenti as $key => $riferimento) {
|
||||
if (in_array($riga->id, $riferimento)) {
|
||||
if ($riga->id === $riferimento[0]) {
|
||||
$riga_ordine = $database->fetchOne('SELECT numero_cliente, data_cliente FROM or_ordini WHERE id = '.prepare($riga->idordine));
|
||||
if (!empty($riga_ordine['numero_cliente']) && !empty($riga_ordine['data_cliente'])) {
|
||||
$text = $text.'<b>Ordine n. '.$riga_ordine['numero_cliente'].' del '.Translator::dateToLocale($riga_ordine['data_cliente']).'</b><br>';
|
||||
}
|
||||
$r['descrizione'] = str_replace('Rif. '.strtolower($key), '', $r['descrizione']);
|
||||
preg_match("/Rif\.(.*)/s", $r['descrizione'], $rif2);
|
||||
$r['descrizione'] = str_replace('Rif.'.strtolower($rif2[1]), '', $r['descrizione']);
|
||||
|
||||
if (!empty($rif2)) {
|
||||
$text .= '<b>'.$rif2[0].'</b>';
|
||||
}
|
||||
$text .= '<b>'.$key.'</b></td>';
|
||||
if ($options['pricing']) {
|
||||
$text .= '
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>';
|
||||
}
|
||||
|
||||
$text .= '<td></td><td></td></tr><tr><td class="text-center" nowrap="nowrap" style="vertical-align: middle">';
|
||||
|
||||
echo '
|
||||
</td>';
|
||||
if ($has_image) {
|
||||
echo '
|
||||
<td></td>';
|
||||
}
|
||||
echo'
|
||||
<td>
|
||||
'.nl2br($text);
|
||||
}
|
||||
}
|
||||
$r['descrizione'] = preg_replace("/Rif\.(.*)/s", '', $r['descrizione']);
|
||||
$autofill->count($r['descrizione']);
|
||||
}
|
||||
|
||||
|
||||
$source_type = get_class($riga);
|
||||
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
|
||||
echo $num.'</td>';
|
||||
if ($has_image) {
|
||||
if ($riga->isArticolo() && !empty($riga->articolo->image)) {
|
||||
echo '
|
||||
<td align="center">
|
||||
<img src="'.$riga->articolo->image.'" style="max-height: 80px; max-width:120px">
|
||||
</td>';
|
||||
} else {
|
||||
echo '
|
||||
<td></td>';
|
||||
}
|
||||
}
|
||||
echo'
|
||||
<td>'.$r['descrizione'];
|
||||
} else {
|
||||
echo $num.'
|
||||
</td>
|
||||
<td>'.nl2br($r['descrizione']);
|
||||
}
|
||||
|
||||
|
||||
if ($documento->direzione == 'uscita') {
|
||||
echo '
|
||||
<td class="text-center" style="vertical-align: middle">
|
||||
|
@ -120,10 +190,6 @@ foreach ($righe as $riga) {
|
|||
</td>';
|
||||
}
|
||||
|
||||
echo '
|
||||
<td>
|
||||
'.nl2br($r['descrizione']);
|
||||
|
||||
if ($riga->isArticolo()) {
|
||||
if ($documento->direzione == 'entrata' && !$options['hide-item-number']) {
|
||||
// Codice articolo
|
||||
|
@ -161,14 +227,14 @@ foreach ($righe as $riga) {
|
|||
|
||||
echo '
|
||||
<td class="text-center">
|
||||
'.Translator::numberToLocale(abs($qta), 'qta').' '.$um.'
|
||||
'.Translator::numberToLocale(abs($qta), $d_qta).' '.$um.'
|
||||
</td>';
|
||||
|
||||
if ($options['pricing']) {
|
||||
// Prezzo unitario
|
||||
echo '
|
||||
<td class="text-right">
|
||||
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario);
|
||||
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario, $d_importi);
|
||||
|
||||
if ($riga->sconto > 0) {
|
||||
$text = discountInfo($riga, false);
|
||||
|
@ -185,13 +251,13 @@ foreach ($righe as $riga) {
|
|||
// Imponibile
|
||||
echo '
|
||||
<td class="text-right">
|
||||
'.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile).'
|
||||
'.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile, $d_importi).'
|
||||
</td>';
|
||||
|
||||
// Iva
|
||||
echo '
|
||||
<td class="text-center">
|
||||
'.Translator::numberToLocale($riga->aliquota->percentuale, 0).'
|
||||
'.Translator::numberToLocale($riga->aliquota->percentuale, $d_qta).'
|
||||
</td>';
|
||||
}
|
||||
|
||||
|
@ -246,7 +312,7 @@ if ($options['pricing']) {
|
|||
</td>
|
||||
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'</b>
|
||||
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -259,7 +325,7 @@ if ($options['pricing']) {
|
|||
</td>
|
||||
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($sconto, 2).'</b>
|
||||
<b>'.moneyFormat($sconto, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -271,7 +337,7 @@ if ($options['pricing']) {
|
|||
</td>
|
||||
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($totale_imponibile, 2).'</b>
|
||||
<b>'.moneyFormat($totale_imponibile, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
}
|
||||
|
@ -284,7 +350,7 @@ if ($options['pricing']) {
|
|||
</td>
|
||||
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($totale_iva, 2).'</b>
|
||||
<b>'.moneyFormat($totale_iva, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -295,7 +361,7 @@ if ($options['pricing']) {
|
|||
<b>'.tr('Totale documento', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($totale, 2).'</b>
|
||||
<b>'.moneyFormat($totale, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -307,7 +373,7 @@ if ($options['pricing']) {
|
|||
<b>'.tr('Sconto in fattura', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($sconto_finale, 2).'</b>
|
||||
<b>'.moneyFormat($sconto_finale, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -318,7 +384,7 @@ if ($options['pricing']) {
|
|||
<b>'.tr('Netto a pagare', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="2" class="text-right">
|
||||
<b>'.moneyFormat($netto_a_pagare, 2).'</b>
|
||||
<b>'.moneyFormat($netto_a_pagare, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
}
|
||||
|
|
|
@ -22,6 +22,9 @@ include_once __DIR__.'/../../core.php';
|
|||
use Modules\Ordini\Ordine;
|
||||
|
||||
$documento = Ordine::find($id_record);
|
||||
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
|
||||
$d_importi = (int) setting('Cifre decimali per importi in stampa');
|
||||
$d_totali = (int) setting('Cifre decimali per totali in stampa');
|
||||
|
||||
$id_cliente = $documento['idanagrafica'];
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ if ($pricing && empty($options['dir'])) {
|
|||
<b>'.tr('Totale consuntivo (no iva)', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="2" class="text-center">
|
||||
<b>'.moneyFormat($somma_totale_imponibile).'</b>
|
||||
<b>'.moneyFormat($somma_totale_imponibile, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -46,7 +46,7 @@ if ($pricing && empty($options['dir'])) {
|
|||
<b>'.tr('Budget (no IVA)', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="2" class="text-center">
|
||||
<b>'.moneyFormat($budget).'</b>
|
||||
<b>'.moneyFormat($budget, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -57,7 +57,7 @@ if ($pricing && empty($options['dir'])) {
|
|||
<b>'.tr('Rapporto budget/spesa (no IVA)', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="2" class="text-center">
|
||||
<b>'.moneyFormat($rapporto).'</b>
|
||||
<b>'.moneyFormat($rapporto, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
|
|
@ -23,6 +23,9 @@ use Modules\Ordini\Ordine;
|
|||
|
||||
$documento = Ordine::find($id_record);
|
||||
$records = $documento->interventi;
|
||||
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
|
||||
$d_importi = (int) setting('Cifre decimali per importi in stampa');
|
||||
$d_totali = (int) setting('Cifre decimali per totali in stampa');
|
||||
|
||||
$id_cliente = $documento['idanagrafica'];
|
||||
$id_sede = $documento['idsede'];
|
||||
|
|
|
@ -257,14 +257,14 @@ foreach ($righe as $key => $riga) {
|
|||
if (!$riga->isDescrizione()) {
|
||||
echo '
|
||||
<td class="text-center" style="vertical-align: middle" >
|
||||
'.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
|
||||
'.Translator::numberToLocale(abs($riga->qta), $d_qta).' '.$r['um'].'
|
||||
</td>';
|
||||
|
||||
if ($options['pricing']) {
|
||||
// Prezzo unitario
|
||||
echo '
|
||||
<td class="text-right" style="vertical-align: middle">
|
||||
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario);
|
||||
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario, $d_importi);
|
||||
|
||||
if ($riga->sconto != 0) {
|
||||
$text = discountInfo($riga, false);
|
||||
|
@ -281,14 +281,14 @@ foreach ($righe as $key => $riga) {
|
|||
// Iva
|
||||
echo '
|
||||
<td class="text-center" style="vertical-align: middle">
|
||||
'.Translator::numberToLocale($riga->aliquota->percentuale, 2).'
|
||||
'.Translator::numberToLocale($riga->aliquota->percentuale, $d_qta).'
|
||||
</td>';
|
||||
}
|
||||
// Imponibile
|
||||
echo '
|
||||
<td class="text-right" style="vertical-align: middle" >
|
||||
'.(($options['hide-total'] || $prezzi_ivati) ? moneyFormat($riga->totale) : moneyFormat($riga->totale_imponibile)).'
|
||||
</td>';
|
||||
<td class="text-right" style="vertical-align: middle" >
|
||||
'.(($options['hide-total'] || $prezzi_ivati) ? moneyFormat($riga->totale, $d_importi) : moneyFormat($riga->totale_imponibile, $d_importi)).'
|
||||
</td>';
|
||||
}
|
||||
} else {
|
||||
echo '
|
||||
|
@ -319,7 +319,7 @@ foreach ($righe as $key => $riga) {
|
|||
<b>'.tr('Subtotale', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<td colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
|
||||
'.moneyFormat($subtotale_gruppo, 2).'
|
||||
'.moneyFormat($subtotale_gruppo, $d_totali).'
|
||||
</td>
|
||||
</tr>';
|
||||
if (!$options['no-iva']) {
|
||||
|
@ -329,7 +329,7 @@ foreach ($righe as $key => $riga) {
|
|||
<b>'.tr('Iva', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<td colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
|
||||
'.moneyFormat($iva_gruppo, 2).'
|
||||
'.moneyFormat($iva_gruppo, $d_totali).'
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
@ -337,7 +337,7 @@ foreach ($righe as $key => $riga) {
|
|||
<b>'.tr('Subtotale ivato', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<td colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
|
||||
<b>'.moneyFormat($subtotale_gruppo + $iva_gruppo, 2).'</b>
|
||||
<b>'.moneyFormat($subtotale_gruppo + $iva_gruppo, $d_totali).'</b>
|
||||
</td>
|
||||
</tr>';
|
||||
}
|
||||
|
@ -372,7 +372,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
|
|||
</td>
|
||||
|
||||
<th colspan="'.($options['show-only-total'] ? (($has_image) ? ($options['no-iva'] ? 1 : 2) : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
|
||||
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'</b>
|
||||
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -385,7 +385,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
|
|||
</td>
|
||||
|
||||
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
|
||||
<b>'.moneyFormat($sconto, 2).'</b>
|
||||
<b>'.moneyFormat($sconto, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -397,7 +397,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
|
|||
</td>
|
||||
|
||||
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
|
||||
<b>'.moneyFormat($totale_imponibile, 2).'</b>
|
||||
<b>'.moneyFormat($totale_imponibile, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
}
|
||||
|
@ -411,7 +411,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
|
|||
</td>
|
||||
|
||||
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
|
||||
<b>'.moneyFormat($totale_iva, 2).'</b>
|
||||
<b>'.moneyFormat($totale_iva, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -422,7 +422,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
|
|||
<b>'.tr('Totale documento', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
|
||||
<b>'.moneyFormat($totale, 2).'</b>
|
||||
<b>'.moneyFormat($totale, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -434,7 +434,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
|
|||
<b>'.tr('Sconto in fattura', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
|
||||
<b>'.moneyFormat($sconto_finale, 2).'</b>
|
||||
<b>'.moneyFormat($sconto_finale, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -445,7 +445,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
|
|||
<b>'.tr('Netto a pagare', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
|
||||
<b>'.moneyFormat($netto_a_pagare, 2).'</b>
|
||||
<b>'.moneyFormat($netto_a_pagare, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
}
|
||||
|
|
|
@ -22,6 +22,9 @@ include_once __DIR__.'/../../core.php';
|
|||
use Modules\Preventivi\Preventivo;
|
||||
|
||||
$documento = Preventivo::find($id_record);
|
||||
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
|
||||
$d_importi = (int) setting('Cifre decimali per importi in stampa');
|
||||
$d_totali = (int) setting('Cifre decimali per totali in stampa');
|
||||
|
||||
$id_cliente = $documento['idanagrafica'];
|
||||
|
||||
|
|
|
@ -23,6 +23,10 @@ $budget = get_imponibile_preventivo($id_record);
|
|||
$somma_totale_imponibile = get_totale_interventi_preventivo($id_record);
|
||||
$rapporto = floatval($budget) - floatval($somma_totale_imponibile) - $documento->provvigione;
|
||||
|
||||
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
|
||||
$d_totali = (int) setting('Cifre decimali per importi in stampa');
|
||||
$d_totali = (int) setting('Cifre decimali per totali in stampa');
|
||||
|
||||
if ($pricing && empty($options['dir'])) {
|
||||
// Totale imponibile
|
||||
echo '
|
||||
|
@ -35,7 +39,7 @@ if ($pricing && empty($options['dir'])) {
|
|||
<b>'.tr('Totale consuntivo (no iva)', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="2" class="text-center">
|
||||
<b>'.moneyFormat($somma_totale_imponibile).'</b>
|
||||
<b>'.moneyFormat($somma_totale_imponibile, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -46,7 +50,7 @@ if ($pricing && empty($options['dir'])) {
|
|||
<b>'.tr('Budget (no IVA)', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="2" class="text-center">
|
||||
<b>'.moneyFormat($budget).'</b>
|
||||
<b>'.moneyFormat($budget, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
@ -57,7 +61,7 @@ if ($pricing && empty($options['dir'])) {
|
|||
<b>'.tr('Rapporto budget/spesa (no IVA)', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<th colspan="2" class="text-center">
|
||||
<b>'.moneyFormat($rapporto).'</b>
|
||||
<b>'.moneyFormat($rapporto, $d_totali).'</b>
|
||||
</th>
|
||||
</tr>';
|
||||
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
$d_totali = (int) setting('Cifre decimali per totali in stampa');
|
||||
|
||||
$somma_ore = sum($somma_ore);
|
||||
$somma_imponibile = sum($somma_imponibile);
|
||||
$somma_sconto = sum($somma_sconto);
|
||||
|
@ -30,7 +32,7 @@ $somma_km = sum($somma_km);
|
|||
if (setting('Formato ore in stampa') == 'Sessantesimi') {
|
||||
$somma_ore = Translator::numberToHours($somma_ore);
|
||||
} else {
|
||||
$somma_ore = Translator::numberToLocale($somma_ore, 2);
|
||||
$somma_ore = Translator::numberToLocale($somma_ore, $d_qta);
|
||||
}
|
||||
|
||||
echo '
|
||||
|
@ -38,16 +40,12 @@ echo '
|
|||
<th width="5%" style="border-right: 0"></th>
|
||||
<th class="text-right" style="border-left: 0;">
|
||||
<b>'.tr('Totale', [], ['upper' => true]).':</b>
|
||||
</th>';
|
||||
if (get('id_print') != 24) {
|
||||
echo '
|
||||
<th class="text-center">'.($somma_km).'</td>';
|
||||
}
|
||||
echo '
|
||||
</th>
|
||||
<th class="text-center">'.($somma_km).'</td>
|
||||
<th class="text-center">'.($pricing ? $somma_ore : '-').'</th>
|
||||
<th class="text-center">'.($pricing ? moneyFormat($somma_imponibile, 2) : '-').'</th>
|
||||
<th class="text-center">'.($pricing ? moneyFormat($somma_sconto, 2) : '-').'</th>
|
||||
<th class="text-center">'.($pricing ? moneyFormat($somma_totale_imponibile, 2) : '-').'</th>
|
||||
<th class="text-center">'.($pricing ? moneyFormat($somma_imponibile, $d_totali) : '-').'</th>
|
||||
<th class="text-center">'.($pricing ? moneyFormat($somma_sconto, $d_totali) : '-').'</th>
|
||||
<th class="text-center">'.($pricing ? moneyFormat($somma_totale_imponibile, $d_totali) : '-').'</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
|
@ -55,8 +53,8 @@ echo '
|
|||
<th class="text-right" style="border-left: 0;">
|
||||
<b>'.tr('Iva', [], ['upper' => true]).':</b>
|
||||
</th>
|
||||
<th colspan="'.(get('id_print') != 24 ? 4 : 3).'"></th>
|
||||
<th class="text-center">'.($pricing ? moneyFormat($somma_iva, 2) : '-').'</th>
|
||||
<th colspan="4"></th>
|
||||
<th class="text-center">'.($pricing ? moneyFormat($somma_iva, $d_totali) : '-').'</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
|
@ -64,8 +62,8 @@ echo '
|
|||
<th class="text-right" style="border-left: 0;">
|
||||
<b>'.tr('Totale Ivato', [], ['upper' => true]).':</b>
|
||||
</th>
|
||||
<th colspan="'.(get('id_print') != 24 ? 4 : 3).'"></th>
|
||||
<th class="text-center">'.($pricing ? moneyFormat($somma_totale_ivato, 2) : '-').'</th>
|
||||
<th colspan="4"></th>
|
||||
<th class="text-center">'.($pricing ? moneyFormat($somma_totale_ivato, $d_totali) : '-').'</th>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>';
|
||||
|
|
|
@ -22,6 +22,9 @@ include_once __DIR__.'/../../core.php';
|
|||
use Modules\Interventi\Intervento;
|
||||
use Modules\Iva\Aliquota;
|
||||
|
||||
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
|
||||
$d_importi = (int) setting('Cifre decimali per importi in stampa');
|
||||
|
||||
$intervento = Intervento::find($record['id']);
|
||||
$sessioni = $intervento->sessioni;
|
||||
$iva_predefinita = floatval(Aliquota::find(setting('Iva predefinita'))->percentuale);
|
||||
|
@ -74,19 +77,15 @@ echo '
|
|||
if (setting('Formato ore in stampa') == 'Sessantesimi') {
|
||||
$ore = Translator::numberToHours($ore);
|
||||
} else {
|
||||
$ore = Translator::numberToLocale($ore, 2);
|
||||
}
|
||||
echo '
|
||||
</td>';
|
||||
if (get('id_print') != 24) {
|
||||
echo '
|
||||
<td class="text-center">'.($km).'</td>';
|
||||
$ore = Translator::numberToLocale($ore, $d_qta);
|
||||
}
|
||||
echo '
|
||||
</td>
|
||||
<td class="text-center">'.($pricing ? $km : '-').'</td>
|
||||
<td class="text-center">'.($pricing ? $ore : '-').'</td>
|
||||
<td class="text-center">'.($pricing ? moneyFormat($imponibile, 2) : '-').'</td>
|
||||
<td class="text-center">'.($pricing && empty($options['dir']) ? moneyFormat($sconto, 2) : '-').'</td>
|
||||
<td class="text-center">'.($pricing ? moneyFormat($totale_imponibile, 2) : '-').'</td>
|
||||
<td class="text-center">'.($pricing ? moneyFormat($imponibile, $d_importi) : '-').'</td>
|
||||
<td class="text-center">'.($pricing && empty($options['dir']) ? moneyFormat($sconto, $d_importi) : '-').'</td>
|
||||
<td class="text-center">'.($pricing ? moneyFormat($totale_imponibile, $d_importi) : '-').'</td>
|
||||
</tr>';
|
||||
|
||||
// Sessioni
|
||||
|
@ -133,8 +132,8 @@ if (!$righe->isEmpty()) {
|
|||
<td style="border-top: 0; border-bottom: 0;"></td>
|
||||
<td colspan="'.(get('id_print') != 24 ? 3 : 2).'"><small>'.$riga->descrizione.'</small></td>
|
||||
<td class="text-center"><small>'.$riga->qta.' '.$riga->um.'</small></td>
|
||||
<td class="text-center"><small>'.($pricing ? moneyFormat($prezzo) : '-').'</small></td>
|
||||
<td class="text-center"><small>'.($pricing ? moneyFormat($totale) : '-').'</small></td>
|
||||
<td class="text-center"><small>'.($pricing ? moneyFormat($prezzo, $d_importi) : '-').'</small></td>
|
||||
<td class="text-center"><small>'.($pricing ? moneyFormat($totale, $d_importi) : '-').'</small></td>
|
||||
</tr>';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -675,8 +675,8 @@ ALTER TABLE `or_righe_ordini` CHANGE `sconto_unitario` `sconto_unitario` decimal
|
|||
ALTER TABLE `or_righe_ordini` CHANGE `qta` `qta` decimal(12, 6) NOT NULL;
|
||||
ALTER TABLE `or_righe_ordini` CHANGE `qta_evasa` `qta_evasa` decimal(12, 6) NOT NULL;
|
||||
|
||||
UPDATE `zz_settings` SET `tipo` = 'list[1,2,3,4,5]' WHERE `nome` = 'Cifre decimali per importi';
|
||||
UPDATE `zz_settings` SET `tipo` = 'list[1,2,3,4,5]' WHERE `nome` = 'Cifre decimali per quantità';
|
||||
UPDATE `zz_settings` SET `tipo` = 'list[2,3,4,5]' WHERE `nome` = 'Cifre decimali per importi';
|
||||
UPDATE `zz_settings` SET `tipo` = 'list[0,1,2,3,4,5]' WHERE `nome` = 'Cifre decimali per quantità';
|
||||
|
||||
-- Aggiunta percentuale combinata in listini
|
||||
ALTER TABLE `mg_listini` ADD `prc_combinato` VARCHAR(255);
|
||||
|
|
|
@ -90,4 +90,17 @@ INSERT INTO `zz_widgets` (`id`, `name`, `type`, `id_module`, `location`, `class`
|
|||
(NULL, 'Stampa giacenza', 'print', (SELECT `id` FROM `zz_modules` WHERE name='Automezzi'), 'controller_top', 'col-md-4', '', '#45a9f1', 'fa fa-truck', '', 'if( confirm(\'Stampare la giacenza attuale sugli automezzi?\') ){ window.open(\'pdfgen.php?id_print=53&search_targa=\'+$(\'#th_Targa input\').val()+\'&search_nome=\'+$(\'#th_Nome input\').val()); }', 'javascript', '', 'Stampa giacenza', '1', '1', NULL);
|
||||
|
||||
-- Aggiunta flag rappresentante fiscale per sede
|
||||
ALTER TABLE `an_sedi` ADD `is_rappresentante_fiscale` BOOLEAN NULL DEFAULT FALSE;
|
||||
ALTER TABLE `an_sedi` ADD `is_rappresentante_fiscale` BOOLEAN NULL DEFAULT FALSE;
|
||||
|
||||
-- Aggiunte impostazioni per definire il numero di decimali in stampa
|
||||
INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES ("Cifre decimali per importi in stampa", '2', 'list[0,1,2,3,4,5]', 1, 'Generali', '35', 'Definisce il numero di decimali per gli importi nei template di stampa');
|
||||
INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES ("Cifre decimali per quantità in stampa", '0', 'list[0,1,2,3,4,5]', 1, 'Generali', '36', 'Definisce il numero di decimali per le quantità nei template di stampa');
|
||||
INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES ("Cifre decimali per totali in stampa", '2', 'list[0,1,2]', 1, 'Generali', '37', 'Definisce il numero di decimali per i totali nei template di stampa');
|
||||
|
||||
-- Fix per vista modulo campi personalizzati
|
||||
UPDATE `zz_modules` SET `options` = 'SELECT\r\n |select|\r\nFROM\r\n `zz_fields`\r\n LEFT JOIN `zz_modules` ON `zz_modules`.`id` = `zz_fields`.`id_module`\r\n LEFT JOIN `zz_plugins` ON `zz_plugins`.`id` = `zz_fields`.`id_plugin`\r\nWHERE\r\n 1=1\r\nHAVING\r\n 2=2' WHERE `zz_modules`.`name` = 'Campi personalizzati';
|
||||
|
||||
UPDATE `zz_views` INNER JOIN `zz_modules` ON `zz_views`.`id_module` = `zz_modules`.`id` SET `zz_views`.`query` = 'IF(emails IS NOT NULL, \'fa fa-envelope text-success\', \'\')' WHERE `zz_modules`.`name` = 'Fatture di vendita' AND `zz_views`.`name` = 'icon_Inviata';
|
||||
|
||||
-- Miglioria query modulo interventi
|
||||
UPDATE `zz_modules` SET `options` = 'SELECT\r\n |select|\r\nFROM\r\n `in_interventi`\r\n LEFT JOIN `an_anagrafiche` ON `in_interventi`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\r\n LEFT JOIN `in_interventi_tecnici` ON `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`\r\n LEFT JOIN `in_interventi_tecnici_assegnati` ON `in_interventi_tecnici_assegnati`.`id_intervento` = `in_interventi`.`id`\r\n LEFT JOIN (SELECT `idintervento`, SUM(`prezzo_unitario`*`qta`-`sconto`) AS `ricavo_righe`, SUM(`costo_unitario`*`qta`) AS `costo_righe` FROM `in_righe_interventi` GROUP BY `idintervento`) AS `righe` ON `righe`.`idintervento` = `in_interventi`.`id`\r\n LEFT JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento`=`in_statiintervento`.`idstatointervento`\r\n LEFT JOIN `an_referenti` ON `in_interventi`.`idreferente` = `an_referenti`.`id`\r\n LEFT JOIN (SELECT `an_sedi`.`id`, CONCAT(`an_sedi`.`nomesede`, \'<br />\',IF(`an_sedi`.`telefono`!=\'\',CONCAT(`an_sedi`.`telefono`,\'<br />\'),\'\'),IF(`an_sedi`.`cellulare`!=\'\',CONCAT(`an_sedi`.`cellulare`,\'<br />\'),\'\'),`an_sedi`.`citta`,IF(`an_sedi`.`indirizzo`!=\'\',CONCAT(\' - \',`an_sedi`.`indirizzo`),\'\')) AS `info` FROM `an_sedi`) AS `sede_destinazione` ON `sede_destinazione`.`id` = `in_interventi`.`idsede_destinazione`\r\n LEFT JOIN (SELECT GROUP_CONCAT(DISTINCT `co_documenti`.`numero_esterno` SEPARATOR \', \') AS `info`, `co_righe_documenti`.`original_document_id` AS `idintervento` FROM `co_documenti` INNER JOIN `co_righe_documenti` ON `co_documenti`.`id` = `co_righe_documenti`.`iddocumento` WHERE `original_document_type` = \'Modules\\\\Interventi\\\\Intervento\' GROUP BY `idintervento`, `original_document_id`) AS `fattura` ON `fattura`.`idintervento` = `in_interventi`.`id`\r\n LEFT JOIN (SELECT `in_interventi_tecnici_assegnati`.`id_intervento`, GROUP_CONCAT( DISTINCT `ragione_sociale` SEPARATOR \', \') AS `nomi` FROM `an_anagrafiche` INNER JOIN `in_interventi_tecnici_assegnati` ON `in_interventi_tecnici_assegnati`.`id_tecnico` = `an_anagrafiche`.`idanagrafica` GROUP BY `id_intervento`) AS `tecnici_assegnati` ON `in_interventi`.`id` = `tecnici_assegnati`.`id_intervento`\r\n LEFT JOIN (SELECT `in_interventi_tecnici`.`idintervento`, GROUP_CONCAT( DISTINCT `ragione_sociale` SEPARATOR \', \') AS `nomi` FROM `an_anagrafiche` INNER JOIN `in_interventi_tecnici` ON `in_interventi_tecnici`.`idtecnico` = `an_anagrafiche`.`idanagrafica` GROUP BY `idintervento`) AS `tecnici` ON `in_interventi`.`id` = `tecnici`.`idintervento`\r\n LEFT JOIN (SELECT COUNT(id) as emails, em_emails.id_record FROM em_emails INNER JOIN zz_operations ON zz_operations.id_email = em_emails.id WHERE id_module IN(SELECT id FROM zz_modules WHERE name = \'Interventi\') AND `zz_operations`.`op` = \'send-email\' GROUP BY em_emails.id_record) AS `email` ON `email`.`id_record` = `in_interventi`.`id`\r\n LEFT JOIN (SELECT GROUP_CONCAT(CONCAT(`matricola`, IF(`nome` != \'\', CONCAT(\' - \', `nome`), \'\')) SEPARATOR \'<br />\') AS `descrizione`, `my_impianti_interventi`.`idintervento` FROM `my_impianti` INNER JOIN `my_impianti_interventi` ON `my_impianti`.`id` = `my_impianti_interventi`.`idimpianto` GROUP BY `my_impianti_interventi`.`idintervento`) AS `impianti` ON `impianti`.`idintervento` = `in_interventi`.`id`\r\n LEFT JOIN (SELECT `co_contratti`.`id`, CONCAT(`co_contratti`.`numero`, \' del \', DATE_FORMAT(`data_bozza`, \'%d/%m/%Y\')) AS `info` FROM `co_contratti`) AS `contratto` ON `contratto`.`id` = `in_interventi`.`id_contratto`\r\n LEFT JOIN (SELECT `co_preventivi`.`id`, CONCAT(`co_preventivi`.`numero`, \' del \', DATE_FORMAT(`data_bozza`, \'%d/%m/%Y\')) AS `info` FROM `co_preventivi`) AS `preventivo` ON `preventivo`.`id` = `in_interventi`.`id_preventivo`\r\n LEFT JOIN (SELECT `or_ordini`.`id`, CONCAT(`or_ordini`.`numero`, \' del \', DATE_FORMAT(`data`, \'%d/%m/%Y\')) AS `info` FROM `or_ordini`) AS `ordine` ON `ordine`.`id` = `in_interventi`.`id_ordine`\r\n LEFT JOIN `in_tipiintervento` ON `in_interventi`.`idtipointervento` = `in_tipiintervento`.`idtipointervento`\r\nLEFT JOIN( SELECT zz_files.* FROM zz_files INNER JOIN zz_modules ON zz_files.id_module = zz_modules.id WHERE zz_modules.name = \'Interventi\' ) AS zz_files ON zz_files.id_record = in_interventi.id\r\nWHERE \r\n 1=1 |segment(`in_interventi`.`id_segment`)| |date_period(`orario_inizio`,`data_richiesta`)|\r\nGROUP BY \r\n `in_interventi`.`id`\r\nHAVING \r\n 2=2\r\nORDER BY \r\n IFNULL(`orario_fine`, `data_richiesta`) DESC ' WHERE `zz_modules`.`name` = 'Interventi';
|
|
@ -0,0 +1 @@
|
|||
UPDATE `zz_settings` SET `zz_settings`.`nome` = 'Visualizza riferimento su ogni riga in stampa', `help` = 'Se disabilitato, raggruppa il riferimento ai documenti collegati in un\'unica riga, se abilitato riporta i riferimenti ai documenti in ogni riga.' WHERE `zz_settings`.`nome` = "Riferimento dei documenti nelle stampe";
|
|
@ -0,0 +1,2 @@
|
|||
-- Correzioni Automezzi
|
||||
UPDATE `zz_views` SET `query` = 'IFNULL(an_sedi.nome,an_sedi.nomesede)', `order` = '1' WHERE `zz_views`.`name` = 'Nome' AND `zz_views`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE name='Automezzi');
|
|
@ -15,6 +15,7 @@ return [
|
|||
'an_tipianagrafiche_anagrafiche',
|
||||
'an_zone',
|
||||
'an_pagamenti_anagrafiche',
|
||||
'an_sedi_tecnici',
|
||||
'co_banche',
|
||||
'co_contratti',
|
||||
'co_dichiarazioni_intento',
|
||||
|
|
Loading…
Reference in New Issue