Merge remote-tracking branch 'origin/master'

This commit is contained in:
Dasc3er 2021-09-22 17:17:09 +02:00
commit d9bfde834c
8 changed files with 209 additions and 21 deletions

View File

@ -41,6 +41,8 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
### Aggiunto (Added)
- Aggiunto modal in fase di **Stampa Bilancio** per visualizzare o meno l'elenco analitico dei clienti e fornitori
- Aggiunta scelta del tipo documento in fase di creazione fattura da un altro documento
- Aggiunta possibilità di creare delle ricorrenze per gli **Interventi** in fase di aggiunta
- Aggiunta scelta del tipo documento in fase di creazione fattura da un azione di gruppo di un altro documento
### Modificato (Changed)
### Fixed

View File

@ -35,6 +35,11 @@ if (!isset($_SESSION['module_'.$id_fatture]['id_segment'])) {
}
$id_segment = $_SESSION['module_'.$id_fatture]['id_segment'];
$idconto = setting('Conto predefinito fatture di vendita');
$idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
'predefined' => 1,
'dir' => 'entrata',
])['id'];
switch (post('op')) {
case 'crea_fattura':
@ -42,8 +47,7 @@ switch (post('op')) {
$numero_totale = 0;
// Informazioni della fattura
$descrizione_tipo = 'Fattura immediata di vendita';
$tipo_documento = Tipo::where('descrizione', $descrizione_tipo)->first();
$tipo_documento = Tipo::where('id', post('idtipodocumento'))->first();
$stato_documenti_accodabili = Stato::where('descrizione', 'Bozza')->first();
$accodare = post('accodare');
@ -125,7 +129,9 @@ $operations['crea_fattura'] = [
'text' => '<span><i class="fa fa-file-code-o"></i> '.tr('Fattura _TYPE_', ['_TYPE_' => strtolower($module['name'])]),
'data' => [
'title' => tr('Fatturare i _TYPE_ selezionati?', ['_TYPE_' => strtolower($module['name'])]),
'msg' => '{[ "type": "checkbox", "label": "<small>'.tr('Aggiungere alle fatture di vendita non ancora emesse?').'</small>", "placeholder": "'.tr('Aggiungere alle fatture esistenti non ancora emesse?').'", "name": "accodare" ]}<br>{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' AND is_fiscale = 1 ORDER BY name", "value": "'.$id_segment.'" ]}',
'msg' => '{[ "type": "checkbox", "label": "<small>'.tr('Aggiungere alle fatture di vendita non ancora emesse?').'</small>", "placeholder": "'.tr('Aggiungere alle fatture esistenti non ancora emesse?').'", "name": "accodare" ]}<br>
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' AND is_fiscale = 1 ORDER BY name", "value": "'.$id_segment.'" ]}<br>
{[ "type": "select", "label": "'.tr('Tipo documento').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, CONCAT(codice_tipo_documento_fe, \' - \', descrizione) AS descrizione FROM co_tipidocumento WHERE enabled = 1 AND dir =\'entrata\' ORDER BY codice_tipo_documento_fe", "value": "'.$idtipodocumento.'" ]}',
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => false,

View File

@ -41,6 +41,10 @@ if (!isset($_SESSION['module_'.$id_fatture]['id_segment'])) {
}
$id_segment = $_SESSION['module_'.$id_fatture]['id_segment'];
$idconto = setting('Conto predefinito fatture di vendita');
$idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
'predefined' => 1,
'dir' => $dir,
])['id'];
switch (post('op')) {
case 'crea_fattura':
@ -48,13 +52,7 @@ switch (post('op')) {
$numero_totale = 0;
// Informazioni della fattura
if ($dir == 'entrata') {
$descrizione_tipo = 'Fattura immediata di vendita';
} else {
$descrizione_tipo = 'Fattura immediata di acquisto';
}
$tipo_documento = Tipo::where('descrizione', $descrizione_tipo)->first();
$tipo_documento = Tipo::where('id', post('idtipodocumento'))->first();
$stato_documenti_accodabili = Stato::where('descrizione', 'Bozza')->first();
$accodare = post('accodare');
@ -180,8 +178,9 @@ $operations['crea_fattura'] = [
'text' => '<span><i class="fa fa-file-code-o"></i> '.tr('Fattura _TYPE_', ['_TYPE_' => strtolower($module['name'])]),
'data' => [
'title' => tr('Fatturare i _TYPE_ selezionati?', ['_TYPE_' => strtolower($module['name'])]),
'msg' => '{[ "type": "checkbox", "label": "<small>'.tr('Aggiungere alle _TYPE_ non ancora emesse?', ['_TYPE_' => strtolower($module_fatture)]).'", "placeholder": "'.tr('Aggiungere alle _TYPE_ nello stato bozza?', ['_TYPE_' => strtolower($module_fatture)]).'</small>", "name": "accodare" ]}
<br>{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' AND is_fiscale = 1 ORDER BY name", "value": "'.$id_segment.'" ]}',
'msg' => '{[ "type": "checkbox", "label": "<small>'.tr('Aggiungere alle _TYPE_ non ancora emesse?', ['_TYPE_' => strtolower($module_fatture)]).'", "placeholder": "'.tr('Aggiungere alle _TYPE_ nello stato bozza?', ['_TYPE_' => strtolower($module_fatture)]).'</small>", "name": "accodare" ]}<br>
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' AND is_fiscale = 1 ORDER BY name", "value": "'.$id_segment.'" ]}<br>
{[ "type": "select", "label": "'.tr('Tipo documento').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, CONCAT(codice_tipo_documento_fe, \' - \', descrizione) AS descrizione FROM co_tipidocumento WHERE enabled = 1 AND dir ='.prepare($dir).' ORDER BY codice_tipo_documento_fe", "value": "'.$idtipodocumento.'" ]}',
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => false,

View File

@ -214,6 +214,97 @@ switch (post('op')) {
'id_tecnico' => $tecnici_assegnati,
]);
if(!empty(post('ricorsiva'))){
$periodicita = post('periodicita');
$data = post('data_inizio_ricorrenza');
$interval = post('tipo_periodicita')!='manual' ? post('tipo_periodicita') : 'days';
$stato = Stato::find(post('idstatoricorrenze'));
// Estraggo le date delle ricorrenze
if (post('metodo_ricorrenza')=='data') {
$data_fine = post('data_fine_ricorrenza');
while(strtotime($data)<=strtotime($data_fine)){
$data = date('Y-m-d', strtotime('+'.$periodicita.' '.$interval.'', strtotime($data)));
$w = date('w', strtotime($data));
//Escludo sabato e domenica
if($w=='6'){
$data = date('Y-m-d', strtotime('+2 day', strtotime($data)));
}else if($w=='0'){
$data = date('Y-m-d', strtotime('+1 day', strtotime($data)));
}
if ($data<=$data_fine) {
$date_ricorrenze[] = $data;
}
}
} else {
$ricorrenze = post('numero_ricorrenze');
for($i=0; $i<$ricorrenze; $i++){
$data = date('Y-m-d', strtotime('+'.$periodicita.' '.$interval.'', strtotime($data)));
$w = date('w', strtotime($data));
//Escludo sabato e domenica
if($w=='6'){
$data = date('Y-m-d', strtotime('+2 day', strtotime($data)));
}else if($w=='0'){
$data = date('Y-m-d', strtotime('+1 day', strtotime($data)));
}
$date_ricorrenze[] = $data;
}
}
foreach($date_ricorrenze as $data_ricorrenza){
$intervento = Intervento::find($id_record);
$new = $intervento->replicate();
// Calcolo il nuovo codice
$new->codice = Intervento::getNextCodice($data_ricorrenza);
$new->data_richiesta = $data_ricorrenza;
$new->idstatointervento = $stato->idstatointervento;
$new->save();
$idintervento = $new->id;
// Inserimento sessioni
if (!empty(post('riporta_sessioni'))) {
$numero_sessione = 0;
$sessioni = $intervento->sessioni;
foreach ($sessioni as $sessione) {
// Se è la prima sessione che copio importo la data con quella della richiesta
if ($numero_sessione == 0) {
$orario_inizio = date('Y-m-d', strtotime($data_ricorrenza)).' '.date('H:i:s', strtotime($sessione->orario_inizio));
} else {
$diff = strtotime($sessione->orario_inizio) - strtotime($inizio_old);
$orario_inizio = date('Y-m-d H:i:s', (strtotime($sessione->orario_inizio) + $diff));
}
$diff_fine = strtotime($sessione->orario_fine) - strtotime($sessione->orario_inizio);
$orario_fine = date('Y-m-d H:i:s', (strtotime($orario_inizio) + $diff_fine));
$new_sessione = $sessione->replicate();
$new_sessione->idintervento = $new->id;
$new_sessione->orario_inizio = $orario_inizio;
$new_sessione->orario_fine = $orario_fine;
$new_sessione->save();
++$numero_sessione;
$inizio_old = $sessione->orario_inizio;
}
}
// Assegnazione dei tecnici all'intervento
$tecnici_assegnati = (array) post('tecnici_assegnati');
$dbo->sync('in_interventi_tecnici_assegnati', [
'id_intervento' => $new->id,
], [
'id_tecnico' => $tecnici_assegnati,
]);
$n_ricorrenze++;
}
flash()->info(tr('Aggiunte _NUM_ nuove ricorrenze!', [
'_NUM_' => $n_ricorrenze,
]));
}
if (post('ref') == 'dashboard') {
flash()->clearMessage('info');
flash()->clearMessage('warning');

View File

@ -47,7 +47,7 @@ if ($user['gruppo'] == 'Tecnici' && !empty($user['idanagrafica'])) {
}
// Stato di default associato all'attivitò
$stato = $dbo->fetchArray("SELECT * FROM in_statiintervento WHERE descrizione = 'In programmazione'");
$stato = $dbo->fetchArray("SELECT * FROM in_statiintervento WHERE codice = 'WIP'");
$id_stato = $stato['idstatointervento'];
// Se è indicata un'anagrafica relativa, si carica il tipo di intervento di default impostato
@ -314,6 +314,58 @@ echo '
</div>
</div>
<!-- RICORRENZA -->
<div class="box box-warning collapsable collapsed-box">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Ricorrenza').'</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">
<div class="row">
<div class="col-md-4">
{[ "type": "checkbox", "label": "'.tr('Ricorsiva').'", "name": "ricorsiva", "value": "" ]}
</div>
<div class="col-md-4 ricorrenza">
{[ "type": "timestamp", "label": "'.tr('Data/ora inizio').'", "name": "data_inizio_ricorrenza", "value": "'.($data_richiesta ?: '-now-').'" ]}
</div>
<div class="col-md-4 ricorrenza">
{[ "type": "number", "label": "'.tr('Periodicità').'", "name": "periodicita", "decimals": "0", "icon-after": "choice|period|months", "value": "1" ]}
</div>
</div>
<div class="row ricorrenza">
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Metodo fine ricorrenza').'", "name": "metodo_ricorrenza", "values": "list=\"data\":\"Data fine\",\"numero\":\"Numero ricorrenze\"" ]}
</div>
<div class="col-md-4">
{[ "type": "timestamp", "label": "'.tr('Data/ora fine').'", "name": "data_fine_ricorrenza" ]}
</div>
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Numero ricorrenze').'", "name": "numero_ricorrenze", "decimals": "0" ]}
</div>
</div>
<div class="row ricorrenza">
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Stato ricorrenze').'", "name": "idstatoricorrenze", "values": "query=SELECT idstatointervento AS id, descrizione, colore AS _bgcolor_ FROM in_statiintervento WHERE deleted_at IS NULL AND is_completato=0" ]}
</div>
<div class="col-md-4">
{[ "type": "checkbox", "label": "'.tr('Riporta sessioni di lavoro').'", "name": "riporta_sessioni", "value": "" ]}
</div>
</div>
</div>
</div>
<!-- DETTAGLI CLIENTE -->
<div class="box box-success collapsable collapsed-box">
<div class="box-header with-border">
@ -407,6 +459,9 @@ echo '
location.reload();
});
}
// Ricorrenza
$(".ricorrenza").addClass("hidden");
});
input("idtecnico").change(function() {
@ -597,4 +652,32 @@ if (filter('orario_fine') !== null) {
function deassegnaTuttiTecnici() {
input("tecnici_assegnati").getElement().selectReset();
}
$("#ricorsiva").on("change", function(){
if ($(this).is(":checked")) {
$(".ricorrenza").removeClass("hidden");
$("#data_inizio_ricorrenza").attr("required", true);
$("#metodo_ricorrenza").attr("required", true);
$("#idstatoricorrenze").attr("required", true);
} else {
$(".ricorrenza").addClass("hidden");
$("#data_inizio_ricorrenza").attr("required", false);
$("#metodo_ricorrenza").attr("required", false);
$("#idstatoricorrenze").attr("required", false);
}
});
$("#metodo_ricorrenza").on("change", function(){
if ($(this).val()=="data") {
input("data_fine_ricorrenza").enable();
$("#data_fine_ricorrenza").attr("required", true);
input("numero_ricorrenze").disable();
input("numero_ricorrenze").set("");
} else {
input("numero_ricorrenze").enable();
input("data_fine_ricorrenza").disable();
input("data_fine_ricorrenza").set("");
$("#data_fine_ricorrenza").attr("required", false);
}
});
</script>';

View File

@ -33,7 +33,6 @@ if (!isset($_SESSION['module_'.$id_fatture]['id_segment'])) {
$_SESSION['module_'.$id_fatture]['id_segment'] = isset($segments[0]['id']) ? $segments[0]['id'] : null;
}
$id_segment = $_SESSION['module_'.$id_fatture]['id_segment'];
$idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
'predefined' => 1,
'dir' => 'entrata',

View File

@ -35,14 +35,17 @@ if (!isset($_SESSION['module_'.$id_fatture]['id_segment'])) {
}
$id_segment = $_SESSION['module_'.$id_fatture]['id_segment'];
$idconto = setting('Conto predefinito fatture di vendita');
$idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
'predefined' => 1,
'dir' => 'entrata',
])['id'];
switch (post('op')) {
case 'crea_fattura':
$documenti = collect();
$numero_totale = 0;
$descrizione_tipo = 'Fattura immediata di vendita';
$tipo_documento = Tipo::where('descrizione', $descrizione_tipo)->first();
$tipo_documento = Tipo::where('id', post('idtipodocumento'))->first();
$stato_documenti_accodabili = Stato::where('descrizione', 'Bozza')->first();
$accodare = post('accodare');
@ -145,7 +148,8 @@ if ($module['name'] == 'Ordini cliente') {
'data' => [
'title' => tr('Fatturare i _TYPE_ selezionati?', ['_TYPE_' => strtolower($module['name'])]),
'msg' => '{[ "type": "checkbox", "label": "<small>'.tr('Aggiungere alle _TYPE_ non ancora emesse?', ['_TYPE_' => strtolower($module_fatture)]).'", "placeholder": "'.tr('Aggiungere alle _TYPE_ nello stato bozza?', ['_TYPE_' => strtolower($module_fatture)]).'</small>", "name": "accodare" ]}
<br>{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' AND is_fiscale = 1 ORDER BY name", "value": "'.$id_segment.'" ]}',
<br>{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' AND is_fiscale = 1 ORDER BY name", "value": "'.$id_segment.'" ]}<br>
{[ "type": "select", "label": "'.tr('Tipo documento').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, CONCAT(codice_tipo_documento_fe, \' - \', descrizione) AS descrizione FROM co_tipidocumento WHERE enabled = 1 AND dir =\'entrata\' ORDER BY codice_tipo_documento_fe", "value": "'.$idtipodocumento.'" ]}',
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => false,

View File

@ -34,6 +34,10 @@ if (!isset($_SESSION['module_'.$id_fatture]['id_segment'])) {
$_SESSION['module_'.$id_fatture]['id_segment'] = isset($segments[0]['id']) ? $segments[0]['id'] : null;
}
$id_segment = $_SESSION['module_'.$id_fatture]['id_segment'];
$idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
'predefined' => 1,
'dir' => 'entrata',
])['id'];
switch (post('op')) {
case 'crea_fattura':
@ -41,8 +45,7 @@ switch (post('op')) {
$numero_totale = 0;
// Informazioni della fattura
$descrizione_tipo = 'Fattura immediata di vendita';
$tipo_documento = Tipo::where('descrizione', $descrizione_tipo)->first();
$tipo_documento = Tipo::where('id', post('idtipodocumento'))->first();
$stato_documenti_accodabili = Stato::where('descrizione', 'Bozza')->first();
$accodare = post('accodare');
@ -123,7 +126,8 @@ $operations['crea_fattura'] = [
'text' => '<span><i class="fa fa-file-code-o"></i> '.tr('Fattura _TYPE_', ['_TYPE_' => strtolower($module['name'])]),
'data' => [
'title' => tr('Fatturare i _TYPE_ selezionati?', ['_TYPE_' => strtolower($module['name'])]),
'msg' => '{[ "type": "checkbox", "label": "<small>'.tr('Aggiungere alle fatture di vendita non ancora emesse?').'</small>", "placeholder": "'.tr('Aggiungere alle fatture di vendita nello stato bozza?').'", "name": "accodare" ]}<br>{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' AND is_fiscale = 1 ORDER BY name", "value": "'.$id_segment.'" ]}',
'msg' => '{[ "type": "checkbox", "label": "<small>'.tr('Aggiungere alle fatture di vendita non ancora emesse?').'</small>", "placeholder": "'.tr('Aggiungere alle fatture di vendita nello stato bozza?').'", "name": "accodare" ]}<br>{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' AND is_fiscale = 1 ORDER BY name", "value": "'.$id_segment.'" ]}<br>
{[ "type": "select", "label": "'.tr('Tipo documento').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, CONCAT(codice_tipo_documento_fe, \' - \', descrizione) AS descrizione FROM co_tipidocumento WHERE enabled = 1 AND dir =\'entrata\' ORDER BY codice_tipo_documento_fe", "value": "'.$idtipodocumento.'" ]}',
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => false,