mrcnpdlk/mojepanstwo-api

View on GitHub
src/mrcnpdlk/MojePanstwo/Api.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php
/**
 * MOJEPANSTWO-API
 *
 * Copyright © 2017 pudelek.org.pl
 *
 * @license MIT License (MIT)
 *
 * For the full copyright and license information, please view source file
 * that is bundled with this package in the file LICENSE
 *
 * @author  Marcin Pudełek <marcin@pudelek.org.pl>
 */

declare (strict_types=1);

namespace mrcnpdlk\MojePanstwo;


use mrcnpdlk\MojePanstwo\Model\Address\Commune;
use mrcnpdlk\MojePanstwo\Model\Address\District;
use mrcnpdlk\MojePanstwo\Model\Address\Province;
use mrcnpdlk\MojePanstwo\Model\KrsEntity;
use mrcnpdlk\MojePanstwo\Model\KrsEntityType;
use mrcnpdlk\MojePanstwo\Model\KrsPerson;

class Api
{
    /**
     * @var \mrcnpdlk\MojePanstwo\Api
     */
    protected static $instance;

    /**
     * @var \mrcnpdlk\MojePanstwo\Client
     */
    private $oClient;

    /**
     * Api constructor.
     *
     * @param \mrcnpdlk\MojePanstwo\Client $oClient
     */
    protected function __construct(Client $oClient)
    {
        $this->oClient = $oClient;
    }

    /**
     * @param \mrcnpdlk\MojePanstwo\Client $oClient
     *
     * @return \mrcnpdlk\MojePanstwo\Api
     */
    public static function create(Client $oClient): Api
    {
        if (null === static::$instance) {
            static::$instance = new static($oClient);
        }

        return static::$instance;
    }

    /**
     * @return \mrcnpdlk\MojePanstwo\Api
     * @throws \mrcnpdlk\MojePanstwo\Exception
     */
    public static function getInstance(): Api
    {
        if (null === static::$instance) {
            throw new Exception(sprintf('First call CREATE method!'));
        }

        return static::$instance;
    }

    /**
     * @return \mrcnpdlk\MojePanstwo\Client
     */
    public function getClient(): Client
    {
        return $this->oClient;
    }

    /**
     * @param $id
     *
     * @return Commune
     * @throws \mrcnpdlk\MojePanstwo\Exception
     */
    public function getCommune($id): Commune
    {
        $qb = QueryBuilder::create(Commune::class);

        return $qb->find((string)$id);
    }

    /**
     * @param $id
     *
     * @return District
     * @throws \mrcnpdlk\MojePanstwo\Exception
     */
    public function getDistrict($id): District
    {
        $qb = QueryBuilder::create(District::class);

        return $qb->find((string)$id);
    }

    /**
     * Return KRS Entity by ID (krs)
     *
     * @param string|int $krs      ID or KRS number
     *
     * @param int        $pullFlag Additional layers. E.i: KrsEntity::PULL_PKDS | KrsEntity::PULL_PERSON_REPRESENTATION
     *
     * @return \mrcnpdlk\MojePanstwo\Model\KrsEntity
     * @throws \mrcnpdlk\MojePanstwo\Exception
     */
    public function getKrsEntity($krs, int $pullFlag = KrsEntity::PULL_NONE): KrsEntity
    {
        $krs = (int)$krs;
        $qb  = QueryBuilder::create(KrsEntity::class)
                           ->addLayer('jedynyAkcjonariusz')
        ;
        if ($pullFlag & KrsEntity::PULL_COMPANIES) {
            $qb->addLayer('firmy');
        }
        if ($pullFlag & KrsEntity::PULL_DEPARTMENTS) {
            $qb->addLayer('oddzialy');
        }
        if ($pullFlag & KrsEntity::PULL_PARTNERS) {
            $qb->addLayer('wspolnicy');
        }
        if ($pullFlag & KrsEntity::PULL_PKDS) {
            $qb->addLayer('dzialalnosci');
        }
        if ($pullFlag & KrsEntity::PULL_SHARES) {
            $qb->addLayer('emisje_akcji');
        }
        if ($pullFlag & KrsEntity::PULL_PERSON_REPRESENTATION) {
            $qb->addLayer('reprezentacja');
        }
        if ($pullFlag & KrsEntity::PULL_PERSON_SUPERVISION) {
            $qb->addLayer('nadzor');
        }
        if ($pullFlag & KrsEntity::PULL_PERSON_PROXY) {
            $qb->addLayer('prokurenci');
        }
        if ($pullFlag & KrsEntity::PULL_PERSON_FOUNDING) {
            $qb->addLayer('komitetZalozycielski');
        }

        return $qb->find((string)$krs);
    }

    /**
     * Return KRS Entity Type
     *
     * @param $id
     *
     * @return \mrcnpdlk\MojePanstwo\Model\KrsEntityType
     * @throws \mrcnpdlk\MojePanstwo\Exception
     */
    public function getKrsEntityType($id): KrsEntityType
    {
        $qb = QueryBuilder::create(KrsEntityType::class);

        return $qb->find((string)$id);
    }

    /**
     * @param     $id
     *
     * @param int $pullFlag
     *
     * @return KrsPerson
     * @throws \mrcnpdlk\MojePanstwo\Exception
     */
    public function getKrsPerson($id, int $pullFlag = KrsPerson::PULL_NONE): KrsPerson
    {
        $qb = QueryBuilder::create(KrsPerson::class);

        /**
         * @var KrsPerson $oKrsPerson
         */
        $oKrsPerson = $qb->find((string)$id);

        if ($pullFlag & KrsPerson::PULL_KRS_ENTITIES) {
            foreach ($oKrsPerson->podmioty as $item) {
                $item->podmiot = $this->getKrsEntity($item->podmiot_id);
            }
        }


        return $oKrsPerson;
    }

    /**
     * Return Province
     *
     * @param $id
     *
     * @return Province
     * @throws \mrcnpdlk\MojePanstwo\Exception
     */
    public function getProvince($id): Province
    {
        $qb = QueryBuilder::create(Province::class);

        return $qb->find((string)$id);
    }

    /**
     * @return \mrcnpdlk\MojePanstwo\QueryBuilder
     * @throws \mrcnpdlk\MojePanstwo\Exception
     */
    public function searchCommune(): QueryBuilder
    {
        return QueryBuilder::create(Commune::class);
    }

    /**
     * @return \mrcnpdlk\MojePanstwo\QueryBuilder
     * @throws \mrcnpdlk\MojePanstwo\Exception
     */
    public function searchDistrict(): QueryBuilder
    {
        return QueryBuilder::create(District::class);
    }

    /**
     * Return QueryBuilder for searching KRS Entities
     *
     * @return \mrcnpdlk\MojePanstwo\QueryBuilder
     * @throws \mrcnpdlk\MojePanstwo\Exception
     */
    public function searchKrsEntity(): QueryBuilder
    {
        return QueryBuilder::create(KrsEntity::class);
    }

    /**
     * Return QueryBuilder for searching KRS Entity Types
     *
     * @return \mrcnpdlk\MojePanstwo\QueryBuilder
     * @throws \mrcnpdlk\MojePanstwo\Exception
     */
    public function searchKrsEntityType(): QueryBuilder
    {
        return QueryBuilder::create(KrsEntityType::class);
    }

    /**
     * Wyszukiwanie osoby w KRS
     *
     * @return \mrcnpdlk\MojePanstwo\QueryBuilder
     * @throws \mrcnpdlk\MojePanstwo\Exception
     */
    public function searchKrsPerson(): QueryBuilder
    {
        return QueryBuilder::create(KrsPerson::class);
    }

    /**
     * @return \mrcnpdlk\MojePanstwo\QueryBuilder
     * @throws \mrcnpdlk\MojePanstwo\Exception
     */
    public function searchProvince(): QueryBuilder
    {
        return QueryBuilder::create(Province::class);
    }

}