Merge branch 'master' of https://github.com/devcode-it/openstamanager
This commit is contained in:
commit
3ec3928026
|
@ -46,8 +46,6 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
|
|||
- Aggiunta stampa del bilancio
|
||||
- Aggiunta possibilità di notificare al cliente/tecnico in modo automatico quando viene cambiato lo stato dell'intervento
|
||||
- Aggiunta flag per escludere la generazione scadenza di una ritenuta d'acconto se viene versata dal fornitore
|
||||
- Aggiunta stampa fattura elettronica nelle fatture di vendita e di acquisto
|
||||
- Aggiunta azione massiva per esportare le stampe delle fatture elettroniche
|
||||
|
||||
### Modificato (Changed)
|
||||
- Impostazione CAP automatico a 99999 nella FE per clienti esteri
|
||||
|
|
1
add.php
1
add.php
|
@ -91,7 +91,6 @@ $(document).ready(function(){
|
|||
select = "#'.get('select').'";
|
||||
if ($(select).val() !== undefined) {
|
||||
$(select).selectSetNew(response.id, response.text, response.data);
|
||||
$(select).change();
|
||||
}
|
||||
|
||||
$form.closest("div[id^=bs-popup").modal("hide");
|
||||
|
|
|
@ -55,8 +55,7 @@
|
|||
"symfony/polyfill-php70": "^1.8",
|
||||
"symfony/translation": "^3.3",
|
||||
"symfony/var-dumper": "^3.3",
|
||||
"willdurand/geocoder": "^3.3",
|
||||
"ckeditor/ckeditor": "dev-full/stable"
|
||||
"willdurand/geocoder": "^3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"codeception/codeception": "^3.0",
|
||||
|
|
|
@ -274,8 +274,8 @@ function srcFonts() {
|
|||
|
||||
function ckeditor() {
|
||||
return gulp.src([
|
||||
'./vendor/ckeditor/ckeditor/{adapters,lang,skins,plugins}/**/*.{js,json,css,png}',
|
||||
'./vendor/ckeditor/ckeditor/*.{js,css}',
|
||||
config.nodeDirectory + '/ckeditor4/{adapters,lang,skins,plugins}/**/*.{js,json,css,png}',
|
||||
config.nodeDirectory + '/ckeditor4/*.{js,css}',
|
||||
])
|
||||
.pipe(gulp.dest(config.production + '/' + config.paths.js + '/ckeditor'));
|
||||
}
|
||||
|
@ -345,7 +345,7 @@ function i18n() {
|
|||
config.nodeDirectory + '/**/{i18n,lang,locale,locales}/*.{js,json}',
|
||||
config.development + '/' + config.paths.js + '/i18n/**/*.{js,json}',
|
||||
'!' + config.nodeDirectory + '/**/{src,plugins}/**',
|
||||
'!./vendor/ckeditor/ckeditor/**',
|
||||
'!' + config.nodeDirectory + '/ckeditor4/**',
|
||||
'!' + config.nodeDirectory + '/summernote/**',
|
||||
'!' + config.nodeDirectory + '/jquery-ui/**',
|
||||
])
|
||||
|
|
|
@ -450,10 +450,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
|
|||
</div>';
|
||||
} else {
|
||||
echo '
|
||||
<div class="alert alert-info">
|
||||
'.tr('Non sono presenti banche per l\'anagrafica').'... '.Modules::link('Banche', null, tr('Creane una')).'
|
||||
</div>';
|
||||
|
||||
<p>'.tr("Nessuna banca disponibile per l'Anagrafica").'</p>';
|
||||
}
|
||||
|
||||
echo '
|
||||
|
@ -680,7 +677,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
|
|||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{[ "type": "checkbox", "label": "<?php echo tr('Opt-out per newsletter'); ?>", "name": "disable_newsletter", "value": "<?php echo empty($record['enable_newsletter']); ?>" ]}
|
||||
{[ "type": "checkbox", "label": "<?php echo tr('Opt-out newsletter'); ?>", "name": "disable_newsletter", "value": "<?php echo empty($record['enable_newsletter']); ?>" ]}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -101,7 +101,7 @@ include_once __DIR__.'/../../core.php';
|
|||
<script>
|
||||
$(document).ready(function () {
|
||||
var sub = $('#add-form').find('#subcategoria_add');
|
||||
var original = sub.parent().find(".input-group-addon button").attr("onclick");
|
||||
var original = sub.parent().find(".input-group-addon button").data("href");
|
||||
|
||||
$('#add-form').find('#categoria').change(function() {
|
||||
updateSelectOption("id_categoria", $(this).val());
|
||||
|
@ -111,7 +111,7 @@ $(document).ready(function () {
|
|||
|
||||
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()));
|
||||
sub.parent().find(".input-group-addon button").data("href", original + "&id_original="+$(this).val());
|
||||
}
|
||||
else {
|
||||
sub.parent().find(".input-group-addon button").addClass("hide");
|
||||
|
|
|
@ -350,7 +350,7 @@ echo '
|
|||
} else {
|
||||
echo '
|
||||
<div class="alert alert-info">
|
||||
'.tr('Non sono presenti piani di sconto/rincaro').'... '.Modules::link('Piani di sconto/rincaro', null, tr('Crea il primo')).'
|
||||
'.tr('Non ci sono piani di sconto/rincaro caricati').'... '.Modules::link('Piani di sconto/rincaro', null, tr('Crea')).'
|
||||
</div>';
|
||||
}
|
||||
echo '
|
||||
|
|
|
@ -76,10 +76,6 @@ switch (post('op')) {
|
|||
$contratto->data_accettazione = post('data_accettazione');
|
||||
$contratto->data_conclusione = post('data_conclusione');
|
||||
|
||||
$contratto->rinnovabile = post('rinnovabile');
|
||||
$contratto->rinnovo_automatico = post('rinnovo_automatico');
|
||||
$contratto->giorni_preavviso_rinnovo = post('giorni_preavviso_rinnovo');
|
||||
$contratto->ore_preavviso_rinnovo = post('ore_preavviso_rinnovo');
|
||||
$contratto->esclusioni = post('esclusioni');
|
||||
$contratto->descrizione = post('descrizione');
|
||||
$contratto->id_documento_fe = post('id_documento_fe');
|
||||
|
@ -111,6 +107,17 @@ switch (post('op')) {
|
|||
|
||||
break;
|
||||
|
||||
case 'update_rinnovo':
|
||||
|
||||
$contratto->rinnovabile = post('rinnovabile');
|
||||
$contratto->rinnovo_automatico = post('rinnovo_automatico');
|
||||
$contratto->giorni_preavviso_rinnovo = post('giorni_preavviso_rinnovo');
|
||||
$contratto->ore_preavviso_rinnovo = post('ore_preavviso_rinnovo');
|
||||
$contratto->save();
|
||||
flash()->info(tr('Contratto modificato correttamente!'));
|
||||
|
||||
break;
|
||||
|
||||
// Duplica contratto
|
||||
case 'copy':
|
||||
$new = $contratto->replicate();
|
||||
|
|
|
@ -108,37 +108,10 @@ $block_edit = $record['is_completato'];
|
|||
{[ "type": "number", "label": "<?php echo tr('Validità contratto'); ?>", "name": "validita", "decimals": "0", "value": "$validita$", "icon-after": "choice|period|<?php echo $record['tipo_validita']; ?>", "help": "<?php echo tr('Il campo Validità contratto viene utilizzato per il calcolo della Data di conclusione del contratto'); ?>" ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
{[ "type": "checkbox", "label": "<?php echo tr('Rinnovabile'); ?>", "name": "rinnovabile", "help": "<?php echo tr('Il contratto è rinnovabile?'); ?>", "value": "$rinnovabile$" ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
{[ "type": "checkbox", "label": "<?php echo tr('Rinnovo automatico'); ?>", "name": "rinnovo_automatico", "help": "<?php echo tr('Il contratto è da rinnovare automaticamente alla scadenza'); ?>", "value": "$rinnovo_automatico$", "disabled": <?php echo $record['rinnovabile'] ? 0 : 1; ?> ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
{[ "type": "number", "label": "<?php echo tr('Preavviso per rinnovo'); ?>", "name": "giorni_preavviso_rinnovo", "decimals": "2", "value": "$giorni_preavviso_rinnovo$", "icon-after": "giorni", "disabled": <?php echo $record['rinnovabile'] ? 0 : 1; ?> ]}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
|
||||
<div class="col-md-3">
|
||||
{[ "type": "number", "label": "<?php echo tr('Ore rimanenti rinnovo'); ?>", "name": "ore_preavviso_rinnovo", "decimals": "2", "value": "$ore_preavviso_rinnovo$", "icon-after": "ore", "disabled": <?php echo $record['rinnovabile'] ? 0 : 1; ?>, "help": "<?php echo tr('Ore residue nel contratto prima di visualizzare una avviso per un eventuale rinnovo anticipato.'); ?>" ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-9">
|
||||
{[ "type": "select", "multiple": "1", "label": "<?php echo tr('Impianti'); ?>", "name": "matricolaimpianto[]", "values": "query=SELECT idanagrafica, id AS id, IF(nome = '', matricola, CONCAT(matricola, ' - ', nome)) AS descrizione FROM my_impianti WHERE idanagrafica='$idanagrafica$' ORDER BY descrizione", "value": "$idimpianti$", "icon-after": "add|<?php echo Modules::get('Impianti')['id']; ?>|||<?php echo (empty($block_edit)) ? '' : 'disabled'; ?>" ]}
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
|
|
@ -188,7 +188,7 @@ if ($module['name'] == 'Ddt di vendita') {
|
|||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
{[ "type": "timestamp", "label": "<?php echo tr('Data ora trasporto'); ?>", "name": "data_ora_trasporto", "required": 0, "value": "$data_ora_trasporto$", "help": "<?php echo tr('Data e ora inizio del trasporto'); ?>" ]}
|
||||
{[ "type": "timestamp", "label": "<?php echo tr('Data ora trasporto'); ?>", "name": "data_ora_trasporto", "required": 0, "value": "$data_ora_trasporto$" ]}
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
|
|
@ -42,7 +42,7 @@ class EmailHook extends Manager
|
|||
$accounts = Account::all();
|
||||
$remaining = Mail::whereNull('sent_at')
|
||||
->where($failed)
|
||||
->where('attempt', '<', 10)
|
||||
->where('attempt', '<', setting('Numero massimo di tentativi'))
|
||||
->whereIn('id_account', $accounts->pluck('id'))
|
||||
->count();
|
||||
|
||||
|
@ -74,7 +74,7 @@ class EmailHook extends Manager
|
|||
$mail = Mail::whereNull('sent_at')
|
||||
->where('id_account', $account->id)
|
||||
->where($failed)
|
||||
->where('attempt', '<', 10)
|
||||
->where('attempt', '<', setting('Numero massimo di tentativi'))
|
||||
->orderBy('created_at')
|
||||
->first();
|
||||
|
||||
|
@ -103,14 +103,14 @@ class EmailHook extends Manager
|
|||
$user = auth()->getUser();
|
||||
|
||||
$current = Mail::whereDate('sent_at', '>', $yesterday)
|
||||
->where('attempt', '<', 10)
|
||||
->where('attempt', '<', setting('Numero massimo di tentativi'))
|
||||
->where('created_by', $user->id)
|
||||
->count();
|
||||
$total = Mail::where(function ($query) use ($yesterday) {
|
||||
$query->whereDate('sent_at', '>', $yesterday)
|
||||
->orWhereNull('sent_at');
|
||||
})
|
||||
->where('attempt', '<', 10)
|
||||
->where('attempt', '<', setting('Numero massimo di tentativi'))
|
||||
->where('created_by', $user->id)
|
||||
->count();
|
||||
|
||||
|
|
|
@ -65,48 +65,6 @@ switch (post('op')) {
|
|||
|
||||
break;
|
||||
|
||||
case 'exportFE-bulk':
|
||||
$dir = base_dir().'/files/export_fatture/';
|
||||
directory($dir.'tmp/');
|
||||
|
||||
$dir = slashes($dir);
|
||||
$zip = slashes($dir.'fattureFE_'.time().'.zip');
|
||||
|
||||
// Rimozione dei contenuti precedenti
|
||||
$files = glob($dir.'/*.zip');
|
||||
foreach ($files as $file) {
|
||||
delete($file);
|
||||
}
|
||||
|
||||
$module = Modules::get($id_module);
|
||||
|
||||
if ($module['name'] == 'Fatture di vendita') {
|
||||
$print_name = 'Fattura elettronica di vendita';
|
||||
} else {
|
||||
$print_name = 'Fattura elettronica di acquisto';
|
||||
}
|
||||
$print = $dbo->SelectOne('zz_prints', 'id', ['name' => $print_name]);
|
||||
|
||||
if (!empty($id_records)) {
|
||||
foreach ($id_records as $id_record) {
|
||||
|
||||
Prints::render($print['id'], $id_record, $dir.'tmp/');
|
||||
}
|
||||
|
||||
// Creazione zip
|
||||
if (extension_loaded('zip')) {
|
||||
Zip::create($dir.'tmp/', $zip);
|
||||
|
||||
// Invio al browser dello zip
|
||||
download($zip);
|
||||
|
||||
// Rimozione dei contenuti
|
||||
delete($dir.'tmp/');
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'genera-xml':
|
||||
$failed = [];
|
||||
$added = [];
|
||||
|
@ -559,17 +517,6 @@ if ($module->name == 'Fatture di vendita') {
|
|||
],
|
||||
];
|
||||
|
||||
$operations['exportFE-bulk'] = [
|
||||
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta stampe FE').'</span>',
|
||||
'data' => [
|
||||
'title' => '',
|
||||
'msg' => tr('Vuoi davvero esportare i PDF delle fatture elettroniche selezionate in un archivio ZIP?'),
|
||||
'button' => tr('Procedi'),
|
||||
'class' => 'btn btn-lg btn-warning',
|
||||
'blank' => true,
|
||||
],
|
||||
];
|
||||
|
||||
$operations['check-bulk'] = [
|
||||
'text' => '<span><i class="fa fa-list-alt"></i> '.tr('Controlla fatture elettroniche').'</span>',
|
||||
'data' => [
|
||||
|
|
|
@ -33,51 +33,37 @@ if ($dir == 'entrata') {
|
|||
$conto = 'acquisti';
|
||||
}
|
||||
|
||||
// Informazioni sulla dichiarazione d'intento, visibili solo finchè la fattura è in bozza
|
||||
// Informazioni sulla dichiarazione d'intento
|
||||
if ($dir == 'entrata' && !empty($fattura->dichiarazione) && $fattura->stato->descrizione == 'Bozza') {
|
||||
$diff = $fattura->dichiarazione->massimale - $fattura->dichiarazione->totale;
|
||||
|
||||
$id_iva = setting("Iva per lettere d'intento");
|
||||
$iva = Aliquota::find($id_iva);
|
||||
|
||||
if (!empty($iva)){
|
||||
|
||||
if ($diff > 0) {
|
||||
echo '
|
||||
<div class="alert alert-info">
|
||||
<div class="alert alert-info">
|
||||
<i class="fa fa-warning"></i> '.tr("La fattura è collegata a una dichiarazione d'intento con diponibilità di _MONEY_: per collegare una riga alla dichiarazione è sufficiente inserire come IVA _IVA_", [
|
||||
'_MONEY_' => moneyFormat(abs($diff)),
|
||||
'_IVA_' => '"'.$iva->descrizione.'"',
|
||||
]).'.</b>
|
||||
</div>';
|
||||
</div>';
|
||||
} elseif ($diff == 0) {
|
||||
echo '
|
||||
<div class="alert alert-warning">
|
||||
<div class="alert alert-warning">
|
||||
<i class="fa fa-warning"></i> '.tr("La dichiarazione d'intento ha raggiunto il massimale previsto di _MONEY_: le nuove righe della fattura devono presentare IVA diversa da _IVA_", [
|
||||
'_MONEY_' => moneyFormat(abs($fattura->dichiarazione->massimale)),
|
||||
'_IVA_' => '"'.$iva->descrizione.'"',
|
||||
]).'.</b>
|
||||
</div>';
|
||||
</div>';
|
||||
} else {
|
||||
echo '
|
||||
<div class="alert alert-danger">
|
||||
<div class="alert alert-danger">
|
||||
<i class="fa fa-warning"></i> '.tr("La dichiarazione d'intento ha superato il massimale previsto di _MONEY_: per rimuovere righe della fattura dalla dichiarazione è sufficiente modificare l'IVA in qualcosa di diverso da _IVA_", [
|
||||
'_MONEY_' => moneyFormat(abs($diff)),
|
||||
'_IVA_' => '"'.$iva->descrizione.'"',
|
||||
]).'.</b>
|
||||
</div>';
|
||||
}
|
||||
|
||||
}else{
|
||||
|
||||
//TODO link ad impostazioni con nuova ricerca rapida
|
||||
echo '
|
||||
<div class="alert alert-warning">
|
||||
<i class="fa fa-warning"></i> '.tr("Attenzione nessuna aliq. IVA definita per la dichiarazione d'intento. _SETTING_", [
|
||||
'_SETTING_' => Modules::link("Impostazioni", $dbo->fetchOne("SELECT `id` FROM `zz_settings` WHERE nome=\"Iva per lettere d'intento\"")['id'], tr('Selezionala dalle impostazioni')),
|
||||
]).'
|
||||
</div>';
|
||||
|
||||
</div>';
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -381,12 +367,7 @@ elseif ($record['stato'] == 'Bozza') {
|
|||
}
|
||||
if ($dir == 'entrata') {
|
||||
echo '
|
||||
<div class="col-md-3">';
|
||||
|
||||
if (!empty($record['id_dichiarazione_intento'])) {
|
||||
echo Plugins::link("Dichiarazioni d'Intento", $record['idanagrafica'], null, null, 'class="pull-right"');
|
||||
}
|
||||
echo '
|
||||
<div class="col-md-3">
|
||||
{[ "type": "select", "label": "'.tr("Dichiarazione d'intento").'", "name": "id_dichiarazione_intento", "ajax-source": "dichiarazioni_intento", "select-options": {"idanagrafica": '.$record['idanagrafica'].', "data": "'.$record['data'].'"},"value": "$id_dichiarazione_intento$" ]}
|
||||
</div>';
|
||||
}
|
||||
|
|
|
@ -173,7 +173,7 @@ foreach ($righe as $riga) {
|
|||
// Iva
|
||||
echo '
|
||||
<td class="text-right">
|
||||
'.moneyFormat($riga->iva_unitaria-$riga->sconto_iva_unitario).'
|
||||
'.moneyFormat($riga->iva_unitaria).'
|
||||
<br><small class="'.(($riga->aliquota->deleted_at) ? 'text-red' : '').' text-muted">'.$riga->aliquota->descrizione.(($riga->aliquota->esente) ? ' ('.$riga->aliquota->codice_natura_fe.')' : null).'</small>
|
||||
</td>';
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ echo '
|
|||
<div class="panel-heading">
|
||||
<h3 class="panel-title">
|
||||
'.tr('Dettagli scadenza').'
|
||||
<button type="button" class="btn btn-xs btn-info pull-right tip '.(empty($documento) ? 'disabled' : '').'" id="add-scadenza" '.(empty($documento) ? 'disabled' : '').' title="È possibile aggiungere scadenze solo se è presente il collegamento a un documento, in caso contrario è consigliato creare più scadenze con la stessa descrizione">
|
||||
<button type="button" class="btn btn-xs btn-info pull-right '.(empty($documento) ? 'disabled' : '').'" id="add-scadenza" '.(empty($documento) ? 'disabled' : '').'>
|
||||
<i class="fa fa-plus"></i> '.tr('Aggiungi scadenza').'
|
||||
</button>
|
||||
</h3>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
"bootstrap-colorpicker": "2.5.1",
|
||||
"bootstrap-daterangepicker": "^2.1.25",
|
||||
"chart.js": "^2.7.0",
|
||||
"ckeditor4": "^4.16.0",
|
||||
"ckeditor4": "^4.14.1",
|
||||
"components-jqueryui": "^1.12.1",
|
||||
"datatables.net-bs": "^1.10.15",
|
||||
"datatables.net-buttons-bs": "^1.3.1",
|
||||
|
|
|
@ -58,11 +58,11 @@ echo '
|
|||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "date", "label": "'.tr('Data protocollo').'", "name": "data_protocollo", "required": 1 ]}
|
||||
{[ "type": "date", "label": "'.tr('Data protocollo').'", "name": "data_protocollo" ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
{[ "type": "date", "label": "'.tr('Data di emissione').'", "name": "data_emissione", "required": 1 ]}
|
||||
{[ "type": "date", "label": "'.tr('Data di emissione').'", "name": "data_emissione" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -57,11 +57,11 @@ echo '
|
|||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "date", "label": "'.tr('Data protocollo').'", "name": "data_protocollo", "required": 1, "value": "'.$record['data_protocollo'].'" ]}
|
||||
{[ "type": "date", "label": "'.tr('Data protocollo').'", "name": "data_protocollo", "value": "'.$record['data_protocollo'].'" ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
{[ "type": "date", "label": "'.tr('Data di emissione').'", "name": "data_emissione", "required": 1, "value": "'.$record['data_emissione'].'" ]}
|
||||
{[ "type": "date", "label": "'.tr('Data di emissione').'", "name": "data_emissione", "value": "'.$record['data_emissione'].'" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -410,7 +410,7 @@ if (!empty($righe)) {
|
|||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
{[ "type": "select", "name": "selezione_riferimento['.$key.']", "ajax-source": "riferimenti-fe", "select-options": '.json_encode(['id_anagrafica' => $anagrafica ? $anagrafica->id : '']).', "label": "'.tr('Riferimento').'", "help": "'.tr('Articoli contenuti in Ordini o DDT del Fornitore').'", "icon-after": '.json_encode('<button type="button" onclick="rimuoviRiferimento(this)" class="btn btn-primary disabled" id="rimuovi_riferimento_'.$key.'"><i class="fa fa-close"></i></button>').' ]}
|
||||
{[ "type": "select", "name": "selezione_riferimento['.$key.']", "ajax-source": "riferimenti-fe", "select-options": '.json_encode(['id_anagrafica' => $anagrafica ? $anagrafica->id : '']).', "label": "'.tr('Riferimento').'", "icon-after": '.json_encode('<button type="button" onclick="rimuoviRiferimento(this)" class="btn btn-primary disabled" id="rimuovi_riferimento_'.$key.'"><i class="fa fa-close"></i></button>').' ]}
|
||||
</div>
|
||||
</td>
|
||||
</tr>';
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.r.l.
|
||||
* Copyright (C) DevCode s.n.c.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -18,12 +18,15 @@
|
|||
*/
|
||||
|
||||
use Modules\Contratti\Components\Riga;
|
||||
use Modules\Contratti\Components\Articolo;
|
||||
use Modules\Articoli\Articolo as ArticoloOriginale;
|
||||
use Modules\Contratti\Contratto;
|
||||
use Modules\Fatture\Fattura;
|
||||
use Modules\Fatture\Tipo;
|
||||
use Plugins\PianificazioneFatturazione\Pianificazione;
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
include_once __DIR__.'/../modutil.php';
|
||||
|
||||
$operazione = filter('op');
|
||||
|
||||
|
@ -32,50 +35,104 @@ switch ($operazione) {
|
|||
case 'add':
|
||||
$contratto = Contratto::find($id_record);
|
||||
|
||||
if(post('scadenza')=='Mensile'){
|
||||
$timeing = '+1 month';
|
||||
}
|
||||
if(post('scadenza')=='Bimestrale'){
|
||||
$timeing = '+2 month';
|
||||
}
|
||||
if(post('scadenza')=='Trimestrale'){
|
||||
$timeing = '+3 month';
|
||||
}
|
||||
if(post('scadenza')=='Quadrimestrale'){
|
||||
$timeing = '+4 month';
|
||||
}
|
||||
if(post('scadenza')=='Semestrale'){
|
||||
$timeing = '+6 month';
|
||||
}
|
||||
if(post('scadenza')=='Annuale'){
|
||||
$timeing = '+12 month';
|
||||
}
|
||||
|
||||
$selezioni = collect(post('selezione_periodo'));
|
||||
$periodi = post('periodo');
|
||||
|
||||
$numero_fatture = 0;
|
||||
$date_pianificazioni = [];
|
||||
$pianificazioni = [];
|
||||
foreach ($selezioni as $key => $selezione) {
|
||||
$data_scadenza = $periodi[$key];
|
||||
if( $numero_fatture==0 && !empty(post('data_inizio')) ){
|
||||
$date = new DateTime(post('data_inizio'));
|
||||
}else{
|
||||
$date = new DateTime($periodi[$key]);
|
||||
|
||||
if(post('cadenza_fatturazione')=='Inizio'){
|
||||
$date->modify('first day of this month');
|
||||
}elseif( post('cadenza_fatturazione')=='Giorno' && !empty(post('giorno_fisso')) ){
|
||||
$date->modify('last day of this month');
|
||||
$last_day = $date->format('d');
|
||||
$day = post('giorno_fisso') > $last_day ? $last_day : post('giorno_fisso');
|
||||
|
||||
// Correzione data
|
||||
$date->setDate($date->format('Y'), $date->format('m'), $day);
|
||||
}
|
||||
}
|
||||
|
||||
// Comversione della data in stringa standard
|
||||
$data_scadenza = $date->format('Y-m-d');
|
||||
|
||||
++$numero_fatture;
|
||||
|
||||
// Creazione pianificazione
|
||||
Pianificazione::build($contratto, $data_scadenza);
|
||||
$pianificazione = Pianificazione::build($contratto, $data_scadenza);
|
||||
$date_pianificazioni[] = $data_scadenza;
|
||||
$pianificazioni[$numero_fatture] = $pianificazione->id;
|
||||
}
|
||||
|
||||
if ($numero_fatture > 0) {
|
||||
// Rimozione righe precedenti del contratto
|
||||
$righe_contratto = $contratto->getRighe();
|
||||
$iva_righe = collect($righe_contratto->toArray())->groupBy('idiva');
|
||||
foreach ($righe_contratto as $riga) {
|
||||
$riga->delete();
|
||||
}
|
||||
$subtotale = [];
|
||||
|
||||
// Creazione nuove righe
|
||||
$descrizioni = post('descrizione');
|
||||
$qta = post('qta');
|
||||
foreach ($iva_righe as $id_iva => $righe) {
|
||||
$iva = $righe->first()->aliquota;
|
||||
$righe = $righe->toArray();
|
||||
|
||||
$totale = sum(array_column($righe, setting('Utilizza prezzi di vendita comprensivi di IVA') ? 'totale' : 'totale_imponibile'));
|
||||
|
||||
$qta_riga = $qta[$id_iva];
|
||||
$descrizione_riga = $descrizioni[$id_iva];
|
||||
|
||||
$prezzo_unitario = $totale / $qta_riga / $numero_fatture;
|
||||
|
||||
foreach($righe_contratto as $r){
|
||||
$qta_evasa = $r->qta_evasa;
|
||||
$data_scadenza = '';
|
||||
$inizio = $date_pianificazioni[0];
|
||||
$fine = date("Y-m-d", strtotime($inizio.' -1 days'));
|
||||
$fine = date("Y-m-d", strtotime($fine." ".$timeing));
|
||||
for ($rata = 1; $rata <= $numero_fatture; ++$rata) {
|
||||
$riga = Riga::build($contratto);
|
||||
if( $qta_evasa<$r->qta ){
|
||||
$qta_riga = ($qta[$r->id]<=($r->qta-$qta_evasa) ? $qta[$r->id] : ($r->qta-$qta_evasa) );
|
||||
$descrizione = post('descrizione')[$r->id];
|
||||
|
||||
$riga->descrizione = $descrizione_riga;
|
||||
$riga->setPrezzoUnitario($prezzo_unitario, $id_iva);
|
||||
$descrizione = variables($descrizione, $inizio, $fine)['descrizione'];
|
||||
|
||||
$inizio = $fine;
|
||||
$fine = date("Y-m-d", strtotime($timeing, strtotime($inizio)));
|
||||
$inizio = date("Y-m-d", strtotime($inizio.' +1 days'));
|
||||
|
||||
$prezzo_unitario = ($r->subtotale / $r->qta);
|
||||
|
||||
if( !empty($r->idarticolo) ){
|
||||
$articolo = ArticoloOriginale::find($r->idarticolo);
|
||||
$riga = Articolo::build($contratto, $articolo);
|
||||
}else{
|
||||
$riga = Riga::build($contratto);
|
||||
}
|
||||
|
||||
$riga->descrizione = $descrizione;
|
||||
$riga->setPrezzoUnitario($prezzo_unitario, $r->idiva);
|
||||
$riga->qta = $qta_riga;
|
||||
$riga->idpianificazione = $pianificazioni[$rata];
|
||||
|
||||
$riga->save();
|
||||
|
||||
$qta_evasa += $qta_riga;
|
||||
}
|
||||
}
|
||||
$r->delete();
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.r.l.
|
||||
* Copyright (C) DevCode s.n.c.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -20,9 +20,18 @@
|
|||
use Modules\Contratti\Contratto;
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
include_once __DIR__.'/../modutil.php';
|
||||
|
||||
$contratto = Contratto::find($id_record);
|
||||
|
||||
$giorni_fatturazione = [];
|
||||
for ($i = 1; $i <= 31; ++$i) {
|
||||
$giorni_fatturazione[] = [
|
||||
'id' => $i,
|
||||
'text' => $i,
|
||||
];
|
||||
}
|
||||
|
||||
echo '
|
||||
<form action="" method="post">
|
||||
<input type="hidden" name="op" value="add">
|
||||
|
@ -35,33 +44,34 @@ echo '
|
|||
<ul class="nav nav-tabs nav-justified">
|
||||
<li class="active"><a href="#periodi" data-tab="periodi" onclick="apriTab(this)" data-toggle="tab">'.tr('Periodi').'</a></li>
|
||||
|
||||
<li><a href="#div_righe" data-tab="div_righe" onclick="apriTab(this)" data-toggle="tab">'.tr('Righe').'</a></li>
|
||||
<li><a href="#div_righe" data-tab="righe" data-toggle="tab">'.tr('Righe').'</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane active" id="periodi">
|
||||
<div class="row">';
|
||||
|
||||
$data_corrente = $contratto->data_accettazione->startOfMonth();
|
||||
$data_conclusione = $contratto->data_conclusione;
|
||||
$count = 0;
|
||||
while ($data_corrente->lessThanOrEqualTo($data_conclusione)) {
|
||||
$data = $data_corrente->endOfMonth()->format('Y-m-d');
|
||||
|
||||
echo '
|
||||
<br>
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
<label for="m_'.$count.'">
|
||||
<input type="checkbox" class="unblockable" id="m_'.$count.'" name="selezione_periodo['.$count.']" />
|
||||
'.ucfirst($data_corrente->formatLocalized('%B %Y')).'
|
||||
</label>
|
||||
<input type="hidden" name="periodo['.$count.']" value="'.$data.'">
|
||||
</div>';
|
||||
|
||||
$data_corrente = $data_corrente->addDay();
|
||||
++$count;
|
||||
}
|
||||
|
||||
echo '
|
||||
{[ "type": "select", "label": "'.tr('Ricorrenza fatturazione').'", "name": "scadenza", "values": "list=\"\":\"Seleziona un\'opzione\", \"Mensile\":\"Mensile\", \"Bimestrale\":\"Bimestrale\", \"Trimestrale\":\"Trimestrale\", \"Quadrimestrale\":\"Quadrimestrale\", \"Semestrale\":\"Semestrale\", \"Annuale\":\"Annuale\"", "value": "Mensile", "help":"'.tr('Specificare la cadenza con cui creare la pianificazione fatturazione').'" ]}
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
{[ "type": "select", "label": "'.tr('Giorno di fatturazione').'", "name": "cadenza_fatturazione", "values": "list=\"\":\"Seleziona un\'opzione\", \"Inizio\":\"Inizio mese\", \"Fine\":\"Fine mese\", \"Giorno\":\"Giorno fisso\" ", "value": "Inizio", "help":"'.tr('Specificare per la pianificazione fatturazione se si desidera creare le fatture a inizio mese o alla fine. Se non specificata alcuna opzione saranno create di default a fine mese.').'" ]}
|
||||
</div>
|
||||
<div class="col-md-3" id="div_giorno_fisso" hidden>
|
||||
{[ "type": "select", "label": "'.tr('Giorno fisso fatturazione').'", "name": "giorno_fisso", "values": '.json_encode($giorni_fatturazione).', "value": "1", "help":"'.tr('Selezionare il giorno fisso di fatturazione.').'" ]}
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
{[ "type": "date", "label": "'.tr('Data inizio fatturazione').'", "name": "data_inizio", "value": "'.$contratto->data_accettazione.'", "help":"'.tr('Data da cui far partire la prima fattura del contratto.').'" ]}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h4 id="total_check">Rate: 0</h4>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<div id="cadenza">
|
||||
<script>$("#cadenza").load(</script>
|
||||
</div>
|
||||
|
||||
<br>
|
||||
|
@ -84,33 +94,59 @@ echo '
|
|||
<div class="tab-pane" id="div_righe">';
|
||||
|
||||
$iva_righe = $contratto->getRighe()->groupBy('idiva');
|
||||
|
||||
/*
|
||||
foreach ($iva_righe as $id_iva => $righe) {
|
||||
$iva = $righe->first()->aliquota;
|
||||
$descrizione = $righe->first()->descrizione;
|
||||
$righe = $righe->toArray();
|
||||
*/
|
||||
|
||||
$righe = $contratto->getRighe();
|
||||
|
||||
echo '
|
||||
<div class="alert alert-info">
|
||||
<p>'.tr("Puoi utilizzare le seguenti variabili nella descrizione delle righe").':</p>'.variables()['list'].'
|
||||
</div>';
|
||||
|
||||
foreach ($righe as $riga) {
|
||||
$id_iva = $riga->id_iva;
|
||||
$descrizione = $riga->descrizione."\n{periodo}";
|
||||
|
||||
$options = [
|
||||
'id' => $riga->id,
|
||||
'totale_imponibile' => $riga->totale_imponibile,
|
||||
'iva' => $riga->iva,
|
||||
'totale' => $riga->totale,
|
||||
'qta' => $riga->qta,
|
||||
];
|
||||
$options = json_encode($options);
|
||||
|
||||
echo '
|
||||
<h5>'.tr('Informazioni generali sulle righe con IVA: _IVA_', [
|
||||
'_IVA_' => $iva->descrizione,
|
||||
]).'</h5>
|
||||
<!--h5>'.tr('Informazioni generali sulle righe con IVA: _IVA_', [
|
||||
'_IVA_' => $riga->iva->descrizione,
|
||||
]).'</h5-->
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9">
|
||||
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "descrizione['.$id_iva.']", "value": "'.tr('Canone contratto numero _NUM__IVA_', [
|
||||
'_IVA_' => (count($iva_righe) > 1) ? ': '.$iva->descrizione : '',
|
||||
'_NUM_' => $contratto->numero,
|
||||
]).'" ]}
|
||||
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "descrizione['.$riga->id.']", "value": "'.$descrizione.'" ]}
|
||||
|
||||
{[ "type": "number", "label": "'.tr('Q.tà per fattura').'", "name": "qta['.$id_iva.']", "required": 1, "value": "1", "decimals": "qta", "min-value": "1" ]}
|
||||
{[ "type": "number", "label": "'.tr('Q.tà per fattura').'", "class":"qta_fattura", "name": "qta['.$riga->id.']", "required": 1, "value": "1", "decimals": "qta", "min-value": "1", "icon-after":"'.tr('Su _TOT_',[
|
||||
'_TOT_' => Translator::numberToLocale( ($riga->qta-$riga->qta_evasa) ),
|
||||
]).'", "options":"'.str_replace('"','\"',$options).'" ]}
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<p><b>'.tr('Imponibile').'</b>: '.moneyFormat(sum(array_column($righe, 'totale_imponibile'))).'</p>
|
||||
<p><b>'.tr('IVA').'</b>: '.moneyFormat(sum(array_column($righe, 'iva'))).'</p>
|
||||
<p><b>'.tr('Totale').'</b>: '.moneyFormat(sum(array_column($righe, 'totale'))).'</p>
|
||||
<div class="col-md-3" id="totali_'.$riga->id.'">
|
||||
</div>
|
||||
</div>
|
||||
<hr>';
|
||||
}
|
||||
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-offset-9 col-md-3" id="div_totale">
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
</div>
|
||||
</div>
|
||||
|
@ -127,15 +163,98 @@ echo '
|
|||
<script>$(document).ready(init)</script>
|
||||
|
||||
<script>
|
||||
function selezionaTutto(){
|
||||
$(document).ready(function(){
|
||||
caricaCadenza();
|
||||
get_prezzi();
|
||||
});
|
||||
|
||||
$("#scadenza").change(function(){
|
||||
caricaCadenza();
|
||||
});
|
||||
|
||||
$("#data_inizio").focusout(function(){
|
||||
caricaCadenza();
|
||||
});
|
||||
|
||||
function caricaCadenza() {
|
||||
let container = $("#cadenza");
|
||||
|
||||
localLoading(container, true);
|
||||
return $.get("'.$structure->fileurl('ajax_cadenza.php').'?id_module='.$id_module.'&id_record='.$id_record.'&scadenza="+$("#scadenza").val()+"&data_inizio="+$("#data_inizio").val(), function(data) {
|
||||
container.html(data);
|
||||
localLoading(container, false);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
$("input:checkbox").click(function(){
|
||||
var check = 0;
|
||||
$("#periodi input").each(function (){
|
||||
if( $(this).is(":checked") ){
|
||||
check = check + 1;
|
||||
}
|
||||
});
|
||||
|
||||
$("#total_check").html("Rate: " + check).trigger("change");
|
||||
});
|
||||
|
||||
function selezionaTutto(){
|
||||
var check = 0;
|
||||
$("#periodi input").each(function (){
|
||||
$("input:checkbox").prop("checked",true);
|
||||
if( $("input:checkbox").is(":checked") ){
|
||||
check = check + 1;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function deselezionaTutto(){
|
||||
$("#total_check").html("Rate: " + check).trigger("change");
|
||||
}
|
||||
|
||||
function deselezionaTutto(){
|
||||
var check = 0;
|
||||
$("#periodi input").each(function (){
|
||||
$("input:checkbox").prop("checked",false);
|
||||
if( $("input:checkbox").is(":checked") ){
|
||||
check = check + 1;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$("#total_check").html("Rate: " + check).trigger("change");
|
||||
}
|
||||
|
||||
$(".qta_fattura").change(function(){
|
||||
get_prezzi();
|
||||
});
|
||||
|
||||
function get_prezzi(){
|
||||
|
||||
$(".qta_fattura").each(function(){
|
||||
var qta = parseFloat($(this).val().replace(",",".")).toFixed(2);
|
||||
var riga = JSON.parse($(this).attr("options"));
|
||||
|
||||
var imponibile_riga = (riga.totale_imponibile/riga.qta)*qta;
|
||||
imponibile_riga = imponibile_riga.toLocaleString()+" €";
|
||||
|
||||
var iva_riga = (riga.iva/riga.qta)*qta;
|
||||
iva_riga = iva_riga.toLocaleString()+" €";
|
||||
|
||||
var totale_riga = (riga.totale/riga.qta)*qta;
|
||||
totale_riga = totale_riga.toLocaleString()+" €";
|
||||
|
||||
$("#totali_"+riga.id).html("<p><b>Imponibile</b>: "+imponibile_riga+"</p>\
|
||||
<p><b>IVA</b>: "+iva_riga+"</p>\
|
||||
<p><b>Totale</b>: "+totale_riga+"</p>");
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
$("#cadenza_fatturazione").change(function(){
|
||||
if( $(this).val()=="Giorno" ){
|
||||
$("#div_giorno_fisso").show();
|
||||
}else{
|
||||
$("#giorno_fisso").selectReset();
|
||||
$("#div_giorno_fisso").hide();
|
||||
}
|
||||
})
|
||||
|
||||
</script>';
|
||||
|
|
|
@ -0,0 +1,93 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.n.c.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Modules\Contratti\Contratto;
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
$contratto = Contratto::find($id_record);
|
||||
|
||||
if(get('scadenza')=='Mensile'){
|
||||
$timeing = '+1 month';
|
||||
}
|
||||
if(get('scadenza')=='Bimestrale'){
|
||||
$timeing = '+2 month';
|
||||
}
|
||||
if(get('scadenza')=='Trimestrale'){
|
||||
$timeing = '+3 month';
|
||||
}
|
||||
if(get('scadenza')=='Quadrimestrale'){
|
||||
$timeing = '+4 month';
|
||||
}
|
||||
if(get('scadenza')=='Semestrale'){
|
||||
$timeing = '+6 month';
|
||||
}
|
||||
if(get('scadenza')=='Annuale'){
|
||||
$timeing = '+12 month';
|
||||
}
|
||||
|
||||
$data_inizio = new Carbon(get('data_inizio'));
|
||||
|
||||
echo '
|
||||
<div class="row" id="ajax_cadenza">';
|
||||
|
||||
$data_corrente = $data_inizio->startOfMonth();
|
||||
$data_conclusione = $contratto->data_conclusione;
|
||||
$count = 0;
|
||||
|
||||
while ($data_corrente->lessThanOrEqualTo($data_conclusione)) {
|
||||
$data = $data_corrente->endOfMonth()->format('Y-m-d');
|
||||
$data_fatturazione = ($data_fatturazione ?: date("Y-m", strtotime($data)) );
|
||||
unset($checked);
|
||||
|
||||
if( $id_module==Modules::get('Contratti')['id'] ){
|
||||
if( $data==date("Y-m-t", strtotime($timeing, strtotime($data_fatturazione)) ) ){
|
||||
$checked = 'checked';
|
||||
$data_fatturazione = date("Y-m", strtotime($data));
|
||||
}
|
||||
}
|
||||
|
||||
echo '
|
||||
<div class="col-md-3">
|
||||
<label for="m_'.$count.'">
|
||||
<input type="checkbox" class="unblockable" id="m_'.$count.'" name="selezione_periodo['.$count.']" '.$checked.' />
|
||||
'.ucfirst($data_corrente->formatLocalized('%B %Y')).'
|
||||
</label>
|
||||
<input type="hidden" name="periodo['.$count.']" value="'.$data.'">
|
||||
</div>';
|
||||
|
||||
$data_corrente = $data_corrente->addDay();
|
||||
++$count;
|
||||
}
|
||||
|
||||
echo '
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
var check = 0;
|
||||
$("#periodi input").each(function (){
|
||||
if( $(this).is(":checked") ){
|
||||
check = check + 1;
|
||||
}
|
||||
});
|
||||
$("#total_check").html("Rate: " + check).trigger("change");
|
||||
});
|
||||
</script>';
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.r.l.
|
||||
* Copyright (C) DevCode s.n.c.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -33,6 +33,7 @@ $numero_rata = $contratto->pianificazioni->search(function ($item) use ($id_pian
|
|||
$module_fattura = Modules::get('Fatture di vendita');
|
||||
|
||||
$id_conto = setting('Conto predefinito fatture di vendita');
|
||||
$data = date("Y-m",strtotime($pianificazione->data_scadenza))."-".date("d",strtotime($contratto->data_accettazione));
|
||||
|
||||
echo '
|
||||
<form action="" method="post">
|
||||
|
@ -47,7 +48,7 @@ echo '
|
|||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "date", "label": "'.tr('Data').'", "name": "data", "required": 1, "class": "text-center", "value": "-now-" ]}
|
||||
{[ "type": "date", "label": "'.tr('Data').'", "name": "data", "required": 1, "class": "text-center", "value": "'.$pianificazione->data_scadenza.'" ]}
|
||||
</div>';
|
||||
|
||||
// Tipo di documento
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.r.l.
|
||||
* Copyright (C) DevCode s.n.c.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
function variables($descrizione='', $inizio=null, $fine=null)
|
||||
{
|
||||
$mese = [
|
||||
'01' => 'Gennaio',
|
||||
'02' => 'Febbraio',
|
||||
'03' => 'Marzo',
|
||||
'04' => 'Aprile',
|
||||
'05' => 'Maggio',
|
||||
'06' => 'Giugno',
|
||||
'07' => 'Luglio',
|
||||
'08' => 'Agosto',
|
||||
'09' => 'Settembre',
|
||||
'11' => '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>
|
||||
</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']);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.r.l.
|
||||
* Copyright (C) DevCode s.n.c.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.r.l.
|
||||
* Copyright (C) DevCode s.n.c.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -22,10 +22,7 @@ use Plugins\PianificazioneFatturazione\Pianificazione;
|
|||
include_once __DIR__.'/../../../core.php';
|
||||
|
||||
$pianificazioni = Pianificazione::doesntHave('fattura')
|
||||
->leftjoin('co_contratti', 'co_contratti.id', '=', 'co_fatturazione_contratti.idcontratto')
|
||||
->leftjoin('an_anagrafiche', 'an_anagrafiche.idanagrafica', '=', 'co_contratti.idanagrafica')
|
||||
->orderBy('data_scadenza', 'asc')
|
||||
->orderBy('ragione_sociale', 'asc')
|
||||
->whereHas('contratto', function($q){
|
||||
$q->whereHas('stato', function($q){
|
||||
$q->where('is_fatturabile', 1);
|
||||
|
|
|
@ -18,13 +18,48 @@
|
|||
*/
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
include_once __DIR__.'/../init.php';
|
||||
|
||||
$id_contratto_precedente = $record['idcontratto_prev'];
|
||||
|
||||
if (empty($id_contratto_precedente)) {
|
||||
echo '
|
||||
<script>$("#link-tab_'.$plugin['id'].'").addClass("disabled");</script>';
|
||||
}
|
||||
echo '
|
||||
<form action="" method="post" id="rinnovo-form">
|
||||
<input type="hidden" name="backto" value="record-edit">
|
||||
<input type="hidden" name="op" value="update_rinnovo">
|
||||
<input type="hidden" name="id_record" value="'.$id_record.'">
|
||||
|
||||
<div class="panel panel-primary">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">'.tr('Informazioni per rinnovo').'</h3>
|
||||
</div>
|
||||
|
||||
<div class="panel-body">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
{[ "type": "checkbox", "label": "'.tr('Rinnovabile').'", "name": "rinnovabile", "help": "'.tr('Il contratto è rinnovabile?').'", "value": "$rinnovabile$" ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
{[ "type": "checkbox", "label": "'.tr('Rinnovo automatico').'", "name": "rinnovo_automatico", "help": "'.tr('Il contratto è da rinnovare automaticamente alla scadenza').'", "value": "$rinnovo_automatico$", "disabled": '.($record['rinnovabile'] ? 0 : 1).' ]}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-md-3">
|
||||
{[ "type": "number", "label": "'.tr('Preavviso per rinnovo').'", "name": "giorni_preavviso_rinnovo", "decimals": "2", "value": "$giorni_preavviso_rinnovo$", "icon-after": "giorni", "disabled": '.($record['rinnovabile'] ? 0 : 1).' ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
{[ "type": "number", "label": "'.tr('Ore rimanenti rinnovo').'", "name": "ore_preavviso_rinnovo", "decimals": "2", "value": "$ore_preavviso_rinnovo$", "icon-after": "ore", "disabled": '.($record['rinnovabile'] ? 0 : 1).', "help": "'.tr('Ore residue nel contratto prima di visualizzare una avviso per un eventuale rinnovo anticipato.').'" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-12 text-right">
|
||||
<button type="submit" class="btn btn-success"><i class="fa fa-check"></i> '.tr('Salva').'</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>';
|
||||
|
||||
echo '
|
||||
<table class="table table-hover table-condensed table-bordered table-striped">
|
||||
|
|
|
@ -43,7 +43,7 @@ echo '
|
|||
|
||||
<div class="panel panel-primary">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title"><span class="tip" title="'.tr("La statistica considera le fatture di acquisto nel periodo temporale definito").'"><i class="fa fa-question-circle"></i></span> '.tr('Prezzo medio acquisto').'</h3>
|
||||
<h3 class="panel-title">'.tr('Prezzo medio acquisto').'</h3>
|
||||
</div>
|
||||
|
||||
<div class="panel-body">
|
||||
|
@ -69,7 +69,7 @@ echo '
|
|||
|
||||
<div class="panel panel-primary">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title"><span class="tip" title="'.tr("La statistica considera le fatture di vendita nel periodo temporale definito").'"><i class="fa fa-question-circle"></i></span> '.tr('Prezzo medio vendita').'</h3>
|
||||
<h3 class="panel-title">'.tr('Prezzo medio vendita').'</h3>
|
||||
</div>
|
||||
|
||||
<div class="panel-body">
|
||||
|
|
|
@ -148,8 +148,7 @@ class Interventi extends AppResource
|
|||
IF(idsede_destinazione = 0, NULL, idsede_destinazione) AS id_sede,
|
||||
firma_file,
|
||||
IF(firma_data = '0000-00-00 00:00:00', '', firma_data) AS firma_data,
|
||||
firma_nome,
|
||||
(SELECT GROUP_CONCAT(ragione_sociale SEPARATOR ',') FROM in_interventi_tecnici_assegnati INNER JOIN an_anagrafiche ON in_interventi_tecnici_assegnati.id_tecnico=an_anagrafiche.idanagrafica WHERE id_intervento=in_interventi.id) AS tecnici_assegnati
|
||||
firma_nome
|
||||
FROM in_interventi
|
||||
WHERE in_interventi.id = ".prepare($id);
|
||||
|
||||
|
|
|
@ -135,7 +135,7 @@ class Plugins
|
|||
if (!empty($plugin) && in_array($plugin->permission, ['r', 'rw'])) {
|
||||
$anchor = 'tab_'.$plugin->id;
|
||||
|
||||
return Modules::link($plugin->module->id, $id_record, $testo, $alternativo, $extra, $blank, $anchor);
|
||||
return Modules::link($plugin->originalModule->id, $id_record, $testo, $alternativo, $extra, $blank, $anchor);
|
||||
}
|
||||
|
||||
return $alternativo;
|
||||
|
|
|
@ -1,110 +0,0 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.r.l.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
use Models\Upload;
|
||||
use Plugins\ExportFE\FatturaElettronica;
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
try {
|
||||
$fattura_pa = new FatturaElettronica($id_record);
|
||||
} catch (UnexpectedValueException $e) {
|
||||
echo '<div class="text-center">'.tr("Questo documento non è una fattura elettronica").'</div>';
|
||||
return;
|
||||
}
|
||||
$file = Upload::where('filename', $fattura_pa->getFilename())
|
||||
->where('id_record', $id_record)
|
||||
->first();
|
||||
|
||||
$file = Models\Upload::find($file['id']);
|
||||
|
||||
if (empty($file)) {
|
||||
echo '<div class="text-center">'.tr("Questo documento non è una fattura elettronica").'</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
$link = base_path().'/'.$file->filepath;
|
||||
|
||||
if ($file->isFatturaElettronica()) {
|
||||
$content = file_get_contents(base_dir().'/'.$file->filepath);
|
||||
|
||||
// Individuazione stylesheet
|
||||
$default_stylesheet = 'asso-invoice';
|
||||
|
||||
$name = basename($file->original_name);
|
||||
$filename = explode('.', $name)[0];
|
||||
$pieces = explode('_', $filename);
|
||||
$stylesheet = $pieces[2];
|
||||
|
||||
$stylesheet = base_dir().'/plugins/xml/'.$stylesheet.'.xsl';
|
||||
$stylesheet = file_exists($stylesheet) ? $stylesheet : base_dir().'/plugins/xml/'.$default_stylesheet.'.xsl';
|
||||
|
||||
// XML
|
||||
$xml = new DOMDocument();
|
||||
$xml->loadXML($content);
|
||||
|
||||
// XSL
|
||||
$xsl = new DOMDocument();
|
||||
$xsl->load($stylesheet);
|
||||
|
||||
// XSLT
|
||||
$xslt = new XSLTProcessor();
|
||||
$xslt->importStylesheet($xsl);
|
||||
echo $xslt->transformToXML($xml);
|
||||
|
||||
echo '
|
||||
<style>
|
||||
#notifica {
|
||||
min-width: 860px !important;
|
||||
}
|
||||
table.tbFoglio td {
|
||||
border-bottom: solid 1px #000000;
|
||||
}
|
||||
</style>';
|
||||
|
||||
|
||||
} else {
|
||||
echo '
|
||||
<style>
|
||||
body, iframe, img{
|
||||
border: 0;
|
||||
margin: 0;
|
||||
max-width: 100%;
|
||||
}
|
||||
iframe{
|
||||
width:100%;
|
||||
height:100%;
|
||||
min-height: 500px;
|
||||
}
|
||||
</style>';
|
||||
|
||||
if ($file->isImage()) {
|
||||
echo '
|
||||
<img src="'.$link.'"></img>';
|
||||
} else {
|
||||
if ($file->isPDF()) {
|
||||
$src = \Prints::getPDFLink($file->filepath);
|
||||
}
|
||||
|
||||
echo '
|
||||
<iframe src="'.($link ?: $src).'">
|
||||
<a src="'.$link.'">'.tr('Il browser non supporta i contenuti iframe: clicca qui per raggiungere il file originale').'</a>
|
||||
</iframe>';
|
||||
}
|
||||
}
|
|
@ -137,6 +137,13 @@ INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `
|
|||
|
||||
INSERT INTO `zz_group_view` (`id_gruppo`, `id_vista`) (SELECT `zz_groups`.`id`, `zz_views`.`id` FROM `zz_groups`, `zz_views` INNER JOIN `zz_modules` ON `zz_views`.`id_module` = `zz_modules`.`id` WHERE `zz_modules`.`name` = 'Fatture di acquisto' AND `zz_views`.`name` = '_bg_');
|
||||
|
||||
|
||||
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`) VALUES (NULL, 'Descrizione fattura pianificata', 'Canone {rata} del contratto numero {numero}', 'text', '1', 'Fatturazione');
|
||||
|
||||
ALTER TABLE `co_righe_contratti` ADD `idpianificazione` INT NULL DEFAULT NULL AFTER `idarticolo`;
|
||||
INSERT INTO `zz_prints` (`id`, `id_module`, `is_record`, `name`, `title`, `filename`, `directory`, `previous`, `options`, `icon`, `version`, `compatibility`, `order`, `predefined`, `default`, `enabled`) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name`='Fatture di vendita'), '1', 'Fattura elettronica di vendita', 'Fattura elettronica di vendita', 'Fattura elettronica {numero} del {data}', 'fatture_elettroniche', 'iddocumento', '{\"hide-header\": true, \"hide-footer\": true}', 'fa fa-print', '', '', '0', '1', '1', '1');
|
||||
|
||||
INSERT INTO `zz_prints` (`id`, `id_module`, `is_record`, `name`, `title`, `filename`, `directory`, `previous`, `options`, `icon`, `version`, `compatibility`, `order`, `predefined`, `default`, `enabled`) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name`='Fatture di acquisto'), '1', 'Fattura elettronica di acquisto', 'Fattura elettronica di acquisto', 'Fattura elettronica {numero} del {data}', 'fatture_elettroniche', 'iddocumento', '{\"hide-header\": true, \"hide-footer\": true}', 'fa fa-print', '', '', '0', '1', '1', '1');
|
||||
|
||||
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES
|
||||
(NULL, 'Numero massimo di tentativi', '10', 'integer', 1, 'Newsletter', 1, 'Numero massimo di tentativi da effettuare per cercare di inviare una mail');
|
||||
|
|
Loading…
Reference in New Issue