Aggiunta gestione Automezzi

This commit is contained in:
Beppe 2023-11-30 12:57:03 +01:00
parent ce2da169ff
commit 848c2bf22c
21 changed files with 1023 additions and 4 deletions

View File

@ -66,6 +66,7 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
## 2.4.52
### Aggiunto (Added)
- Aggiunta la gestione delle sedi definite come automezzi con pratico modulo per il carico/scarico degli articoli nell'automezzo, l'assegnazione di tecnici/autisti con date di validità e stampe di carico filtrabili
### Modificato (Changed)
- Aggiunta una limitazione sulle quantità scaricabili nei documenti di vendita in modo da non poter vendere più articoli di quelli presenti fisicamente nel magazzino selezionato. Questa limitazione è legata all'impostazione **Permetti selezione articoli con quantità minore o uguale a zero in Documenti di Vendita**

View File

@ -0,0 +1,192 @@
<?php
include_once __DIR__.'/../../core.php';
use Carbon\Carbon;
use Modules\Articoli\Articolo;
switch (post('op')) {
case 'update':
$targa = post('targa');
$nome = post('nome');
$descrizione = post('descrizione');
if ($dbo->fetchNum('SELECT targa FROM an_sedi WHERE targa='.prepare($targa).' AND NOT id='.prepare($id_record)) == 0) {
$query = 'UPDATE an_sedi SET targa='.prepare($targa).', descrizione='.prepare($descrizione).', nome='.prepare($nome).' WHERE id='.prepare($id_record);
if ($dbo->query($query)) {
flash()->info(tr('Informazioni salvate correttamente!'));
}
} else {
flash()->error(tr('Esiste già un automezzo con questa targa!'));
}
break;
// Aggiunta automezzo
case 'add':
$targa = post('targa');
$nome = post('nome');
// Inserisco l'automezzo solo se non esiste un altro articolo con stesso targa
if ($dbo->fetchNum('SELECT targa FROM an_sedi WHERE targa='.prepare($targa)) == 0) {
$dbo->insert('an_sedi', [
'idanagrafica' => setting('Azienda predefinita'),
'nomesede' => $nome." - ".$targa,
'is_automezzo' => 1,
'targa' => $targa,
'nome' => $nome,
]);
$id_record = $dbo->lastInsertedID();
flash()->info(tr('Aggiunto un nuovo automezzo!'));
} else {
flash()->error(tr('Esiste già un automezzo con questa targa!'));
}
break;
// Aggiunta tecnico
case 'addtech':
$idtecnico = post('idtecnico');
$data_inizio = post('data_inizio');
$data_fine = null;
// Controllo sull'effettivo inserimento di una data di fine successiva a quella di inizio
if (!empty(post('data_fine'))) {
if (new DateTime(post('data_fine')) >= new DateTime($data_inizio)) {
$data_fine = post('data_fine');
}
}
$data_fine = isset($data_fine) ? $data_fine : '0000-00-00';
// Inserisco il tecnico
$dbo->insert('an_sedi_tecnici',[
'idtecnico' => $idtecnico,
'idsede' => $id_record,
'data_inizio' => $data_inizio,
'data_fine' => $data_fine,
]);
flash()->info(tr('Collegato un nuovo tecnico!'));
break;
// Salvataggio tecnici collegati
case 'savetech':
$errors = 0;
foreach (post('data_inizio') as $idautomezzotecnico => $data) {
$idautomezzotecnico = $idautomezzotecnico;
$data_inizio = post('data_inizio')[$idautomezzotecnico];
$data_fine = null;
// Controllo sull'effettivo inserimento di una data di fine successiva a quella di inizio
if (!empty(post('data_fine')[$idautomezzotecnico])) {
if (new DateTime(post('data_fine')[$idautomezzotecnico]) >= new DateTime($data_inizio)) {
$data_fine = post('data_fine')[$idautomezzotecnico];
}
}
$data_fine = isset($data_fine) ? $data_fine : '0000-00-00';
$dbo->update('an_sedi_tecnici',[
'idtecnico' => $idtecnico,
'idsede' => $id_record,
'data_inizio' => $data_inizio,
'data_fine' => $data_fine,
],['id' => $idautomezzotecnico]);
if (!$dbo->query($query)) {
++$errors;
}
}
if ($errors == 0) {
flash()->info(tr('Informazioni salvate correttamente!'));
} else {
flash()->error(tr('Errore durante il salvataggio del tecnico!'));
}
break;
// Eliminazione associazione con tecnico
case 'deltech':
$idautomezzotecnico = post('id');
$query = 'DELETE FROM an_sedi_tecnici WHERE id='.prepare($idautomezzotecnico);
if ($dbo->query($query)) {
flash()->info(tr('Tecnico rimosso!'));
}
break;
// Aggiunta quantità nell'automezzo
case 'addrow':
$idarticolo = post('idarticolo');
$qta = post('qta');
$articolo = Articolo::find($idarticolo);
$automezzo = $dbo->table("an_sedi")->where('id',$id_record)->first();
// Registrazione del movimento verso la sede di destinazione
$articolo->registra($qta, tr('Carico dal magazzino sull\'automezzo _SEDE_',['_SEDE_' => $automezzo->nomesede]), Carbon::now(), 1, [
'idsede' => $id_record,
]);
// Registrazione del movimento dalla sede di origine
$articolo->registra(-$qta, tr('Scarico nel magazzino dall\'automezzo _SEDE_',['_SEDE_' => $automezzo->nomesede]), Carbon::now(), 1, [
'idsede' => 0,
]);
flash()->info(tr("Caricato il magazzino dell'automezzo!"));
break;
case 'editrow':
$idarticolo = post('idarticolo');
$articolo = Articolo::find($idarticolo);
$automezzo = $dbo->table("an_sedi")->where('id',$id_record)->first();
$qta = post('qta') - $dbo->fetchOne("SELECT SUM(mg_movimenti.qta) AS qta FROM mg_movimenti WHERE mg_movimenti.idarticolo=".prepare($idarticolo)." AND mg_movimenti.idsede=".prepare($id_record))['qta'];
// Registrazione del movimento verso la sede di destinazione
$articolo->registra($qta, tr('Carico dal magazzino sull\'automezzo _SEDE_',['_SEDE_' => $automezzo->nomesede]), Carbon::now(), 1, [
'idsede' => $id_record,
]);
// Registrazione del movimento dalla sede di origine
$articolo->registra(-$qta, tr('Scarico nel magazzino dall\'automezzo _SEDE_',['_SEDE_' => $automezzo->nomesede]), Carbon::now(), 1, [
'idsede' => 0,
]);
flash()->info(tr("Caricato il magazzino dell'automezzo!"));
break;
// Spostamento scorta da automezzo a magazzino generale
case 'moverow':
$idarticolo = post('idarticolo');
$idautomezzotecnico = post('idautomezzotecnico');
$articolo = Articolo::find($idarticolo);
$automezzo = $dbo->table("an_sedi")->where('id',$idautomezzotecnico)->first();
$qta = $dbo->fetchOne("SELECT SUM(qta) AS qta FROM mg_movimenti WHERE idarticolo=".prepare($idarticolo)." AND idsede=".prepare($idautomezzotecnico))['qta'];
// Registrazione del movimento verso la sede di destinazione
$articolo->registra($qta, tr('Carico nel magazzino dall\'automezzo _SEDE_',['_SEDE_' => $automezzo->nomesede]), Carbon::now(), 1, [
'idsede' => 0,
]);
// Registrazione del movimento dalla sede di origine
$descrizione = tr('Scarico dall\'automezzo _SEDE_ nel magazzino',[
'_SEDE_' => $automezzo->nomesede
]);
$articolo->registra(-$qta, $descrizione, Carbon::now(), 1, [
'idsede' => $idautomezzotecnico,
]);
break;
case 'delete':
$dbo->query('DELETE FROM `an_sedi` WHERE `id`='.prepare($id_record));
flash()->info(tr('Automezzo eliminato e articoli riportati in magazzino!'));
break;
}

25
modules/automezzi/add.php Normal file
View File

@ -0,0 +1,25 @@
<?php
include_once __DIR__.'/../../core.php';
?><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-6">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 1 ]}
</div>
<div class="col-md-6">
{[ "type": "text", "label": "<?php echo tr('Targa'); ?>", "name": "targa", "required": 1, "maxlength": 10, "class": "alphanumeric-mask" ]}
</div>
</div>
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary"><i class="fa fa-plus"></i> <?php echo tr('Aggiungi'); ?></button>
</div>
</div>
</form>

View File

@ -0,0 +1,48 @@
<?php
include_once __DIR__.'/../../core.php';
$idautomezzo = get('idautomezzo');
$idarticolo = get('idarticolo');
$op = "addrow";
$qta = 1;
if( !empty($idarticolo) && !empty($idautomezzo) ){
$qta = $dbo->fetchOne("SELECT SUM(mg_movimenti.qta) AS qta FROM mg_movimenti WHERE mg_movimenti.idarticolo=".prepare($idarticolo)." AND mg_movimenti.idsede=".prepare($idautomezzo))['qta'];
$op = "editrow";
}
/*
Form di inserimento riga documento
*/
echo '
<form id="link_form" action="'.$rootdir.'/editor.php?id_module='.Modules::get('Automezzi')['id'].'&id_record='.$idautomezzo.'" method="post">
<input type="hidden" name="op" value="'.$op.'">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="id_record" value="'.$idautomezzo.'">';
// Seleziona articolo
echo '
<div class="col-md-8">
{[ "type": "select", "label": "'.tr('Articolo').'", "name": "idarticolo", "required": 1, "value": "'.$idarticolo.'", "ajax-source": "articoli" ]}
</div>';
// Quantità
echo '
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Q.tà su questo automezzo').'", "name": "qta", "value": "'.$qta.'", "decimals": "qta" ]}
</div>';
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary pull-right"><i class="fa fa-plus"></i> '.tr('Aggiungi').'</button>
</div>
</div>
</form>';
echo '
<script>
$(document).ready(function(){init();});
</script>';

View File

@ -0,0 +1,58 @@
<?php
include_once __DIR__.'/../../core.php';
$id_record = get('idautomezzo');
// Form di inserimento responsabili automezzo
echo '
<form action="'.$rootdir.'/editor.php?id_module='.Modules::get('Automezzi')['id'].'&id_record='.$id_record.'" method="post">
<input type="hidden" name="op" value="addtech">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="id_record" value="'.$id_record.'">
<div class="row">';
// Tecnico
echo '
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Tecnico').'", "name": "idtecnico", "required": 1, "values": "query=SELECT an_anagrafiche.idanagrafica AS id, ragione_sociale AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE (descrizione=\'Tecnico\') AND deleted_at IS NULL ORDER BY ragione_sociale", "value": "'.$idtecnico.'" ]}
</div>';
// Data di partenza
echo '
<div class="col-md-3">
{[ "type": "date", "label": "'.tr('Data dal').'", "name": "data_inizio", "required": 1, "value": "-now-" ]}
</div>';
// Data di fine
echo '
<div class="col-md-3">
{[ "type": "date", "label": "'.tr('Data al').'", "name": "data_fine", "min-date": "-now-" ]}
</div>';
echo '
</div>
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary pull-right"><i class="fa fa-plus"></i> '.tr('Aggiungi').'</button>
</div>
</div>
</form>';
echo '
<script type="text/javascript">
$(document).ready(function(){init();});
$(function () {
$("#data_inizio").on("dp.change", function (e) {
$("#data_fine").data("DateTimePicker").minDate(e.date);
if($("#data_fine").data("DateTimePicker").date() < e.date){
$("#data_fine").data("DateTimePicker").date(e.date);
}
})
});
</script>';

View File

@ -0,0 +1,47 @@
<?php
include_once __DIR__.'/../../../core.php';
$link_id = Modules::get('Automezzi')['id'];
$fields = [
'Nome' => 'nome',
'Descrizione' => 'descrizione',
'Targa' => 'targa',
];
$query = 'SELECT *';
foreach ($fields as $name => $value) {
$query .= ', '.$value." AS '".str_replace("'", "\'", $name)."'";
}
$query .= ' FROM dt_automezzi WHERE 1=0 ';
foreach ($fields as $name => $value) {
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
}
$query .= Modules::getAdditionalsQuery('Automezzi');
$rs = $dbo->fetchArray($query);
foreach ($rs as $r) {
$result = [];
$result['link'] = ROOTDIR.'/editor.php?id_module='.$link_id.'&id_record='.$r['id'];
$result['title'] = $r['nome'];
$result['category'] = 'Automezzi';
// Campi da evidenziare
$result['labels'] = [];
foreach ($fields as $name => $value) {
if (str_contains($r[$name], $term)) {
$text = str_replace($term, "<span class='highlight'>".$term.'</span>', $r[$name]);
$result['labels'][] = $name.': '.$text.'<br/>';
}
}
$results[] = $result;
}

115
modules/automezzi/edit.php Normal file
View File

@ -0,0 +1,115 @@
<?php
include_once __DIR__.'/../../core.php';
unset($_SESSION['superselect']['idautomezzo']);
?><form action="" method="post" id="edit-form">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="update">
<input type="hidden" name="id_record" value="<?php echo $id_record; ?>">
<!-- DATI ARTICOLO -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Automezzo'); ?></h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 1, "value": "$nome$" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Targa'); ?>", "name": "targa", "required": 1, "maxlength": 10, "class": "alphanumeric-mask", "value": "$targa$" ]}
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "value": "$descrizione$" ]}
</div>
</div>
</div>
</div>
</form>
<!-- TECNICI + MAGAZZINO AUTOMEZZO -->
<div class="row">
<!--TECNICI -->
<div class="col-md-6">
<div class="panel panel-primary">
<div class="panel-heading">
<div class="row">
<div class="col-md-12">
<h3 class="panel-title"><?php echo tr('Tecnici responsabili automezzo'); ?></h3>
</div>
</div>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-12" >
<form action="<?php echo $rootdir; ?>/editor.php?id_module=<?php echo Modules::get('Automezzi')['id']; ?>&id_record=<?php echo $id_record; ?>" id="updatetech-form" method="post" role="form">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="id_record" value="<?php echo $id_record; ?>">
<input type="hidden" name="op" value="">
<?php
include $docroot.'/modules/automezzi/row-list-tecnici.php';
?>
</form>
<a href="javascript:;" class="btn btn-sm btn-success pull-right" title="Aggiorna date" onclick="$('#updatetech-form input[name=op]').val('savetech'); $('#updatetech-form').submit();"><i class="fa fa-edit"></i> <?php echo tr('Salva date'); ?></a>
<div class="pull-left">
<a class="btn btn-sm btn-primary" data-href="<?php echo $rootdir; ?>/modules/automezzi/add_tecnico.php?idautomezzo=<?php echo $id_record; ?>" data-toggle="modal" data-title="Aggiungi tecnico"><i class="fa fa-plus"></i> <?php echo tr('Aggiungi tecnico'); ?></a><br>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
</div>
</div>
<!-- MAGAZZINO AUTOMEZZO -->
<div class="col-md-6">
<div class="panel panel-primary">
<div class="panel-heading">
<div class="row">
<div class="col-md-12">
<h3 class="panel-title"><?php echo tr('Magazzino automezzo'); ?></h3>
</div>
</div>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-12">
<?php
include $docroot.'/modules/automezzi/row-list-articoli.php';
?>
<div class="pull-left">
<a class="btn btn-sm btn-primary" data-href="<?php echo $rootdir; ?>/modules/automezzi/add_articolo.php?idautomezzo=<?php echo $id_record; ?>" data-toggle="modal" data-title="Aggiungi articoli"><i class="fa fa-plus"></i> <?php echo tr('Articolo magazzino'); ?></a><br>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<a class="btn btn-danger ask" data-backto="record-list">
<i class="fa fa-trash"></i> <?php echo tr('Elimina'); ?>
</a>
<script>
$(document).ready(function(){
$("#pulsanti .btn-info").addClass("hidden");
});
</script>

View File

@ -0,0 +1,7 @@
<?php
include_once __DIR__.'/../../core.php';
if (isset($id_record)) {
$record = $dbo->fetchOne('SELECT * FROM an_sedi WHERE an_sedi.id='.prepare($id_record));
}

View File

@ -0,0 +1,67 @@
<?php
include_once __DIR__.'/../../core.php';
// Elenco articoli caricati sull'automezzo
$rs2 = $dbo->fetchArray("SELECT mg_movimenti.idsede AS id, mg_articoli.codice AS codice, idarticolo, SUM(mg_movimenti.qta) AS qta_automezzo, mg_articoli.qta AS qta_magazzino, mg_articoli.descrizione, mg_articoli.prezzo_vendita, (SELECT percentuale FROM co_iva WHERE id=mg_articoli.idiva_vendita) AS prciva_vendita FROM mg_movimenti INNER JOIN mg_articoli ON mg_movimenti.idarticolo=mg_articoli.id WHERE mg_movimenti.idsede=".prepare($id_record)." GROUP BY idarticolo HAVING qta_automezzo>0 ORDER BY mg_articoli.descrizione");
if (!empty($rs2)) {
echo '
<div style="max-height: 300px; overflow: auto;">
<table class="table table-striped table-hover table-condensed">
<tr>
<th>'.tr('Articolo').'</th>
<th width="25%">'.tr('Q.').'</th>
<th width="25%">'.tr('Prezzo di vendita').'</th>
<th width="10%"></th>
</tr>';
foreach ($rs2 as $r) {
echo '
<tr>';
// Articolo
echo '
<td class="text-left">
'.Modules::link('Articoli', $r['idarticolo'], $r['codice'].' - '.$r['descrizione']).'
</td>';
// Quantità
echo '
<td class="first_cell center">
<span><big>'.Translator::numberToLocale($r['qta_automezzo']).'</big></span><br/>
<small>'.tr('Q. magazzino').': '.Translator::numberToLocale($r['qta_magazzino']).'</small><br/>
</td>';
// Prezzo di vendita
$netto = $r['prezzo_vendita'];
$iva = $r['prezzo_vendita'] / 100 * $r['prciva_vendita'];
echo '
<td class="table_cell center">
<span>'.Translator::numberToLocale($netto + $iva).' &euro;</span><br/>
<small>'.tr('Netto').': '.Translator::numberToLocale($netto).' &euro;</small><br/>
<small>'.tr('Iva').': '.Translator::numberToLocale($iva).' &euro;</small><br/>
</td>';
// Pulsanti
echo '
<td class="text-center">
<a class="btn btn-warning btn-xs" data-href="'.$structure->fileurl('add_articolo.php').'?idautomezzo='.$id_record.'&idarticolo='.$r['idarticolo'].'" data-toggle="modal" data-title="'.tr('Aggiungi articoli').'">
<i class="fa fa-edit"></i>
</a>
<a class="btn btn-danger btn-xs ask" data-backto="record-edit" data-op="moverow" data-idautomezzotecnico="'.$r['id'].'", data-idarticolo="'.$r['idarticolo'].'" data-msg="'.tr("Rimuovere articolo dell'automezzo?").'">
<i class="fa fa-trash"></i>
</a>
</td>
</tr>';
$tot_articoli += $r['qta_automezzo'];
}
echo '
</table>
</div>';
} else {
echo '
<p>'.tr('Nessun articolo presente').'...</p>';
}

View File

@ -0,0 +1,60 @@
<?php
include_once __DIR__.'/../../core.php';
/*
TECNICI ASSEGNATI ALL'AUTOMEZZO
*/
$q_art = 'SELECT an_sedi_tecnici.*, an_anagrafiche.ragione_sociale FROM an_sedi_tecnici INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica=an_sedi_tecnici.idtecnico WHERE an_sedi_tecnici.idsede='.prepare($id_record);
$rs_art = $dbo->fetchArray($q_art);
if (!empty($rs_art)) {
echo '
<div style="max-height: 300px; overflow: auto;">
<table class="table table-striped table-hover table-condensed">
<tr>
<th>'.tr('Tecnico').'</th>
<th width="25%">'.tr('Dal').'</th>
<th width="25%">'.tr('Al').'</th>
<th width="5%"></th>
</tr>';
foreach ($rs_art as $r) {
// Tecnico
echo '
<tr>
<td>
<input type="hidden" name="idautomezzotecnico[]" value="'.$r['id'].'">
'.$r['ragione_sociale'].'
</td>';
// Data di inizio
echo '
<td>
{[ "type": "date", "name": "data_inizio['.$r['id'].']", "required": 1, "value": "'.$r['data_inizio'].'" ]}
</td>';
// Data di fine
echo '
<td>
{[ "type": "date", "name": "data_fine['.$r['id'].']", "required": 1, "value": "'.$r['data_fine'].'", "min-date": "'.$r['data_inizio'].'" ]}
</td>';
// Pulsanti per aggiornamento date tecnici
echo '
<td>
<a class="btn btn-danger ask" data-backto="record-edit" data-op="deltech" data-id="'.$r['id'].'" data-msg="'.tr("Rimuovere il tecnico responsabile dell'automezzo?").'">
<i class="fa fa-trash"></i>
</a>
</td>
</tr>';
}
echo '
</table>
</div>';
} else {
echo '
<p>'.tr('Nessun tecnico inserito').'...</p>';
}

View File

@ -1153,6 +1153,7 @@ switch (post('op')) {
break;
case 'update_inline':
$qta = post('qta');
$id_riga = post('riga_id');
$riga = $riga ?: Riga::find($id_riga);
$riga = $riga ?: Articolo::find($id_riga);
@ -1162,7 +1163,7 @@ switch (post('op')) {
if ($riga->isSconto()) {
$riga->setScontoUnitario(post('sconto'), $riga->idiva);
} else {
$riga->qta = post('qta');
$riga->qta = $qta;
$riga->setPrezzoUnitario(post('prezzo'), $riga->idiva);
$riga->setSconto(post('sconto'), post('tipo_sconto'));
$riga->costo_unitario = post('costo') ?: 0;

View File

@ -32,6 +32,7 @@ switch ($operazione) {
'codice_destinatario' => post('codice_destinatario'),
'citta' => post('citta'),
'cap' => post('cap'),
'is_automezzo' => post('is_automezzo'),
'provincia' => strtoupper(post('provincia')),
'km' => post('km'),
'cellulare' => post('cellulare'),
@ -74,6 +75,7 @@ switch ($operazione) {
'codice_fiscale' => post('codice_fiscale'),
'citta' => post('citta'),
'cap' => post('cap'),
'is_automezzo' => post('is_automezzo'),
'provincia' => strtoupper(post('provincia')),
'km' => post('km'),
'cellulare' => post('cellulare'),

View File

@ -91,9 +91,12 @@ echo '
</div>
<div class="row">
<div class="col-md-12">
<div class="col-md-6">
{[ "type": "checkbox", "label": "'.tr('Opt-out per newsletter').'", "name": "disable_newsletter", "id": "disable_newsletter_m", "value": "0", "help": "'.tr("Blocco per l'invio delle email.").'" ]}
</div>
<div class="col-md-6">
{[ "type": "checkbox", "label": "'.tr('Automezzo').'", "name": "is_automezzo", "id": "is_automezzo", "value": "0", "help": "'.tr("Seleziona se questa sede rappresenta un automezzo.").'" ]}
</div>
</div>
<div class="row">

View File

@ -85,7 +85,7 @@ echo '
</div>
<div class="row">
<div class="col-md-6">
<div class="col-md-3">
{[ "type": "text", "label": "'.tr('Indirizzo email').'", "name": "email", "value": "$email$", "class": "email-mask", "validation": "email" ]}
</div>
@ -93,6 +93,10 @@ echo '
{[ "type": "checkbox", "label": "'.tr('Opt-out per newsletter').'", "name": "disable_newsletter", "id": "disable_newsletter_m", "value": "'.empty($record['enable_newsletter']).'", "help": "'.tr("Blocco per l'invio delle email.").'" ]}
</div>
<div class="col-md-3">
{[ "type": "checkbox", "label": "'.tr('Automezzo').'", "name": "is_automezzo", "id": "is_automezzo", "value": "'.$record['is_automezzo'].'", "help": "'.tr("Seleziona se questa sede rappresenta un automezzo.").'" ]}
</div>
<div class="col-md-3">
{[ "type": "select", "label": "'.tr('Zona').'", "name": "idzona", "ajax-source": "zone", "value": "$idzona$", "placeholder": "'.tr('Nessuna zona').'", "icon-after": "add|'.Modules::get('Zone')['id'].'" ]}
</div>

View File

@ -0,0 +1,96 @@
<?php
echo "
<br><br><span><big><b>CARICO SUGLI AUTOMEZZI IL ".date("d/m/Y", strtotime($dt_carico))."</b></big></span><br>";
$targa = "";
$totale_qta = 0.000;
$totale_ven = 0.00;
for( $r=0; $r<sizeof($rs); $r++ ){
if ($targa != $rs[$r]['targa']) {
if ($targa != "") {
echo "
<table cellspacing='0' style='table-layout:fixed;'>
<col width='35'><col width='275'><col width='50'><col width='70'><col width='45'><col width='65'><col width='65'>
<tr>
<td class='first_cell cell-padded'>"."&nbsp;"."</td>
<td class='table_cell cell-padded'>"."&nbsp;"."</td>
<td class='table_cell cell-padded'>"."&nbsp;"."</td>
<td class='table_cell text-right cell-padded'>".number_format( $totale_qta, 3, ",", "." )."&nbsp;kg</td>
<td class='table_cell text-right cell-padded'>"."&nbsp;"."</td>
<td class='table_cell text-right cell-padded'>".number_format( $totale_ven, 2, ",", "." )." &euro;</td>
<td class='table_cell cell-padded'>"."&nbsp;"."</td>
</tr>
</table>";
}
echo "
<br/>
<table cellspacing='0' style='table-layout:fixed;'>
<col width='150'><col width='250'>
<tr>
<th bgcolor='#ffffff' class='full_cell1 cell-padded' width='150'>Targa: ".$rs[$r]['targa']."</th>
<th bgcolor='#ffffff' class='full_cell cell-padded' width='250'>Automezzo: ".$rs[$r]['nome']."</th>
</tr>
</table>";
echo "
<table class='table table-bordered' cellspacing='0' style='table-layout:fixed;'>
<col width='35'><col width='275'><col width='50'><col width='70'><col width='45'><col width='65'><col width='65'>
<tr>
<th bgcolor='#dddddd' class='full_cell1 cell-padded' width='10%'>Codice</th>
<th bgcolor='#dddddd' class='full_cell cell-padded' >Descrizione</th>
<th bgcolor='#dddddd' class='full_cell cell-padded' width='20%'>Sub.Cat.</th>
<th bgcolor='#dddddd' class='full_cell cell-padded' width='10%'>Quantit&agrave;</th>
<th bgcolor='#dddddd' class='full_cell cell-padded' width='10%'>P. Ven.</th>
<th bgcolor='#dddddd' class='full_cell cell-padded' width='10%'>Totale</th>
<th bgcolor='#dddddd' class='full_cell cell-padded' width='10%'>Utente</th>
</tr>";
$targa = $rs[$r]['targa'];
$totale_qta = 0.000;
$totale_ven = 0.00;
}
echo "
<tr>";
$qta = number_format( $rs[$r]['qta'], 3, ",", "." )."&nbsp;".$rs[$r]['um'];
$prz_vendita = number_format($rs[$r]['prezzo_vendita'], 2);
$prz_vendita += ($prz_vendita /100) * $rs[$r]['iva'];
$totv = number_format($prz_vendita,2) * $rs[$r]['qta'];
echo "
<td class='first_cell cell-padded'>".$rs[$r]['codice']."</td>
<td class='table_cell cell-padded'>".$rs[$r]['descrizione']."</td>
<td class='table_cell cell-padded'>".$rs[$r]['subcategoria']."</td>
<td class='table_cell text-right cell-padded'>".$qta."</td>
<td class='table_cell text-right cell-padded'>".number_format( $prz_vendita, 2, ",", "." )." &euro;</td>
<td class='table_cell text-right cell-padded'>".number_format( $totv, 2, ",", "." )." &euro;</td>
<td class='table_cell cell-padded'>".ucfirst($rs[$r]['username'])."</td>
</tr>";
$totale_ven = $totale_ven + $totv;
if ($rs[$r]['um']=='kg') {
$totale_qta = $totale_qta + $rs[$r]['qta'];
}
}
echo "
</table>";
if ($targa != "") {
echo "
<table cellspacing='0' style='table-layout:fixed;'>
<tr>
<td class='first_cell cell-padded'>"."&nbsp;"."</td>
<td class='table_cell cell-padded'>"."&nbsp;"."</td>
<td class='table_cell cell-padded'>"."&nbsp;"."</td>
<td class='table_cell text-right cell-padded'>".number_format( $totale_qta, 3, ",", "." )."&nbsp;kg</td>
<td class='table_cell text-right cell-padded'>"."&nbsp;"."</td>
<td class='table_cell text-right cell-padded'>".number_format( $totale_ven, 2, ",", "." )." &euro;</td>
<td class='table_cell cell-padded'>"."&nbsp;"."</td>
</tr>
</table>";
}
?>

View File

@ -0,0 +1,39 @@
<?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/>.
*/
/*
* Footer di default.
* I contenuti di questo file vengono utilizzati per generare il footer delle stampe nel caso non esista un file footer.php all'interno della stampa.
*
* Per modificare il footer della stampa basta aggiungere un file footer.php all'interno della cartella della stampa con i contenuti da mostrare (vedasi templates/fatture/footer.php).
*
* La personalizzazione specifica del footer deve comunque seguire lo standard della cartella custom: anche se il file footer.php non esiste nella stampa originaria, se si vuole personalizzare il footer bisogna crearlo all'interno della cartella custom.
*/
echo '
<table style="width:200mm; font-size:7pt; color:#999;">
<tr>
<td style="width:100mm; text-align:right;">
'.tr('Pagina _PAGE_ di _TOTAL_', [
'_PAGE_' => '{PAGENO}',
'_TOTAL_' => '{nb}',
]).'
</td>
</tr>
</table>';

View File

@ -0,0 +1,60 @@
<?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/>.
*/
include_once __DIR__.'/../../core.php';
$search_targa = get('search_targa');
$search_nome = get('search_nome');
$dt_carico = get('data_carico');
$data_carico = strtotime(str_replace('/', '-', $dt_carico));
$startTM = date("Y-m-d", $data_carico) . " 00:00:00";
$endTM = date("Y-m-d", $data_carico) . " 23:59:59";
$query = "
SELECT
mg_movimenti.data,
an_sedi.targa,
an_sedi.nome,
mg_articoli.codice,
mg_articoli.prezzo_vendita,
co_iva.percentuale AS 'iva',
(SELECT mg_categorie.nome FROM mg_categorie WHERE mg_categorie.id=mg_articoli.id_sottocategoria) AS subcategoria,
(SELECT mg_articoli.descrizione FROM mg_articoli WHERE mg_articoli.id=mg_movimenti.idarticolo) AS 'descrizione',
IF( mg_movimenti.movimento LIKE '%Scarico%', mg_movimenti.qta*(-1), mg_movimenti.qta) AS qta,
mg_movimenti.idutente,
zz_users.username,
mg_articoli.um,
zz_groups.nome as 'gruppo'
FROM
mg_movimenti
INNER JOIN mg_articoli ON mg_movimenti.idarticolo=mg_articoli.id
INNER JOIN co_iva ON mg_articoli.idiva_vendita = co_iva.id
INNER JOIN zz_users ON mg_movimenti.idutente=zz_users.id
INNER JOIN zz_groups ON zz_users.idgruppo=zz_groups.id
INNER JOIN an_sedi ON mg_movimenti.idsede=an_sedi.id
WHERE
(mg_movimenti.idsede > 0) AND (mg_movimenti.idintervento IS NULL) AND
((mg_movimenti.data BETWEEN ".prepare($startTM)." AND ".prepare($endTM).") AND (zz_groups.nome IN ('Titolari', 'Amministratori')))";
$query .= " AND (an_sedi.targa LIKE ".prepare('%'.$search_targa.'%').") AND (an_sedi.nome LIKE ".prepare('%'.$search_nome.'%').") ";
$query .= " ORDER BY an_sedi.targa, mg_articoli.descrizione";
$rs = $dbo->fetchArray($query);
$totrows = sizeof($rs);
$azienda = $dbo->fetchOne("SELECT * FROM an_anagrafiche WHERE idanagrafica=".prepare(setting('Azienda predefinita')));

View File

@ -0,0 +1,52 @@
<?php
include_once __DIR__.'/../../core.php';
echo "<br>";
$targa = "";
for( $r=0; $r<sizeof($rs); $r++ ){
if ($targa != $rs[$r]['targa']) {
if ($targa != "") {
echo "
</table>
<br/>";
}
echo "
<table cellspacing='0' style='table-layout:fixed;'>
<col width='150'><col width='250'>
<tr>
<th bgcolor='#ffffff' class='full_cell1 cell-padded' width='150'>Targa: ".$rs[$r]['targa']."</th>
<th bgcolor='#ffffff' class='full_cell cell-padded' width='250'>Automezzo: ".$rs[$r]['nome']."</th>
</tr>
</table>
<table class='table table-bordered' cellspacing='0' style='table-layout:fixed;'>
<col width='50'><col width='300'><col width='50'><col width='50'><col width='50'>
<tr>
<th bgcolor='#dddddd' class='full_cell1 cell-padded' width='10%'>Codice</th>
<th bgcolor='#dddddd' class='full_cell cell-padded' >Descrizione</th>
<th bgcolor='#dddddd' class='full_cell cell-padded' width='20%'>Sub.Cat.</th>
<th bgcolor='#dddddd' class='full_cell cell-padded' width='15%'>Q.t&agrave;</th>
<th bgcolor='#dddddd' class='full_cell cell-padded' width='5%'></th>
</tr>";
$targa = $rs[$r]['targa'];
}
echo "
<tr>";
$qta = number_format( $rs[$r]['qta'], 3, ",", "." )."&nbsp;".$rs[$r]['um'];
echo "
<td class='first_cell cell-padded'>".$rs[$r]['codice']."</td>
<td class='table_cell cell-padded'>".$rs[$r]['descrizione']."</td>
<td class='table_cell cell-padded'>".$rs[$r]['subcategoria']."</td>
<td class='table_cell text-right cell-padded'>".$qta."</td>
<td class='table_cell cell-padded'></td>
</tr>";
}
if ($targa != "") {
echo "
</table>";
}
?>

View File

@ -0,0 +1,39 @@
<?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/>.
*/
/*
* Footer di default.
* I contenuti di questo file vengono utilizzati per generare il footer delle stampe nel caso non esista un file footer.php all'interno della stampa.
*
* Per modificare il footer della stampa basta aggiungere un file footer.php all'interno della cartella della stampa con i contenuti da mostrare (vedasi templates/fatture/footer.php).
*
* La personalizzazione specifica del footer deve comunque seguire lo standard della cartella custom: anche se il file footer.php non esiste nella stampa originaria, se si vuole personalizzare il footer bisogna crearlo all'interno della cartella custom.
*/
echo '
<table style="width:200mm; font-size:7pt; color:#999;">
<tr>
<td style="width:100mm; text-align:right;">
'.tr('Pagina _PAGE_ di _TOTAL_', [
'_PAGE_' => '{PAGENO}',
'_TOTAL_' => '{nb}',
]).'
</td>
</tr>
</table>';

View File

@ -0,0 +1,55 @@
<?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/>.
*/
include_once __DIR__.'/../../core.php';
$azienda = $dbo->fetchOne("SELECT * FROM an_anagrafiche WHERE idanagrafica=".prepare(setting('Azienda predefinita')));
$where = [];
$search_targa = get('search_targa');
$search_nome = get('search_nome');
$where[] = "movimenti.qta > 0";
$where[] = "movimenti.qta > 0";
if( $search_targa ){
$where[] = "an_sedi.targa like ".prepare('%'.$search_targa.'%');
}
if( $search_nome ){
$where[] = "an_sedi.nome like ".prepare('%'.$search_nome.'%');
}
//Ciclo tra gli articoli selezionati
$query = "
SELECT
an_sedi.targa, an_sedi.nome,
mg_articoli.codice, mg_articoli.descrizione,
(SELECT mg_categorie.nome FROM mg_categorie WHERE mg_categorie.id=mg_articoli.id_sottocategoria) AS subcategoria,
movimenti.qta,
mg_articoli.um
FROM an_sedi
INNER JOIN (SELECT SUM(mg_movimenti.qta) AS qta, idarticolo, idsede FROM mg_movimenti GROUP BY idsede,idarticolo) AS movimenti ON movimenti.idsede = an_sedi.id
INNER JOIN mg_articoli ON movimenti.idarticolo = mg_articoli.id
WHERE
".implode(" AND ", $where)."
ORDER BY
an_sedi.targa, an_sedi.descrizione";
$rs = $dbo->fetchArray($query);
$totrows = sizeof($rs);

View File

@ -39,4 +39,52 @@ ALTER TABLE `zz_files` ADD INDEX(`id_record`);
ALTER TABLE `co_scadenziario` ADD `id_pagamento` INT NOT NULL;
ALTER TABLE `co_scadenziario` ADD `id_banca_azienda` INT NULL;
ALTER TABLE `co_scadenziario` ADD `id_banca_controparte` INT NULL;
ALTER TABLE `co_scadenziario` ADD `id_banca_controparte` INT NULL;
-- Aggiunta nuovi campi in sedi per gestione automezzi
ALTER TABLE `an_sedi`
ADD `nome` VARCHAR(225) NULL DEFAULT NULL ,
ADD `descrizione` VARCHAR(225) NULL DEFAULT NULL AFTER `nome` ,
ADD `targa` VARCHAR(225) NULL DEFAULT NULL AFTER `descrizione` ,
ADD `is_automezzo` TINYINT NOT NULL DEFAULT '0' AFTER `targa` ;
-- Creazione modulo Automezzi
INSERT INTO `zz_modules` (`id`, `name`, `title`, `directory`, `options`, `options2`, `icon`, `version`, `compatibility`, `order`, `parent`, `default`, `enabled`, `use_notes`, `use_checklists`) VALUES (NULL, 'Automezzi', 'Automezzi', 'automezzi', 'SELECT |select| FROM an_sedi INNER JOIN zz_settings ON (zz_settings.valore=an_sedi.idanagrafica AND zz_settings.nome=\'Azienda predefinita\' ) WHERE 1=1 AND an_sedi.is_automezzo=1 HAVING 2=2 ORDER BY nomesede ASC', '', 'fa fa-angle-right', '1.0', '2.4.16', '100', (SELECT `t`.`id` FROM `zz_modules` AS `t` WHERE `t`.`name` = 'Magazzino'), '0', '1', '0', '0');
--Viste modulo automezzi
INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES
((SELECT `id` FROM `zz_modules` WHERE name='Automezzi'), 'id', 'an_sedi.id', 0, 1, 0, 0, '', '', 0, 0, 0),
((SELECT `id` FROM `zz_modules` WHERE name='Automezzi'), 'Targa', 'an_sedi.targa', 2, 1, 0, 0, '', '', 1, 0, 0),
((SELECT `id` FROM `zz_modules` WHERE name='Automezzi'), 'Nome', 'an_sedi.nome', 3, 1, 0, 0, '', '', 1, 0, 0),
((SELECT `id` FROM `zz_modules` WHERE name='Automezzi'), 'Descrizione', 'an_sedi.descrizione', 4, 1, 0, 0, '', '', 1, 0, 0);
-- Tabella per associazione automezzi-tecnici
CREATE TABLE `an_sedi_tecnici` (
`id` INT NOT NULL AUTO_INCREMENT ,
`idsede` INT NOT NULL ,
`idtecnico` INT NOT NULL ,
`data_inizio` DATE NULL DEFAULT NULL,
`data_fine` DATE NULL DEFAULT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`updated_at` TIMESTAMP on UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`)) ENGINE = InnoDB;
-- Aggiunta indici
ALTER TABLE `an_sedi_tecnici`
ADD INDEX(`idsede`),
ADD INDEX(`idtecnico`);
ALTER TABLE `an_sedi_tecnici` ADD CONSTRAINT `an_sedi_tecnici_ibfk_1` FOREIGN KEY (`idsede`) REFERENCES `an_sedi`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
ALTER TABLE `an_sedi_tecnici` ADD CONSTRAINT `an_sedi_tecnici_ibfk_2` FOREIGN KEY (`idtecnico`) REFERENCES `an_anagrafiche`(`idanagrafica`) ON DELETE CASCADE ON UPDATE NO ACTION;
-- Aggiunta stampe automezzi
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='Automezzi'), '0', 'Giacenza automezzi', 'Giacenza automezzi', 'giacenza automezzo', 'automezzi_inventario', '', '', '', '', '', '1', '0', '0', '1'),
(NULL, (SELECT `id` FROM `zz_modules` WHERE name='Automezzi'), '0', 'Giacenza odierna automezzi', 'Giacenza odierna automezzi', 'giacenza automezzo', 'automezzi_carico', '', '', '', '', '', '1', '0', '0', '1');
-- Widget modulo automezzi
INSERT INTO `zz_widgets` (`id`, `name`, `type`, `id_module`, `location`, `class`, `query`, `bgcolor`, `icon`, `print_link`, `more_link`, `more_link_type`, `php_include`, `text`, `enabled`, `order`, `help`) VALUES
(NULL, 'Stampa carico odierno', 'print', (SELECT `id` FROM `zz_modules` WHERE name='Automezzi'), 'controller_top', 'col-md-4', '', '#37a02d', 'fa fa-print', '', 'var data_carico = prompt(\'Data del carico da stampare?\', moment(new Date()).format(\'DD/MM/YYYY\'));\r\nif ( data_carico != null){ \r\nwindow.open(\'pdfgen.php?id_print=54&search_targa=\'+$(\'#th_Targa input\').val()+\'&search_nome=\'+$(\'#th_Nome input\').val()+\'&data_carico=\'+data_carico); \r\n}', 'javascript', '', 'Stampa carico odierno', '1', '2', NULL),
(NULL, 'Stampa giacenza', 'print', (SELECT `id` FROM `zz_modules` WHERE name='Automezzi'), 'controller_top', 'col-md-4', '', '#45a9f1', 'fa fa-truck', '', 'if( confirm(\'Stampare la giacenza attuale sugli automezzi?\') ){ window.open(\'pdfgen.php?id_print=53&search_targa=\'+$(\'#th_Targa input\').val()+\'&search_nome=\'+$(\'#th_Nome input\').val()); }', 'javascript', '', 'Stampa giacenza', '1', '1', NULL);