| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- <?php
- namespace ModulesGarden\Servers\ProxmoxCloudVps\Packages\WhmcsService;
- use ModulesGarden\Servers\ProxmoxCloudVps\Core\HandlerError\Exceptions\Exception;
- use ModulesGarden\Servers\ProxmoxCloudVps\Core\HandlerError\ErrorCodes\ErrorCodesLib;
- use ModulesGarden\Servers\ProxmoxCloudVps\Core\Models\ProductSettings\Repository;
- use ModulesGarden\Servers\ProxmoxCloudVps\Core\Models\Whmcs\Currency;
- use ModulesGarden\Servers\ProxmoxCloudVps\Packages\WhmcsService\Config\Enum;
- use ModulesGarden\Servers\ProxmoxCloudVps\Core\Traits\AppParams;
- use ModulesGarden\Servers\ProxmoxCloudVps\Packages\WhmcsService\Traits\ConfigurableOptionsConfig;
- use ModulesGarden\Servers\ProxmoxCloudVps\Packages\WhmcsService\Traits\CustomFieldsConfig;
- use WHMCS\Database\Capsule;
- class Product
- {
- use ConfigurableOptionsConfig;
- use CustomFieldsConfig;
- use AppParams;
- protected $productId = null;
- protected $product = null;
- protected $configOptions = null;
- protected $configurableOptionsGroupCreated = false;
- public function __construct($productId = null)
- {
- $this->setProductId($productId);
- $this->loadWhmcsService();
- }
- protected function setProductId($productId = null)
- {
- $relationId = (int)$productId;
- if ($relationId <= 0)
- {
- throw new Exception(ErrorCodesLib::CORE_WS_000002);
- }
- $this->productId = $relationId;
- }
- protected function loadWhmcsService()
- {
- $this->product = \WHMCS\Product\Product::find($this->productId);
- }
- public function loadConfigOptions($force = false)
- {
- if ($force || $this->configOptions === null)
- {
- $this->configOptions = Capsule::table('tblproductconfigoptions')
- ->leftJoin('tblproductconfiglinks', 'tblproductconfigoptions.gid', '=', 'tblproductconfiglinks.gid')
- ->join('tblproductconfiggroups', 'tblproductconfigoptions.gid', '=', 'tblproductconfiggroups.id')
- ->select('tblproductconfigoptions.id', 'tblproductconfigoptions.optionname', 'tblproductconfigoptions.gid')
- ->where('tblproductconfiglinks.pid', $this->productId)->get();
- }
- }
- public function doesConfigurableOptionExist($optionName = null)
- {
- if (!is_string($optionName) || trim($optionName) === '')
- {
- return false;
- }
- $this->loadConfigOptions();
- $rawOptionName = $this->configOptionNameToRaw($optionName);
- foreach ($this->configOptions as $option)
- {
- if ($rawOptionName === $this->configOptionNameToRaw($option->optionname))
- {
- return true;
- }
- }
- return false;
- }
- public function getOptionGroupId($optionName = null)
- {
- if (!is_string($optionName) || trim($optionName) === '')
- {
- return false;
- }
- $this->loadConfigOptions();
- $rawOptionName = $this->configOptionNameToRaw($optionName);
- foreach ($this->configOptions as $option)
- {
- if ($rawOptionName === $this->configOptionNameToRaw($option->optionname))
- {
- return $option->gid;
- }
- }
- return false;
- }
- public function getFirstOptionGroupId()
- {
- $this->loadConfigOptions();
- foreach ($this->configOptions as $option)
- {
- return $option->gid;
- }
- $optionGroup = Capsule::table('tblproductconfiggroups')
- ->join('tblproductconfiglinks', 'tblproductconfiglinks.gid', '=', 'tblproductconfiggroups.id')
- ->where('tblproductconfiglinks.pid', $this->productId)->first();
- if (is_object($optionGroup))
- {
- return $optionGroup->gid;
- }
- return false;
- }
- public function createConfigOptionsGroup()
- {
- $productName = $this->product->name;
- $moduleName = $this->getAppParam('name');
- $groupId = Capsule::table('tblproductconfiggroups')->insertGetId([
- 'name' => 'Configurable options for ' . $productName . ' product',
- 'description' => 'Auto generated by module ' . $moduleName
- ]);
- if (is_int($groupId) && $groupId > 0)
- {
- Capsule::table('tblproductconfiglinks')->insertGetId(['gid' => $groupId, 'pid' => $this->productId]);
- }
- $this->configurableOptionsGroupCreated = true;
- }
- public function configOptionNameToRaw($optionName)
- {
- if (!is_string($optionName) || trim($optionName) === '' || substr($optionName, 0, 1) === '|')
- {
- return '';
- }
- if (strpos($optionName, '|') > 0)
- {
- $parts = explode('|', $optionName);
- return $parts[0];
- }
- return $optionName;
- }
- public function addConfigurableOption($optionName = null)
- {
- if (!$this->canOptionBeAdded($optionName))
- {
- return;
- }
- $gid = $this->getConfigurableOptionGroupId();
- $this->createConfigurableOption($optionName, $gid);
- }
- public function createConfigurableOption($optionName, $gid)
- {
- foreach ($this->configOptionsList as $option)
- {
- if ($option[Enum::OPTION_NAME] === $optionName || $this->configOptionNameToRaw($option[Enum::OPTION_NAME]) === $optionName)
- {
- $optId = Capsule::table('tblproductconfigoptions')->insertGetId([
- Enum::OPTION_GROUP_ID => $gid,
- Enum::OPTION_NAME => $option[Enum::OPTION_NAME],
- Enum::OPTION_TYPE => $option[Enum::OPTION_TYPE],
- Enum::OPTION_QUANTITY_MIN => $option[Enum::OPTION_QUANTITY_MIN] ? $option[Enum::OPTION_QUANTITY_MIN] : Enum::OPTION_QUANTITY_MIN_DEFAULT,
- Enum::OPTION_QUANTITY_MAX => $option[Enum::OPTION_QUANTITY_MAX] ? $option[Enum::OPTION_QUANTITY_MAX] : Enum::OPTION_QUANTITY_MAX_DEFAULT,
- Enum::ORDER => $option[Enum::ORDER] ? $option[Enum::ORDER] : Enum::ORDER_DEFAULT,
- Enum::HIDDEN => $option[Enum::HIDDEN] ? $option[Enum::HIDDEN] : Enum::HIDDEN_DEFAULT
- ]);
- if ($option[Enum::OPTION_TYPE] == Enum::OPTION_TYPE_QUANTITY && !$option[Enum::CONFIG_SUB_OPTIONS])
- {
- $defaultConfig = Enum::DEFAULT_QUANTITY_SUB_CONFIG;
- $this->createConfigurableSubOption($optId, $defaultConfig[Enum::OPTION_SUB_NAME],
- $defaultConfig[Enum::OPTION_SUB_ORDER], $defaultConfig[Enum::OPTION_SUB_HIDDEN]);
- }
- foreach ($option[Enum::CONFIG_SUB_OPTIONS] as $subOption)
- {
- $this->createConfigurableSubOption($optId, $subOption[Enum::OPTION_SUB_NAME],
- $subOption[Enum::OPTION_SUB_ORDER], $subOption[Enum::OPTION_SUB_HIDDEN]);
- }
- foreach ($this->getCallbackSubOptions($optionName) as $subOption)
- {
- $this->createConfigurableSubOption($optId, $subOption[Enum::OPTION_SUB_NAME],
- $subOption[Enum::OPTION_SUB_ORDER], $subOption[Enum::OPTION_SUB_HIDDEN]);
- }
- break;
- }
- }
- }
- public function createConfigurableSubOption($optId = null, $optName = null, $sortOrder = 0, $hidden = 0)
- {
- if (!is_string($optName) || trim($optName) === '')
- {
- return;
- }
- $subId = Capsule::table('tblproductconfigoptionssub')->insertGetId([
- Enum::OPTION_SUB_OPTION_ID => (int)$optId,
- Enum::OPTION_SUB_NAME => $optName,
- Enum::OPTION_SUB_ORDER => (int)$sortOrder ? (int)$sortOrder : Enum::OPTION_SUB_ORDER_DEFAULT,
- Enum::OPTION_SUB_HIDDEN => (int)$hidden ? (int)$hidden : Enum::OPTION_SUB_HIDDEN_DEFAULT,
- ]);
- //add default pricing
- $this->insertDefaultConfigOptionPricing($subId);
- return $subId;
- }
- public function insertDefaultConfigOptionPricing($relId = null, $defaultPrice = '0.00')
- {
- $currencyIds = Currency::pluck("id")->all();
- if(empty( $currencyIds)|| !$relId)
- {
- return null;
- }
- foreach ( $currencyIds as $currencyId){
- Capsule::table('tblpricing')->insertGetId([ 'type' => 'configoptions', 'currency' => $currencyId,
- 'relid' => $relId, 'msetupfee' => $defaultPrice, 'qsetupfee' => $defaultPrice, 'ssetupfee' => $defaultPrice,
- 'asetupfee' => $defaultPrice, 'bsetupfee' => $defaultPrice, 'tsetupfee' => $defaultPrice, 'monthly' => $defaultPrice,
- 'quarterly' => $defaultPrice, 'semiannually' => $defaultPrice, 'annually' => $defaultPrice,
- 'biennially' => $defaultPrice, 'triennially' => $defaultPrice
- ]);
- }
- }
- public function getConfigurableOptionGroupId()
- {
- $gid = $this->getFirstOptionGroupId();
- if (!$gid)
- {
- $this->createConfigOptionsGroup();
- $this->loadConfigOptions(true);
- $gid = $this->getFirstOptionGroupId();
- }
- return $gid;
- }
- public function canOptionBeAdded($optionName = null)
- {
- if (!is_string($optionName) || trim($optionName) === '')
- {
- return false;
- }
- if ($this->doesConfigurableOptionExist($optionName))
- {
- return false;
- }
- $configOptionParams = $this->getConfigurableOptionConfigParams($optionName);
- if (!$configOptionParams)
- {
- return false;
- }
- return true;
- }
- public function getCallbackSubOptions($optionName = null)
- {
- if(!class_exists('\ModulesGarden\Servers\ProxmoxCloudVps\App\Config\Packages\WhmcsService'))
- {
- return null;
- }
- $service = new \ModulesGarden\Servers\ProxmoxCloudVps\App\Config\Packages\WhmcsService();
- if (method_exists($service, 'getSuboptionsByCallback') && is_callable([$service, 'getSuboptionsByCallback']))
- {
- return $service->getSuboptionsByCallback($optionName);
- }
- return null;
- }
- public function isConfigurableOptionsGroupCreated()
- {
- return $this->configurableOptionsGroupCreated;
- }
- public function getProductConfig()
- {
- $settingRepo = new Repository();
- $productSettings = $settingRepo->getProductSettings($this->productId);
- return $productSettings;
- }
- }
|