<?php
  /**
   * phpaga
   *
   * Return simple query results
   *
   * This page is called by xmlhttprequests.
   *
   * @author Florian Lanthaler <florian@phpaga.net>
   * @version $Id: service.php 753 2006-10-25 21:52:28Z florian $
   *
   * Copyright (c) 2005, Florian Lanthaler <florian@phpaga.net>
   *
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions are
   * met:
   *
   *    * Redistributions of source code must retain the above copyright
   *      notice, this list of conditions and the following disclaimer.
   *
   *    * Redistributions in binary form must reproduce the above copyright
   *      notice, this list of conditions and the following disclaimer in
   *      the documentation and/or other materials provided with the
   *      distribution.
   *
   *    * Neither the name of Florian Lanthaler nor the names of his
   *      contributors may be used to endorse or promote products derived
   *      from this software without specific prior written permission.
   *
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
   * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
   * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
   * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */

include_once("./config.php");

if (!isset($_REQUEST["saction"]) || !is_numeric($_REQUEST["saction"]))
    return "";

switch ($_REQUEST["saction"])
{

    case ACTION_SERVICE_PAYTERM:
        if (isset($_REQUEST["id"]) && is_numeric($_REQUEST["id"]))
            print phpaga_companies_getdefaultpayterm($_REQUEST["id"]);
        else
            print "";
        break;

    case ACTION_SERVICE_MEMBERPARM:

        $peInfo = array();
        $pe_hourlyrate = "";
        $jcat_id = "";

        if (isset($_REQUEST["id"]) && is_numeric($_REQUEST["id"]))
        {
            $result = phpaga_persons_getInfo($_REQUEST["id"], $peInfo);

            if ($result == PHPAGA_ERR_NONE)
            {
                if (isset($peInfo["jcat_id"]))
                    $jcat_id = $peInfo["jcat_id"];

                if (isset($peInfo["pe_hourlyrate"]))
                    $pe_hourlyrate = $peInfo["pe_hourlyrate"];
            }
        }

        print sprintf("%s||%s",
                      $jcat_id,
                      $pe_hourlyrate);

        break;

    case ACTION_SERVICE_OPDETAILS:


        $html = "";

        if (isset($_REQUEST["id"]) && is_numeric($_REQUEST["id"]))
        {
            $opInfo = array();
            $prjInfo = array();

            $result = phpaga_operations_getInfo($_REQUEST["id"], $opInfo);
            if ($result == PHPAGA_ERR_NONE)
            {
                $result2 = phpaga_projects_getInfo($opInfo["prj_id"], $prjInfo);
                if ($result == PHPAGA_ERR_NONE)
                {

                    $tpl = new psmarty;
                    $tpl->assign("prjInfo", $prjInfo);
                    $tpl->assign("opInfo", $opInfo);
                    $tpl->assign("isdiv", true);
                    $html = $tpl->fetch("view_operation.tpl.html");
                }
            }
        }

        print utf8_encode($html);
        break;

    case ACTION_SERVICE_GETADDTASK:

        $values = "";
        $err = false;
        $errtxt = null;
        $oid = null;
        $otxt = null;
        $ismember = false;
        $can_manage = false;
        $prjInfo = array();
        $select_user = array();

        if (isset($_REQUEST["id"]) && is_numeric($_REQUEST["id"])) {

            $prj_id = $_REQUEST["id"];

            phpaga_project_is_member($prj_id, $_SESSION["auth_user"]["pe_id"], $ismember);
            $can_manage = phpaga_project_canmanage($prj_id);

            /* user can add tasks if she is a project member, if she has the right
             * to manage this project */

            if (!$ismember && !$can_manage) {
                $err = true;
                $errtxt = _("You cannot file tasks for this project because you are not a member or manager.");
            } else {

                $result = phpaga_projects_getInfo($prj_id, $prjInfo);

                if ($result == PHPAGA_ERR_NONE)
                {

                    $tags = "<prjid>".$prj_id."</prjid>\n<prjtitle>".$prjInfo["prj_title"]."</prjtitle>\n";

                    phpaga_operations_getCategoryList($select_opcat);
                    phpaga_arrayAddOption($select_opcat, PHPAGA_OPTION_SELECT);

                    foreach ($select_opcat as $oid => $otxt)
                        $tags .= sprintf("<opcat id=\"%s\">%s</opcat>\n", $oid, phpaga_sanitize_htmlout(utf8_encode($otxt)));

                    /* only the project owner and overall project managers can set an operation's user */

                    if (!$can_manage) {

                        $result = phpaga_persons_getInfo($_SESSION["auth_user"]["pe_id"], $peInfo);

                        $select_user[$peInfo["pe_id"]] =
                            $peInfo["pe_person"]
                            ." ("
                            .$_SESSION["auth_user"]["usr_login"]
                            .")";

                    } else {

                        $userInfo["prj_id"] = $prj_id;
                        $result = phpaga_user_search($users, $userInfo);

                        foreach ($users as $u)
                            $select_user[$u["pe_id"]] = $u["pe_name"]." (".$u["usr_login"].")";
                    }

                    foreach ($select_user as $oid => $otxt)
                        $tags .= sprintf("<user id=\"%s\">%s</user>\n", $oid, phpaga_sanitize_htmlout(utf8_encode($otxt)));

                    $tpl = new psmarty;
                    $tpl->assign("status", 0);
                    $tpl->assign("tags", $tags);
                    $values = $tpl->fetch("xmlresponseframe.tpl.xml");

                } else {
                    $err = true;
                    $errtxt = phpaga_errortext($result, "\n");
                }
            }

        } else {
            $err = true;
            $errtxt = _("Invalid project");
        }

        if ($err) {
            $tpl = new psmarty;
            $tpl->assign("status", 20);

            if (strlen($errtxt))
                $tpl->assign("message", $errtxt);

            $tpl->assign("tags", "");
            $values = $tpl->fetch("xmlresponseframe.tpl.xml");
        }

        header("Content-type: text/xml");
        print $values;
        break;


    case ACTION_SERVICE_ADDTASK:

        $op_id = null;
        $err = false;
        $errtxt = null;
        $ismember = false;
        $can_manage = false;
        $values = null;
        $opInfo = array();

        if (isset($_REQUEST["prj_id"]) && is_numeric($_REQUEST["prj_id"]))
        {
            $prj_id = $_REQUEST["prj_id"];
            $opInfo["prj_id"] = $prj_id;

            phpaga_project_is_member($prj_id, $_SESSION["auth_user"]["pe_id"], $ismember);
            $can_manage = phpaga_project_canmanage($prj_id);

            if (!$ismember && !$can_manage) {
                $err = true;
                $errtxt = _("You cannot file tasks for this project because you are not a member or manager.");
            } else {

                /* only the project owner and overall project managers
                 * can set an operation's user */

                if (!$can_manage)
                    $opInfo["pe_id"] = $_SESSION["auth_user"]["pe_id"];
                else
                    $opInfo["pe_id"] = $_POST["pe_id"];

                if (isset($_REQUEST["op_billabletype"]) && ($_REQUEST["op_billabletype"] == 0)) {
                    $opInfo["op_billabletype"] = 0;
                    $opInfo["billable_checked"] = true;
                } else {
                    $opInfo["op_billabletype"] = 10;
                    $opInfo["billable_checked"] = false;
                }

                $opInfo["opcat_id"] = $_POST["opcat_id"];
                $opInfo["op_desc"] = utf8_decode($_POST["op_desc"]);
                $opInfo["op_duration"] = $_POST["op_duration"];

                /* if the duration is numeric, convert it from fractional hours into hours:minutes */

                if (is_numeric($opInfo["op_duration"]))
                {
                    // Under 24 - assume the duration was given in hours
                    if ($opInfo["op_duration"] < 24)
                        $opInfo["op_duration"] = (int)$opInfo["op_duration"].':'.sprintf('%02d', 60 * ($opInfo["op_duration"] - (int)$opInfo["op_duration"]));
                    // More than 60 minutes, different calculation
                    elseif ($opInfo["op_duration"] >= 60)
                        $opInfo["op_duration"] = (int)($opInfo["op_duration"] / 60).':'.sprintf('%02d', $opInfo["op_duration"] % 60);
                    // duration given in minutes
                    else
                        $opInfo["op_duration"] = '0:'.(int)$opInfo["op_duration"];
                }

                /* if there is a valid start date and time then convert it to a timestamp */

                $opInfo["op_startdate"]  = $_POST["op_startdate"];
                $opInfo["op_starthours"] = $_POST["op_starthours"];

                $start_tmp = "";

                if ($opInfo["op_startdate"] != "") {

                    $start_tmp = $opInfo["op_startdate"];

                    if ($opInfo["op_starthours"] != "")
                        $start_tmp .= " ".$opInfo["op_starthours"];

                    $opInfo["op_timestamp_start"] = strtotime($start_tmp);
                } else
                    $opInfo["op_timestamp_start"] = "";

                /* if there is a valid end date and time then convert it to a timestamp */

                $opInfo["op_enddate"]  = $_POST["op_enddate"];
                $opInfo["op_endhours"] = $_POST["op_endhours"];

                $end_tmp = "";

                if ($opInfo["op_enddate"] != "") {

                    $end_tmp = $opInfo["op_enddate"];

                    if ($opInfo["op_endhours"] != "")
                        $end_tmp .= " ".$opInfo["op_endhours"];

                    $opInfo["op_timestamp_end"] = strtotime($end_tmp);
                } else
                    $opInfo["op_timestamp_end"] = "";

                /* check if operation data is valid and add the operation */

                $result = phpaga_operations_validdata($opInfo);

                if (phpaga_errorhappened($result)) {
                    $err = true;
                    $errtxt = phpaga_errortext($result, "\n");
                } else {
                    $add_result = phpaga_operations_add($opInfo, $op_id);

                    if (phpaga_errorhappened($add_result)) {
                        $err = true;
                        $errtxt = phpaga_errortext($add_result, "\n");
                    } else {

                        $duration = null;
                        phpaga_projects_getDuration($prj_id, $duration);


                        $resop = phpaga_operations_getInfo($op_id, $opInfo);
                        if (phpaga_errorhappened($resop)) {
                            $err = true;
                            $errtxt = phpaga_errortext($resop, "\n");
                        } else {

                            $taskdate = strftime(PHPAGA_DATEFORMAT_SHORT, $opInfo["op_timestamp_start"]);

                            if (strlen($opInfo['prj_title']) > PHPAGA_SHOWPRJTITLELENGHT)
                                $prj_title = substr($opInfo['prj_title'], 0, PHPAGA_SHOWPRJTITLELENGHT).'...';
                            else
                                $prj_title = $opInfo['prj_title'];

                            if (strlen($opInfo['op_desc']) > PHPAGA_SHOWOPDESCLENGHT)
                                $op_desc = substr($opInfo['op_desc'], 0, PHPAGA_SHOWOPDESCLENGHT).'...';
                            else
                                $op_desc = $opInfo['op_desc'];

                            $deltxt = phpaga_jsmessage_sanitizestr(utf8_encode(sprintf("%s\n%s: %s\n%s: %s",
                                                                                       $taskdate,
                                                                                       _("Project"),
                                                                                       $opInfo['prj_title'],
                                                                                       _("Task"),
                                                                                       $opInfo['op_desc'])));

                            $tpl = new psmarty;
                            $tpl->assign("status", 0);
                            $tpl->assign("tags",
                                         sprintf("<prjid>%s</prjid>\n".
                                                 "<prjduration>%s</prjduration>\n".
                                                 "<prjtitle>%s</prjtitle>\n".
                                                 "<opcat>%s</opcat>\n".
                                                 "<opid>%s</opid>".
                                                 "<opdesc>%s</opdesc>".
                                                 "<opstart>%s</opstart>\n".
                                                 "<opduration>%s</opduration>\n".
                                                 "<deltxt>%s</deltxt>",
                                                 $prj_id,
                                                 $duration,
                                                 phpaga_jsmessage_sanitizestr(utf8_encode($prj_title)),
                                                 phpaga_jsmessage_sanitizestr(utf8_encode($opInfo["opcat_title"])),
                                                 $op_id,
                                                 phpaga_jsmessage_sanitizestr(utf8_encode($op_desc)),
                                                 phpaga_jsmessage_sanitizestr($taskdate),
                                                 phpaga_jsmessage_sanitizestr($opInfo["op_duration"]),
                                                 $deltxt
                                             ));
                            $values = $tpl->fetch("xmlresponseframe.tpl.xml");
                        }
                    }
                }
            }
        }

        if ($err) {
            $tpl = new psmarty;
            $tpl->assign("status", 20);

            if (strlen($errtxt))
                $tpl->assign("message", $errtxt);

            $tpl->assign("tags", "");
            $values = $tpl->fetch("xmlresponseframe.tpl.xml");
        }

        header("Content-type: text/xml");
        print $values;

        break;


    case ACTION_SERVICE_MATDETAILS:

        $html = "";

        if (isset($_REQUEST["id"]) && is_numeric($_REQUEST["id"]))
        {
            $matInfo = array();
            $prjInfo = array();

            $result = phpaga_materials_getInfo($_REQUEST["id"], $matInfo);
            if ($result == PHPAGA_ERR_NONE)
            {
                $result2 = phpaga_projects_getInfo($matInfo["prj_id"], $prjInfo);
                if ($result == PHPAGA_ERR_NONE)
                {

                    $tpl = new psmarty;
                    $tpl->assign("prjinfo", $prjInfo);
                    $tpl->assign("matinfo", $matInfo);
                    $html = $tpl->fetch("material.tpl.html");
                }
            }
        }

        print utf8_encode($html);
        break;

    case ACTION_SERVICE_PRODINFO:


        $values = "";
        $err = false;

        if (isset($_REQUEST["prod_code"]) && strlen($_REQUEST["prod_code"]))
        {
            $prodInfo = array();

            $result = phpaga_products_getInfo($_REQUEST["prod_code"], $prodInfo, true);
            if ($result == PHPAGA_ERR_NONE)
            {

                $tags = "<prodname>".$prodInfo["prod_name"]."</prodname>\n".
                    "<prodprice>".$prodInfo["prod_price"]."</prodprice>\n".
                    "<prodid>".$prodInfo["prod_id"]."</prodid>\n";

                $tpl = new psmarty;
                $tpl->assign("status", 0);
                $tpl->assign("tags", $tags);
                $values = $tpl->fetch("xmlresponseframe.tpl.xml");

            }
            else
                $err = true;
        }
        else
            $err = true;

        if ($err) {
            $tpl = new psmarty;
            $tpl->assign("status", 20);
            $tpl->assign("message", phpaga_errortext($result, "\n"));
            $tpl->assign("tags", "");
            $values = $tpl->fetch("xmlresponseframe.tpl.xml");
        }

        header("Content-type: text/xml");
        print $values;

        break;


    default:
        print "";
        break;

}

?>
