#! /home/onyx/bin/onyx
#
# Dies ist eine kleine Finanzbuchhaltung als Beispiel fuer Onyx 4gl
#
# (c) 93 Michael Koehne <kraehe@bakunin.north.de>
# -----------------------------------------------------------------------------

database fibu%gawk;

# -----------------------------------------------------------------------------

table h
	inprim	char	1,
	knr	int	5,
	ubetr	calc	10;

table kora
	nr	int	5,
	uproz	calc	5,
	ukto	int	5,
	soll	calc	10,
	haben	calc	10,
	saldo	calc	10,
	name	char	25,
	check	char	1;

table kobl
	kto	int	5,
	gkto	int	5,
	gname	char	25,
	sbetr	calc	10,
	hbetr	calc	10,
	belnr	char	10,
	datum	date	10,
	text	char	25;

table prima
	skto	int	5,
	sname	char	25,
	hkto	int	5,
	hname	char	25,
	betr	calc	10,
	belnr	char	10,
	datum	date	10,
	text	char	25;

table journ
	skto	int	5,
	sname	char	25,
	hkto	int	5,
	hname	char	25,
	betr	calc	10,
	belnr	char	10,
	datum	date	10,
	text	char	25;

# -----------------------------------------------------------------------------

transaction init {
	show Messages;
	show Menu;
	}

# -----------------------------------------------------------------------------

program Erfassung;

menu mask Primanota by prima
	"",
	" Soll   Konto : $      #",
	" Haben  Konto : $      #",
	"",
	" Betrag       : $",
	"",
	" Beleg Nummer : $",
	"       Datum  : $",
	"       Text   : $",
	"";
fields
	skto:prima_skto,hkto:prima_hkto,betr,belnr,datum,text:prima_text,

	sname,hname;

transaction prima_skto {
	set h.inprim = "x";
	set h.knr = $prima.skto;
	call kora_load;
	set prima.sname = $kora.name;
	}

transaction prima_hkto {
	set h.inprim = "x";
	set h.knr = $prima.hkto;
	call kora_load;
	set prima.hname = $kora.name;
	}

transaction prima_text {
	fetch new prima;
	}

# -----------------------------------------------------------------------------

menu mask Kontenrahmen by kora
	"",
	" Nummer      : $      $",
	"",
	" Steuerkonto : $      $",
	"",
	" Soll        : #",
	" Haben       : #",
	" Saldo       : #",
	"";
fields
	nr:kora_nr,name,ukto,uproz:kora_save,soll,haben,saldo;

transaction kora_load {
	if not h.knr then break;

	import kora from
		select * from kontenrahmen
		 where nr = $h.knr;

	if not kora.nr
	then call kora_check;
	}

transaction kora_check {
	set kora.nr = $h.knr;
	set kora.check = "x";
	show Kontenrahmen;
	}

transaction kora_nr {
	set h.inprim = "";
	set h.knr = $kora.nr;
	call kora_load;
	}

transaction kora_save {
	if not kora.nr then break;

	if kora.check
	then	insert into kontenrahmen
		values ( $kora.nr,
			 $kora.uproz, $kora.ukto,
			 $kora.soll, $kora.haben, $kora.saldo,
			 "$kora.name"
			);

	else	update kontenrahmen
		   set name = "$kora.name",
		       uproz = "$kora.uproz",
		       ukto = "$kora.ukto"
		 where nr = $kora.nr;

	set kora.check = "";

	if h.inprim
	then show Primanota;
	}

# -----------------------------------------------------------------------------

program Bearbeitung;

transaction buche_soll_steuer {
	set h.ubetr = ($prima.betr*100)/(100+$kora.uproz);

	insert into kontenblatt values (
		$prima.skto, $prima.hkto, "$prima.hname",
		$h.ubetr, 0,
		"$prima.belnr", "$prima.datum", "$prima.text"
		);

	update kontenrahmen
	   set soll = soll  + $h.ubetr,
	      saldo = saldo + $h.ubetr
	 where nr = $prima.skto;

	set h.ubetr = ($prima.betr*$kora.uproz)/(100+$kora.uproz);

	insert into kontenblatt values (
		$kora.ukto, $prima.hkto, "$prima.hname",
		$h.ubetr, 0,
		"$prima.belnr", "$prima.datum", "$prima.text"
		);

	update kontenrahmen
	   set soll = soll  + $h.ubetr,
	      saldo = saldo + $h.ubetr
	 where nr = $kora.ukto;
	}

transaction buche_haben_steuer {
	set h.ubetr = ($prima.betr*100)/(100+$kora.uproz);

	insert into kontenblatt values (
		$prima.hkto, $prima.skto, "$prima.sname",
		0, $h.ubetr,
		"$prima.belnr", "$prima.datum", "$prima.text"
		);

	update kontenrahmen
	   set haben = haben + $h.ubetr,
	       saldo = saldo - $h.ubetr
	 where nr = $prima.hkto;

	set h.ubetr = ($prima.betr*$kora.uproz)/(100+$kora.uproz);

	insert into kontenblatt values (
		$kora.ukto, $prima.skto, "$prima.sname",
		0, $h.ubetr,
		"$prima.belnr", "$prima.datum", "$prima.text"
		);

	update kontenrahmen
	   set haben = haben + $h.ubetr,
	       saldo = saldo - $h.ubetr
	 where nr = $kora.ukto;
	}

transaction buche_soll {
	insert into kontenblatt values (
		$prima.skto, $prima.hkto, "$prima.hname",
		$prima.betr, 0,
		"$prima.belnr", "$prima.datum", "$prima.text"
		);

	update kontenrahmen
	   set soll = soll + $prima.betr,
	      saldo = saldo+ $prima.betr
	 where nr = $prima.skto;
	}


transaction buche_haben {
	insert into kontenblatt values (
		$prima.hkto, $prima.skto, "$prima.sname",
		0, $prima.betr,
		"$prima.belnr", "$prima.datum", "$prima.text"
		);

	update kontenrahmen
	   set haben = haben + $prima.betr,
	       saldo = saldo - $prima.betr
	 where nr = $prima.hkto;
	}

transaction buche {
	show Primanota;

	insert into journal values (
		$prima.skto, "$prima.sname",
		$prima.hkto, "$prima.hname",
		$prima.betr,
		"$prima.belnr", "$prima.datum", "$prima.text"
		);

	set h.knr = $prima.skto;
	call kora_load;

	if kora.uproz
	then call buche_soll_steuer;
	else call buche_soll;

	set h.knr = $prima.hkto;
	call kora_load;

	if kora.uproz
	then call buche_haben_steuer;
	else call buche_haben;
	}

menu transaction Verbuchung {
	for prima do buche;
	clean prima;
	}

menu transaction Auswertungen {
	call shell /home/onyx/bin/fibu.sh;
	}
