Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tuntien laskeminen

t0ll0 [08.03.2011 15:48:16]

#

Moikka!

Eli alustavasti kyselen miten seuraavanlainen kannattaisi toteuttaa, mitä ottaa huomioon ja millä näitä asioita kannattaa edes käsitellä.

Sivuilla täytetään seuraavanlainen formi:
Työn laatu:
Työn tekijä:
Työ aloitettu:
Työn kesto:

Tietokantaan siis tallennetaan työn aloitusaika sekä kesto.

Sitten pitäisi saada tehtyä yhteenveto viikon tunneista tähän tyyliin:
----
Arkipäivät: X tuntia
Iltatyötä: X tuntia
Yötyötä: X tuntia

Lauantai: X tuntia
Iltatyötä: X tuntia
Yötyötä: X tuntia

Sunnuntai: X tuntia
Iltatyötä X tuntia
Yötyötä: X tuntia
----

Iltatyötä on 18-22 välinen aika ja yötyötä on 22-06 välinen aika.

Esimerkki:
Mikäli työ aloitetaan esimerkiksi perjantaina kello 17:00 ja se kestää 9 tuntia niin yhteenveto näyttäisi sen työn osalta tältä:

Arkipäivät: 7 tuntia
Iltatyötä: 4 tuntia
Yötyötä: 2 tuntia

Lauantai: 2 tuntia
Iltatyötä: 0 tuntia
Yötyötä: 2 tuntia


Miten kannattaa alkaa näitä tunteja laskemaan kun tarjolla on ainoastaan työn aloitusaika sekä kesto? Itsellä tuntuu olevan niin tunkkaisia ajatuksia että päätin kysyä täältä neuvoa tämmöisen automatiikan perustaan.

-t0ll0

Metabolix [08.03.2011 19:28:09]

#

Jos työt osuvat tasatunneille, yksinkertainen ratkaisu on ensin muodostaa tarkka lista työtunneista:

pe	17
pe	18
pe	19
pe	20
pe	21
pe	22
pe	23
la	00
la	01

Tästä listasta on sitten helppo poimia erikseen yötyöt, lauantait ynnä muut.

Tehokkaampaa on tietenkin tunnistaa vuorokauden eri osat suoraan isompina paloina eli katkaista työrupeama vain olennaisilta rajoilta (yötyön alku ja loppu, lauantain alku ja loppu ynnä muut), jolloin tuloksena olisi tällaisia osia:

arki	päivä	1
arki	ilta	4
arki	yö	2
la  	yö	2

t0ll0 [08.03.2011 20:42:05]

#

Uskoakseni tähän sopii paremmin tuo toinen ehdotus.

Noh meikä kokeilee erillaisia tapoja ja palaan luultavasti jollain koodin rääpäleellä tänne!

esajeejee [10.03.2011 01:14:18]

#

Testailin parilla nopee ja näyttää antavan oikeita tuloksia. Nää voi parsee
suoraan php arrayksi json_decodella servupuolella.

Jos löytyy joku yhdistelmä millä ei toimi niin sano vaan niin debuggaan

//Käyttö

calchours("maanantai", 16, 8);

/*
{"arkipaivat":{"total":8,"evening":4,"night":2},"lauantai":{"total":0,"evening":0,"night":0},"sunnuntai":{"total":0,"evening":0,"night":0}}
*/

calchours("perjantai", 17, 9)

/*
{"arkipaivat":{"total":7,"evening":4,"night":2},"lauantai":{"total":2,"evening":0,"night":2},"sunnuntai":{"total":0,"evening":0,"night":0}}
*/
function sumobj(obj) {
var s = 0;
	for( var key in obj ) {

		if (typeof obj[key] == "object" ) {
		s += sumobj( obj[key] );
		}
		else {
		s += +obj[key];
		}

	}

return s;
}

function calchours( daybegin, hourbegin, hoursdone ) {

var days = {
	maanantai: 0,
	tiistai: 1,
	keskiviikko: 2,
	torstai: 3,
	perjantai: 4,
	lauantai: 5,
	sunnuntai: 6
}

var nightmin = 22;
var nightmax = 5;
var eveningmin = 18;
var eveningmax = 21;

var shiftcontainer = {
	weekday: { night: 0, evening: 0, regular: 0 },
	saturday: { night: 0, evening: 0, regular: 0 },
	sunday: { night: 0, evening: 0, regular: 0 }
}

var curhour = days[daybegin] * 24 + hourbegin;

	do{

	var curday = ~~(curhour / 24);

		if( !hoursdone ) { break; }

	var curhourmodulus = curhour % 24;

	var whichday = curhour < 120 ? "weekday" : curhour < 144 ? "saturday" : "sunday";

		if ( curhourmodulus >= nightmin || curhourmodulus <= nightmax ) {
		shiftcontainer[whichday].night++;
		}
		else if ( curhourmodulus >= eveningmin && curhourmodulus <= eveningmax ) {
		shiftcontainer[whichday].evening++;
		}
		else{
		shiftcontainer[whichday].regular++;
		}

	curhour++;

	curhour = curhour > 168 ? 0 : curhour;

	} while( hoursdone-- );



var r = {
	"arkipaivat": {"total":  sumobj( shiftcontainer.weekday ), "evening": shiftcontainer.weekday.evening, "night": shiftcontainer.weekday.night},
	"lauantai": {"total": sumobj( shiftcontainer.saturday ), "evening": shiftcontainer.saturday.evening, "night": shiftcontainer.saturday.night},
	"sunnuntai": {"total": sumobj( shiftcontainer.sunday ), "evening": shiftcontainer.sunday.evening, "night": shiftcontainer.sunday.night}
}

return r;
}

t0ll0 [17.03.2011 11:02:43]

#

Ohop, en ollut huomannut tämmöistä vastausta!
Hyvältä näyttää kiitoksia esajeejee. Ei välttämättä suoraan toimi tekemässäni järjestelmässä mutta erittäin hyvä runko kuiteskin.
Palataan asiaan.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta