package Opals::SIF::Specs;
use	Exporter;
@ISA       = qw(Exporter);


@EXPORT = qw(
    SIF_SUPPORT_VERSION
    XPATH_ACK_STATUS     
    XPATH_ACK_STATUS_CODE
    XPATH_ACK_STATUS_DATA
    XPATH_ACK_ERROR
    XPATH_ACK_ERROR_CATEGORY
    XPATH_ACK_ERROR_CODE
    XPATH_ACK_ERROR_DESC
    XPATH_ACK_ERROR_EXTENDEDDESC
    
    XPATH_GET_MSG
    XPATH_EVENT_MSG
    XPATH_EVENT_MSGID
    XPATH_RESPONSE_MSG
    XPATH_RESPONSE_MSGID
    XPATH_EVENT_SOURCEID
    XPATH_RESPONSE_SOURCEID


    XPATH_EVENT_OBJECT
    XPATH_RESPONSE_OBJECT
    XPATH_RESPONSE_PACKETNUMBER
    XPATH_RESPONSE_MOREPACKETS

    STUDENTPERSONAL
    SCHOOLINFO
    STAFFPERSONAL
    ROOMINFO
    STUDENTSCHOOLENROLLMENT
);

# Version number
$VERSION   = 0.01;
use strict;
use constant SIF_SUPPORT_VERSION =>{
    "2.0r1"=>1,
    "2.4"=>1

};


#################################################################
#



use constant XPATH_ACK_STATUS       =>"/SIF_Message/SIF_Ack/SIF_Status";
use constant XPATH_ACK_STATUS_CODE  =>"/SIF_Message/SIF_Ack/SIF_Status/SIF_Code";
use constant XPATH_ACK_STATUS_DATA  =>"/SIF_Message/SIF_Ack/SIF_Status/SIF_Data";


use constant XPATH_ACK_ERROR             =>"/SIF_Message/SIF_Ack/SIF_Error";
use constant XPATH_ACK_ERROR_CATEGORY    =>"/SIF_Message/SIF_Ack/SIF_Error/SIF_Category";
use constant XPATH_ACK_ERROR_CODE        =>"/SIF_Message/SIF_Ack/SIF_Error/SIF_Code";
use constant XPATH_ACK_ERROR_DESC        =>"/SIF_Message/SIF_Ack/SIF_Error/SIF_Desc";
use constant XPATH_ACK_ERROR_EXTENDEDDESC =>"/SIF_Message/SIF_Ack/SIF_Error/SIF_ExtendedDesc";


use constant  XPATH_GET_MSG     => "/SIF_Message/SIF_Ack/SIF_Status/SIF_Data/SIF_Message";

use constant  XPATH_EVENT_MSG     => "/SIF_Message/SIF_Event";
use constant  XPATH_RESPONSE_MSG  => "/SIF_Message/SIF_Response";
use constant  XPATH_RESPONSE_MSG_REQUEST_ID  => "/SIF_Message/SIF_Response/SIF_RequestMsgId";
use constant  XPATH_RESPONSE_PACKETNUMBER  => "/SIF_Message/SIF_Response/SIF_PacketNumber";
use constant  XPATH_RESPONSE_MOREPACKETS  => "/SIF_Message/SIF_Response/SIF_MorePackets";
use constant  XPATH_EVENT_OBJECT     => "/SIF_Message/SIF_Event/SIF_ObjectData";
use constant  XPATH_RESPONSE_OBJECT  => "/SIF_Message/SIF_Response/SIF_ObjectData";
use constant  XPATH_EVENT_OBJECT_STUDENT     => "/SIF_Message/SIF_Event/SIF_ObjectData/SIF_EventObject/StudentPersonal";
use constant  XPATH_RESPONSE_OBJECT_STUDENT  => "/SIF_Message/SIF_Response/SIF_ObjectData";

use constant  XPATH_EVENT_MSGID     => "/SIF_Message/SIF_Event/SIF_Header/SIF_MsgId";
use constant  XPATH_RESPONSE_MSGID  => "/SIF_Message/SIF_Response/SIF_Header/SIF_MsgId";

use constant  XPATH_EVENT_SOURCEID     => "/SIF_Message/SIF_Event/SIF_Header/SIF_SourceId";
use constant  XPATH_RESPONSE_SOURCEID  => "/SIF_Message/SIF_Response/SIF_Header/SIF_SourceId";


#################################################################

use constant STUDENTPERSONAL =>{
        "2.0r1" =>{
            localId     =>"/StudentPersonal/LocalId",
            refId       =>"/StudentPersonal/\@RefId",
            barcode     =>"/StudentPersonal/ElectronicIdList/ElectronicId[\@Type='Barcode']",
            firstname   =>"/StudentPersonal/Name[\@Type='04']/FirstName",
            lastname    =>"/StudentPersonal/Name[\@Type='04']/LastName",
            middlename  =>"/StudentPersonal/Name[\@Type='04']/MiddleName",
            fullname   =>"/StudentPersonal/Name[\@Type='04']/FullName",
            preferredName=>"/StudentPersonal/Name[\@Type='04']/PreferredName",
            gender      =>"/StudentPersonal/Demographics/Gender",
            birthDate   =>"/StudentPersonal/Demographics/BirthDate",
            addressLine1=>"/StudentPersonal/AddressList/Address[\@Type='0123']/Street/Line1",
            addressLine2=>"/StudentPersonal/AddressList/Address[\@Type='0123']/Street/Line2",
            city        =>"/StudentPersonal/AddressList/Address[\@Type='0123']/City",
            state       =>"/StudentPersonal/AddressList/Address[\@Type='0123']/StateProvince",
            country     =>"/StudentPersonal/AddressList/Address[\@Type='0123']/Country",
            zipCode     =>"/StudentPersonal/AddressList/Address[\@Type='0123']/PostalCode",
            phone       =>"/StudentPersonal/PhoneNumberList/PhoneNumber[\@Type='0096']/Number",
            email       =>"/StudentPersonal/EmailList/Email[\@Type='Primary']",
            onTimeGraduationYear  =>"/StudentPersonal/OnTimeGraduationYear",
            projectedGraduationYear  =>"/StudentPersonal/ProjectedGraduationYear",
            schoolLocalId   =>"/StudentPersonal/MostRecent/SchoolLocalId",
            teacher         =>"/StudentPersonal/HR_Teacher", #custom field requestせd from Western NY RIC
            homeroom        =>"/StudentPersonal/MostRecent/HomeroomLocalId",
            gradeLevel      =>"/StudentPersonal/MostRecent/GradeLevel",

        },
        "2.4" =>{
            localId     =>"/StudentPersonal/LocalId",
            refId       =>"/StudentPersonal/\@RefId",
            barcode     =>"/StudentPersonal/ElectronicIdList/ElectronicId[\@Type='Barcode']",
            firstname   =>"/StudentPersonal/Name[\@Type='04']/FirstName",
            lastname    =>"/StudentPersonal/Name[\@Type='04']/LastName",
            middlename  =>"/StudentPersonal/Name[\@Type='04']/MiddleName",
            fullname   =>"/StudentPersonal/Name[\@Type='04']/FullName",
            preferredName=>"/StudentPersonal/Name[\@Type='04']/PreferredName",
            gender      =>"/StudentPersonal/Demographics/Gender",
            birthDate   =>"/StudentPersonal/Demographics/BirthDate",
            addressLine1=>"/StudentPersonal/AddressList/Address[\@Type='0123']/Street/Line1",
            addressLine2=>"/StudentPersonal/AddressList/Address[\@Type='0123']/Street/Line2",
            city        =>"/StudentPersonal/AddressList/Address[\@Type='0123']/City",
            state       =>"/StudentPersonal/AddressList/Address[\@Type='0123']/StateProvince",
            country     =>"/StudentPersonal/AddressList/Address[\@Type='0123']/Country",
            zipCode     =>"/StudentPersonal/AddressList/Address[\@Type='0123']/PostalCode",
            phone       =>"/StudentPersonal/PhoneNumberList//PhoneNumber[\@Type='0096']/Number",
            email       =>"/StudentPersonal/EmailList/Email[\@Type='Primary']",
            onTimeGraduationYear  =>"/StudentPersonal/OnTimeGraduationYear",
            projectedGraduationYear  =>"/StudentPersonal/ProjectedGraduationYear",
            schoolLocalId   =>"/StudentPersonal/MostRecent/SchoolLocalId",
            teacher         =>"/StudentPersonal/HR_Teacher", #custom field requestせd from Western NY RIC
            homeroom        =>"/StudentPersonal/MostRecent/HomeroomLocalId",
            gradeLevel      =>"/StudentPersonal/MostRecent/GradeLevel",

        }
    };
#################################################################
#ref: http://specification.sifinfo.org/implementation/2.0r1/studentinformationsystemsworkinggroup.html
use constant SCHOOLINFO      =>{
        "2.0r1" =>{
            localId          =>"/SchoolInfo/LocalId",
            refId            =>"/SchoolInfo/\@RefId",
            stateProvinceId  =>"/SchoolInfo/StateProvinceId",
            NCESId           =>"/SchoolInfo/NCESId",
            schoolName       =>"/SchoolInfo/SchoolName",
            schoolURL        =>"/SchoolInfo/SchoolURL",
            principalName    =>"SchoolInfo/PrincipalInfo/ContactName"
            

        },
        "2.4" =>{
            localId          =>"/SchoolInfo/LocalId",
            refId            =>"/SchoolInfo/\@RefId",
            stateProvinceId  =>"/SchoolInfo/StateProvinceId",
            NCESId           =>"/SchoolInfo/NCESId",
            schoolName       =>"/SchoolInfo/SchoolName",
            schoolURL        =>"/SchoolInfo/SchoolURL",
            principalName    =>"SchoolInfo/PrincipalInfo/ContactName"
       

        }
    };

#################################################################
#ref: http://specification.sifinfo.org/implementation/2.0r1/studentinformationsystemsworkinggroup.html
use constant STAFFPERSONAL      =>{
        "2.0r1" =>{
            localId          =>"/StaffPersonal/LocalId",
            refId            =>"/StaffPersonal/\@RefId",
            employeePersonalRefId =>"/StaffPersonal/\@RefId",
            barcode          =>"/StaffPersonal/ElectronicIdList/ElectronicId[\@Type='Barcode']",
            firstname        =>"/StaffPersonal/Name[\@Type='04']/FirstName",
            lastname         =>"/StaffPersonal/Name[\@Type='04']/LastName",
            middlename       =>"/StaffPersonal/Name[\@Type='04']/MiddleName",
            preferredName    =>"/StaffPersonal/Name[\@Type='04']/PreferredName",
            gender           =>"/StaffPersonal/Demographics/Gender",
            email            =>"/StaffPersonal/EmailList/Email[\@Type='Primary']",
            addressLine1     =>"/StaffPersonal/AddressList/Address[\@Type='0123']/Street/Line1",
            addressLine2     =>"/StaffPersonal/AddressList/Address[\@Type='0123']/Street/Line2",
            city             =>"/StaffPersonal/AddressList/Address[\@Type='0123']/City",
            state            =>"/StaffPersonal/AddressList/Address[\@Type='0123']/StateProvince",
            country          =>"/StaffPersonal/AddressList/Address[\@Type='0123']/Country",
            zipCode          =>"/StaffPersonal/AddressList/Address[\@Type='0123']/PostalCode"
            

        },
        "2.4" =>{
            localId          =>"/StaffPersonal/LocalId",
            refId            =>"/StaffPersonal/\@RefId",
            employeePersonalRefId =>"/StaffPersonal/\@RefId",
            barcode          =>"/StaffPersonal/ElectronicIdList/ElectronicId[\@Type='Barcode']",
            firstname        =>"/StaffPersonal/Name[\@Type='04']/FirstName",
            lastname         =>"/StaffPersonal/Name[\@Type='04']/LastName",
            middlename       =>"/StaffPersonal/Name[\@Type='04']/MiddleName",
            preferredName    =>"/StaffPersonal/Name[\@Type='04']/PreferredName",
            gender           =>"/StaffPersonal/Demographics/Gender",
            email            =>"/StaffPersonal/EmailList/Email[\@Type='Primary']",
            addressLine1     =>"/StaffPersonal/AddressList/Address[\@Type='0123']/Street/Line1",
            addressLine2     =>"/StaffPersonal/AddressList/Address[\@Type='0123']/Street/Line2",
            city             =>"/StaffPersonal/AddressList/Address[\@Type='0123']/City",
            state            =>"/StaffPersonal/AddressList/Address[\@Type='0123']/StateProvince",
            country          =>"/StaffPersonal/AddressList/Address[\@Type='0123']/Country",
            zipCode          =>"/StaffPersonal/AddressList/Address[\@Type='0123']/PostalCode"
       
        }
    };

#################################################################
#ref: http://specification.sifinfo.org/implementation/2.0r1/studentinformationsystemsworkinggroup.html
use constant STUDENTSCHOOLENROLLMENT      =>{
        "2.0r1" =>{
            refId                   =>"/StudentSchoolEnrollment/\@RefId",
            studentPersonalRefId    =>"/StudentSchoolEnrollment/\@StudentPersonalRefId",
            schoolInfoRefId         =>"/StudentSchoolEnrollment/\@SchoolInfoRefId", 
            homeRoomRefId           =>"/StudentSchoolEnrollment/Homeroom[\@SIF_RefObject='RoomInfo']", 
            advisor                 =>"/StudentSchoolEnrollment/Advisor[\@SIF_RefObject='StaffPersonal']", 
            counselor               =>"/StudentSchoolEnrollment/Counselor[\@SIF_RefObject='StaffPersonal']"
        },
        "2.4" =>{
            refId                   =>"/StudentSchoolEnrollment/\@RefId",
            studentPersonalRefId    =>"/StudentSchoolEnrollment/\@StudentPersonalRefId",
            schoolInfoRefId         =>"/StudentSchoolEnrollment/\@SchoolInfoRefId", 
            homeRoomRefId           =>"/StudentSchoolEnrollment/Homeroom[\@SIF_RefObject='RoomInfo']", 
            advisor                 =>"/StudentSchoolEnrollment/Advisor[\@SIF_RefObject='StaffPersonal']", 
            counselor               =>"/StudentSchoolEnrollment/Counselor[\@SIF_RefObject='StaffPersonal']"
                  
        }
    };

#################################################################
#ref: http://specification.sifinfo.org/implementation/2.0r1/studentinformationsystemsworkinggroup.html
use constant ROOMINFO      =>{
        "2.0r1" =>{
            refId            =>"/RoomInfo/\@RefId",
            schoolInfoRefId  =>"/RoomInfo/\@SchoolInfoRefId",
            staffList        =>"/RoomInfo/StaffList",
            description      =>"/RoomInfo/Description",
            building         =>"/RoomInfo/Building",
            roomNumber       =>"/RoomInfo/RoomNumber",
            homeroomNumber   =>"/RoomInfo/HomeroomNumber",
            size             =>"/RoomInfo/Size",
            capacity         =>"/RoomInfo/Capacity",
            phone            =>"/RoomInfo/PhoneNumber[\@Type='0096']/Number"
        },
        "2.4" =>{
            refId            =>"/RoomInfo/\@RefId",
            schoolInfoRefId  =>"/RoomInfo/\@SchoolInfoRefId",
            staffList        =>"/RoomInfo/StaffList",
            description      =>"/RoomInfo/Description",
            building         =>"/RoomInfo/Building",
            roomNumber       =>"/RoomInfo/RoomNumber",
            homeroomNumber   =>"/RoomInfo/HomeroomNumber",
            Size             =>"/RoomInfo/Size",
            capacity         =>"/RoomInfo/Capacity",
            phone            =>"/RoomInfo/PhoneNumber[\@Type='0096']/Number"
            
        }
    };




#################################################################
1;

