storno an gemneinsame DB angepasst - **** WOP ****

This commit is contained in:
rxf
2025-11-10 20:57:34 +01:00
parent e3bb5d36b9
commit ad0f7b2912
4 changed files with 105 additions and 58 deletions

View File

@@ -1,5 +1,4 @@
<?php <?php
# Hier werden die Anfragen vom Javascript verarbeitet und die
# Datenbank bedient # Datenbank bedient
include 'config_stern.php'; include 'config_stern.php';
@@ -139,6 +138,10 @@ function getAllTeilnehmer($fdatum)
// die Daten der Führungen in dem Bereich start - end // die Daten der Führungen in dem Bereich start - end
// in ein Array als ISO8601 holen // in ein Array als ISO8601 holen
// Parameter // Parameter
@@ -146,10 +149,14 @@ function getAllTeilnehmer($fdatum)
// $end -> bis zu diesem Datum // $end -> bis zu diesem Datum
// Retunrn: // Retunrn:
// Array mit den Daten in ISO8601 // Array mit den Daten in ISO8601
function getFuehrungen($start, $end) { function getFuehrungen($start, $end, $typ) {
global $db; global $db;
$erg = array(); $erg = [];
$sql_sel = "SELECT * FROM fdatum1 where datum >= '$start' AND datum <= '$end' ORDER BY datum ASC"; $table = 'fdatum1';
if ($typ == 'sonnen') {
$table = 'sonnedatum';
}
$sql_sel = "SELECT * FROM $table where datum >= '$start' AND datum <= '$end' ORDER BY datum ASC";
$result = mysqli_query($db, $sql_sel) or die(mysqli_error($db)); $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db));
while ($row = mysqli_fetch_assoc($result)) { while ($row = mysqli_fetch_assoc($result)) {
foreach ($row as $key => $value) { foreach ($row as $key => $value) {
@@ -262,6 +269,17 @@ function getOneDate($id) {
return $data; return $data;
} }
// aus fdatum die div. Datumsteile hole
function getTimeByDate($dt, $typ) {
global $db;
if ($typ == 'sonnen')
return '11 Uhr';
$sql_stmt = "SELECT uhrzeit FROM fdatum1 WHERE datum='$dt'";
$result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
$data = mysqli_fetch_assoc($result);
return $data['uhrzeit'];
}
function insertteilnehmer($data) { function insertteilnehmer($data) {
global $db; global $db;
$name = $data['name']; $name = $data['name'];
@@ -473,6 +491,9 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
case 'GET_ONE_DATE': case 'GET_ONE_DATE':
$erg = getOneDate($_POST['fid']); $erg = getOneDate($_POST['fid']);
break; break;
case 'GET_TIME_BY_DATE':
$erg = getTimeByDate($_POST['dt'], $_POST['typ']);
break;
case 'GET_ALLTEILN': case 'GET_ALLTEILN':
$erg = getAllTeilnehmer($_POST['fdatum']); $erg = getAllTeilnehmer($_POST['fdatum']);
break; break;
@@ -503,7 +524,7 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$erg = getTeilnehmer(-1, true, false); $erg = getTeilnehmer(-1, true, false);
break; break;
case 'GET_FUEHRUNGEN': case 'GET_FUEHRUNGEN':
$erg = getFuehrungen($_POST['start'], $_POST['end']); $erg = getFuehrungen($_POST['start'], $_POST['end'], $_POST['typ']);
break; break;
case 'PUT_FDATES': case 'PUT_FDATES':
$erg = putFdates($_POST['data']); $erg = putFdates($_POST['data']);

View File

@@ -2,7 +2,7 @@
.storno { .storno {
font-size: 14px; font-size: 14px;
min-height: 500px; min-height: 550px;
position: relative; position: relative;
} }
@@ -131,3 +131,8 @@ h5 {
margin-left: 10px; margin-left: 10px;
font-size: 80%; font-size: 80%;
} }
#abbrechen {
background-color: gray;
margin-top: 40px;
}

View File

@@ -51,7 +51,7 @@
Für diese E-Mail Adresse ist keine Führung angemeldet !<br /> Für diese E-Mail Adresse ist keine Führung angemeldet !<br />
</div> </div>
<div id="anmeldid" class="col-12 col-xm-8 text-center"> <div id="anmeldid" class="col-12 col-xm-8 text-center">
Sie sind angemeldet für: <br /><br /> Sie sind angemeldet für eine <span id="fart">Sternführung</span> am: <br /><br />
<div id="anmeldung"> <div id="anmeldung">
2022-07-12 22:00 Uhr 4 Personen 2022-07-12 22:00 Uhr 4 Personen
</div> </div>

View File

@@ -5,8 +5,8 @@
$(document).ready(() => { $(document).ready(() => {
// Globale Konstanten und Variable // Globale Konstanten und Variable
// const ajaxURL="php/anmeldDB.php"; // const ajaxURL="php/anmeldDB.php";
const ajaxURL="../../DB4js.php"; const ajaxURL = "../../DB4js.php";
const maxVisitors = 25 const maxVisitors = 25
const months2add = 3 const months2add = 3
@@ -21,9 +21,9 @@ $(document).ready(() => {
// Return: // Return:
// angeforderte Daten als JSON // angeforderte Daten als JSON
const fetchFromDbase = async (body) => { const fetchFromDbase = async (body) => {
const response = await fetch(ajaxURL,{ const response = await fetch(ajaxURL, {
method: 'POST', method: 'POST',
headers: {'Content-Type': 'application/js'}, headers: { 'Content-Type': 'application/js' },
body: JSON.stringify(body) body: JSON.stringify(body)
}); });
let rt = await response.json(); let rt = await response.json();
@@ -37,22 +37,41 @@ $(document).ready(() => {
// Return: // Return:
// angeforderte Daten als JSON // angeforderte Daten als JSON
const putToDbase = async (body) => { const putToDbase = async (body) => {
const response = await fetch(ajaxURL,{ const response = await fetch(ajaxURL, {
method: 'POST', method: 'POST',
headers: {'Content-Type': 'application/js'}, headers: { 'Content-Type': 'application/js' },
body: JSON.stringify(body) body: JSON.stringify(body)
}); });
return await response.json(); return await response.json();
} }
// Wochentag aus integer Datum extrahieren
function getWochentag(datumInt) {
const d = new Date(
Math.floor(datumInt / 10000), // Jahr
Math.floor((datumInt % 10000) / 100) - 1, // Monat (0-basiert)
datumInt % 100 // Tag
);
return ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"][d.getDay()];
}
// Aus dem integer Führungsdatum (aus anmeldungen) den Wochentag und
// die Uhrzeit aus der Tabelle fdatum 1 holen
const getFuhrzeit = async (dt, typ) => {
return await fetchFromDbase({ cmd: 'GET_TIME_BY_DATE', dt: dt, typ: typ })
}
// Das Führungsdatum extrahieren // Das Führungsdatum extrahieren
const buildDatum = async (tn, short) => { const buildDatum = async (tn, short) => {
const person = tn.anzahl === '1' ? 'Person' : 'Personen' const person = tn.anzahl === '1' ? 'Person' : 'Personen'
const datum = await fetchFromDbase({cmd: 'GET_ONE_DATE', fid: tn.fid}) const uhrzeit = await getFuhrzeit(tn.fdatum, tn.typ)
if(short) { if (short) {
return `${moment(datum.datum).format('DD.MM.YYYY')}` return `${moment(tn.fdatum).format('DD.MM.YYYY')}`
} }
return `${datum.wtag}, den ${moment(datum.datum).format('DD.MM.YYYY')} um ${datum.uhrzeit} mit ${tn.anzahl} ${person}` if(tn.typ === 'sonnen') {
document.getElementById('fart').innerHTML = "Sonnenführung"
}
return `${getWochentag(tn.fdatum)}, den ${moment(tn.fdatum).format('DD.MM.YYYY')} um ${uhrzeit} mit ${tn.anzahl} ${person}`
} }
// Das Führungsdatum anzeigen // Das Führungsdatum anzeigen
@@ -67,13 +86,13 @@ $(document).ready(() => {
} }
const austragen = async (teilnehmer) => { const austragen = async (teilnehmer) => {
// console.log("Austragen von ", teilnehmer) // console.log("Austragen von ", teilnehmer)
// return // return
oldtndata = {...teilnehmer} oldtndata = { ...teilnehmer }
let delstr = {cmd: 'DELETE_ENTRY', id: parseInt(teilnehmer.id)} let delstr = { cmd: 'DELETE_ENTRY', id: parseInt(teilnehmer.id) }
const erg1 = await putToDbase(delstr) const erg1 = await putToDbase(delstr)
console.log("Storno Ergebnis: ",erg1) console.log("Storno Ergebnis: ", erg1)
if(erg1) { if (erg1) {
$('#ausgetragen').show() $('#ausgetragen').show()
$('#lower_text').show() $('#lower_text').show()
sendEmail(teilnehmer, true) sendEmail(teilnehmer, true)
@@ -84,44 +103,48 @@ $(document).ready(() => {
} }
const umbuchen = async (teilnehmer) => { const umbuchen = async (teilnehmer) => {
// console.log('Umbuchen von ',teilnehmer) // console.log('Umbuchen von ',teilnehmer)
// return // return
oldtndata = {...teilnehmer} oldtndata = { ...teilnehmer }
let start = moment() let start = moment()
start = start.add(vorlauf, 'h') start = start.add(vorlauf, 'h')
let end = moment() let end = moment()
end = end.add(months2add, 'M') let add = months2add
if (teilnehmer.typ === 'sonnen') {
add = 12
}
end = end.add(add, 'M')
const anzahl = parseInt(teilnehmer.anzahl) const anzahl = parseInt(teilnehmer.anzahl)
let fuehrungen = await fetchFromDbase({cmd: 'GET_FUEHRUNGEN', start: start.format('YYYYMMDD'), end: end.format('YYYYMMDD')}) let fuehrungen = await fetchFromDbase({ cmd: 'GET_FUEHRUNGEN', start: start.format('YYYYMMDD'), end: end.format('YYYYMMDD'), typ: teilnehmer.typ})
let r = `<label for "ftermin" class="labeltext"><strong>Umbuchung auf</strong></label><br /><select name="ftermin" id="ftermin"><option>-- Bitte wählen Sie ein Datum aus--</option>` let r = `<label for "ftermin" class="labeltext"><strong>Umbuchung auf</strong></label><br /><select name="ftermin" id="ftermin"><option>-- Bitte wählen Sie ein Datum aus--</option>`
for (let f of fuehrungen) { for (let f of fuehrungen) {
if(f.datum == teilnehmer.fdatum) { if (f.datum == teilnehmer.fdatum) {
continue continue
} }
let count = await fetchFromDbase({cmd: 'GET_COUNTS_DATE', date: f.datum}) let count = await fetchFromDbase({ cmd: 'GET_COUNTS_DATE', date: f.datum })
count = count ? parseInt(count) : 0 count = count ? parseInt(count) : 0
if(count + anzahl >= maxVisitors) { if (count + anzahl >= maxVisitors) {
continue // wenn der Platz nicht reicht, nicht anzeigen continue // wenn der Platz nicht reicht, nicht anzeigen
} }
r += `<option id=${f.id} value=${f.datum}>` r += `<option id=${f.id} value=${f.datum}>`
r += `${f.wtag.substring(0,2)} , ${moment(f.datum).format('DD.MM.YYYY')} ${f.uhrzeit} ` r += `${getWochentag(f.datum).substring(0, 2)} , ${moment(f.datum).format('DD.MM.YYYY')} ${await getFuhrzeit(f.datum, teilnehmer.typ)} `
r += `Frei ${(maxVisitors-count) > 0 ? maxVisitors-count : 0}</option>` r += `Frei ${(maxVisitors - count) > 0 ? maxVisitors - count : 0}</option>`
} }
r += '</select>' r += '</select>'
$('#umbuchung').html(r) $('#umbuchung').html(r)
// $('#umgebucht').html('Bitte wählen Sie ein freies Datum über den kleine Pfeil rechts.') // $('#umgebucht').html('Bitte wählen Sie ein freies Datum über den kleine Pfeil rechts.')
$('#umgebucht').show() $('#umgebucht').show()
// Eventhandler für Auswahl eines Datums über die SelectBox: // Eventhandler für Auswahl eines Datums über die SelectBox:
// Anzeigen der Anmeldungen dazu // Anzeigen der Anmeldungen dazu
$('#ftermin').change( async () => { $('#ftermin').change(async () => {
const x = $('#ftermin').find(':selected'); const x = $('#ftermin').find(':selected');
const date = x[0].value const date = x[0].value
teilnehmer.fdatum = date teilnehmer.fdatum = date
teilnehmer.fid = x[0].id teilnehmer.fid = x[0].id
const update = {cmd: 'UPDATETLNFD', fdatum: date, fid: x[0].id, id: teilnehmer.id} const update = { cmd: 'UPDATETLNFD', fdatum: date, fid: x[0].id, id: teilnehmer.id }
const erg = await putToDbase(update) const erg = await putToDbase(update)
if(erg) { if (erg) {
$('#umbuchung').hide() $('#umbuchung').hide()
$('#umgebucht').html(`Sie wurden erfolgreich umgebucht auf <br /><br />${await buildDatum(teilnehmer, false)}`) $('#umgebucht').html(`Sie wurden erfolgreich umgebucht auf <br /><br />${await buildDatum(teilnehmer, false)}`)
$('#umgebucht').show() $('#umgebucht').show()
@@ -137,11 +160,11 @@ $(document).ready(() => {
} }
const aendern = async (teilnehmer) => { const aendern = async (teilnehmer) => {
console.log('Ändern von ',teilnehmer) console.log('Ändern von ', teilnehmer)
let count = await fetchFromDbase({cmd: 'GET_COUNTS_DATE', date: teilnehmer.fdatum}) let count = await fetchFromDbase({ cmd: 'GET_COUNTS_DATE', date: teilnehmer.fdatum })
let anzahl = parseInt(teilnehmer.anzahl) let anzahl = parseInt(teilnehmer.anzahl)
let max = anzahl let max = anzahl
if(count < maxVisitors) { if (count < maxVisitors) {
max = maxVisitors - (count - anzahl) max = maxVisitors - (count - anzahl)
} }
if (max > 10) { if (max > 10) {
@@ -149,24 +172,24 @@ $(document).ready(() => {
} }
console.log("Max: ", max) console.log("Max: ", max)
$('#maxanzahl').text(`max. ${max}`) $('#maxanzahl').text(`max. ${max}`)
$('#personen').attr({max: max, min: 1, step: 1, value: anzahl}) $('#personen').attr({ max: max, min: 1, step: 1, value: anzahl })
// Evelthandler Übernehmen geklicked // Evelthandler Übernehmen geklicked
$('#bsave').click(async () => { $('#bsave').click(async () => {
$('#save').hide() $('#save').hide()
teilnehmer.anzahl = $('#personen').val() teilnehmer.anzahl = $('#personen').val()
let e = await putToDbase({cmd: 'UPDATE_TLN', data: teilnehmer, id: teilnehmer.id}) let e = await putToDbase({ cmd: 'UPDATE_TLN', data: teilnehmer, id: teilnehmer.id })
$('#newperson').html(`Sie sind nun mit <strong>${teilnehmer.anzahl} </strong> Personen angemeldet.`) $('#newperson').html(`Sie sind nun mit <strong>${teilnehmer.anzahl} </strong> Personen angemeldet.`)
$('#bsave').hide() $('#bsave').hide()
$('#newperson').show() $('#newperson').show()
$('#homebutton').show() $('#homebutton').show()
}) })
} }
// Emailadresse eingegeben // Emailadresse eingegeben
const setEvent = (f) => { const setEvent = (f) => {
$(document).on("keypress", "input", async function (e) { $(document).on("keypress", "input", async function (e) {
if (e.which === 13) { if (e.which === 13) {
@@ -196,15 +219,15 @@ $(document).ready(() => {
$('#umbuchen').click(() => { $('#umbuchen').click(() => {
umbuchen(f[idx]) umbuchen(f[idx])
$('#anmeldid').hide() $('#anmeldid').hide()
// $('#email').val("") // $('#email').val("")
}) })
// Ändern geklicked // Ändern geklicked
$('#aendern').click(() => { $('#aendern').click(() => {
aendern(f[idx]) aendern(f[idx])
$('#butgroup').hide() $('#butgroup').hide()
$('#aenderung').show() $('#aenderung').show()
// $('#anmeldid').hide() // $('#anmeldid').hide()
// $('#email').val("") // $('#email').val("")
}) })
} }
}) })
@@ -214,20 +237,18 @@ $(document).ready(() => {
sendEmail = async (tln, storno) => { sendEmail = async (tln, storno) => {
let fdatum = await buildDatum(tln, false) let fdatum = await buildDatum(tln, false)
let oldfdatum = await buildDatum(oldtndata, true) let oldfdatum = await buildDatum(oldtndata, true)
let subject = `${storno ? "Stornierung":"Umbuchung"} der Führung vom ${oldfdatum} auf der Sternwarte Welzheim` let subject = `${storno ? "Stornierung" : "Umbuchung"} der Führung vom ${oldfdatum} auf der Sternwarte Welzheim`
let body_txt = ` let body_txt = `
Sehr geehrte Dame, sehr geehrter Herr, Sehr geehrte Dame, sehr geehrter Herr,
hiermit bestätigen wir die ${storno ? 'Stornierung' : 'Umbuchung'} Ihrer Führung auf der Sternwarte Welzheim vom` hiermit bestätigen wir die ${storno ? 'Stornierung' : 'Umbuchung'} Ihrer Führung auf der Sternwarte Welzheim vom`
if(!storno) { if (!storno) {
body_txt += ` ${oldfdatum}. body_txt += ` ${oldfdatum}.
Sie wurden umgebucht auf: Sie wurden umgebucht auf:
${fdatum} ${fdatum}
Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit.
Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist
und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn
eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden. eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden.
@@ -244,12 +265,12 @@ Mit freundlichen Grüßen
Beobachterteam der Sternwarte Welzheim Beobachterteam der Sternwarte Welzheim
www.sternwarte-welzheim.de www.sternwarte-welzheim.de
` `
let erg = await putToDbase({cmd: 'SEND_MAIL_HTML', subject: subject, to: [tln.email], body_txt: body_txt, body_html: ""}) let erg = await putToDbase({ cmd: 'SEND_MAIL_HTML', subject: subject, to: [tln.email], body_txt: body_txt, body_html: "" })
console.log("Antwort von sendmail_1: ", erg) console.log("Antwort von sendmail_1: ", erg)
body_txt = `Die Führung vom ${oldfdatum} wurde ${storno ? 'storniert' : 'umgebucht'} body_txt = `Die Führung vom ${oldfdatum} wurde ${storno ? 'storniert' : 'umgebucht'}
` `
if(!storno) { if (!storno) {
body_txt += ` body_txt += `
auf ${fdatum}` auf ${fdatum}`
} }
@@ -258,12 +279,12 @@ auf ${fdatum}`
Besucher: ${tln.name} ${tln.vorname}` Besucher: ${tln.name} ${tln.vorname}`
body_html = `Die Führung vom ${oldfdatum} wurde ${storno ? 'storniert' : 'umgebucht'}` body_html = `Die Führung vom ${oldfdatum} wurde ${storno ? 'storniert' : 'umgebucht'}`
if(!storno) { if (!storno) {
body_html += ` auf ${fdatum}<br />` body_html += ` auf ${fdatum}<br />`
} }
body_html += `<br />Besucher: ${tln.name} ${tln.vorname}` body_html += `<br />Besucher: ${tln.name} ${tln.vorname}`
erg = await putToDbase({cmd: 'SEND_MAIL_HTML', subject: subject, to: ['rexfue@gmail.com'], body_txt: body_txt, body_html: body_html}) erg = await putToDbase({ cmd: 'SEND_MAIL_HTML', subject: subject, to: ['rexfue@gmail.com'], body_txt: body_txt, body_html: body_html })
console.log("Antwort von sendmail_2: ", erg) console.log("Antwort von sendmail_2: ", erg)
} }
@@ -277,7 +298,7 @@ Besucher: ${tln.name} ${tln.vorname}`
// und anzeigen // und anzeigen
// Params: // Params:
// n -> Anzahl der zu holnden Daten // n -> Anzahl der zu holnden Daten
async function main(){ async function main() {
console.log("Running...") console.log("Running...")
$('.lastchange').text(`Letzte Änderungen: ${VDATE} rxf`) $('.lastchange').text(`Letzte Änderungen: ${VDATE} rxf`)
$('#anmeldid').hide() $('#anmeldid').hide()
@@ -290,7 +311,7 @@ Besucher: ${tln.name} ${tln.vorname}`
$('#versn').html("Version: " + VERSION + ' vom ' + VDATE); $('#versn').html("Version: " + VERSION + ' vom ' + VDATE);
let fdatum = moment().format('YYYYMMDD') let fdatum = moment().format('YYYYMMDD')
// alle Anmeldungen ab fdatum in ein Array holen // alle Anmeldungen ab fdatum in ein Array holen
let fuehrungen = await fetchFromDbase({cmd: 'GET_ALLTEILN', fdatum: fdatum}) let fuehrungen = await fetchFromDbase({ cmd: 'GET_ALLTEILN', fdatum: fdatum })
setEvent(fuehrungen) setEvent(fuehrungen)
} }