<?php

/**
 * Goweb Sitemanager 4 Framework
 *
 * @version    5.1.4
 * @category   Goweb
 * @package    Goweb_Mb
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2010 (c) Goweb (http://www.goweb.pt)
 */

/**
 * Classe de ligacao e base de dados
 *
 * @version    5.1.4
 * @category   Goweb
 * @package    Goweb_Mb
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2010 (c) Goweb (http://www.goweb.pt)
 */
class Goweb_Mb {

    /**
     * url_base necessario para obter imagem
     */
    protected $_urlBase;

    /**
     * Numero da Factura e/ou Documento
     *
     * @var String
     */
    protected $_nDocumento;

    /**
     * Valor a Pagar
     *
     * @var float|int|String
     */
    protected $_valor;

    /**
     * Referencia da entidade
     *
     * @var String
     */
    protected $_entidade;

    /**
     * Sub entidade
     *
     * @var int
     */
    protected $_subEntidade;

    /**
     * Pesos usados para os calculos, constantes
     *
     * @var array
     */
    protected $_pesos = array(3, 30, 9, 90, 27, 76, 81, 34, 49, 5, 50, 15, 53, 45, 62, 38, 89, 17, 73, 51);

    /**
     * Constructor
     *
     * @param   int     $nDocumento	Numero da Factura/Documento
     * @param   int     $valor		Valor a Pagar
     * @param   int     $subEntidade	Sub-Entidade(Cliente)
     * @param   int     $entidade		Referencia a pagar
     * @example
     * Goweb::loadClass('Goweb_Mb');
     * $mb=new Goweb_Mb('1', '234,67','414','10559');
     * $referencia = $mb->getReferencia();
     * $output = $mb->getOutput();
     *
     */
    public function __construct($nDocumento = '1', $valor = '23467', $subEntidade = '414', $entidade = '10559') {
        $this->_nDocumento = intval(strlen($nDocumento) > 4 ? substr($nDocumento,-4) : $nDocumento);
        $this->_valor = intval(str_replace(array(',', '.'), '', number_format($this->_fixValor($valor), 2)));
        $this->_entidade = intval($entidade);
        $this->_subEntidade = intval($subEntidade);
        $request = Zend_Controller_Front::getInstance()->getRequest();
        $this->_urlBase = $request->getScheme() .'://' . $request->getHttpHost() . str_replace('/admin', '',  str_replace('/index.php', '', $request->getBaseUrl()));
    }

    /**
     * Calcular a referência
     *
     * @return string
     */
    public function getReferencia(){
        $chk_str = sprintf('%05u%03u%04u%08u', $this->_entidade, $this->_subEntidade , $this->_nDocumento, $this->_valor);
        $chk_val = 0;
        for ($i = 0; $i < 20; $i++) {
            $chk_int = substr($chk_str, 19-$i, 1);
            $chk_val += ($chk_int % 10) * $this->_pesos[$i];
        }
         
        $chk_val %= 97;
         
        $chk_digits = sprintf('%02u', 98 - $chk_val);
        $this->_referencia = $this->_subEntidade . " " . substr($chk_str, 8, 3) . " " . substr($chk_str, 11, 1) . $chk_digits;
        return $this->_referencia;
    }

    /**
     * Obter a entidade para a referência gerada
     *
     * @return string
     */
    public function getEntidade(){
        return $this->_entidade;
    }

    /**
     * Obter o valor a pagar
     *
     * @return string
     */
    public function getValor(){
        return number_format(substr($this->_valor, 0, -2) . '.' . substr($this->_valor,-2),2, ',', '');
    }

    /**
     * Obter a referência Multibanco para os valores passados no constructor
     *
     * @return String '497 xxx xxx'
     */
    public function getOutput(){
        if (!isset($this->_referencia)) $this->_referencia = $this->getReferencia();

        $output='<table>
	<tr>
		<td valign="top"><img src="' . $this->_urlBase . '/media/images/MB.gif"></td>
		<td valign="top">
			<table class="multibanco" cellpadding="4">
				<tr>
					<td colspan="2" align="left" class="mb_header" style="font-size:12px; text-transform:uppercase; color:#ffffff;">' . translate('Pagamento por multibanco') . '</td>
				</tr>
				<tr>
					<td bgcolor="#f5f5f5" style="color:#666666; font-size:12px; font-weight:bold;">' . translate('Entidade') . ':</td>
					<td bgcolor="#f0f0f0" style="color:#666666; font-size:12px;">' . $this->_entidade . '</td>
				</tr>
				<tr>
					<td bgcolor="#f5f5f5" style="color:#666666; font-size:12px; font-weight:bold;">' . translate('Refer&ecirc;ncia') . ':</td>
					<td bgcolor="#f0f0f0" style="color:#666666; font-size:12px;">' . $this->_referencia . '</td>
				</tr>
				<tr>
					<td bgcolor="#f5f5f5" style="color:#666666; font-size:12px; font-weight:bold;">' . translate('Montante') . ':</td>
					<td bgcolor="#f0f0f0" style="color:#666666; font-size:12px;">&euro; ' . number_format(substr($this->_valor,0,strlen($this->_valor)-2) . '.' . substr($this->_valor,strlen($this->_valor)-2),2, ',', '') . '</td>
				</tr>
			</table>
		</td>
	</tr>
</table>
';
        return $output;
    }

    /**
     * Obter a referência Multibanco para os valores passados no constructor
     *
     * @return String '497 xxx xxx'
     */
    public function getSmallOutput(){
        if (!isset($this->_referencia)) $this->_referencia = $this->getReferencia();
        $output='<table class="multibanco">
				<tr>
				<th><img src="' . $this->_urlBase . '/media/images/MB.jpg"></th>
				<th>' . translate('Pagamento por multibanco') . '</th>
				</tr>
				</table>';
        return $output;
    }

    /**
     * Obter os pagamentos efectuados no dia corrente
     *
     * @return array
     */
    public function getPayments($date, $config = null){
        if (is_null($config)) {
            $config = new Goweb_Config(Goweb_Config_Ini::load(ROOT_PATH.'/config.ini', 'pagamentos'), true);
        }
        if ($config->mb->activo != '1') {
            return false;
        }
        $host     = $config->mb->host;
        $port     = $config->mb->port;
        $username = $config->mb->username;
        $password = $config->mb->password;

        Goweb::loadClass('Goweb_Ftp');
        
        $ftp = Goweb_Ftp::getInstance($host, $username, $password, $port);

        if($file = $ftp->fileExists($date . '*.xml')){

            if ($contents = $ftp->getFileContents($file)){
                	
                $payments = array();
                $doc = new DOMDocument();
                $success = $doc->loadXML($contents);
                if ($elements = $doc->getElementsByTagName('pagamentoMB')){
                    foreach ($elements as  $child){
                        $payment = array();
                        $values = $child->getElementsByTagName('*');
                        foreach($values as $node) {
                            $payment[$node->nodeName] = ltrim(rtrim($node->nodeValue));
                        }
                        $payments[] = $payment;
                    }
                }
                return $payments;
            }
        }
        return false;
    }

    /**
     * Colocar o valor da referência com um valor customizado
     *
     * @param string $value
     */
    public function setReferencia($value){
        $this->_referencia = $value;
    }

    /**
     * Corrigir valor Float
     *
     * @param string $valor
     * @return string
     */
    protected function _fixValor($valor){
        if (!is_string($valor)) return $valor;
        if (strpos($valor, ',') !== false && strpos($valor, '.') !== false){
            $valor = str_replace('.','',$valor);
        }
        $valor = str_replace(',','.',$valor);
        return $valor;
    }

    /**
     * Retorna o valor de uma variavel.
     *
     * @param   string  $key    Nome da variavel
     * @return  string          Valor da variavel
     */
    public function __get($key) {
        switch ($key) {
            case 'referencia':
                if (!isset($this->{'_' . $key})) $this->{'_' . $key} = $this->getReferencia();
                return $this->{'_' . $key};
                break;
            default:
                break;
        }
        return null;
    }
}
