Explorar el Código

add dependencies

andre hace 2 años
padre
commit
edb15e74fe

+ 43 - 0
app/Http/Client/EmailRessource.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\Http\Client;
+
+use ModulesGarden\Servers\ZimbraEmail\App\Enums\ControllerEnums;
+use ModulesGarden\Servers\ZimbraEmail\App\Enums\ProductParams;
+use ModulesGarden\Servers\ZimbraEmail\App\Helpers\BuildUrlExtended;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Product\ProductManager;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Admin\Custom\Pages\Description;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Pages\Ressources;
+use ModulesGarden\Servers\ZimbraEmail\Core\Http\AbstractClientController;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Traits\WhmcsParams;
+use ModulesGarden\Servers\ZimbraEmail\Core\Helper;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 10.09.19
+ * Time: 10:12
+ * Class EmailRessource
+ */
+class EmailRessource extends AbstractClientController
+{
+    use WhmcsParams;
+
+    public function index()
+    {
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($this->request->get('id'));
+
+        if ($this->getWhmcsParamByKey('status') !== 'Active' || !$productManager->isControllerAccessible(ControllerEnums::EMAIL_ACCOUNT_PAGE))
+        {
+            return Helper\redirectByUrl(BuildUrlExtended::getProvisioningUrl('',false,false));
+        }
+
+        return Helper\view()
+            ->addElement(new Description('emailRessource'))
+            ->addElement(Ressources::class)
+            ;
+
+    }
+}

+ 321 - 0
app/Libs/Zimbra/Components/Api/Soap/Actions/Ressource.php

@@ -0,0 +1,321 @@
+<?php
+namespace ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Actions;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Interfaces\AbstractAction;
+use SoapFault;
+use SoapParam;
+use SoapVar;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Helpers\XmlParser;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 28.08.19
+ * Time: 13:46
+ * Class Account
+ */
+class Account extends AbstractAction
+{
+
+    public function read()
+    {
+
+    }
+
+    /**
+     * @description create account in Zimbra API
+     * @param \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account $account
+     * @return bool|void
+     */
+    public function create(\ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account $account)
+    {
+        /**
+         *
+         */
+        $params = [
+            new SoapParam($account->getName(), "name"),
+            new SoapParam($account->getPassword(), "password"),
+        ];
+
+        /**
+         * add account params
+         */
+        foreach ($account->getAttrs() as $key => $value)
+        {
+            $params[] = new SoapVar('<ns1:a n="' . $key . '">' . $value . '</ns1:a>', XSD_ANYXML);
+        }
+
+        /**
+         * run request
+         */
+        $result = $this->connection->request("CreateAccountRequest", $params);
+        $this->setLastResult($result);
+
+        /**
+         * load response to model
+         */
+        if($accountData = $result->getResponseBody()['CREATEACCOUNTRESPONSE']['ACCOUNT'])
+        {
+            $account->fill($accountData);
+            return $account;
+        }
+
+        $this->setError($result->getLastError());
+        return false;
+    }
+
+    /**
+     * @param \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\AccountAlias $alias
+     * @return \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\AccountAlias
+     */
+    public function createAlias(\ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\AccountAlias $alias)
+    {
+        $params = [
+            new SoapParam($alias->getAccountId(), "id"),
+            new SoapParam($alias->getAlias(), "alias"),
+        ];
+
+        $result = $this->connection->request("AddAccountAliasRequest", $params);
+        $this->setLastResult($result);
+
+        if(!$result->getLastError())
+        {
+            return $alias;
+        }
+
+        $this->setError($result->getLastError());
+        return false;
+    }
+
+    /**
+     * @param \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account $account
+     * @return bool|\ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account
+     */
+    public function update(\ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account $account)
+    {
+        $params = [
+            new SoapParam($account->getId(), "id"),
+        ];
+
+        /**
+         * add account params
+         */
+        foreach ($account->getAttrs() as $key => $value)
+        {
+            $params[] = new SoapVar('<ns1:a n="' . $key . '">' . $value . '</ns1:a>', XSD_ANYXML);
+        }
+
+        $result = $this->connection->request("ModifyAccountRequest", $params);
+        $this->setLastResult($result);
+
+        if($accountData = $result->getResponseBody()['MODIFYACCOUNTRESPONSE']['ACCOUNT'])
+        {
+            $account->fill($accountData);
+            return $account;
+        }
+
+        $this->setError($result->getLastError());
+        return false;
+    }
+
+    public function setPassword(\ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account $account)
+    {
+        $params = [
+            new SoapParam($account->getId(), "id"),
+            new SoapParam($account->getPassword(), "newPassword"),
+        ];
+
+        $result = $this->connection->request("SetPasswordRequest", $params);
+        $this->setLastResult($result);
+
+        if($result->getLastError())
+        {
+            $this->setError($result->getLastError());
+            return false;
+        }
+
+        return true;
+
+    }
+
+    /**
+     * @param \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account $account
+     * @return bool
+     */
+    public function delete(\ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account $account)
+    {
+        $params = [
+            new SoapParam($account->getId(), "id"),
+        ];
+
+        $result = $this->connection->request("DeleteAccountRequest", $params);
+        $this->setLastResult($result);
+
+        if($result->getLastError())
+        {
+            $this->setError($result->getLastError());
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * @param \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\AccountAlias $alias
+     * @return bool
+     */
+    public function deleteAlias(\ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\AccountAlias $alias)
+    {
+        $params = [
+            new SoapParam($alias->getAccountId(), "id"),
+            new SoapParam($alias->getAlias(), "alias"),
+        ];
+
+        $result = $this->connection->request("RemoveAccountAliasRequest", $params);
+        $this->setLastResult($result);
+
+        if(!$result->getLastError())
+        {
+            return true;
+        }
+
+        $this->setError($result->getLastError());
+        return false;
+
+    }
+
+    /**
+     * @param $name
+     * @return \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Response
+     */
+    public function getAccountId($name)
+    {
+        $params = [
+            new SoapVar('<ns1:account by="name">' . $name . '</ns1:account>', XSD_ANYXML),
+        ];
+
+        return $this->connection->cleanResponse()->request("GetAccountInfoRequest", $params);
+
+    }
+
+    /**
+     * @param \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account $account
+     * @return \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Response
+     */
+    public function getAccountInfo(\ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account $account)
+    {
+        if($value = $account->getId())
+        {
+            $type = 'id';
+        }elseif($value =$account->getName())
+        {
+            $type = 'name';
+        }
+
+        $result = null;
+
+        $params = [
+            new SoapVar('<ns1:account by="' . $type . '">' . $value . '</ns1:account>', XSD_ANYXML),
+        ];
+
+        return $this->connection->request("GetAccountInfoRequest", $params);
+    }
+
+    /**
+     * @param \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account $account
+     * @return \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Response
+     */
+    public function delegateAuth(\ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account $account)
+    {
+        if($value = $account->getId())
+        {
+            $type = 'id';
+        }elseif($value =$account->getName())
+        {
+            $type = 'name';
+        }
+
+        $result = null;
+
+        $params = [
+            new SoapVar('<ns1:account by="' . $type . '">' . $value . '</ns1:account>', XSD_ANYXML),
+        ];
+
+        $result = $this->connection->cleanResponse()->request("DelegateAuthRequest", $params);
+        $this->setLastResult($result);
+
+        if($result->getLastError())
+        {
+            $this->setError($result->getLastError());
+            return false;
+        }
+
+        return $result;
+    }
+
+    /**
+     * @param \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account $account
+     * @return \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Response
+     */
+    public function getAccountOptions(\ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account $account)
+    {
+        if($value = $account->getId())
+        {
+            $type = 'id';
+        }elseif($value =$account->getName())
+        {
+            $type = 'name';
+        }
+
+        $params = [
+            new SoapVar('<ns1:account by="' . $type . '">' . $value . '</ns1:account>', XSD_ANYXML),
+        ];
+
+        return  $this->connection
+            ->cleanResponse()
+            ->request("GetAccountRequest", $params);
+    }
+
+    /**
+     * @param \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Domain $domain
+     * @return \ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Response
+     */
+    public function getAllByDomain(\ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Domain $domain)
+    {
+        if($value = $domain->getId())
+        {
+            $type = 'id';
+        }elseif($value =$domain->getName())
+        {
+            $type = 'name';
+        }
+
+        $params = [
+            new SoapVar('<ns1:domain by="' . $type . '">' . $value . '</ns1:domain>', XSD_ANYXML),
+        ];
+        $result = $this->connection->request("GetAllAccountsRequest", $params);
+        return $result;
+    }
+
+    public function getAllAccounts($idOrNameDomain, $type = "auto")
+    {
+        if ($type == "auto")
+        {
+            //$realType = getDomainType($idOrNameDomain);
+        }
+        else
+        {
+            $realType = $type;
+        }
+
+        $result = null;
+
+        $params = [
+            new SoapVar('<ns1:domain by="' . $realType . '">' . $idOrNameDomain . '</ns1:domain>', XSD_ANYXML),
+        ];
+
+        return  $this->connection->request("GetAllAccountsRequest", $params);
+
+    }
+
+}

+ 46 - 0
app/Libs/Zimbra/Components/Api/Soap/Helpers/RessourceHelper.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Helpers;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\Enums\ProductParams;
+use ModulesGarden\Servers\ZimbraEmail\App\Enums\Size;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 18.09.19
+ * Time: 09:22
+ * Class RessourceHelper
+ */
+class RessourceHelper
+{
+
+    /**
+     * @description return formatted data per API data
+     * @param $date
+     * @return false|string|null
+     */
+    public static function getFormattedData($date, $format = 'd/m/Y')
+    {
+        if(!$date)
+        {
+            return null;
+        }
+        $tmpDate = strstr($date, '.', true);
+        $tmpDate = $tmpDate ? $tmpDate : $date;
+
+        return date($format, strtotime($tmpDate));
+    }
+
+    /**
+     * @param $quote
+     * @return float|int|string
+     */
+    public static function getQuotaAsMb($quote)
+    {
+        return isset($quote) ? ($quote / Size::B_TO_MB)  : ProductParams::SIZE_UNLIMITED;
+    }
+
+}

+ 199 - 0
app/Libs/Zimbra/Components/Api/Soap/Models/Ressource.php

@@ -0,0 +1,199 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Interfaces\AbstractModel;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 10.09.19
+ * Time: 08:43
+ * Class Ressource
+ */
+class Ressource extends AbstractModel
+{
+    /**
+     * Ressource Attributes
+     */
+    const ATTR_FIRSTNAME        = 'givenName';
+    const ATTR_LASTNAME         = 'sn';
+    const ATTR_PHONE            = 'telephoneNumber';
+    const ATTR_MOBILE_PHONE     = 'mobile';
+    const ATTR_FAX              = 'facsimileTelephoneNumber';
+    const ATTR_PAGER            = 'pager';
+    const ATTR_HOME_PHONE       = 'homePhone';
+    const ATTR_COUNTRY          = 'co';
+    const ATTR_STATE            = 'st';
+    const ATTR_POSTAL_CODE      = 'postalCode';
+    const ATTR_CITY             = 'l';
+    const ATTR_STREET           = 'street';
+    const ATTR_COMPANY          = 'company';
+    const ATTR_PROF_TITLE       = 'title';
+    const ATTR_ACCOUNT_STATUS   = 'zimbraRessourceStatus';
+    const ATTR_DISPLAY_NAME     = 'displayName';
+    const ATTR_MAIL_QUOTA       = 'zimbraMailQuota';
+    const ATTR_ALIAS            = 'zimbraMailAlias';
+    const ATTR_CLASS_OF_SERVICE_ID = 'zimbraCOSId';
+
+    protected $id;
+    protected $name;
+    protected $password;
+    protected $attrs;
+    protected $limit;
+    protected $used;
+
+    /**
+     * @return mixed
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * @param $name
+     * @return $this
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+        return $this;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getPassword()
+    {
+        return $this->password;
+    }
+
+    /**
+     * @param $password
+     * @return $this
+     */
+    public function setPassword($password)
+    {
+        $this->password = $password;
+        return $this;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * @param $id
+     * @return $this
+     */
+    public function setId($id)
+    {
+        $this->id = $id;
+        return $this;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getLimit()
+    {
+        return $this->limit;
+    }
+
+    /**
+     * @param $limit
+     * @return $this
+     */
+    public function setLimit($limit = 0)
+    {
+        $this->limit = $limit;
+        return $this;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getUsed()
+    {
+        return $this->used;
+    }
+
+    /**
+     * @param $used
+     * @return $this
+     */
+    public function setUsed($used = 0)
+    {
+        $this->used = $used;
+        return $this;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getAttrs()
+    {
+        return $this->attrs;
+    }
+
+    /**
+     * @param $key
+     * @param null $value
+     * @return $this
+     */
+    public function setAttr($key, $value = null)
+    {
+        $this->attrs[$key] = $value;
+        return $this;
+    }
+
+    /**
+     * @param $key
+     * @return mixed
+     */
+    public function getAttr($key)
+    {
+        return $this->attrs[$key];
+    }
+
+    /**
+     * @param $attrs
+     * @return $this
+     */
+    public function setAttrs($attrs = [])
+    {
+        $this->attrs = $attrs;
+        return $this;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getCosId()
+    {
+        return $this->getDataResourceA(self::ATTR_CLASS_OF_SERVICE_ID);
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getAliases()
+    {
+        foreach($this->resources['a'] as $res)
+        {
+            if($res['N'] === self::ATTR_ALIAS)
+            {
+                $tmp[$res['DATA']] =  $res['DATA'];
+            }
+        }
+        return $tmp;
+    }
+
+}

+ 233 - 0
app/Libs/Zimbra/Components/Api/Soap/Repository/Ressources.php

@@ -0,0 +1,233 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Repository;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\Enums\Size;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Interfaces\AbstractApiClient;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Interfaces\AbstractRepository;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Ressource;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\RessourceAlias;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Domain;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 10.09.19
+ * Time: 08:28
+ * Class Ressources
+ */
+class Ressources extends AbstractRepository
+{
+    const NO_COS_INDEX = 'default';
+
+    /**
+     * get all account for domain
+     * @param $name
+     * @return mixed
+     */
+    public function getByDomainName($name)
+    {
+        $domain = new Domain();
+        $domain->setName($name);
+
+        $result = $this->getClient()->account->getAllByDomain($domain);
+
+        $accounts = $result->getResponseBody()['GETALLACCOUNTSRESPONSE']['ACCOUNT'];
+        /**
+         * API return one or araay with accounts
+         */
+        $tmp = [];
+        if(isset($accounts['NAME']))
+        {
+            $tmpRessource =  new Ressource($accounts);
+
+            /**
+             * skip ZiImbra default account
+             */
+            if (strpos($tmpRessource->getName(), 'galsync@') !== false)
+            {
+                return [];
+            }
+            $tmp[$tmpRessource->getId()] = $tmpRessource;
+        }else{
+            foreach($accounts as $account)
+            {
+                $tmpRessource =  new Ressource($account);
+
+                /**
+                 * skip ZiImbra default account
+                 */
+                if (strpos($tmpRessource->getName(), 'galsync@') !== false)
+                {
+                    continue;
+                }
+
+
+                $tmp[$tmpRessource->getId()] = $tmpRessource;
+            }
+        }
+
+       return $tmp;
+    }
+
+    /**
+     * @param $name
+     * @return mixed
+     */
+    public function getGroupedByCos($name)
+    {
+        $accounts = $this->getByDomainName($name);
+        foreach($accounts as $account)
+        {
+            /* @var $account Ressource*/
+            $cosId = $account->getDataResourceA(Ressource::ATTR_CLASS_OF_SERVICE_ID);
+            $key = $cosId ? $cosId : self::NO_COS_INDEX;
+
+            $tmp[$key][] = $account;
+        }
+
+        return $tmp;
+    }
+
+    /**
+     * @param $name
+     * @return mixed
+     */
+    public function getMailboxes($name)
+    {
+        $accounts = $this->getByDomainName($name);
+
+        foreach($accounts as $key => $account)
+        {
+            /* @var $account Ressource*/
+            if (strpos($account->getName(), 'galsync@') !== false)
+            {
+                unset($accounts[$key]);
+                continue;
+            }
+
+        }
+
+        return $accounts;
+    }
+
+    /**
+     * @param $id
+     * @return Ressource
+     */
+    public function getRessourceInfoById($id)
+    {
+        $account = new Ressource();
+        $account->setId($id);
+
+        $result = $this->getClient()->account->getRessourceInfo($account);
+
+        if(!$result->getLastError())
+        {
+            $body = $result->getResponseBody();
+            $result =  $account->fill($body['GETACCOUNTINFORESPONSE']);
+            $result->setName($body['GETACCOUNTINFORESPONSE']['NAME']['DATA']);
+            return $result;
+        }
+
+        return $result;
+    }
+
+    /**
+     * @param $id
+     * @return Ressource
+     */
+    public function getRessourceOptionsById($id)
+    {
+        $account = new Ressource();
+        $account->setId($id);
+
+        $result = $this->getClient()->account->getRessourceOptions($account);
+
+        if(!$result->getLastError())
+        {
+            $body = $result->getResponseBody();
+            return $account->fill($body['GETACCOUNTRESPONSE']['ACCOUNT']);
+        }
+
+        return $result;
+    }
+
+    /**
+     * @param $name
+     * @return mixed
+     */
+    public function getUsages($name)
+    {
+        $domain = new Domain();
+        $domain->setName($name);
+
+        $result = $this->getClient()->domain->getDomainUsages($domain);
+
+        $accounts = $result->getResponseBody()['GETQUOTAUSAGERESPONSE']['ACCOUNT'];
+
+        /**
+         * API return one or araay with accounts
+         */
+        if(isset($accounts['NAME']))
+        {
+            $tmpRessource =  new Ressource($accounts);
+            $tmp[$tmpRessource->getId()] = $tmpRessource;
+        }else{
+            foreach($accounts as $account)
+            {
+                $tmpRessource =  new Ressource($account);
+                $tmp[$tmpRessource->getId()] = $tmpRessource;
+            }
+        }
+
+        return $tmp;
+    }
+
+    /**
+     * @description return usages of all accounts
+     * @param $name
+     * @return float
+     */
+    public function getFullUsages($name)
+    {
+        /**
+         * count Usages
+         */
+        foreach($this->getUsages($name) as $acc)
+        {
+            $used += (float) $acc->getUsed();
+        }
+        $used = round($used / Size::B_TO_MB, 2);
+
+        return $used;
+    }
+
+    /**
+     * @param $domain
+     * @return array
+     */
+    public function getRessourceAliasesByDomainName($domain)
+    {
+        $accounts = $this->getByDomainName($domain);
+
+        foreach($accounts as $account)
+        {
+            /* @var $account Ressource */
+            foreach($account->getAliases() as $al)
+            {
+
+                $alias = new RessourceAlias();
+                $alias->setRessourceId($account->getId());
+                $alias->setRessourceName($account->getName());
+                $alias->setAlias($al);
+                $data[] = $alias;
+            }
+
+        }
+        return $data;
+    }
+
+}

+ 163 - 0
app/Libs/Zimbra/Components/Api/Soap/Services/Create/CreateRessource.php

@@ -0,0 +1,163 @@
+<?php
+/**
+ * Class CreateRessource
+ * User: Nessandro
+ * Date: 2019-10-07
+ * Time: 10:41
+ * @package ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Services\Create
+ */
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Services\Create;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\Enums\ProductParams;
+use ModulesGarden\Servers\ZimbraEmail\App\Enums\Size;
+use ModulesGarden\Servers\ZimbraEmail\App\Enums\Zimbra;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Product\ProductManager;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Interfaces\ApiService;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Ressource;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Traits\ProductManagerHandler;
+use ModulesGarden\Servers\ZimbraEmail\Core\Helper\ConfigOptionsHelper;
+
+class CreateRessource extends ApiService
+{
+    use ProductManagerHandler;
+    use \ModulesGarden\Servers\ZimbraEmail\Core\UI\Traits\RequestObjectHandler;
+
+    /**
+     * added more conditions
+     * @return bool
+     */
+    protected function isValid()
+    {
+        /**
+         * check if product manager is set
+         */
+        if(!$this->productManager)
+        {
+            $this->setError('Product Manager Not Found');
+            return false;
+        }
+
+        /**
+         * domain name
+         */
+        if(!$this->formData['domain'])
+        {
+            $this->setError('Domain name can not be found.');
+            return false;
+        }
+
+        /**
+         * check full usages of domains
+         */
+        $maxDomainQuota = $this->productManager->get('domainMaxSize') * Size::B_TO_GB;
+        $usages = $this->api->repository()->accounts->getFullUsages($this->formData['domain']);
+
+        if($maxDomainQuota !== Size::UNLIMITED && $usages >= $maxDomainQuota)
+        {
+            $this->setError("Domain size limit has been reached");
+            return false;
+        }
+
+        /**
+         *
+         * Check if accounts limit has been reached
+         */
+        $hosting = $this->productManager->getHosting();
+        $configOption = new ConfigOptionsHelper;
+        $acc_addObj = $configOption->getConfigurableOption($hosting->id, 'acc_add');
+        $acc_add = $acc_addObj->qty ? $acc_addObj->qty : 0;
+        $accountLimit = $this->productManager->get('acc_base') + $acc_add;
+        $mailBoxes = $this->getMailboxes();
+
+        if(count($mailBoxes) >= $accountLimit && $accountLimit !== ProductParams::SIZE_UNLIMITED && 'editRessourceForm' !== $this->getRequestValue('loadData'))
+        {
+            $this->setError('There are too many mailboxes');
+            return false;
+        }
+
+        /**
+         *
+         */
+        return parent::isValid();
+    }
+
+    /**
+     * @return mixed
+     */
+    protected function getMailboxes()
+    {
+        $mailBoxes = $this->api->repository()->accounts->getMailboxes($this->formData['domain']);
+        return $mailBoxes;
+    }
+
+    /**
+     * @return Ressource
+     */
+    protected function getModel()
+    {
+        $accountSize = $this->productManager->get(ProductParams::ACCOUNT_SIZE);
+        /**
+         * create new account in zimbra
+         */
+        $account = new Ressource();
+        $account->setName($this->formData['username'].'@'.$this->formData['domain']);
+        $account->setPassword(html_entity_decode($this->formData['password']), ENT_QUOTES);
+        /**
+         *  set account attributes
+         */
+        $account->setAttr(Ressource::ATTR_FIRSTNAME, $this->formData['firstname']);
+        $account->setAttr(Ressource::ATTR_LASTNAME, $this->formData['lastname']);
+        $account->setAttr(Ressource::ATTR_PHONE, $this->formData['phone']);
+        $account->setAttr(Ressource::ATTR_MOBILE_PHONE, $this->formData['mobile_phone']);
+        $account->setAttr(Ressource::ATTR_FAX, $this->formData['fax']);
+        $account->setAttr(Ressource::ATTR_PAGER, $this->formData['pager']);
+        $account->setAttr(Ressource::ATTR_HOME_PHONE, $this->formData['home_phone']);
+        $account->setAttr(Ressource::ATTR_COUNTRY, $this->formData['country']);
+        $account->setAttr(Ressource::ATTR_STATE, $this->formData['state']);
+        $account->setAttr(Ressource::ATTR_PROF_TITLE, $this->formData['title']);
+        $account->setAttr(Ressource::ATTR_POSTAL_CODE, $this->formData['post_code']);
+        $account->setAttr(Ressource::ATTR_CITY, $this->formData['city']);
+        $account->setAttr(Ressource::ATTR_STREET, $this->formData['street']);
+        $account->setAttr(Ressource::ATTR_COMPANY, $this->formData['company']);
+        $account->setAttr(Ressource::ATTR_ACCOUNT_STATUS, $this->formData['status']);
+        $account->setAttr(Ressource::ATTR_DISPLAY_NAME, $this->formData['display_name']);
+        $account->setAttr(Ressource::ATTR_MAIL_QUOTA, $accountSize * Size::B_TO_MB);
+
+        foreach($this->productManager->getZimbraConfiguration() as $key => $value)
+        {
+            $value = $value === ProductParams::SWITCHER_ENABLED ? Zimbra::ATTR_ENABLED : Zimbra::ATTR_DISABLED;
+            $account->setAttr($key, $value);
+        }
+
+        return $account;
+    }
+
+    /**
+     * @return bool|mixed|Ressource|void
+     */
+    protected function process()
+    {
+        /**
+         *
+         */
+        $model = $this->getModel();
+
+        /**
+         * create account in ZIMBRA
+         */
+        $result = $this->api->account->create($model);
+
+        /**
+         * problem with create account
+         */
+        if(!$result)
+        {
+            $this->setError($this->api->account->getLastResult()->getLastErrorCode());
+            return false;
+        }
+
+        return $result;
+    }
+}

+ 43 - 0
app/Libs/Zimbra/Components/Api/Soap/Services/Delete/DeleteRessource.php

@@ -0,0 +1,43 @@
+<?php
+/**
+ * Class DeleteRessource
+ * User: Nessandro
+ * Date: 2019-09-17
+ * Time: 17:12
+ * @package ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Services\Create
+ */
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Services\Delete;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Interfaces\ApiService;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Ressource;
+
+class DeleteRessource extends ApiService
+{
+
+    /**
+     * remove account in APi
+     *
+     * @return bool|mixed
+     */
+    public function process()
+    {
+        $account = new Ressource();
+        $account->setId($this->formData['id']);
+
+        $result = $this->api->account->delete($account);
+
+        /**
+         * problem with remove account
+         */
+        if(!$result)
+        {
+            $this->setError($this->api->account->getLastResult()->getLastErrorCode());
+            return false;
+        }
+
+        return $result;
+    }
+
+}

+ 77 - 0
app/Libs/Zimbra/Components/Api/Soap/Services/Update/UpdateRessource.php

@@ -0,0 +1,77 @@
+<?php
+namespace ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Services\Update;
+use ModulesGarden\Servers\ZimbraEmail\App\Enums\Size;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Interfaces\ApiService;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Ressource;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Services\Create\CreateRessource;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 18.09.19
+ * Time: 11:09
+ * Class UpdateRessource
+ */
+class UpdateRessource extends CreateRessource
+{
+
+    /**
+     * @return bool|mixed|Ressource|void
+     */
+    protected function process()
+    {
+        /**
+         *
+         */
+        $model = $this->getModel();
+
+        /**
+         * update account in ZIMBRA
+         */
+        $result = $this->api->account->update($model);
+
+        /**
+         * problem with create account
+         */
+        if(!$result)
+        {
+            $this->setError($this->api->account->getLastResult()->getLastErrorCode());
+            return false;
+        }
+
+        return $result;
+    }
+
+    /**
+     * @return Ressource
+     */
+    public function getModel()
+    {
+        $account = new Ressource();
+        /**
+         *  set account attributes
+         */
+        $account->setId($this->formData['id']);
+
+        $account->setAttr(Ressource::ATTR_FIRSTNAME, $this->formData['firstname']);
+        $account->setAttr(Ressource::ATTR_LASTNAME, $this->formData['lastname']);
+        $account->setAttr(Ressource::ATTR_PHONE, $this->formData['phone']);
+        $account->setAttr(Ressource::ATTR_MOBILE_PHONE, $this->formData['mobile_phone']);
+        $account->setAttr(Ressource::ATTR_FAX, $this->formData['fax']);
+        $account->setAttr(Ressource::ATTR_PAGER, $this->formData['pager']);
+        $account->setAttr(Ressource::ATTR_HOME_PHONE, $this->formData['home_phone']);
+        $account->setAttr(Ressource::ATTR_COUNTRY, $this->formData['country']);
+        $account->setAttr(Ressource::ATTR_STATE, $this->formData['state']);
+        $account->setAttr(Ressource::ATTR_PROF_TITLE, $this->formData['title']);
+        $account->setAttr(Ressource::ATTR_POSTAL_CODE, $this->formData['post_code']);
+        $account->setAttr(Ressource::ATTR_CITY, $this->formData['city']);
+        $account->setAttr(Ressource::ATTR_STREET, $this->formData['street']);
+        $account->setAttr(Ressource::ATTR_COMPANY, $this->formData['company']);
+        $account->setAttr(Ressource::ATTR_ACCOUNT_STATUS, $this->formData['status']);
+        $account->setAttr(Ressource::ATTR_DISPLAY_NAME, $this->formData['display_name']);
+
+        return $account;
+
+    }
+}

+ 56 - 0
app/Libs/Zimbra/Components/Api/Soap/Services/Update/UpdateRessourcePassword.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Services\Update;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Interfaces\ApiService;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Ressource;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Services\Create\CreateRessourceCosQuota;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Traits\ProductManagerHandler;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 08.11.19
+ * Time: 12:15
+ * Class UpdateRessourcePassword
+ */
+class UpdateRessourcePassword extends ApiService
+{
+    use ProductManagerHandler;
+
+    /**
+     * @return bool
+     */
+    public function isValid()
+    {
+        if(!$this->formData['id'])
+        {
+            $this->setError('Ressource Id name can not be found.');
+            return false;
+        }
+
+        return parent::isValid(); // TODO: Change the autogenerated stub
+    }
+
+    /**
+     * @return bool|mixed
+     */
+    public function process()
+    {
+        $model = new Ressource();
+        $model->setId($this->formData['id']);
+        $model->setPassword($this->formData['password']);
+
+        $result = $this->api->account->setPassword($model);
+
+        if(!$result)
+        {
+            $this->setError($this->api->account->getLastResult()->getLastErrorCode());
+            return false;
+        }
+
+        return true;
+    }
+}

+ 39 - 0
app/Libs/Zimbra/Components/Api/Soap/Services/Update/UpdateRessourceStatus.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Services\Update;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Interfaces\ApiService;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Ressource;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Traits\ProductManagerHandler;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 09.10.19
+ * Time: 09:00
+ * Class UpdateRessourceStatus
+ */
+class UpdateRessourceStatus extends ApiService
+{
+    use ProductManagerHandler;
+
+    public function process()
+    {
+        $model = new Ressource();
+        $model->setId($this->formData['id']);
+        $model->setAttr(Ressource::ATTR_ACCOUNT_STATUS, $this->formData['status']);
+
+        $result = $this->api->account->update($model);
+
+        if(!$result)
+        {
+            $this->setError($this->api->account->getLastResult()->getLastErrorCode());
+            return false;
+        }
+
+        return true;
+    }
+
+}

BIN
app/UI/Client/Templates/assets/icons/emailRessource.png


+ 18 - 0
app/UI/Client/Templates/assets/js/emailRessource/index.js

@@ -0,0 +1,18 @@
+/**
+ *
+ *
+ * Modal position fix.
+ * add custom class if modal height is bigger than window.
+ */
+mgEventHandler.on('ModalLoaded', null,function(){
+
+    $('.lu-modal__dialog').each(function(index){
+        var self = $(this);
+        var pixelDiff = $(window).height() - self.height();
+
+        if(pixelDiff < 30)
+        {
+            self.addClass('lu-modal_fixed_position');
+        }
+    });
+});

+ 5 - 0
app/UI/Client/Templates/emailRessource/buttons/spanDropdownButton.tpl

@@ -0,0 +1,5 @@
+<mg-component-body-{$elementId|strtolower}
+        component_id='{$elementId}'
+        component_namespace='{$namespace}'
+        component_index='{$rawObject->getIndex()}'
+></mg-component-body-{$elementId|strtolower}>

+ 30 - 0
app/UI/Client/Templates/emailRessource/buttons/spanDropdownButton_components.tpl

@@ -0,0 +1,30 @@
+
+<script type="text/x-template" id="t-mg-dropdawn-btn-wrapper-{$elementId|strtolower}"
+        :component_id="component_id"
+        :component_namespace="component_namespace"
+        :component_index="component_index"
+>
+    <span class="lu-has-dropdown">
+        <button @click="toogleDropdawn" class="mg-drop-target-btn lu-btn lu-btn--icon lu-btn--link lu-btn--default" data-tooltip="" data-title="{$MGLANG->T('More Actions')}">
+            <i class="lu-btn__icon lu-zmdi lu-zmdi-more-vert"></i>
+        </button>
+        <div class="mg-drop-bg-wrapper" v-show="dropOpen" @click="hideDrop"></div>
+        <div v-show="dropOpen"  @click="notHideDrop" class="drop lu-drop-element drop-enabled drop-element-attached-top drop-element-attached-left drop-target-attached-bottom drop-target-attached-left drop-open drop-open-transitionend drop-after-open">
+            <div class="drop-content">
+                <div class="lu-dropdown" data-dropdown-menu="">
+                    <div class="lu-dropdown__arrow" data-arrow="" style="left: auto; right: 10px;"></div>
+                    <ul class="lu-dropdown__menu">
+                        <li class="lu-dropdown__header">
+                            <span class="lu-dropdown__title">{$MGLANG->T('Additional Actions')}</span>
+                        </li>
+                        {foreach from=$rawObject->getButtons() key=buttonKey item=buttonValue}
+                            <li class="lu-dropdown__item">
+                                {$buttonValue->getHtml()}
+                            </li>
+                        {/foreach}
+                    </ul>
+                </div>
+            </div>
+        </div>
+    </span>
+</script>