This commit is contained in:
Beppe 2022-02-21 18:49:34 +01:00
commit 31a65dad18
33 changed files with 686 additions and 272 deletions

View File

@ -708,6 +708,10 @@ input.small-width {
cursor: pointer;
}
.fc-event {
border-top-width: 10px;
}
.fc-event-primary {
background-color: #3a87ad;
border: 1px solid #3a87ad;

View File

@ -141,6 +141,8 @@ $("#idarticolo").on("change", function() {
$("#prezzi").html("");
$("#prezzivendita").html("");
$("#prezziacquisto").html("");
$("#prezzo_unitario").val("");
$("#sconto").val("");
}
if (!$(this).val()) {
@ -186,7 +188,6 @@ $("#idarticolo").on("change", function() {
$("#um").selectSetNew($data.um, $data.um);
// Aggiornamento automatico di guadagno e margine
});
$("#idsede").on("change", function() {
@ -276,7 +277,10 @@ function verificaPrezzoArticolo() {
}
div.css("padding-top", "5px");
div.html(`<small class="label label-info" >'.tr('Prezzo suggerito').': ` + prezzo_previsto.toLocale() + " " + globals.currency + `<button type="button" class="btn btn-xs btn-info pull-right" onclick="aggiornaPrezzoArticolo()"><i class="fa fa-refresh"></i> '.tr('Aggiorna').'</button></small>`);
div.html(`<small class="label label-info" id="listino" >'.tr('Prezzo').': ` + prezzo_previsto.toLocale() + " " + globals.currency + " " + `'.Plugins::link(($options['dir'] == 'uscita' ? 'Listino Fornitori' : 'Listino Clienti'), $options['idanagrafica'], null, null, '').'<button type="button" class="btn btn-xs btn-info pull-right" onclick="aggiornaPrezzoArticolo()"><i class="fa fa-refresh"></i> '.tr('Aggiorna').'</button></small>`);
edit_listino = $("#listino").find("a");
edit_listino.attr("href", edit_listino.attr("href").replace(/id_record=[0-9]*/, "id_record=" + $("#idarticolo").val()));
}
/**

View File

@ -152,6 +152,7 @@ switch ($resource) {
if ($usare_dettaglio_fornitore) {
$search_fields[] = 'mg_fornitore_articolo.descrizione LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'mg_fornitore_articolo.codice_fornitore LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'mg_fornitore_articolo.barcode_fornitore LIKE '.prepare('%'.$search.'%');
}
}

View File

@ -155,13 +155,14 @@ switch (post('op')) {
foreach ($id_records as $id) {
$originale = Articolo::find($id);
$articolo = ArticoloPreventivo::build($preventivo, $originale);
$idiva = $originale->idiva_vendita ?: setting('Iva predefinita');
$articolo->qta = 1;
$articolo->descrizione = $originale->descrizione;
$articolo->um = $originale->um ?: null;
$articolo->costo_unitario = $originale->prezzo_acquisto;
$articolo->prezzo_unitario = $originale->prezzo_vendita;
$articolo->idiva = $originale->idiva_vendita;
$articolo->setPrezzoUnitario($originale->prezzo_vendita, $originale->idiva_vendita);
$articolo->idiva = $idiva;
$articolo->setPrezzoUnitario($originale->prezzo_vendita, $idiva);
$articolo->save();
++$n_articoli;

View File

@ -29,6 +29,7 @@ use Modules\Articoli\Articolo;
use Modules\Articoli\Categoria;
use Modules\Iva\Aliquota;
use Plugins\ListinoClienti\DettaglioPrezzo;
use Plugins\ListinoFornitori\DettaglioFornitore;
use Uploads;
/**
@ -54,6 +55,10 @@ class CSV extends CSVImporter
'Foto',
],
],
[
'field' => 'import_immagine',
'label' => 'Import immagine',
],
[
'field' => 'descrizione',
'label' => 'Descrizione',
@ -153,6 +158,18 @@ class CSV extends CSVImporter
'field' => 'anagrafica_listino',
'label' => 'Anagrafica listino',
],
[
'field' => 'codice_fornitore',
'label' => 'Codice fornitore',
],
[
'field' => 'barcode_fornitore',
'label' => 'Barcode fornitore',
],
[
'field' => 'descrizione_fornitore',
'label' => 'Descrizione fornitore',
],
[
'field' => 'qta_minima',
'label' => 'Qta minima',
@ -214,6 +231,10 @@ class CSV extends CSVImporter
}
$database->query('DELETE FROM mg_prezzi_articoli WHERE id_articolo = '.prepare($articolo->id).' AND id_anagrafica = '.prepare($anagrafica->id));
if (!empty($dettagli['codice_fornitore']) && !empty($dettagli['descrizione_fornitore'])) {
$database->query('DELETE FROM mg_fornitore_articolo WHERE id_articolo = '.prepare($articolo->id).' AND id_anagrafica = '.prepare($anagrafica->id));
}
}
}
@ -291,6 +312,72 @@ class CSV extends CSVImporter
$qta_registrata = (float) ($record['qta']);
$nome_sede = $record['nome_sede'];
// Aggiornamento dettaglio prezzi
$dettagli['anagrafica_listino'] = $record['anagrafica_listino'];
$dettagli['qta_minima'] = $record['qta_minima'];
$dettagli['qta_massima'] = $record['qta_massima'];
$dettagli['prezzo_listino'] = $record['prezzo_listino'];
$dettagli['sconto_listino'] = $record['sconto_listino'];
$dettagli['dir'] = $record['dir'];
$dettagli['codice_fornitore'] = $record['codice_fornitore'];
$dettagli['barcode_fornitore'] = $record['barcode_fornitore'];
$dettagli['descrizione_fornitore'] = $record['descrizione_fornitore'];
$this->aggiornaDettaglioPrezzi($articolo, $dettagli);
//Gestione immagine
if (!empty($url) && !empty($record['import_immagine'])) {
$file_content = file_get_contents($url);
if (!empty($file_content)) {
if ($record['import_immagine'] == 2 || $record['import_immagine'] == 4) {
Uploads::deleteLinked([
'id_module' => Modules::get('Articoli')['id'],
'id_record' => $articolo->id,
]);
$database->update('mg_articoli', [
'immagine' => '',
], [
'id' => $articolo->id,
]);
}
$name = 'immagine_'.$articolo->id.'.'.Upload::getExtensionFromMimeType($file_content);
$upload = Uploads::upload($file_content, [
'name' => 'Immagine',
'category' => 'Immagini',
'original_name' => $name,
'id_module' => Modules::get('Articoli')['id'],
'id_record' => $articolo->id,
], [
'thumbnails' => true,
]);
$filename = $upload->filename;
if ($record['import_immagine'] == 1 || $record['import_immagine'] == 2) {
if (!empty($filename)) {
$database->update('mg_articoli', [
'immagine' => $filename,
], [
'id' => $articolo->id,
]);
}
}
}
}
unset($record['import_immagine']);
unset($record['anagrafica_listino']);
unset($record['qta_minima']);
unset($record['qta_massima']);
unset($record['prezzo_listino']);
unset($record['sconto_listino']);
unset($record['dir']);
unset($record['codice_fornitore']);
unset($record['barcode_fornitore']);
unset($record['descrizione_fornitore']);
// Salvataggio delle informazioni generali
$articolo->fill($record);
@ -301,15 +388,6 @@ class CSV extends CSVImporter
$articolo->save();
// Aggiornamento dettaglio prezzi
$dettagli['anagrafica_listino'] = $record['anagrafica_listino'];
$dettagli['qta_minima'] = $record['qta_minima'];
$dettagli['qta_massima'] = $record['qta_massima'];
$dettagli['prezzo_listino'] = $record['prezzo_listino'];
$dettagli['sconto_listino'] = $record['sconto_listino'];
$dettagli['dir'] = $record['dir'];
$this->aggiornaDettaglioPrezzi($articolo, $dettagli);
// Movimentazione della quantità registrata
$giacenze = $articolo->getGiacenze();
$anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita'));
@ -328,44 +406,21 @@ class CSV extends CSVImporter
'idsede' => $id_sede,
]);
}
//Gestione immagine
if (!empty($url)) {
$file_content = file_get_contents($url);
if (!empty($file_content)) {
$name = 'immagine_'.$articolo->id.'.'.Upload::getExtensionFromMimeType($file_content);
$upload = Uploads::upload($file_content, [
'name' => 'Immagine',
'category' => 'Immagini',
'original_name' => $name,
'id_module' => Modules::get('Articoli')['id'],
'id_record' => $articolo->id,
], [
'thumbnails' => true,
]);
$filename = $upload->filename;
if (!empty($filename)) {
$database->update('mg_articoli', [
'immagine' => $filename,
], [
'id' => $articolo->id,
]);
}
}
}
}
public static function getExample()
{
return [
['Codice', 'Barcode', 'Descrizione', 'Fornitore predefinito', 'Quantità', 'Unità di misura', 'Prezzo acquisto', 'Prezzo vendita', 'Peso lordo (KG)', 'Volume (M3)', 'Categoria', 'Sottocategoria', 'Ubicazione', 'Note', 'Anagrafica listino', 'Qta minima', 'Qta massima', 'Prezzo listino', 'Sconto listino', 'Cliente/Fornitore listino'],
['00004', '719376861871', 'Articolo', 'Mario Rossi', '10', 'Kg', '5.25', '12.72', '10.2', '500', 'Categoria4', 'Sottocategoria2', 'Scaffale 1', 'Articolo di prova', 'Mario Rossi', '', '', '10', '5', 'Fornitore'],
['00004', '719376861871', 'Articolo', 'Mario Rossi', '10', 'Kg', '5.25', '12.72', '10.2', '500', 'Categoria4', 'Sottocategoria2', 'Scaffale 1', 'Articolo di prova', 'Mario Rossi', '1', '10', '9', '', 'Fornitore'],
['00004', '719376861871', 'Articolo', 'Mario Rossi', '10', 'Kg', '5.25', '12.72', '10.2', '500', 'Categoria4', 'Sottocategoria2', 'Scaffale 1', 'Articolo di prova', 'Mario Rossi', '11', '20', '8', '5', 'Fornitore'],
['00004', '719376861871', 'Articolo', 'Mario Rossi', '10', 'Kg', '5.25', '12.72', '10.2', '500', 'Categoria4', 'Sottocategoria2', 'Scaffale 1', 'Articolo di prova', 'Mario Verdi', '1', '10', '20', '10', 'Cliente'],
['Codice', 'Barcode', 'Immagine', 'Import immagine', 'Descrizione', 'Fornitore predefinito', 'Quantità', 'Unità di misura', 'Prezzo acquisto', 'Prezzo vendita', 'Peso lordo (KG)', 'Volume (M3)', 'Categoria', 'Sottocategoria', 'Ubicazione', 'Note', 'Anagrafica listino', 'Codice fornitore', 'Barcode fornitore', 'Descrizione fornitore', 'Qta minima', 'Qta massima', 'Prezzo listino', 'Sconto listino', 'Cliente/Fornitore listino'],
['00004', '719376861871', 'https://immagini.com/immagine.jpg', '1', 'Articolo', 'Mario Rossi', '10', 'Kg', '5.25', '12.72', '10.2', '500', 'Categoria4', 'Sottocategoria2', 'Scaffale 1', 'Articolo di prova', 'Mario Rossi', 'artforn01', '384574557484', 'Articolo di prova fornitore', '', '', '10', '5', 'Fornitore'],
['00004', '719376861871', 'https://immagini.com/immagine.jpg', '2', 'Articolo', 'Mario Rossi', '10', 'Kg', '5.25', '12.72', '10.2', '500', 'Categoria4', 'Sottocategoria2', 'Scaffale 1', 'Articolo di prova', 'Mario Rossi', 'artforn01', '384574557484', 'Articolo di prova fornitore', '1', '10', '9', '', 'Fornitore'],
['00004', '719376861871', 'https://immagini.com/immagine.jpg', '3', 'Articolo', 'Mario Rossi', '10', 'Kg', '5.25', '12.72', '10.2', '500', 'Categoria4', 'Sottocategoria2', 'Scaffale 1', 'Articolo di prova', 'Mario Rossi', 'artforn01', '384574557484', 'Articolo di prova fornitore', '11', '20', '8', '5', 'Fornitore'],
['00004', '719376861871', '', '', 'Articolo', 'Mario Rossi', '10', 'Kg', '5.25', '12.72', '10.2', '500', 'Categoria4', 'Sottocategoria2', 'Scaffale 1', 'Articolo di prova', 'Mario Verdi', '', '', '', '1', '10', '20', '10', 'Cliente'],
[],
['Import immagine = 1 -> Permette di importare l\'immagine come principale dell\'articolo mantenendo gli altri allegati già presenti'],
['Import immagine = 2 -> Permette di importare l\'immagine come principale dell\'articolo rimuovendo tutti gli allegati presenti'],
['Import immagine = 3 -> Permette di importare l\'immagine come allegato dell\'articolo mantenendo gli altri allegati già presenti'],
['Import immagine = 4 -> Permette di importare l\'immagine come allegato dell\'articolo rimuovendo tutti gli allegati presenti'],
];
}
@ -394,6 +449,14 @@ class CSV extends CSVImporter
}
$dettaglio_predefinito->save();
if ($dettagli['dir'] == 'uscita' && !empty($dettagli['codice_fornitore']) && !empty($dettagli['descrizione_fornitore'])) {
$fornitore = DettaglioFornitore::build($anagrafica, $articolo);
$fornitore->codice_fornitore = $dettagli['codice_fornitore'];
$fornitore->barcode_fornitore = $dettagli['barcode_fornitore'];
$fornitore->descrizione = $dettagli['descrizione_fornitore'];
$fornitore->save();
}
}
}
}

View File

@ -39,6 +39,11 @@ switch (post('op')) {
$contratto = Contratto::build($anagrafica, post('nome'));
// Salvataggio informazioni sul rinnovo
$contratto->idstato = post('idstato');
$contratto->validita = post('validita');
$contratto->tipo_validita = post('tipo_validita');
$contratto->data_accettazione = post('data_accettazione') ?: null;
$contratto->data_conclusione = post('data_conclusione') ?: null;
$contratto->rinnovabile = post('rinnovabile');
$contratto->rinnovo_automatico = post('rinnovo_automatico');
$contratto->giorni_preavviso_rinnovo = post('giorni_preavviso_rinnovo');
@ -47,6 +52,10 @@ switch (post('op')) {
$id_record = $contratto->id;
if (isAjaxRequest()) {
echo json_encode(['id' => $id_record, 'text' => 'Contratto '.$contratto->numero.' del '.dateFormat($contratto->data_bozza).' - '.$contratto->nome]);
}
flash()->info(tr('Aggiunto contratto numero _NUM_!', [
'_NUM_' => $contratto['numero'],
]));

View File

@ -21,6 +21,8 @@ include_once __DIR__.'/../../core.php';
$id_anagrafica = !empty(get('idanagrafica')) ? get('idanagrafica') : $user['idanagrafica'];
$stati = get('pianificabile') ? 'SELECT id, descrizione FROM co_staticontratti WHERE is_pianificabile=1' : 'SELECT id, descrizione FROM co_staticontratti';
echo '
<form action="" method="post" id="add-form">
<input type="hidden" name="op" value="add">
@ -39,10 +41,33 @@ echo '
</div>
</div>
<div class="row">
<div class="col-md-3">
{[ "type": "select", "label": "'.tr('Stato').'", "name": "idstato", "required": 1, "values": "query='.$stati.'" ]}
</div>
<div class="col-md-3">
{[ "type": "date", "label": "'.tr('Data accettazione').'", "name": "data_accettazione" ]}
</div>
<div class="col-md-3">
{[ "type": "date", "label": "'.tr('Data conclusione').'", "name": "data_conclusione" ]}
</div>
<div class="col-md-3">
{[ "type": "number", "label": "'.tr('Validità contratto').'", "name": "validita", "decimals": "0", "icon-after": "choice|period|'.$record['tipo_validita'].'", "help": "'.tr('Il campo Validità contratto viene utilizzato per il calcolo della Data di conclusione del contratto').'" ]}
</div>
</div>
<!-- Informazioni rinnovo -->
<div class="box box-primary">
<div class="box box-primary collapsable collapsed-box">
<div class="box-header">
<h3 class="box-title">'.tr('Informazioni per rinnovo').'</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-plus"></i>
</button>
</div>
</div>
<div class="box-body">
@ -84,4 +109,13 @@ echo '
input("ore_preavviso_rinnovo").setDisabled(disabled);
input("rinnovo_automatico").setDisabled(disabled);
});
$("#data_conclusione").on("dp.change", function (e) {
let data_accettazione = $("#data_accettazione");
data_accettazione.data("DateTimePicker").maxDate(e.date);
if(data_accettazione.data("DateTimePicker").date() > e.date){
data_accettazione.data("DateTimePicker").date(e.date);
}
});
</script>';

View File

@ -94,6 +94,14 @@ switch (filter('op')) {
$results = [];
foreach ($sessioni as $sessione) {
if (setting('Visualizzazione colori sessioni') == 'Sfondo colore stato - bordo colore tecnico') {
$backgroundcolor = $sessione['colore'];
$bordercolor = $sessione['colore_tecnico'];
} else {
$backgroundcolor = $sessione['colore_tecnico'];
$bordercolor = $sessione['colore'];
}
$results[] = [
'id' => $sessione['id'],
'idintervento' => $sessione['idintervento'],
@ -102,9 +110,9 @@ switch (filter('op')) {
'start' => $sessione['orario_inizio'],
'end' => $sessione['orario_fine'],
'link' => base_path().'/editor.php?id_module='.$modulo_interventi->id.'&id_record='.$sessione['idintervento'],
'backgroundColor' => $sessione['colore'],
'textColor' => color_inverse($sessione['colore']),
'borderColor' => ($sessione['colore_tecnico'] == '#FFFFFF') ? color_darken($sessione['colore_tecnico'], 100) : $sessione['colore_tecnico'],
'backgroundColor' => $backgroundcolor,
'textColor' => color_inverse($backgroundcolor),
'borderColor' => ($bordercolor == '#FFFFFF') ? color_darken($bordercolor, 100) : $bordercolor,
'allDay' => false,
];
}

View File

@ -20,19 +20,14 @@
include_once __DIR__.'/../../core.php';
use Modules\DDT\DDT;
use Modules\Fatture\Fattura;
$documento = DDT::find($id_record);
$tipo_documento_finale = Fattura::class;
$module = Modules::get($id_module);
if ($documento->reversed) {
if ($module['name'] == 'Ddt di vendita') {
$final_module = 'Fatture di acquisto';
$dir = 'uscita';
} else {
$final_module = 'Fatture di vendita';
$dir = 'entrata';
}
} elseif ($module['name'] == 'Ddt di vendita') {
if ($module['name'] == 'Ddt di vendita') {
$final_module = 'Fatture di vendita';
$dir = 'entrata';
} else {

View File

@ -64,8 +64,6 @@ switch (post('op')) {
break;
case 'update':
$stato_precedente = $fattura->stato;
$stato = Stato::find(post('idstatodocumento'));
$fattura->stato()->associate($stato);
@ -145,60 +143,46 @@ switch (post('op')) {
$fattura->setScontoFinale(post('sconto_finale'), post('tipo_sconto_finale'));
$fattura->save();
$results = $fattura->save();
$message = '';
// Operazioni automatiche per le Fatture Elettroniche
if ($fattura->direzione == 'entrata' && $stato_precedente->descrizione == 'Bozza' && $stato['descrizione'] == 'Emessa') {
$stato_fe = $database->fetchOne('SELECT * FROM fe_stati_documento WHERE codice = '.prepare($fattura->codice_stato_fe));
$abilita_genera = empty($fattura->codice_stato_fe) || intval($stato_fe['is_generabile']);
foreach ($results as $numero => $result) {
foreach ($result as $title => $links) {
foreach ($links as $link => $errors) {
if (empty($title)) {
flash()->warning(tr('La fattura elettronica num. _NUM_ potrebbe avere delle irregolarità!', [
'_NUM_' => $numero,
]).' '.tr('Controllare i seguenti campi: _LIST_', [
'_LIST_' => implode(', ', $errors),
]).'.');
} else {
$message .= '
<p><b>'.$title.' '.$link.'</b></p>
<ul>';
// Generazione automatica della Fattura Elettronica
$checks = FatturaElettronica::controllaFattura($fattura);
$fattura_elettronica = new FatturaElettronica($id_record);
if ($abilita_genera && empty($checks)) {
$file = $fattura_elettronica->save(base_dir().'/'.FatturaElettronica::getDirectory());
flash()->info(tr('Fattura elettronica generata correttamente!'));
if (!$fattura_elettronica->isValid()) {
$errors = $fattura_elettronica->getErrors();
flash()->warning(tr('La fattura elettronica potrebbe avere delle irregolarità!').' '.tr('Controllare i seguenti campi: _LIST_', [
'_LIST_' => implode(', ', $errors),
]).'.');
}
}
// Visualizzazione degli errori
elseif (!empty($checks)) {
// Rimozione eventuale fattura generata erronamente
// Fix per la modifica di dati interni su fattura già generata
if ($abilita_genera) {
$fattura_elettronica->delete();
}
// Messaggi informativi sulle problematiche
$message = tr('La fattura elettronica non è stata generata a causa di alcune informazioni mancanti').':';
foreach ($checks as $check) {
$message .= '
<p><b>'.$check['name'].' '.$check['link'].'</b></p>
<ul>';
foreach ($check['errors'] as $error) {
if (!empty($error)) {
$message .= '
<li>'.$error.'</li>';
foreach ($errors as $error) {
if (!empty($error)) {
$message .= '
<li>'.$error.'</li>';
}
}
$message .= '
</ul>';
}
$message .= '
</ul>';
}
flash()->warning($message);
}
}
if ($message) {
// Messaggi informativi sulle problematiche
$message = tr('La fattura elettronica numero _NUM_ non è stata generata a causa di alcune informazioni mancanti', [
'_NUM_' => $numero,
]).':'.$message;
flash()->warning($message);
}
aggiorna_sedi_movimenti('documenti', $id_record);
// Controllo sulla presenza di fattura di acquisto con lo stesso numero secondario nello stesso periodo
@ -768,7 +752,7 @@ switch (post('op')) {
// Messaggio informativo
$message = tr('_DOC_ aggiunto!', [
'_DOC_' => $documento->getReference(),
'_DOC_' => $fattura->getReference(),
]);
flash()->info($message);

View File

@ -27,8 +27,10 @@ use Plugins\ExportFE\FatturaElettronica;
use Plugins\ExportFE\Interaction;
use Util\XML;
use Util\Zip;
use Modules\Fatture\Stato;
$anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita'));
$stato_emessa = $dbo->selectOne('co_statidocumento', 'id', ['descrizione' => 'Emessa'])['id'];
switch (post('op')) {
case 'export-bulk':
@ -394,6 +396,70 @@ switch (post('op')) {
'_LIST_' => implode(',', $list),
]));
break;
case 'change-stato':
$list = [];
$new_stato = Stato::where('descrizione', 'Emessa')->first();
foreach ($id_records as $id) {
$fattura = Fattura::find($id);
$stato_precedente = Stato::find($fattura->idstatodocumento);
if ($stato_precedente->descrizione == 'Bozza') {
$fattura->stato()->associate($new_stato);
$results = $fattura->save();
$message = '';
foreach ($results as $numero => $result) {
foreach ($result as $title => $links) {
foreach ($links as $link => $errors) {
if (empty($title)) {
flash()->warning(tr('La fattura elettronica num. _NUM_ potrebbe avere delle irregolarità!', [
'_NUM_' => $numero,
]).' '.tr('Controllare i seguenti campi: _LIST_', [
'_LIST_' => implode(', ', $errors),
]).'.');
} else {
$message .= '
<p><b>'.$title.' '.$link.'</b></p>
<ul>';
foreach ($errors as $error) {
if (!empty($error)) {
$message .= '
<li>'.$error.'</li>';
}
}
$message .= '
</ul>';
}
}
}
}
if ($message) {
// Messaggi informativi sulle problematiche
$message = tr('La fattura elettronica numero _NUM_ non è stata generata a causa di alcune informazioni mancanti', [
'_NUM_' => $numero,
]).':'.$message;
flash()->warning($message);
}
array_push($list, $fattura->numero_esterno);
}
}
if (!empty($list)) {
flash()->info(tr('Le fatture _LIST_ sono state emesse!', [
'_LIST_' => implode(',', $list),
]));
} else {
flash()->warning(tr('Nessuna fattura emessa!'));
}
break;
}
@ -493,13 +559,25 @@ $operations['change-bank'] = [
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Aggiorna banca').'</span>',
'data' => [
'title' => tr('Aggiornare la banca?'),
'msg' => tr('Per ciascuna fattura selezionato, verrà aggiornata la banca').'
'msg' => tr('Per ciascuna fattura selezionata, verrà aggiornata la banca').'
<br><br>{[ "type": "select", "label": "'.tr('Banca').'", "name": "id_banca", "required": 1, "values": "query=SELECT id, CONCAT (nome, \' - \' , iban) AS descrizione FROM co_banche WHERE id_anagrafica='.prepare($anagrafica_azienda->idanagrafica).'" ]}',
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
],
];
if ($dir == 'entrata') {
$operations['change-stato'] = [
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Emetti fatture').'</span>',
'data' => [
'title' => tr('Emissione fatture'),
'msg' => tr('Vuoi emettere le fatture selezionate? Verranno emesse solo le fatture in Bozza'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
],
];
}
if (Interaction::isEnabled()) {
$operations['hook-send'] = [
'text' => '<span><i class="fa fa-paper-plane"></i> '.tr('Coda di invio FE').'</span>',

View File

@ -565,7 +565,7 @@ class Fattura extends Document
$is_fiscale = $this->isFiscale();
// Salvataggio effettivo
$result = parent::save($options);
parent::save($options);
// Fix dei campi statici
$this->id_riga_bollo = $this->gestoreBollo->manageRigaMarcaDaBollo();
@ -581,7 +581,7 @@ class Fattura extends Document
}
// Salvataggio effettivo
$result = parent::save($options);
parent::save($options);
// Operazioni al cambiamento di stato
// Bozza o Annullato -> Stato diverso da Bozza o Annullato
@ -621,6 +621,42 @@ class Fattura extends Document
}
}
// Operazioni automatiche per le Fatture Elettroniche
if ($this->direzione == 'entrata' && $stato_precedente->descrizione == 'Bozza' && $this->stato['descrizione'] == 'Emessa') {
$stato_fe = database()->fetchOne('SELECT * FROM fe_stati_documento WHERE codice = '.prepare($this->codice_stato_fe));
$abilita_genera = empty($this->codice_stato_fe) || intval($stato_fe['is_generabile']);
// Generazione automatica della Fattura Elettronica
$checks = FatturaElettronica::controllaFattura($this);
$fattura_elettronica = new FatturaElettronica($this->id);
if ($abilita_genera && empty($checks)) {
$fattura_elettronica->save(base_dir().'/'.FatturaElettronica::getDirectory());
if (!$fattura_elettronica->isValid()) {
$errors = $fattura_elettronica->getErrors();
$result[$this->numero_esterno][0][0] = $errors;
}
} elseif (!empty($checks)) {
// Rimozione eventuale fattura generata erronamente
// Fix per la modifica di dati interni su fattura già generata
if ($abilita_genera) {
$fattura_elettronica->delete();
}
foreach ($checks as $check) {
$errors = [];
foreach ($check['errors'] as $error) {
if (!empty($error)) {
$errors = $error;
}
}
if (!empty($errors)) {
$result[$this->numero_esterno][$check['name']][$check['link']] = $check['errors'];
}
}
}
}
return $result;
}

View File

@ -199,6 +199,7 @@ switch (post('op')) {
$intervento->id_preventivo = post('idpreventivo');
$intervento->id_contratto = post('idcontratto');
$intervento->id_ordine = post('idordine');
$intervento->idreferente = post('idreferente');
$intervento->richiesta = post('richiesta');
$intervento->idsede_destinazione = $idsede_destinazione;
$intervento->data_scadenza = $data_scadenza;

View File

@ -183,7 +183,7 @@ echo '
</div>
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Contratto').'", "name": "idcontratto", "value": "'.$id_contratto.'", "ajax-source": "contratti", "readonly": "'.(empty($id_contratto) ? 0 : 1).'", "select-options": '.json_encode(['idanagrafica' => $id_anagrafica]).' ]}
{[ "type": "select", "label": "'.tr('Contratto').'", "name": "idcontratto", "value": "'.$id_contratto.'", "ajax-source": "contratti", "readonly": "'.(empty($id_contratto) ? 0 : 1).'", "select-options": '.json_encode(['idanagrafica' => $id_anagrafica]).', "icon-after": "add|'.Modules::get('Contratti')['id'].'|pianificabile=1&idanagrafica='.$id_anagrafica.'" ]}
</div>
<div class="col-md-4">
@ -191,6 +191,12 @@ echo '
</div>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Referente').'", "name": "idreferente", "ajax-source": "referenti", "select-options": '.json_encode(['idanagrafica' => $id_anagrafica, 'idclientefinale' => $id_cliente_finale]).', "icon-after": "add|'.Modules::get('Anagrafiche')['id'].'|id_plugin='.Plugins::get('Referenti')['id'].'&id_parent='.$id_anagrafica.'" ]}
</div>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "timestamp", "label": "'.tr('Data/ora richiesta').'", "name": "data_richiesta", "required": 1, "value": "'.($data_richiesta ?: '-now-').'" ]}
@ -401,6 +407,7 @@ if (!empty($id_intervento)) {
input("idpreventivo").disable();
input("idcontratto").disable();
input("idordine").disable();
input("idreferente").disable();
input("idimpianti").disable();
input("componenti").disable();
input("idanagrafica").disable();
@ -433,6 +440,8 @@ echo '
var contratto = input("idcontratto");
var preventivo = input("idpreventivo");
var ordine = input("idordine");
var referente = input("idreferente");
var cliente_finale = input("idclientefinale");
$(document).ready(function() {
if(!anagrafica.get()){
@ -440,6 +449,7 @@ echo '
preventivo.disable();
contratto.disable();
ordine.disable();
referente.disable();
input("idimpianti").disable();
input("componenti").disable();
} else{
@ -494,6 +504,9 @@ echo '
ordine.setDisabled(selected)
.getElement().selectReset(placeholder);
referente.setDisabled(selected)
.getElement().selectReset(placeholder);
input("idimpianti").setDisabled(selected);
let data = anagrafica.getData();
@ -520,8 +533,23 @@ echo '
plus_impianto = $(".modal #idimpianti").parent().find(".btn");
plus_impianto.attr("onclick", plus_impianto.attr("onclick").replace(/id_anagrafica=[0-9]*/, "id_anagrafica=" + value));
plus_contratto = $(".modal #idcontratto").parent().find(".btn");
plus_contratto.attr("onclick", plus_contratto.attr("onclick").replace(/idanagrafica=[0-9]*/, "idanagrafica=" + value));
plus_referente = $(".modal #idreferente").parent().find(".btn");
plus_referente.attr("onclick", plus_referente.attr("onclick").replace(/id_parent=[0-9]*/, "id_parent=" + value));
});
//gestione del cliente finale
cliente_finale.change(function() {
updateSelectOption("idclientefinale", $(this).val());
session_set("superselect,idclientefinale", $(this).val(), 0);
referente.getElement()
.selectReset("'.tr("Seleziona un'opzione").'");
});
// Gestione della modifica della sede selezionato
sede.change(function() {
updateSelectOption("idsede_destinazione", $(this).val());

View File

@ -63,6 +63,9 @@ switch (filter('op')) {
$esente = post('esente');
$percentuale = empty($esente) ? post('percentuale') : 0;
$codice_natura = post('codice_natura_fe') ?: null;
$esigibilita = post('esigibilita');
$indetraibile = post('indetraibile');
if ($dbo->fetchNum('SELECT * FROM `co_iva` WHERE `descrizione` = '.prepare($descrizione).' AND `codice` = '.prepare($codice)) == 0) {
$dbo->insert('co_iva', [
'descrizione' => $descrizione,
@ -70,7 +73,8 @@ switch (filter('op')) {
'codice' => $codice,
'codice_natura_fe' => $codice_natura,
'percentuale' => $percentuale,
'indetraibile' => post('indetraibile'),
'indetraibile' => $indetraibile,
'esigibilita' => $esigibilita,
]);
$id_record = $dbo->lastInsertedID();

View File

@ -19,43 +19,62 @@
include_once __DIR__.'/../../core.php';
$esigibilita = [
[
'id' => 'I',
'text' => tr('IVA ad esigibilità immediata'),
],
[
'id' => 'D',
'text' => tr('IVA ad esigibilità differita'),
],
[
'id' => 'S',
'text' => tr('Scissione dei pagamenti'),
],
];
use Modules\Iva\Aliquota;
$codice = Aliquota::max('id')+1;
$codice = Aliquota::max('codice')+1;
?><form action="" method="post" id="add-form">
<input type="hidden" name="op" value="add">
<input type="hidden" name="backto" value="record-edit">
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Codice'); ?>", "name": "codice", "required": 1, "decimals": 0, "min-value": "0", "max-value": "999", "maxlength": 3, "value": "<?php echo $codice; ?>", "validation": "codice" ]}
</div>
<div class="col-md-8">
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1 ]}
</div>
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Codice'); ?>", "name": "codice", "required": 1, "decimals":0, "min-value":"0", "max-value":"999", "maxlength": 3, "value": "<?php echo $codice; ?>", "validation": "codice" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "checkbox", "label": "<?php echo tr('Esente'); ?>", "name": "esente", "id": "esente-add", "value": "$esente$" ]}
</div>
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Percentuale'); ?>", "name": "percentuale", "id": "percentuale-add", "icon-after": "<i class=\"fa fa-percent\"></i>", "max-value": "100" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "number", "label": "<?php echo tr('Indetraibile'); ?>", "name": "indetraibile", "icon-after": "<i class=\"fa fa-percent\"></i>", "max-value": "100" ]}
</div>
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Codice Natura (Fatturazione Elettronica)'); ?>", "name": "codice_natura_fe", "values": "query=SELECT codice as id, CONCAT(codice, ' - ', descrizione) AS descrizione FROM fe_natura", "extra": "disabled" ]}
</div>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Indetraibile'); ?>", "name": "indetraibile", "icon-after": "<i class=\"fa fa-percent\"></i>", "max-value": "100" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Esigibilità (Fatturazione Elettronica)'); ?>", "name": "esigibilita", "values": <?php echo json_encode($esigibilita); ?>, "required": 1 ]}
</div>
</div>
<!-- PULSANTI -->
<div class="row">

View File

@ -58,7 +58,12 @@ if ($res) {
<div class="panel-body">
<div class="row">
<div class="col-md-12">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Codice'); ?>", "name": "codice", "value": "$codice$", "required": 1, "decimals": 0, "min-value": "0", "max-value": "999", "maxlength": 3, "extra": "<?php echo $attr; ?>", "validation": "codice" ]}
</div>
<div class="col-md-8">
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": "$descrizione$" ]}
</div>
</div>
@ -71,19 +76,15 @@ if ($res) {
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Percentuale'); ?>", "name": "percentuale", "id": "percentuale-edit", "value": "$percentuale$", "icon-after": "<i class=\"fa fa-percent\"></i>", "disabled": <?php echo intval($record['esente']); ?>, "readonly": "<?php echo $is_readonly; ?>", "extra": "<?php echo $attr; ?>", "max-value": "100" ]}
</div>
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Indetraibile'); ?>", "name": "indetraibile", "value": "$indetraibile$", "icon-after": "<i class=\"fa fa-percent\"></i>", "readonly": "<?php echo $is_readonly; ?>", "extra": "<?php echo $attr; ?>", "max-value": "100" ]}
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Codice Natura (Fatturazione Elettronica)'); ?>", "name": "codice_natura_fe", "value": "$codice_natura_fe$", "required": <?php echo intval($record['esente']); ?>, "disabled": <?php echo intval(!$record['esente']); ?>, "values": "query=SELECT codice as id, CONCAT(codice, ' - ', descrizione) AS descrizione FROM fe_natura", "readonly": "<?php echo $is_readonly; ?>", "extra": "<?php echo $attr; ?>" ]}
</div>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Codice'); ?>", "name": "codice", "value": "$codice$", "required": 1, "decimals":0, "min-value":"0", "max-value":"999", "maxlength": 3, "extra": "<?php echo $attr; ?>", "validation": "codice" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Codice Natura (Fatturazione Elettronica)'); ?>", "name": "codice_natura_fe", "value": "$codice_natura_fe$", "required": <?php echo intval($record['esente']); ?>, "disabled": <?php echo intval(!$record['esente']); ?>, "values": "query=SELECT codice as id, CONCAT(codice, ' - ', descrizione) AS descrizione FROM fe_natura", "readonly": "<?php echo $is_readonly; ?>", "extra": "<?php echo $attr; ?>" ]}
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Indetraibile'); ?>", "name": "indetraibile", "value": "$indetraibile$", "icon-after": "<i class=\"fa fa-percent\"></i>", "readonly": "<?php echo $is_readonly; ?>", "extra": "<?php echo $attr; ?>", "max-value": "100" ]}
</div>
<div class="col-md-4">

View File

@ -19,6 +19,40 @@
include_once __DIR__.'/../../core.php';
function renderRiga($id, $riga)
{
// Conto
echo '
<tr>
<td>
{[ "type": "select", "name": "idconto['.$id.']", "id": "conto'.$id.'", "value": "'.($riga['idconto'] ?: '').'", "ajax-source": "conti-modelliprimanota" ]}
</td>';
// Dare
echo '
<td>
{[ "type": "number", "name": "dare['.$id.']", "id": "dare'.$id.'", "value": "'.($riga['totale'] > 0 ? abs($riga['totale']) : 0).'" ]}
</td>';
// Avere
echo '
<td>
{[ "type": "number", "name": "avere['.$id.']", "id": "avere'.$id.'", "value": "'.($riga['totale'] < 0 ? abs($riga['totale']) : 0).'" ]}
</td>
</tr>';
}
// Nuova riga
echo '
<table class="hide">
<tbody id="template">';
renderRiga('-id-', null);
echo '
</tbody>
</table>';
?><form action="" method="post" id="add-form">
<input type="hidden" name="op" value="add">
<input type="hidden" name="backto" value="record-edit">
@ -41,6 +75,10 @@ include_once __DIR__.'/../../core.php';
Form di aggiunta riga movimento
*/
echo '
<button class="btn btn-info btn-xs pull-right" type="button" id="addriga" onclick="addRiga(this)">
<i class="fa fa-plus"></i> '.tr('Aggiungi riga').'
</button>
<br><br>
<table class="table table-striped table-condensed table-hover table-bordered"
<tr>
<th width="60%">'.tr('Conto').'</th>
@ -48,25 +86,11 @@ include_once __DIR__.'/../../core.php';
<th width="20%">'.tr('Avere').'</th>
</tr>';
for ($i = 0; $i < 10; ++$i) {
$required = ($i <= 1) ? 1 : 0;
$counter = 0;
// Conto
echo '
<tr>
<td>
{[ "type": "select", "name": "idconto['.$i.']", "ajax-source": "conti", "required": "'.$required.'" ]}
</td>
<td class="text-right">
{[ "type": "number", "name": "dare['.$i.']", "id": "dare'.$id.'", "value": "'.($rs[$i]['totale'] > 0 ? $rs[$i]['totale'] : '').'"]}
</td>
<td class="text-right">
{[ "type": "number", "name": "avere['.$i.']", "id": "avere'.$id.'", "value": "'.($rs[$i]['totale'] < 0 ? abs($rs[$i]['totale']) : '').'"]}
</td>
</tr>';
}
foreach ($rs as $r) {
renderRiga($counter++, $r);
}
echo '
</table>';
@ -110,41 +134,72 @@ include_once __DIR__.'/../../core.php';
</form>
<script>
$(document).ready( function() {
$('#modals select').on('change', function() {
if($(this).parent().parent().find('input[disabled]').length != 1){
if($(this).val()) {
$(this).parent().parent().find('input').prop("disabled", false);
}
else{
$(this).parent().parent().find('input').prop("disabled", true);
$(this).parent().parent().find('input').val("");
}
}
});
});
$(document).ready(function() {
// Fix per l\'inizializzazione degli input
$("input[id*=dare], input[id*=avere]").each(function() {
if (input(this).get() === 0) {
$(this).prop("disabled", true);
} else {
$(this).prop("disabled", false);
}
});
$("#modals input[id*=dare], #modals input[id*=avere]").each(function() {
if (input(this).get() === 0) {
$(this).prop("disabled", true);
} else {
$(this).prop("disabled", false);
// Trigger dell\'evento keyup() per la prima volta, per eseguire i dovuti controlli nel caso siano predisposte delle righe in prima nota
$("input[id*=dare][value!=\'\'], input[id*=avere][value!=\'\']").keyup();
$("select[id*=idconto]").click(function() {
$("input[id*=dare][value!=\'\'], input[id*=avere][value!=\'\']").keyup();
});
// Creazione delle eventuali righe aggiuntive
let table = $("#modals table").first();
let button = table.parent().find("button").first();
let row_needed = $("#modals select").length;
let row_count = table.find("tr").length - 2;
while (row_count < row_needed) {
button.click();
row_count++;
}
});
$(document).on("keyup change", "#modals input[id*=dare]", function() {
let row = $(this).parent().parent();
});
if (!$(this).prop("disabled")) {
row.find("#modals input[id*=avere]").prop("disabled", input(this).get() !== 0);
}
});
$(document).on("change", "select", function() {
let row = $(this).parent().parent();
$(document).on("keyup change", "#modals input[id*=avere]", function() {
let row = $(this).parent().parent();
if (row.find("input[disabled]").length > 1) {
row.find("input").prop("disabled", !$(this).val());
}
});
if (!$(this).prop("disabled")) {
row.find("#modals input[id*=dare]").prop("disabled", input(this).get() !== 0);
}
});
$(document).on("keyup change", "input[id*=dare]", function() {
let row = $(this).parent().parent();
if (!$(this).prop("disabled")) {
row.find("input[id*=avere]").prop("disabled", $(this).val().toEnglish());
}
});
$(document).on("keyup change", "input[id*=avere]", function() {
let row = $(this).parent().parent();
if (!$(this).prop("disabled")) {
row.find("input[id*=dare]").prop("disabled", $(this).val().toEnglish());
}
});
var n = <?php echo $counter; ?>;
function addRiga(btn) {
var raggruppamento = $(btn).parent();
cleanup_inputs();
var tabella = raggruppamento.find("tbody");
var content = $("#template").html();
var text = replaceAll(content, "-id-", "" + n);
tabella.append(text);
restart_inputs();
n++;
}
$(document).ready(init);
</script>

View File

@ -19,6 +19,40 @@
include_once __DIR__.'/../../core.php';
function renderRiga($id, $riga)
{
// Conto
echo '
<tr>
<td>
{[ "type": "select", "name": "idconto['.$id.']", "id": "conto'.$id.'", "value": "'.($riga['idconto'] ?: '').'", "ajax-source": "conti-modelliprimanota" ]}
</td>';
// Dare
echo '
<td>
{[ "type": "number", "name": "dare['.$id.']", "id": "dare'.$id.'", "value": "'.($riga['totale'] > 0 ? abs($riga['totale']) : 0).'" ]}
</td>';
// Avere
echo '
<td>
{[ "type": "number", "name": "avere['.$id.']", "id": "avere'.$id.'", "value": "'.($riga['totale'] < 0 ? abs($riga['totale']) : 0).'" ]}
</td>
</tr>';
}
// Nuova riga
echo '
<table class="hide">
<tbody id="template">';
renderRiga('-id-', null);
echo '
</tbody>
</table>';
?><form action="" method="post" id="edit-form">
<input type="hidden" name="op" value="editriga">
<input type="hidden" name="backto" value="record-edit">
@ -58,6 +92,10 @@ for ($x = 0; $x < sizeof($conti2); ++$x) {
Form di modifica riga movimento
*/
echo '
<button class="btn btn-info btn-xs pull-right" type="button" onclick="addRiga(this)">
<i class="fa fa-plus"></i> '.tr('Aggiungi riga').'
</button>
<br><br>
<table class="table table-striped table-condensed table-hover table-bordered"
<tr>
<th width="60%">'.tr('Conto').'</th>
@ -67,24 +105,10 @@ echo '
// Lettura movimenti del mastrino selezionato
$rs = $dbo->fetchArray('SELECT * FROM co_movimenti_modelli WHERE idmastrino='.prepare($record['idmastrino']));
for ($i = 0; $i < 10; ++$i) {
$required = ($i <= 1) ? 1 : 0;
$counter = 0;
// Conto
echo '
<tr>
<td>
{[ "type": "select", "name": "idconto['.$i.']", "value": "'.$rs[$i]['idconto'].'", "ajax-source": "conti-modelliprimanota", "required": "'.$required.'" ]}
</td>
<td class="text-right">
{[ "type": "number", "name": "dare['.$i.']", "id": "dare'.$id.'", "value": "'.($rs[$i]['totale'] > 0 ? $rs[$i]['totale'] : '').'"]}
</td>
<td class="text-right">
{[ "type": "number", "name": "avere['.$i.']", "id": "avere'.$id.'", "value": "'.($rs[$i]['totale'] < 0 ? abs($rs[$i]['totale']) : '').'"]}
</td>
</tr>';
foreach ($rs as $r) {
renderRiga($counter++, $r);
}
echo '
@ -92,49 +116,65 @@ echo '
?>
<script type="text/javascript">
$(document).ready( function() {
$('select').on('change', function() {
if($(this).parent().parent().find('input[disabled]').length != 1){
if($(this).val()) {
$(this).parent().parent().find('input').prop("disabled", false);
}
else{
$(this).parent().parent().find('input').prop("disabled", true);
$(this).parent().parent().find('input').val("");
}
}
});
});
<script type="text/javascript">
$(document).ready(function() {
// Fix per l\'inizializzazione degli input
$("input[id*=dare], input[id*=avere]").each(function() {
let row = $(this).parent().parent();
if (!row.find("select").val()) {
if (input(this).get() === 0) {
$(this).prop("disabled", true);
} else {
$(this).prop("disabled", false);
}
}
});
$(document).on("keyup change", "input[id*=dare]", function() {
let row = $(this).parent().parent();
if (!$(this).prop("disabled")) {
row.find("input[id*=avere]").prop("disabled", input(this).get() !== 0);
if (input(this).get() === 0) {
$(this).prop("disabled", true);
} else {
$(this).prop("disabled", false);
}
});
$(document).on("keyup change", "input[id*=avere]", function() {
let row = $(this).parent().parent();
// Trigger dell\'evento keyup() per la prima volta, per eseguire i dovuti controlli nel caso siano predisposte delle righe in prima nota
$("input[id*=dare][value!=\'\'], input[id*=avere][value!=\'\']").keyup();
if (!$(this).prop("disabled")) {
row.find("input[id*=dare]").prop("disabled", input(this).get() !== 0);
}
$("select[id*=idconto]").click(function() {
$("input[id*=dare][value!=\'\'], input[id*=avere][value!=\'\']").keyup();
});
</script>
});
$(document).on("change", "select", function() {
let row = $(this).parent().parent();
if (row.find("input[disabled]").length > 1) {
row.find("input").prop("disabled", !$(this).val());
}
});
$(document).on("keyup change", "input[id*=dare]", function() {
let row = $(this).parent().parent();
if (!$(this).prop("disabled")) {
row.find("input[id*=avere]").prop("disabled", $(this).val().toEnglish());
}
});
$(document).on("keyup change", "input[id*=avere]", function() {
let row = $(this).parent().parent();
if (!$(this).prop("disabled")) {
row.find("input[id*=dare]").prop("disabled", $(this).val().toEnglish());
}
});
var n = <?php echo $counter; ?>;
function addRiga(btn) {
var raggruppamento = $(btn).parent();
cleanup_inputs();
var tabella = raggruppamento.find("tbody");
var content = $("#template").html();
var text = replaceAll(content, "-id-", "" + n);
tabella.append(text);
restart_inputs();
n++;
}
$(document).ready(init);
</script>
</form>

View File

@ -258,7 +258,7 @@ class Ordine extends Document
public function getReferenceNumber()
{
return $this->numero_esterno ?: $this->numero;
return $this->numero_cliente ?: ($this->numero_esterno ?: $this->numero);
}
public function getReferenceDate()

View File

@ -170,8 +170,11 @@ switch (post('op')) {
$idconto_apertura = setting('Conto per Apertura conti patrimoniali');
$idconto_chiusura = setting('Conto per Chiusura conti patrimoniali');
$data_inizio = $_SESSION['period_start'];
$data_fine = $_SESSION['period_end'];
// Lettura di tutti i conti dello stato patrimoniale con saldo != 0
$conti = $dbo->fetchArray('SELECT co_pianodeiconti3.id, SUM(co_movimenti.totale) AS totale FROM ((co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id) INNER JOIN co_pianodeiconti1 ON co_pianodeiconti2.idpianodeiconti1=co_pianodeiconti1.id) INNER JOIN co_movimenti ON co_pianodeiconti3.id=co_movimenti.idconto WHERE co_pianodeiconti1.descrizione="Patrimoniale" AND data <= '.prepare($_SESSION['period_end']).' AND co_pianodeiconti3.id NOT IN('.prepare($idconto_apertura).', '.prepare($idconto_chiusura).') AND is_apertura=0 AND is_chiusura=0 GROUP BY co_pianodeiconti3.id HAVING totale != 0');
$conti = $dbo->fetchArray('SELECT co_pianodeiconti3.id, SUM(co_movimenti.totale) AS totale FROM ((co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id) INNER JOIN co_pianodeiconti1 ON co_pianodeiconti2.idpianodeiconti1=co_pianodeiconti1.id) INNER JOIN co_movimenti ON co_pianodeiconti3.id=co_movimenti.idconto WHERE co_pianodeiconti1.descrizione="Patrimoniale" AND data >= '.prepare($data_inizio).' AND data <= '.prepare($data_fine).' AND co_pianodeiconti3.id!='.prepare($idconto_chiusura).' AND is_chiusura=0 GROUP BY co_pianodeiconti3.id HAVING totale != 0');
$mastrino = Mastrino::build(tr('Chiusura conto'), $_SESSION['period_end'], 0, true);

View File

@ -126,10 +126,10 @@ foreach ($id_documenti as $id_documento) {
continue;
}
if (empty($id_anagrafica_movimenti)) {
if ($id_anagrafica_movimenti == null) {
$id_anagrafica_movimenti = $fattura->idanagrafica;
} elseif ($fattura->idanagrafica != $id_anagrafica_movimenti) {
$id_anagrafica_movimenti = null;
$id_anagrafica_movimenti = 0;
}
$numeri_fatture[] = !empty($fattura['numero_esterno']) ? $fattura['numero_esterno'] : $fattura['numero'];
@ -204,7 +204,7 @@ if ($numero_documenti + $numero_scadenze > 1) {
$descrizione = $is_ultimo_importo_avere ? tr('Inc. fatture _NAME_ num. _LIST_') : tr('Pag. fatture _NAME_ num. _LIST_');
$descrizione = replace($descrizione, [
'_NAME_' => $anagrafica_movimenti->ragione_sociale,
'_NAME_' => $anagrafica_movimenti->ragione_sociale ?: '',
'_LIST_' => implode(', ', $numeri_fatture),
]);
} else {

View File

@ -53,8 +53,8 @@ $clienti = DettaglioPrezzo::where('id_articolo', $id_articolo)
->groupBy('id_anagrafica');
if (!$clienti->isEmpty()) {
echo '
<table class="table table-condensed table-bordered">
<thead>
<table class="table table-striped table-condensed table-bordered">
<tbody>
<tr>
<th>'.tr('Cliente').'</th>
<th class="text-center" width="210">'.tr('Q. minima').'</th>
@ -62,10 +62,7 @@ if (!$clienti->isEmpty()) {
<th class="text-center" width="150">'.tr('Prezzo unitario').'</th>
<th class="text-center" width="150">'.tr('Sconto').'</th>
<th class="text-center" width="150">#</th>
</tr>
</thead>
<tbody>';
</tr>';
foreach ($clienti as $id_cliente => $prezzi) {
$anagrafica = $prezzi->first()->anagrafica;

View File

@ -42,6 +42,7 @@ switch (filter('op')) {
}
$fornitore->codice_fornitore = post('codice_fornitore');
$fornitore->barcode_fornitore = post('barcode_fornitore');
$fornitore->descrizione = post('descrizione');
$fornitore->qta_minima = post('qta_minima');
$fornitore->giorni_consegna = post('giorni_consegna');

View File

@ -52,9 +52,13 @@ echo '
<input type="hidden" name="id_articolo" value="'.$id_articolo.'">
<div class="row">
<div class="col-md-12">
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Codice fornitore').'", "name": "codice_fornitore", "required": 1, "value": "'.$fornitore['codice_fornitore'].'" ]}
</div>
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Barcode').'", "name": "barcode_fornitore", "value": "'.$fornitore['barcode_fornitore'].'" ]}
</div>
</div>
<div class="row">

View File

@ -79,8 +79,9 @@ if (!$fornitori_disponibili->isEmpty()) {
echo '
<tr>
<th>'.tr('Fornitore').'</th>
<th width="150">'.tr('Codice').'</th>
<th>'.tr('Descrizione').'</th>
<th width="150">'.tr('Codice').'</th>
<th width="150">'.tr('Barcode').'</th>
<th class="text-center" width="210">'.tr('Q. minima ordinabile').'</th>
<th class="text-center" width="150">'.tr('Tempi di consegna').'</th>
<th class="text-center" width="150">#</th>
@ -93,12 +94,16 @@ if (!$fornitori_disponibili->isEmpty()) {
if (!empty($dettaglio)) {
echo '
<td>
'.$dettaglio['descrizione'].'
</td>
<td class="text-center">
'.$dettaglio['codice_fornitore'].'
</td>
<td>
'.$dettaglio['descrizione'].'
<td class="text-center">
'.$dettaglio['barcode_fornitore'].'
</td>
<td class="text-right">
@ -112,8 +117,9 @@ if (!$fornitori_disponibili->isEmpty()) {
</td>';
} else {
echo '
<td class="text-center">-</td>
<td>-</td>
<td class="text-center">-</td>
<td class="text-center">-</td>
<td class="text-right">-</td>
<td class="text-right">-</td>';
}
@ -152,7 +158,7 @@ if (!$fornitori_disponibili->isEmpty()) {
if (!empty($prezzi) && !$prezzi->isEmpty()) {
echo '
<tr>
<td></td>
<td colspan="2"></td>
<th class="text-center">'.tr('Q. minima').'</th>
<th class="text-center">'.tr('Q. massima').'</th>
<th class="text-center">'.tr('Prezzo unitario').'</th>
@ -163,7 +169,7 @@ if (!$fornitori_disponibili->isEmpty()) {
foreach ($prezzi as $key => $dettaglio) {
echo '
<tr '.(($anagrafica->id == $articolo->id_fornitore) ? 'class="success"' : '').'>
<td></td>
<td colspan="2"></td>
<td class="text-right">
'.($dettaglio->minimo ? numberFormat($dettaglio->minimo) : '-').'

View File

@ -1,13 +1,41 @@
<?php
use Plugins\PresentazioniBancarie\Gestore;
use Modules\Banche\Banca;
include_once __DIR__.'/init.php';
if (!empty($records)) {
include $structure->filepath('generate.php');
return;
}else{
$banca_azienda = Banca::where('id_anagrafica', Gestore::getAzienda()->id)
->where('predefined', 1)
->first();
try {
if (empty($banca_azienda)) {
echo '
<div class="alert alert-warning">
<i class="fa fa-warning"></i>
'.tr("La banca dell'azienda non è definita o non ha impostati i campi Codice IBAN e BIC").'.
'.Modules::link('Banche', null, tr('Imposta'), null, null).'
</div>';
}
}
catch (Exception $e) {
}
}
echo '
<div class="row">
<div class="col-md-3">
@ -21,7 +49,7 @@ echo '
<div class="row">
<div class="col-md-12 text-right">
<button type="button" class="btn btn-warning" onclick="esporta(this)">
<button type="button" class="btn btn-primary '.(!empty($banca_azienda) ? '' : 'disabled').'" onclick="esporta(this)">
<i class="fa fa-download"></i> '.tr('Esporta').'
</button>
</div>
@ -38,7 +66,7 @@ function getRecords() {
function esporta(button) {
let records = getRecords();
if (!records.length) {
swal("'.tr('Errore').'", "'.tr('Selezione assente!').'", "error");
swal("'.tr('Errore').'", "'.tr('Selezionare almeno una scadenza.').'", "error");
return;
}

View File

@ -26,7 +26,7 @@ $(document).ready(function () {
$("#pulsanti .pull-right").hide();
})
</script>
<p>'.tr('Riepilogo di esportazione per i pagamenti ai fornitori').'.</p>';
<p>'.tr('Riepilogo di esportazione dei pagamenti').'.</p>';
// Azienda predefinita
$azienda = Anagrafica::find(setting('Azienda predefinita'));
@ -35,10 +35,8 @@ if (empty($banca_azienda)) {
echo '
<div class="alert alert-warning">
<i class="fa fa-warning"></i>
'.tr("L'anagrafica Azienda non ha impostati i campi Codice IBAN e BIC per l'esecuzione dei pagamenti").'.
'.Modules::link('Anagrafiche', $azienda->id, tr('Imposta'), null, 'class="btn btn-warning pull-right"').'
<div class="clearfix"></div>
'.tr("La banca dell'azienda non è definita o non ha impostati i campi Codice IBAN e BIC").'.
'.Modules::link('Banche', $azienda->id, tr('Imposta'), null, null).'
</div>';
}

View File

@ -278,7 +278,7 @@ abstract class Component extends Model
$nuovo_riferimento = null;
// Rimozione del riferimento precedente dalla descrizione
if ($this->hasOriginalComponent()) {
if ($this->hasOriginalComponent() && empty(setting('Mantieni riferimenti tra tutti i documenti collegati'))) {
$riferimento_precedente = self::getDescrizioneRiferimento(
$this->getOriginalComponent()->getDocument()
);

View File

@ -287,7 +287,7 @@ abstract class Document extends Model implements ReferenceInterface, DocumentInt
*/
public function getScontoFinale()
{
$netto = $this->calcola('netto');
$netto = $this->netto;
if (!empty($this->sconto_finale_percentuale)) {
$sconto = $netto * ($this->sconto_finale_percentuale / 100);

View File

@ -56,15 +56,14 @@ $tipo_cliente = $record['tipo_cliente'];
$tipo_doc = $record['tipo_doc'];
$numero = !empty($record['numero_esterno']) ? $record['numero_esterno'] : $record['numero'];
// Fix per le fattura accompagnatorie
$fattura_accompagnatoria = ($record['tipo_doc'] == 'Fattura accompagnatoria di vendita');
// Caso particolare per le fatture pro forma
if (empty($record['is_fiscale'])) {
$tipo_doc = tr('Fattura pro forma');
}
// Fix per le fattura accompagnatorie
$fattura_accompagnatoria = ($record['tipo_doc'] == 'Fattura accompagnatoria di vendita');
$tipo_doc = ($fattura_accompagnatoria) ? 'Fattura accompagnatoria di vendita' : $tipo_doc;
// Leggo i dati della destinazione (se 0=sede legale, se!=altra sede da leggere da tabella an_sedi)
$destinazione = '';
if (!empty($record['idsede_destinazione'])) {

View File

@ -197,7 +197,7 @@ foreach ($righe as $riga) {
if ($riga->isArticolo() && !empty($riga->articolo->image)) {
echo '
<td align="center">
<img src="'.$riga->articolo->image.'" style="max-height: 80px; max-width:120px">
<img src="'.$riga->articolo->image.'" style="max-height: 60px; max-width:80px">
</td>';
$autofill->set(5);

View File

@ -12,4 +12,17 @@ INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`,
((SELECT `id` FROM `zz_modules` WHERE `name` = 'Scadenzario'), 'icon_title_Inviato', 'IF(`email`.`id_email` IS NOT NULL, ''Inviato'', '''')', 17, 1, 0, 0, '', '', 0, 0, 1);
-- Set tipo intervento tempo_standard = 1
UPDATE `in_tipiintervento` SET `tempo_standard` = '1' WHERE `in_tipiintervento`.`tempo_standard` = 0 OR `in_tipiintervento`.`tempo_standard` IS NULL;
UPDATE `in_tipiintervento` SET `tempo_standard` = '1' WHERE `in_tipiintervento`.`tempo_standard` = 0 OR `in_tipiintervento`.`tempo_standard` IS NULL;
-- Aggiunto campo Barcode fornitore
ALTER TABLE `mg_fornitore_articolo` ADD `barcode_fornitore` VARCHAR(255) NOT NULL AFTER `codice_fornitore`;
-- Aggiunta impostazione per scegliere colore sessioni dashboard
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, 'Visualizzazione colori sessioni', 'Sfondo colore stato - bordo colore tecnico', 'list[Sfondo colore stato - bordo colore tecnico,Sfondo colore tecnico - bordo colore stato]', '1', 'Dashboard', '7', '');
-- Aggiunta impostazione per riportare nei documenti tutti i riferimenti collegati
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, 'Mantieni riferimenti tra tutti i documenti collegati', '1', 'boolean', '1', 'Generali', '19', 'Permette l''aggiunta dei riferimenti di tutti i documenti collegati');
-- Aggiunta colonna Codice in Anagrafiche
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES
(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Anagrafiche'), 'Codice', 'an_anagrafiche.codice', 1, 1, 0, 0, '', '', 0, 0, 1);