<?php
/**
 * Copyright 2005-2017 de Solis Soluções Livres Ltda.
 *
 * Este arquivo é parte do programa Gnuteca.
 *
 * O Gnuteca é um software de propriedade da SOLIS, sendo desenvolvido
 * e mantido exclusivamente por esta empresa.
 *
 * A licença de uso está disponível mediante aquisição exclusiva junto à
 * SOLIS. A licença é concedida sem caráter de exclusividade ao licenciado.
 * Os direitos de uso são perpétuos.
 *
 * Embora os códigos fontes sejam fornecidos, o software é de propriedade
 * da SOLIS, não sendo permitido ao adquirente da licença a sua revenda,
 * empréstimo ou cessão (onerosa ou não) à terceiros. Também não é permitido,
 * a qualquer título e tempo, promover no software qualquer tipo de alienação,
 * reprodução, distribuição, divulgação, registro, licenciamento, transferência
 * ou qualquer outro ato que prejudique ou comprometa os direitos de propriedade
 * de software, o nome e a imagem da sua proprietária e do próprio software,
 * além de configurar concorrência à SOLIS.
 *
 * O licenciado, com o acesso ao código fonte do software, terá o direito de
 * promover mudanças no respectivo código. No entanto, nas situações em que ele
 * contar com o suporte oficial prestado pela SOLIS, não poderá promover mudanças
 * no código fonte, sob pena de perda do referido suporte.
 *
 * Para conhecer em detalhes o Termo de Licenciamento do Software Gnuteca
 * leia o arquivo “LICENCA.txt” disponível junto ao código deste software.
 * 
 * 
 *
 *
 *
 *
 *
 **/

include("GnutecaWebServices.class.php");

class gnuteca3WebServicesFinesWSDL
{

    private $webService;
    private $MIOLO;
    private $busFine;
    private $busReserve;
    
    public function __construct()
    {
        $this->webService = new GWebServices();
        $this->MIOLO = MIOLO::getInstance();
        
        $this->busFine = $this->MIOLO->getBusiness('gnuteca3', 'BusFine');
        $this->busReserve = $this->MIOLO->getBusiness('gnuteca3', 'BusReserve');
    }

    /**
     * Webservice para listagem de Renovações utilizando parâmetros do histórico de multa
     * @param int $clientId
     * @param string $clientPassword
     * @param int $personId
     * @param int $page
     * @return bool|string
     */
    public function listFines(
        $clientId,
        $clientPassword,
        $personId,
        $pageNumber = 1
    ) {
        $retorno  = new stdClass();

        // Define acesso ao método e define a classe do Webservice
        $this->webService->__setClient($clientId, $clientPassword);
        $this->webService->setClassName(get_class($this));

        // Verifica se usuário possui acesso ao WebService.
        if (!$this->webService->__checkMethod("listFines", false)) 
        {
            $retorno->message = $this->webService->__getErrorStr();
            return json_encode($retorno);
        }

        $this->busFine->personId = $personId;
        $this->busFine->isFormSearch = true;
        $this->busFine->libraryUnitIdS = $libraryUnitId;
        $this->busFine->itemNumberS = $itemNumber;
        $this->busFine->value = $value;
        $this->busFine->fineStatusIdS = $fineStatusId;
        $this->busFine->beginBeginDateS = $beginFineDate;
        $this->busFine->endBeginDateS = $endFineDate;

        // Particiona o retorno da consulta com base no número de registros por página
        $userFinesData = array_chunk($this->busFine->searchFine(true), LISTING_NREGS);

        $busSearchFormat = $this->MIOLO->getBusiness('gnuteca3', 'BusSearchFormat');
        $busExemplaryControl = $this->MIOLO->getBusiness('gnuteca3', 'BusExemplaryControl');

        // Obtém apenas os registros de uma determinada página
        foreach ($userFinesData[$pageNumber - 1] as $fine) 
        {
            $controlNumber = $busExemplaryControl->getControlNumber($fine->itemNumber);

            $fines[] = [
                "fineId"  => $fine->fineId,
                "loanId" => $fine->loanId ?? '-',
                "reserveId" => $fine->reserveId ?? '-',
                "searchFormat" => $controlNumber ? $busSearchFormat->getFormatedString($controlNumber, 5) : 'Exemplar excluído',
                "date" => explode(" ", $fine->beginDate)[0],
                "value" => number_format($fine->value, 2, ',', '.'),
                "status" => $fine->description,
                "libraryName" => $fine->libraryName,
                "controlNumber" => $controlNumber,
            ];
        }

        // Dados de retorno
        $retorno->fines = $fines;
        $retorno->numberOfPages = count($userFinesData);
        
        return json_encode($retorno);
    }
    
    /**
     * Webservice para obter detalhes de uma multa
     * 
     * @param int $clientId Codigo do cliente SOAP.
     * @param string $clientPassword Senha do cliente SOAP.
     * @param int $fineId Codigo da multa.
     * @return string|null JSON com os detalhes da multa, incluindo título, datas e se é reserva ou empréstimo.
     */
    public function getFineDetails($clientId, $clientPassword, $fineId) {
        $retorno  = new stdClass();

        // Define acesso ao método e define a classe do Webservice
        $this->webService->__setClient($clientId, $clientPassword);
        $this->webService->setClassName(get_class($this));

        // Verifica se usuário possui acesso ao WebService.
        if (!$this->webService->__checkMethod("getFineDetails", false)) 
        {
            $retorno->message = $this->webService->__getErrorStr();
            return json_encode($retorno);
        }

        $this->busFine->fineIdS = $fineId;
        $fine = $this->busFine->searchFine(true, 'A.fineId DESC', true)[0];

        if ($fine->reserveId) 
        {
            $this->busReserve->reserveIdS = $fine->reserveId;
            $reserve = $this->busReserve->searchReserve('R.requestedDate DESC',true)[0];
            $retorno->fineDetails = [
                "title" => trim($fine->loan->title),
                "requestedDate" => $reserve->requestedDate ? explode(" ", $reserve->requestedDate)[0] : '-',
                "limitDate" => $reserve->limitDate ? explode(" ", $reserve->limitDate)[0] : '-',
                "reserveType" => $reserve->reserveType,
                "isReserve" => true,
            ];
            return json_encode($retorno);
        }

        $retorno->fineDetails = [
            "title" => trim($fine->loan->title),
            "loanDate" => $fine->loan->loanDate ? explode(" ", $fine->loan->loanDate)[0] : '-',
            "returnForecastDate" => $fine->loan->returnForecastDate ? explode(" ", $fine->loan->returnForecastDate)[0] : '-',
            "returnDate" => $fine->returnDate ? explode(" ", $fine->returnDate)[0] : '-',
            "loanId" => $fine->loanId,
            "isReserve" => false,
        ];

        return json_encode($retorno);
    }
}
