Merge branch 'master' of https://github.com/devcode-it/openstamanager
This commit is contained in:
commit
d2c666ce18
14
README.md
14
README.md
|
@ -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
|
||||
|
|
|
@ -1238,3 +1238,7 @@ kbd{
|
|||
.read-more-target:target {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.fc-day-today {
|
||||
background:#fafad2 !important;
|
||||
}
|
|
@ -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'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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.tà').'</th>';
|
||||
if ($dir == 'entrata') {
|
||||
echo '<th class="text-center" width="150">'.tr('Costo unitario').'</th>';
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 '
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
|
|
|
@ -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\"}');
|
Loading…
Reference in New Issue