<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>

<database name="openschool" defaultIdMethod="native">

	<table name="schools" description="School Table">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="School id"/>
		<column name="name" type="varchar" size="128" description="The school name" />
	</table>
	
	<table name="school_info" description="Advanced information about school">
		<column name="id" type="integer" primaryKey="true" description="School info id"/>
		<column name="zip_code" type="varchar" size="6" description="Post code" />
		<column name="region" type="varchar" size="128" description="School region" />
		<column name="city" type="varchar" size="128" description="School city" />
		<column name="address" type="varchar" size="255" description="School address" />

		<column name="phones" type="varchar" size="255" />
		<column name="fax" type="varchar" size="255" />

		<column name="email" type="varchar" size="255" />

		<column name="OKPO_code" type="varchar" size="32" />
		<column name="OKATO_code" type="varchar" size="32" />
		<column name="OKOGU_code" type="varchar" size="32" />

		<!-- some other information about school. Facilities and equipment, ocupied area etc. -->


		<column name="head_id" type="integer" description="Fkey to school head" />
		<foreign-key foreignTable="users" onDelete="cascade">
			<reference local="head_id" foreign="id"/>
		</foreign-key>
		

		<foreign-key foreignTable="schools" onDelete="cascade">
			<reference local="id" foreign="id"/>
		</foreign-key>
	</table>


	<table name="users" description="User base table" >
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="User id"/>

		<column name="display_name" type="varchar" size="255" />

		<column name="login" type="varchar" size="40" description="User login"/>
		<column name="password_hash" type="varchar" size="40" description="User password hash"/>

		<column name="school_id" type="integer" description="Fkey to school" />
		<foreign-key foreignTable="schools" onDelete="cascade">
			<reference local="school_id" foreign="id"/>
		</foreign-key>

		<column name="user_role_key" type="INTEGER" inheritance="single">
			<inheritance key="1" class="Teachers" extends="openschool.Users" />
			<inheritance key="2" class="Students" extends="openschool.Users" />
			<inheritance key="3" class="Parents" extends="openschool.Users" />
		</column>
	</table>

	<table name="user_metadata" description="Common user information">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="User id"/>

		<column name="first_name" type="varchar" size="64" required="true" description="First name"/>
		<column name="middle_name" type="varchar" size="64" required="true" description="Middle name"/>
		<column name="last_name" type="varchar" size="64" required="true" description="Last name"/>

		<column name="gender" type="varchar" size="1" required="true" description="enum('male', 'female')" />

		<column name="date_of_birth" type="date" description="user's date of birth" />	

		<column name="zip_code" type="varchar" size="6" description="Post code" />
		<column name="address" type="varchar" size="255" />
		<column name="phones" type="varchar" size="255" />
		<column name="email" type="varchar" size="255" />

		<column name="passport_number" type="char" size="6" />
		<column name="passport_serial_number" type="char" size="4" />
		<column name="passport_emited_by" type="varchar" size="64" />
		<column name="passport_emited_on" type="date" sqlType="year" />

		<foreign-key foreignTable="users" onDelete="cascade">
			<reference local="id" foreign="id"/>
		</foreign-key>
	</table>

	<table name="parents" description="Parents table extends users" phpName="inheritance_parents">
		<column name="id" type="integer" primaryKey="true" description="Parent id"/>

		<column name="place_of_employment" type="varchar" size="255" />
		<column name="post" type="varchar" size="64" />
		<column name="office_phone" type="varchar" size="64" />

		<foreign-key foreignTable="users" onDelete="cascade">
			<reference local="id" foreign="id"/>
		</foreign-key>
	</table>


	<table name="students" description="Students table extends users" phpName="inheritance_students">
		<column name="id" type="integer" primaryKey="true" description="Student id"/>

		<column name="birth_certificate" type="varchar" size="32" />
		<column name="foreign_language_id" type="integer" />
		<column name="case_number" type="integer" />

		<foreign-key foreignTable="users" onDelete="cascade">
			<reference local="id" foreign="id"/>
		</foreign-key>
		<foreign-key foreignTable="foreign_languages" onDelete="cascade">
			<reference local="foreign_language_id" foreign="id"/>
		</foreign-key>
	</table>

	<table name="foreign_languages">
		<column name="id" type="integer" primaryKey="true" description="Language id"/>
		<column name="language" type="varchar" size="32" />
	</table>

	<table name="parents_students">
		<column name="parent_id" type="integer"  required="true" primaryKey="true" />
		<column name="student_id" type="integer"  required="true" primaryKey="true" />

		<foreign-key foreignTable="parents">
			<reference local="parent_id" foreign="id" />
		</foreign-key>
		<foreign-key foreignTable="students">
			<reference local="student_id" foreign="id" />
		</foreign-key>
	</table>

	<table name="teachers" description="Teacher table extends users" phpName="inheritance_teacher">
		<column name="id" type="integer" primaryKey="true" description="Teacher id"/>

		<column name="number" type="integer" required="true" />

		<column name="awards" type="longvarchar" />

		<foreign-key foreignTable="users" onDelete="cascade">
			<reference local="id" foreign="id"/>
		</foreign-key>
	</table>

	<table name="posts_teachers">
		<column name="teacher_id" type="INTEGER" required="true" primaryKey="true"/>
		<column name="post_id" type="INTEGER" required="true" primaryKey="true"/>

		<column name="qualifying_category_id" type="integer" />
		<column name="qualifying_date" type="date" />
		<column name="qualifying_expiration_date" type="date" />		

		<foreign-key foreignTable="teachers">
			<reference local="teacher_id" foreign="id"/>
		</foreign-key>
		<foreign-key foreignTable="posts">
			<reference local="post_id" foreign="id"/>
		</foreign-key>
		<foreign-key foreignTable="qualifying_categories">
			<reference local="qualifying_category_id" foreign="id"/>
		</foreign-key>
	</table>

	<table name="posts">
		<column name="id" type="integer" primaryKey="true" description="Post id"/>
		<column name="post" type="varchar" size="255" />
	</table>

	<table name="qualifying_categories" description="Categories">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Category id"/>
		<column name="category" type="varchar" size="64" description="Category name" />
		<!-- possible value: Highest, first, second, 1-15 rating etc... -->
	</table>


	<table name="educations" description="Teacher educations">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Education id"/>
		<column name="institute" type="varchar" size="255" description="Institute name" />
		<column name="education_date" type="date" />
		<column name="speciality" type="varchar" size="255" description="Speciality by diploma" />
		<column name="qualification" type="varchar" size="255" description="Qualification by diploma" />
		<column name="education_type_id" type="integer" description="Type of education (high, secondary, school, special)" />
		<column name="diploma_number" type="varchar" size="32" />

		<foreign-key foreignTable="education_types" onDelete="cascade">
			<reference local="education_type_id" foreign="id"/>
		</foreign-key>

	</table>

	<table name="education_types" description="Education types">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Education type id"/>
		<column name="education_type" type="varchar" size="64" description="Education type" />
		<!-- Possible values: secondary, higher education ... -->
	</table>
	
	<table name="educations_teachers">
		<column name="education_id" type="integer"  required="true" primaryKey="true" />
		<column name="teacher_id" type="integer"  required="true" primaryKey="true" />

		<foreign-key foreignTable="educations">
			<reference local="education_id" foreign="id" />
		</foreign-key>
		<foreign-key foreignTable="teachers">
			<reference local="teacher_id" foreign="id" />
		</foreign-key>
	</table>
	
	<table name="extension_courses" description="Teacher courses graded">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Course id"/>
		<column name="name" type="varchar" size="255" description="Education type" />
		<column name="institute" type="varchar" size="255" description="Where was graded" />
		<column name="course_year" type="date" sqlType="year" />
		<column name="hours" type="integer" description="Course hours count" />
	</table>

	<table name="extension_courses_teachers">
		<column name="course_id" type="integer"  required="true" primaryKey="true" />
		<column name="teacher_id" type="integer"  required="true" primaryKey="true" />

		<foreign-key foreignTable="extension_courses">
			<reference local="course_id" foreign="id" />
		</foreign-key>
		<foreign-key foreignTable="teachers">
			<reference local="teacher_id" foreign="id" />
		</foreign-key>
	</table>

	<!-- Education program, class, course, Lesson terminology based on Open Course Timetabler (www.openctt.org) -->

	<table name="education_programs" description="Primary, secondary, high school">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Education program id"/>
		<column name="name" type="varchar" size="64" description="Education program name" />
		
		<column name="school_id" type="integer" description="Fkey to school" />
		<foreign-key foreignTable="schools" onDelete="cascade">
			<reference local="school_id" foreign="id"/>
		</foreign-key>

	</table>

	<table name="classes" description="Classes">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Class id"/>
		<column name="name" type="varchar" size="64" description="Class name, e.g. 1A, 1B, 1C, ..., 11A, 11B, 11C" />

		<column name="form_master_id" type="integer" />
		<foreign-key foreignTable="teachers" onDelete="setnull">
			<reference local="form_master_id" foreign="id" />
		</foreign-key>


		<column name="education_program_id" type="integer" />
		<foreign-key foreignTable="education_programs" onDelete="cascade">
			<reference local="education_program_id" foreign="id" />
		</foreign-key>
	</table>

	<table name="classes_students">
		<column name="class_id" type="integer"  required="true" primaryKey="true" />
		<column name="student_id" type="integer"  required="true" primaryKey="true" />

		<foreign-key foreignTable="classes">
			<reference local="class_id" foreign="id" />
		</foreign-key>
		<foreign-key foreignTable="students">
			<reference local="student_id" foreign="id" />
		</foreign-key>		
	</table>


	<table name="courses" description="courses">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Course id"/>
		<column name="name" type="varchar" size="64" description="Course name, e.g. physics, mathematics, history..." />

		<column name="short_name" type="varchar" size="16" description="Course name, e.g. ph, math, hist..." />

		<column name="num_of_lessons_per_week" type="float" />

		<column name="teacher_id" type="integer" />
		<foreign-key foreignTable="teachers" onDelete="setnull">
			<reference local="teacher_id" foreign="id" />
		</foreign-key>

		<column name="class_id" type="integer" />
		<foreign-key foreignTable="classes" onDelete="cascade">
			<reference local="class_id" foreign="id" />
		</foreign-key>
	</table>

	<table name="courses_students">
		<!-- No records if whole class in course -->
		<column name="course_id" type="integer"  required="true" primaryKey="true" />
		<column name="student_id" type="integer"  required="true" primaryKey="true" />

		<foreign-key foreignTable="courses">
			<reference local="course_id" foreign="id" />
		</foreign-key>
		<foreign-key foreignTable="students">
			<reference local="student_id" foreign="id" />
		</foreign-key>		
	</table>

	<table name="courses_rooms">
		<column name="course_id" type="integer"  required="true" primaryKey="true" />
		<column name="room_id" type="integer"  required="true" primaryKey="true" />

		<foreign-key foreignTable="courses">
			<reference local="course_id" foreign="id" />
		</foreign-key>
		<foreign-key foreignTable="rooms">
			<reference local="room_id" foreign="id" />
		</foreign-key>
	</table>


	<table name="rooms" description="Rooms at school">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Room id"/>
		<column name="name" type="varchar" size="64" />
		
		<column name="capacity" type="integer" />
		
		<column name="school_id" type="integer" description="Fkey to school" />
		<foreign-key foreignTable="schools" onDelete="cascade">
			<reference local="school_id" foreign="id"/>
		</foreign-key>
	</table>
	
	<table name="days" description="Days of week">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Day id"/>
		<column name="name" type="varchar" size="16" description="e.g. Monday, tuesday, wednesday, thursday, friday" />

		<column name="school_id" type="integer" description="Fkey to school" />
		<foreign-key foreignTable="schools" onDelete="cascade">
			<reference local="school_id" foreign="id"/>
		</foreign-key>
	</table>
	
	<table name="terms" description="Lesson times">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Term id"/>
		<column name="from" type="time" description="e.g. 08:00" />
		<column name="to" type="time" description="e.g. 08:40" />

		<column name="school_id" type="integer" description="Fkey to school" />
		<foreign-key foreignTable="schools" onDelete="cascade">
			<reference local="school_id" foreign="id"/>
		</foreign-key>
	</table>
	
	<table name="timetable">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Timetable item id"/>

		<column name="course_id" type="integer" required="true" />
		<column name="day_id" type="integer" required="true" />
		<column name="term_id" type="integer" required="true" />
		<column name="room_id" type="integer" required="true" />

		<foreign-key foreignTable="courses" onDelete="cascade">
			<reference local="course_id" foreign="id"/>
		</foreign-key>
		<foreign-key foreignTable="days" onDelete="cascade">
			<reference local="day_id" foreign="id"/>
		</foreign-key>
		<foreign-key foreignTable="terms" onDelete="cascade">
			<reference local="term_id" foreign="id"/>
		</foreign-key>
		<foreign-key foreignTable="rooms" onDelete="cascade">
			<reference local="room_id" foreign="id"/>
		</foreign-key>
	</table>
	
	<table name="lessons">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Lesson id"/>

		<column name="title" type="varchar" size="255" required="true" />

		<column name="course_id" type="integer" required="true"/>

		<column name="from" type="timestamp" required="true" description="e.g. 2008-10-27 08:00:00" />
		<column name="length" type="integer" required="true" description="e.g. 40 (min)" />

		<column name="room_id" type="integer" required="true" />

		<foreign-key foreignTable="courses" onDelete="cascade">
			<reference local="course_id" foreign="id"/>
		</foreign-key>
		<foreign-key foreignTable="rooms" onDelete="cascade">
			<reference local="room_id" foreign="id"/>
		</foreign-key>
	</table>
	
	<table name="marks">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Mark id"/>

		<column name="mark" type="integer" required="true" description="1, 2, 3, 4, 5" />
		<column name="scale" type="integer" required="true" description="1, 5, 10, 100" />
		
		<column name="lesson_id" type="integer" required="true" />
		<column name="student_id" type="integer" required="true" />

		<foreign-key foreignTable="lessons" onDelete="cascade">
			<reference local="lesson_id" foreign="id"/>
		</foreign-key>
		<foreign-key foreignTable="students" onDelete="cascade">
			<reference local="student_id" foreign="id"/>
		</foreign-key>
	</table>
	
	
	
	
<!-- Library part -->
	<table name="library_toc" idMethod="native" treeMode="NestedSet">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Toc entry id"/>

		<column name="lft" type="INTEGER" required="true" default="0" nestedSetLeftKey="true"/>
		<column name="rgt" type="INTEGER" required="true" default="0" nestedSetRightKey="true"/>

		<column name="scope" type="INTEGER" required="true" default="0" treeScopeKey="true"/>
		
		<index name="lft">
			<index-column name="lft"/>
		</index>
		<index name="rgt">
			<index-column name="rgt"/>
		</index>
		<index name="scope">
			<index-column name="scope"/>
		</index>

		<column name="name" type="varchar" size="255" description="e.g. Literature, chemistry..." required="true" />
		<column name="UDK" type="varchar" size="32" />
		<column name="BBK" type="varchar" size="32" />


		<column name="school_id" type="integer" description="Fkey to school" />
		<foreign-key foreignTable="schools" onDelete="cascade">
			<reference local="school_id" foreign="id"/>
		</foreign-key>
	</table>

	<table name="library_items">
		<column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Item id"/>

		<column name="title" type="varchar" size="255" required="true" />
		<column name="author" type="varchar" size="255" />
		<column name="author_type" type="varchar" size="255" description="enum('author','drawer','collective','editor','other','none')" required="true" />

		<column name="description" type="longvarchar" />

		<column name="ISBN" type="varchar" size="32" />
		<column name="UDK" type="varchar" size="32" />
		<column name="BBK" type="varchar" size="32" />

		<column name="copies_count" type="integer" required="true" />
		<column name="readers_count" type="integer" />

		<column name="school_id" type="integer" description="Fkey to school" />
		<foreign-key foreignTable="schools" onDelete="cascade">
			<reference local="school_id" foreign="id"/>
		</foreign-key>
		
		<column name="item_type_key" type="INTEGER" inheritance="single">
			<inheritance key="1" class="Articles" extends="openschool.LibraryItems" />
			<inheritance key="2" class="Magazines" extends="openschool.LibraryItems" />
			<inheritance key="3" class="Books" extends="openschool.LibraryItems" />
			<inheritance key="4" class="BooksToc" extends="openschool.LibraryItems" />
			<inheritance key="5" class="Document" extends="openschool.LibraryItems" />
			<inheritance key="6" class="Url" extends="openschool.LibraryItems" />
		</column>
	</table>

	<table name="articles" description="Articles table extends LibraryItems" phpName="inheritance_articles">
		<column name="id" type="integer" primaryKey="true" description="Article id"/>
		
		<column name="first_page" type="integer" required="true" />
		<column name="last_page" type="integer" required="true" />

		<column name="magazine_id" type="integer"  required="true" primaryKey="true" />
		<foreign-key foreignTable="magazines" onDelete="cascade">
			<reference local="magazine_id" foreign="id" />
		</foreign-key>
		
		<foreign-key foreignTable="library_items" onDelete="cascade">
			<reference local="id" foreign="id"/>
		</foreign-key>
	</table>

	<table name="magazines"  description="Magazines table extends LibraryItems" phpName="inheritance_magazines">
		<column name="id" type="integer" primaryKey="true" description="Magazine id"/>

		<column name="publisher" type="varchar" size="255" />
		<column name="magazine_number" type="integer" required="true" />
		<column name="magazine_year" type="date" sqlType="year" required="true" />

		<foreign-key foreignTable="library_items" onDelete="cascade">
			<reference local="id" foreign="id"/>
		</foreign-key>
	</table>

	<table name="books"  description="Books table extends LibraryItems" phpName="inheritance_books">
		<column name="id" type="integer" primaryKey="true" description="Book id"/>

		<column name="publisher" type="varchar" size="255" />
		<column name="year_published" type="date" sqlType="year" required="true" />
		<column name="price" type="float" />

		<foreign-key foreignTable="library_items" onDelete="cascade">
			<reference local="id" foreign="id"/>
		</foreign-key>
	</table>

	<table name="inventory_nums" description="Inventory numbers for books">
		<column name="inventory_number" type="integer" primaryKey="true" />

		<column name="book_id" type="integer" required="true" />
		<foreign-key foreignTable="books" onDelete="cascade">
			<reference local="book_id" foreign="id"/>
		</foreign-key>
	</table>

	<table name="book_toc"  description="BookToc table extends LibraryItems. Table of contents for books" phpName="inheritance_books_toc">
		<column name="id" type="integer" primaryKey="true" description="Book toc entry id"/>

		<column name="book_id" type="integer"  required="true" primaryKey="true" />
		<foreign-key foreignTable="books" onDelete="cascade">
			<reference local="book_id" foreign="id" />
		</foreign-key>


		<foreign-key foreignTable="library_items" onDelete="cascade">
			<reference local="id" foreign="id"/>
		</foreign-key>
	</table>

	<table name="documents"  description="Documents table extends LibraryItems" phpName="inheritance_documents">
		<!-- Attached content may exist -->
		<column name="id" type="integer" primaryKey="true" description="Document id"/>

		<column name="publisher" type="varchar" size="255" />

		<foreign-key foreignTable="library_items" onDelete="cascade">
			<reference local="id" foreign="id"/>
		</foreign-key>
	</table>

	<table name="urls"  description="Urls table extends LibraryItems" phpName="inheritance_urls">
		<column name="id" type="integer" primaryKey="true" description="Url id"/>

		<column name="url" type="varchar" size="255" />

		<foreign-key foreignTable="library_items" onDelete="cascade">
			<reference local="id" foreign="id"/>
		</foreign-key>
	</table>


	<table name="library_items_toc">
		<column name="toc_id" type="integer"  required="true" primaryKey="true" />
		<column name="item_id" type="integer"  required="true" primaryKey="true" />

		<foreign-key foreignTable="library_items">
			<reference local="item_id" foreign="id" />
		</foreign-key>
		<foreign-key foreignTable="library_toc">
			<reference local="toc_id" foreign="id" />
		</foreign-key>
	</table>

	<table name="library_items_users" description="Readers">
		<column name="user_id" type="integer"  required="true" primaryKey="true" />
		<column name="item_id" type="integer"  required="true" primaryKey="true" />

		<foreign-key foreignTable="library_items">
			<reference local="item_id" foreign="id" />
		</foreign-key>
		<foreign-key foreignTable="users">
			<reference local="user_id" foreign="id" />
		</foreign-key>
	</table>

</database>
