Hoi hoi,

Ik heb de volgende uitdaging, waar ik zo ff niet uitkom.

Achtergrond:
In de DB zijn meerdere timewindows gedefinieerd.
Een mogelijke timewindow is:
Ma 9:00 - 17:00
Di 9:00 - 18:00
Wo 10:00 - 21:00
Do 9:00 - 18:00
Vr 9:00 - 18:00
Za Geen window
Zo Geen window

Table layout:
id
ma_active (of er wel of geen timespan is dus)
ma_start (uur-cijfer van start timespan)
ma_end (uur-cijfer van einde timespan)
en zo door voor di,wo,do,vr,za en zo

Er worden elementen in een andere table aangemaakt, welke gekoppeld worden naar timewindow.id
Deze elementen hebben een StartDatum en een MaximaleDoorlooptijd (in uren).

So far, so good.

Nu is mijn probleempje gebaseerd op het feit, dat er berekeningen gemaakt moeten worden, die enkel in de bovenstaand gedefinieerde timespans doorgeteld mogen worden.

Nu wil ik een aantal dingen berekenen.

- Wat is de uiteindelijke datum van "MaximaleDoorloopTijd"?
Bijv. Bij bovenstaande timespan, krijgt het element een StartDatum van -ma 14:00- en een MaximaleDoorlooptijd van -6 uur-? De functie die ik nodig ben, moet antwoorden: -di 12:00- zeg maar.
- Gevolgvraag: Wat is de tijd ten opzicht van time() (zou ook buiten timewindow kunnen vallen dus) die nog over is tot het antwoord op vraag 1?
- Gevolgvraag: Op hoeveel % van de doorlooptijd zitten we dus?

Volgens mij moet het niet te moeilijk zijn, maar op de een of andere manier krijg ik het niet uit mijn hersenen...

Wie van jullie heeft zin om hier even over te bomen?

Alvast super bedankt!

Grtz, Stephan
Het volgende:
Table layout:
id
ma_active (of er wel of geen timespan is dus)
ma_start (uur-cijfer van start timespan)
ma_end (uur-cijfer van einde timespan)

is niet genormaliseerd en je slaat daarmee de de verkeerde weg mee in
Thnx voor je reactie. Hoe vind jij dat het beter kan?

Even de achtergrond van hetgene wat ik zoek:

De timewindows zijn contractuele afspraken met klanten.
En de elementen zijn bestellingen.
Het gaat er dus om wanneer de bestelling maximaal gereed moet zijn, en een weergave van de tijd tot voorgaand tijdstip en een procentuele weergave van deze verhouding.

[size=xsmall]Toevoeging op 12/02/2011 15:00:48:[/size]

Hey...

Inmiddels 3 uur hersenslopend knutselen heeft een werkend iets opgeleverd (op het eerste deel dan, het berekenen van de eindtijd..)

De code is nog lang niet netjes, maar goed...

Hierbij een volledige copy & paste van de code.


<?PHP
function calc_sla_ssr($ticketnr)
{
	global $db;
	$uitkomst=0;
	$sql = "SELECT active,date_open,date_close,ssr_id FROM tickets WHERE id=".$ticketnr;
	$r1 = $db->sql_query($sql,true);
	$sql = "SELECT servicelevel_window,doorlooptijd_werkuren FROM standard_changes WHERE id=".$r1->ssr_id;
	$r2 = $db->sql_query($sql,true);

	$tr = calc_tr_datum($ticketnr);
	

	$uitkomst = round($uitkomst);
	return $uitkomst;
}

function calc_tr_datum($ticketnr)
{
	global $db;
	$sql = "SELECT active,date_open,date_close,ssr_id FROM tickets WHERE id=".$ticketnr;
	$r1 = $db->sql_query($sql,true);
	$sql = "SELECT servicelevel_window,doorlooptijd_werkuren FROM standard_changes WHERE id=".$r1->ssr_id;
	$r2 = $db->sql_query($sql,true);
	$sql = "SELECT * FROM timewindows WHERE id=".$r2->servicelevel_window;
	$r3 = $db->sql_query($sql,true);

	$dag_van_start=date("N",$r1->date_open);
	/* 1=Maandag, t/m 7=Zondag*/
	
	$totaltime = scanday($r3,date("N",$r1->date_open),$r1->date_open,($r2->doorlooptijd_werkuren*60*60));
	
	$totaltime = $_SESSION['tr'];
	return $totaltime;
}

function scanday($r1,$daykind,$startscantime,$dlt)
{
	// Doorloop een dag
	$start=0;
	$eind=0;
	$target_resolution=0;
	$deze_dag_berekenen=0;
	if ($daykind==1)
	{
		$deze_dag_berekenen = $r1->ma_active;
		$start = mktime($r1->ma_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
		$eind = mktime($r1->ma_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
	}
	if ($daykind==2)
	{
		$deze_dag_berekenen = $r1->di_active;
		$start = mktime($r1->di_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
		$eind = mktime($r1->di_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
	}
	if ($daykind==3)
	{
		$deze_dag_berekenen = $r1->wo_active;
		$start = mktime($r1->wo_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
		$eind = mktime($r1->wo_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
	}
	if ($daykind==4)
	{
		$deze_dag_berekenen = $r1->do_active;
		$start = mktime($r1->do_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
		$eind = mktime($r1->do_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
	}
	if ($daykind==5)
	{
		$deze_dag_berekenen = $r1->vr_active;
		$start = mktime($r1->vr_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
		$eind = mktime($r1->vr_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
	}
	if ($daykind==6)
	{
		$deze_dag_berekenen = $r1->za_active;
		$start = mktime($r1->za_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
		$eind = mktime($r1->za_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
	}
	if ($daykind==7)
	{
		$deze_dag_berekenen = $r1->zo_active;
		$start = mktime($r1->zo_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
		$eind = mktime($r1->zo_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
	}
	if ($deze_dag_berekenen == 1)
	{
		if ($startscantime > $start)
		{
			// niet de hele dag pakken
			$start = $startscantime;
		}
		if ($startscantime > $eind)
		{
			// door naar de volgende dag
			$day_new=1;
			if ($daykind < 7) { $day_new = $daykind+1; }
			$start_new_day_at = mktime(0,0,0,date("m",$startscantime),date("d",$startscantime)+1,date("Y",$startscantime));
			scanday($r1,$day_new,$start_new_day_at,$dlt);
		}
		if (($start+$dlt) < $eind)
		{
			// deze dag verloopt ie ergens
			$target_resolution = $start+$dlt;
			$_SESSION['tr'] = $target_resolution;
		} else {
			// door naar de volgende dag met herberekening 'time-left'
			$day_new=1;
			if ($daykind < 7) { $day_new = $daykind+1; }
			$start_new_day_at = mktime(0,0,0,date("m",$start),date("d",$start)+1,date("Y",$start));
			$dltdone = $eind-$start;
			scanday($r1,$day_new,$start_new_day_at,$dlt-$dltdone);
		}
	} else {
		// door naar de volgende dag
		$day_new=1;
		if ($daykind < 7) { $day_new = $daykind+1; }
		$start_new_day_at = mktime(0,0,0,date("m",$startscantime),date("d",$startscantime)+1,date("Y",$startscantime));
		scanday($r1,$day_new,$start_new_day_at,$dlt);
	}
	return $target_resolution;
}
?>

Reageren