This commit is contained in:
MatteoPistorello 2023-11-17 15:14:27 +01:00
commit d2c666ce18
15 changed files with 209 additions and 96 deletions

View File

@ -53,7 +53,7 @@ La documentazione ufficiale è disponibile all'indirizzo <https://docs.openstama
<!-- /TOC -->
## Requisiti
## Requisiti software
L'installazione del gestionale richiede la presenza di un server web con abilitato il [DBMS MySQL](https://www.mysql.com) e il linguaggio di programmazione [PHP](https://php.net).
@ -85,6 +85,18 @@ L'installazione del gestionale richiede la presenza di un server web con abilita
Per ulteriori informazioni sui pacchetti che forniscono questi elementi di default, visitare la sezione [Installazione](https://docs.openstamanager.com/configurazione/installazione) della documentazione.
### Requisiti hardware
Minimi:
- 1 CPU
- 2GB di ram
- 200MB di spazio per il gestionale
Consigliati:
- 2 CPU
- 4GB di ram
- 2GB di spazio per il gestionale
## Installazione rapida
```bash
git clone https://github.com/devcode-it/openstamanager.git

View File

@ -1238,3 +1238,7 @@ kbd{
.read-more-target:target {
display: block;
}
.fc-day-today {
background:#fafad2 !important;
}

View File

@ -91,10 +91,6 @@ class CSV extends CSVImporter
'field' => 'indirizzo',
'label' => 'Indirizzo',
],
[
'field' => 'indirizzo2',
'label' => 'Civico',
],
[
'field' => 'cap',
'label' => 'CAP',
@ -131,8 +127,9 @@ class CSV extends CSVImporter
'field' => 'sitoweb',
'label' => 'Sito Web',
'names' => [
'Sito',
'Sito web',
'Website',
'Sito',
],
],
[
@ -211,13 +208,8 @@ class CSV extends CSVImporter
[
'field' => 'tipo',
'label' => 'Tipologia (Privato, Ente pubblico, Azienda)',
],
[
'field' => 'codice_destinatario',
'label' => 'Codice Destinatario FE',
'names' => [
'Codice Destinatario FE',
'codice destinatario FE',
'Tipologia',
],
],
[
@ -246,6 +238,13 @@ class CSV extends CSVImporter
$primary_key = $this->getPrimaryKey();
$id_azienda = setting('Azienda predefinita');
// Compilo la ragione sociale se sono valorizzati cognome e nome
if (!$record['ragione_sociale'] && ($record['cognome'] && $record['nome'])) {
$record['ragione_sociale'] = $record['cognome'] . ' ' . $record['nome'];
}
unset($record['cognome']);
unset($record['nome']);
// Individuazione del tipo dell'anagrafica
$tipologie = [];
if (!empty($record['idtipoanagrafica'])) {
@ -297,7 +296,6 @@ class CSV extends CSVImporter
// Separazione dei campi relativi alla sede legale
$campi_sede = [
'indirizzo',
'indirizzo2',
'citta',
'cap',
'provincia',
@ -337,11 +335,11 @@ class CSV extends CSVImporter
if ($anagrafica->id == $id_azienda) {
return;
}
unset($record['ragione_sociale']);
$anagrafica->fill($record);
$anagrafica->tipologie = $tipologie;
$anagrafica->tipo = $tipi_selezionati;
$anagrafica->id_settore = $id_settore;
$anagrafica->save();
$sede = $anagrafica->sedeLegale;
@ -352,8 +350,8 @@ class CSV extends CSVImporter
public static function getExample()
{
return [
['Codice', 'Ragione sociale', 'Nome', 'Cognome', 'Tipologia', 'Partita IVA', 'Codice destinatario', 'Nazione', 'Indirizzo', 'CAP', 'Città', 'Provincia', 'Telefono', 'Fax', 'Cellulare', 'Email', 'PEC', 'Sito Web', 'IBAN', 'Note', 'Tipo'],
['00001', 'Mia anagrafica', '', '', 'Azienda', '12345678910', '1234567', 'ITALIA', 'Via Giuseppe Mazzini, 123', '12345', 'Este', 'PD', '+39 0429 60 25 12', '+39 0429 456 781', '+39 321 12 34 567', 'email@anagrafica.it', 'pec@anagrafica.it', 'www.sito.it', 'IT60 X054 2811 1010 0000 0123 456', 'Note dell\'anagrafica di esempio', 'Cliente,Fornitore'],
['Codice', 'Ragione sociale', 'Nome', 'Cognome', 'Codice destinatario', 'Provincia', 'Città', 'Telefono', 'Indirizzo', 'CAP', 'Cellulare', 'Fax','Email', 'PEC', 'Sito Web', 'Codice fiscale', 'Data di nascita', 'Luogo di nascita', 'Sesso', 'Partita IVA', 'IBAN', 'Note', 'Nazione', 'ID Agente', 'ID pagamento', 'Tipo', 'Tipologia', 'Split Payment', 'Settore merceologico'],
['001', 'Rossi Mario', '', '', '12345', 'PD', 'Este', '+39 0429 60 25 12', 'Via Rovigo, 51', '35042', '+39 321 12 34 567', '', 'email@anagrafica.it', 'email@pec.it', 'www.sito.it', '', '', '', '', '123456789', 'IT60 X054 2811 1010 0000 0123 456', 'Note dell\'anagrafica di esempio', 'Italia', '', '', 'Cliente', 'Privato', '0', 'Tessile'],
];
}
}

View File

@ -289,8 +289,8 @@ if (empty(get('modal'))) {
$id = $data[0]['idcontratto'];
}
// Inserito su vendita banco
elseif (!empty($vendita['id_riga_venditabanco'])) {
// Inserito su vendita banco
elseif (!empty($vendita['id_riga_venditabanco'])) {
$module_id = Modules::get('Vendita al banco')['id'];
// Ricerca vendite su contratti

View File

@ -201,13 +201,13 @@ foreach ($righe as $riga) {
if (empty($record['is_completato'])) {
echo '
<div class="btn-group">';
if ($riga->isArticolo() && !empty($riga->abilita_serial)) {
echo '
if ($riga->isArticolo() && !empty($riga->abilita_serial)) {
echo '
<a class="btn btn-primary btn-xs" title="'.tr('Modifica seriali della riga').'" onclick="modificaSeriali(this)">
<i class="fa fa-barcode"></i>
</a>';
}
echo '
}
echo '
<a class="btn btn-xs btn-warning" title="'.tr('Modifica riga').'" onclick="modificaRiga(this)">
<i class="fa fa-edit"></i>
</a>

View File

@ -39,7 +39,7 @@ echo '
echo '
</th>
<th width="35" class="text-center" >'.tr('#').'</th>
<th class="text-left">'.tr('Descrizione').'</th>
<th class="text-left" style="width:30%;">'.tr('Descrizione').'</th>
<th class="text-center" width="120">'.tr('Q.').'</th>';
if ($dir == 'entrata') {
echo '<th class="text-center" width="150">'.tr('Costo unitario').'</th>';

View File

@ -37,7 +37,7 @@ switch ($op) {
'nome' => post('nome'),
'matricola' => $matricola,
'id_categoria' => post('id_categoria') ?: null,
'id_sottocategoria' => post('subcategoria') ?: null,
'id_sottocategoria' => post('id_sottocategoria') ?: null,
'descrizione' => post('descrizione'),
'idsede' => post('idsede'),
'data' => post('data') ?: null,
@ -101,6 +101,7 @@ switch ($op) {
$idtecnico = post('idtecnico');
$idsede = post('idsede');
$id_categoria = post('id_categoria');
$id_sottocategoria = post('id_sottocategoria');
if (!empty($matricola)) {
$dbo->insert('my_impianti', [
@ -111,6 +112,7 @@ switch ($op) {
'idtecnico' => $idtecnico ?: 0,
'idsede' => $idsede ?: 0,
'id_categoria' => $id_categoria ?: null,
'id_sottocategoria' => $id_sottocategoria ?: null,
]);
$id_record = $dbo->lastInsertedID();

View File

@ -36,22 +36,25 @@ $id_anagrafica = filter('id_anagrafica');
</div>
<div class="row">
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Cliente'); ?>", "name": "idanagrafica", "id": "idanagrafica_impianto", "required": 1, "value": "<?php echo $id_anagrafica; ?>", "ajax-source": "clienti", "icon-after": "add|<?php echo Modules::get('Anagrafiche')['id']; ?>|tipoanagrafica=Cliente&readonly_tipo=1||<?php echo !empty($id_anagrafica) ? 'disabled' : ''; ?>", "readonly": "<?php echo !empty($id_anagrafica) ? 1 : 0; ?>" ]}
</div>
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Sede'); ?>", "name": "idsede", "value": "$idsede$", "ajax-source": "sedi", "select-options": <?php echo json_encode(['idanagrafica' => $id_anagrafica]); ?>, "placeholder": "Sede legale" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Tecnico predefinito'); ?>", "name": "idtecnico", "ajax-source": "tecnici", "icon-after": "add|<?php echo Modules::get('Anagrafiche')['id']; ?>|tipoanagrafica=Tecnico&readonly_tipo=1" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Tecnico predefinito'); ?>", "name": "idtecnico", "ajax-source": "tecnici", "icon-after": "add|<?php echo Modules::get('Anagrafiche')['id']; ?>|tipoanagrafica=Tecnico&readonly_tipo=1" ]}
{[ "type": "select", "label": "<?php echo tr('Categoria'); ?>", "name": "id_categoria", "required": 0, "ajax-source": "categorie_imp", "icon-after": "add|<?php echo Modules::get('Categorie impianti')['id']; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Categoria'); ?>", "name": "id_categoria", "required": 0, "value": "$id_categoria$", "values": "query=SELECT id, nome AS descrizione FROM my_impianti_categorie", "icon-after": "add|<?php echo Modules::get('Categorie impianti')['id']; ?>" ]}
{[ "type": "select", "label": "<?php echo tr('Sottocategoria'); ?>", "name": "id_sottocategoria", "id": "sottocategoria_add", "ajax-source": "sottocategorie_imp", "icon-after": "add|<?php echo Modules::get('Categorie impianti')['id']; ?>||hide" ]}
</div>
</div>
@ -64,7 +67,25 @@ $id_anagrafica = filter('id_anagrafica');
</form>
<script type="text/javascript">
$(document).ready(function() {
$(document).ready(function () {
var sub = $('#add-form').find('#sottocategoria_add');
var original = sub.parent().find(".input-group-addon button").attr("onclick");
$('#add-form').find('#id_categoria').change(function() {
updateSelectOption("id_categoria", $(this).val());
session_set('superselect,id_categoria', $(this).val(), 0);
sub.selectReset();
if($(this).val()){
sub.parent().find(".input-group-addon button").removeClass("hide");
sub.parent().find(".input-group-addon button").attr("onclick", original.replace('&ajax=yes', "&ajax=yes&id_original=" + $(this).val()));
}
else {
sub.parent().find(".input-group-addon button").addClass("hide");
}
});
input('idanagrafica').change(function() {
updateSelectOption("idanagrafica", $(this).val());
session_set('superselect,idanagrafica', $(this).val(), 0);

View File

@ -108,4 +108,39 @@ switch ($resource) {
}
break;
case 'categorie_imp':
$query = 'SELECT `id`, `nome` AS descrizione FROM `my_impianti_categorie` |where| ORDER BY `nome`';
foreach ($elements as $element) {
$filter[] = '`id`='.prepare($element);
}
$where[] = '`parent` IS NULL';
if (!empty($search)) {
$search_fields[] = '`nome` LIKE '.prepare('%'.$search.'%');
}
break;
/*
* Opzioni utilizzate:
* - id_categoria
*/
case 'sottocategorie_imp':
if (isset($superselect['id_categoria'])) {
$query = 'SELECT `id`, `nome` AS descrizione FROM `my_impianti_categorie` |where| ORDER BY `nome`';
foreach ($elements as $element) {
$filter[] = '`id`='.prepare($element);
}
$where[] = '`parent`='.prepare($superselect['id_categoria']);
if (!empty($search)) {
$search_fields[] = '`nome` LIKE '.prepare('%'.$search.'%');
}
}
break;
}

View File

@ -67,19 +67,20 @@ if (!empty($record['immagine'])) {
</div>
</div>
<div class ="row">
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Categoria'); ?>", "name": "id_categoria", "required": 0, "value": "$id_categoria$", "values": "query=SELECT id, nome AS descrizione FROM my_impianti_categorie", "icon-after": "add|<?php echo Modules::get('Categorie impianti')['id']; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Sottocategoria'); ?>", "name": "subcategoria", "value": "$id_sottocategoria$", "values": "query=SELECT id, nome AS descrizione FROM my_impianti_categorie WHERE parent = $id_categoria$", "select-options": <?php echo json_encode(['id_categoria' => $record['id_categoria']]); ?>, "icon-after": "add|<?php echo Modules::get('Categorie impianti')['id']; ?>|id_original=<?php echo $record['id_categoria']; ?>" ]}
</div>
<?php echo (!empty($record['id_categoria'])) ?
Modules::link('Categorie impianti', $record['id_categoria'], null, null, 'class="pull-right"') : ''; ?>
{[ "type": "select", "label": "<?php echo tr('Categoria'); ?>", "name": "id_categoria", "required": 0, "value": "$id_categoria$", "ajax-source": "categorie_imp", "icon-after": "add|<?php echo Modules::get('Categorie impianti')['id']; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Sottocategoria'); ?>", "name": "id_sottocategoria", "value": "$id_sottocategoria$", "ajax-source": "sottocategorie_imp", "select-options": <?php echo json_encode(['id_categoria' => $record['id_categoria']]); ?>, "icon-after": "add|<?php echo Modules::get('Categorie impianti')['id']; ?>|id_original=<?php echo $record['id_categoria']; ?>" ]}
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "date", "label": "<?php echo tr('Data installazione'); ?>", "name": "data", "value": "$data$" ]}
</div>
@ -90,6 +91,9 @@ if (!empty($record['immagine'])) {
{[ "type": "select", "label": "'.tr('Sede').'", "name": "idsede", "value": "$idsede$", "required": "1", "ajax-source": "sedi", "select-options": '.json_encode(['idanagrafica' => $record['idanagrafica']]).', "placeholder": "'.tr('Sede legale').'" ]}
</div>';
?>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Proprietario'); ?>", "name": "proprietario", "value": "$proprietario$" ]}
</div>
</div>
<div class="row">
@ -98,13 +102,6 @@ if (!empty($record['immagine'])) {
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "text", "label": "<?php echo tr('Proprietario'); ?>", "name": "proprietario", "value": "$proprietario$" ]}
</div>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Ubicazione'); ?>", "name": "ubicazione", "value": "$ubicazione$" ]}
@ -201,5 +198,12 @@ $(document).ready(function() {
$("#idsede").prop("disabled", value)
.selectReset();
});
$("#id_categoria").change(function() {
updateSelectOption("id_categoria", $(this).val());
$("#id_sottocategoria").val(null).trigger("change");
});
});
</script>

View File

@ -106,7 +106,20 @@ class FatturaOrdinaria extends FatturaElettronica
$riepiloghi = $this->getBody()['DatiBeniServizi']['DatiRiepilogo'];
$riepiloghi = $this->forceArray($riepiloghi);
$riepiloghi_raggruppati = [];
foreach ($riepiloghi as $riepilogo) {
$aliquota_iva = $riepilogo['AliquotaIVA'];
if (array_key_exists($aliquota_iva, $riepiloghi_raggruppati)) {
$riepiloghi_raggruppati[$aliquota_iva]['ImponibileImporto'] += $riepilogo['ImponibileImporto'];
$riepiloghi_raggruppati[$aliquota_iva]['Imposta'] += $riepilogo['Imposta'];
} else {
$riepiloghi_raggruppati[$aliquota_iva] = $riepilogo;
}
}
foreach ($riepiloghi_raggruppati as $riepilogo) {
$valore = 0;
if (isset($riepilogo['Arrotondamento']) && $riepilogo['Arrotondamento'] != 0 && round($totale_imposta[$riepilogo['AliquotaIVA']], 2) != (float) $riepilogo['Imposta']) {
$valore = $riepilogo['Arrotondamento'];
@ -238,14 +251,13 @@ class FatturaOrdinaria extends FatturaElettronica
$conto_arrotondamenti = $conto[$key];
}
$obj->id_rivalsa_inps = $id_rivalsa;
$obj->ritenuta_contributi = $ritenuta_contributi;
// Inserisco la ritenuta se è specificata nella riga o se non è specificata nella riga ma è presente in Dati ritenuta (quindi comprende tutte le righe)
if (!empty($riga['Ritenuta']) || $info['ritenuta_norighe'] == true) {
$obj->id_ritenuta_acconto = $id_ritenuta_acconto;
$obj->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$obj->id_rivalsa_inps = $id_rivalsa;
}
// Totale documento
@ -474,7 +486,9 @@ class FatturaOrdinaria extends FatturaElettronica
if (!empty($casse)) {
$totale = 0;
foreach ($righe as $riga) {
$totale += $riga['PrezzoTotale'];
if ($riga['Ritenuta']) {
$totale += $riga['PrezzoTotale'];
}
}
$casse = isset($casse[0]) ? $casse : [$casse];
@ -502,6 +516,8 @@ class FatturaOrdinaria extends FatturaElettronica
$id_rivalsa = $rivalsa['id'];
}
$percentuale = 0;
$importo = 0;
// Ritenuta d'Acconto
$ritenuta = $dati_generali['DatiRitenuta'];
if (!empty($ritenuta)) {

View File

@ -74,6 +74,7 @@ echo '
<thead>
<tr>
<th colspan="2">'.tr('Documento', [], ['upper' => true]).'</th>
<th class="text-center" style="width:10%">'.tr('KM', [], ['upper' => true]).'</th>
<th class="text-center" style="width:10%">'.tr('Ore', [], ['upper' => true]).'</th>
<th class="text-center" style="width:15%">'.tr('Imponibile', [], ['upper' => true]).'</th>
<th class="text-center" style="width:15%">'.tr('Sconto', [], ['upper' => true]).'</th>

View File

@ -58,7 +58,7 @@ $has_image = $righe->search(function ($item) {
return !empty($item->articolo->immagine);
}) !== false && $options['images'] == true;
$columns = 6;
$columns = $options['no-iva'] ? 5 : 6;
$columns = $options['pricing'] ? $columns : 3;
if ($has_image) {
@ -170,8 +170,12 @@ echo "
if ($options['pricing']) {
echo "
<th class='text-center' style='width:15%'>".tr('Prezzo unitario', [], ['upper' => true])."</th>
<th class='text-center' style='width:10%'>".tr('IVA', [], ['upper' => true])." (%)</th>
<th class='text-center' style='width:15%'>".tr('Prezzo unitario', [], ['upper' => true]).'</th>';
if (!$options['no-iva']) {
echo "
<th class='text-center' style='width:10%'>".tr('IVA', [], ['upper' => true]).' (%)</th>';
}
echo "
<th class='text-center' style='width:15%'>".($options['hide-total'] ? tr('Importo ivato', [], ['upper' => true]) : tr('Importo', [], ['upper' => true])).'</th>';
}
@ -273,13 +277,13 @@ foreach ($righe as $key => $riga) {
echo '
</td>';
// Iva
echo '
<td class="text-center" style="vertical-align: middle">
'.Translator::numberToLocale($riga->aliquota->percentuale, 2).'
</td>';
if (!$options['no-iva']) {
// Iva
echo '
<td class="text-center" style="vertical-align: middle">
'.Translator::numberToLocale($riga->aliquota->percentuale, 2).'
</td>';
}
// Imponibile
echo '
<td class="text-right" style="vertical-align: middle" >
@ -293,8 +297,11 @@ foreach ($righe as $key => $riga) {
if ($options['pricing']) {
echo '
<td></td>
<td></td>
<td></td>';
if (!$options['no-iva']) {
echo '
<td></td>';
}
}
}
}
@ -314,8 +321,9 @@ foreach ($righe as $key => $riga) {
<td colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
'.moneyFormat($subtotale_gruppo, 2).'
</td>
</tr>
</tr>';
if (!$options['no-iva']) {
echo '
<tr>
<td colspan="'.($options['show-only-total'] ? 2 : 5).'" class="text-right">
<b>'.tr('Iva', [], ['upper' => true]).':</b>
@ -324,16 +332,15 @@ foreach ($righe as $key => $riga) {
'.moneyFormat($iva_gruppo, 2).'
</td>
</tr>
<tr>
<td colspan="'.($options['show-only-total'] ? 2 : 5).'" class="text-right">
<td colspan="'.($options['show-only-total'] ? 2 : 4).'" class="text-right">
<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>
</td>
</tr>';
}
$autofill->next();
$autofill->next();
$autofill->next();
@ -360,11 +367,11 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
// Totale imponibile
echo '
<tr>
<td colspan="'.($options['show-only-total'] ? 2 : 4).'" class="text-right border-top">
<td colspan="'.($options['show-only-total'] ? ($options['no-iva'] ? 3 : 2) : 4).'" class="text-right border-top">
<b>'.tr('Imponibile', [], ['upper' => true]).':</b>
</td>
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
<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>
</th>
</tr>';
@ -396,56 +403,66 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
}
// IVA
echo '
<tr>
<td colspan="'.($options['show-only-total'] ? 2 : 4).'" class="text-right border-top">
<b>'.tr('Totale IVA', [], ['upper' => true]).':</b>
</td>
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
<b>'.moneyFormat($totale_iva, 2).'</b>
</th>
</tr>';
// TOTALE
echo '
<tr>
<td colspan="'.($options['show-only-total'] ? 2 : 4).'" class="text-right border-top">
<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>
</th>
</tr>';
if ($sconto_finale) {
// SCONTO IN FATTURA
if (!$options['no-iva']) {
echo '
<tr>
<td colspan="'.($options['show-only-total'] ? 2 : 4).'" class="text-right border-top">
<b>'.tr('Sconto in fattura', [], ['upper' => true]).':</b>
<b>'.tr('Totale IVA', [], ['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($totale_iva, 2).'</b>
</th>
</tr>';
// NETTO A PAGARE
// TOTALE
echo '
<tr>
<td colspan="'.($options['show-only-total'] ? 2 : 4).'" class="text-right border-top">
<b>'.tr('Netto a pagare', [], ['upper' => true]).':</b>
<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($netto_a_pagare, 2).'</b>
<b>'.moneyFormat($totale, 2).'</b>
</th>
</tr>';
if ($sconto_finale) {
// SCONTO IN FATTURA
echo '
<tr>
<td colspan="'.($options['show-only-total'] ? 2 : 4).'" class="text-right border-top">
<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>
</th>
</tr>';
// NETTO A PAGARE
echo '
<tr>
<td colspan="'.($options['show-only-total'] ? 2 : 4).'" class="text-right border-top">
<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>
</th>
</tr>';
}
}
}
echo '
</table>';
if ($options['no-iva']) {
echo '
<p colspan="3" class="text-right text-muted">
<small>Importo IVA esclusa</small>
</p>
';
}
// CONDIZIONI GENERALI DI FORNITURA
echo '

View File

@ -41,7 +41,7 @@ if (!empty(get('date_end'))) {
$date_end = get('date_end');
}
if (get('id_anagrafica') != 'null') {
if (get('id_anagrafica') && get('id_anagrafica') != 'null') {
$module_query = str_replace('1=1', '1=1 AND co_scadenziario.idanagrafica="'.get('id_anagrafica').'"', $module_query);
$id_anagrafica = get('id_anagrafica');
}

View File

@ -30,3 +30,6 @@ ORDER BY
-- Serial in Contratti
ALTER TABLE `mg_prodotti` ADD `id_riga_contratto` INT NULL AFTER `id_riga_intervento`;
ALTER TABLE `mg_prodotti` ADD FOREIGN KEY (`id_riga_contratto`) REFERENCES `co_righe_contratti`(`id`) ON DELETE CASCADE;
-- Aggiunta stampa preventivo (solo totale imponibile)
INSERT INTO `zz_prints` (`id_module`, `is_record`, `name`, `title`, `filename`, `directory`, `previous`, `options`, `icon`, `version`, `compatibility`, `order`, `predefined`, `default`, `enabled`, `available_options`) VALUES ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Preventivi'), '1', 'Preventivo(solo totale imponibile)', 'Preventivo (solo totale imponibile)', 'Preventivo num. {numero} del {data} rev {revisione}', 'preventivi', 'idpreventivo', '{\"pricing\": false, \"last-page-footer\": true, \"images\": true, \"no-iva\":true, \"show-only-total\":true }', 'fa fa-print', '', '', '0', '0', '1', '1', '{\"pricing\":\"Visualizzare i prezzi\", \"hide-total\": \"Nascondere i totali delle righe\", \"show-only-total\": \"Visualizzare solo i totali del documento\", \"hide-header\": \"Nascondere intestazione\", \"hide-footer\": \"Nascondere footer\", \"last-page-footer\": \"Visualizzare footer solo su ultima pagina\", \"hide-item-number\": \"Nascondere i codici degli articoli\"}');