* @link http://www.oxidmodule.com */ namespace D3\Heidelpay\Setup; use D3\Heidelpay\Models\Configuration\ModProfile; use D3\Heidelpay\Models\Factory; use D3\Heidelpay\Models\Payment\Btobbillpurchase; use D3\Heidelpay\Models\Payment\Creditcard; use D3\Heidelpay\Models\Payment\Debitcard; use D3\Heidelpay\Models\Payment\Directdebit; use D3\Heidelpay\Models\Payment\Easycredit; use D3\Heidelpay\Models\Payment\Eps; use D3\Heidelpay\Models\Payment\Giropay; use D3\Heidelpay\Models\Payment\Ideal; use D3\Heidelpay\Models\Payment\Invoice\Secured; use D3\Heidelpay\Models\Payment\Invoice\Unsecured; use D3\Heidelpay\Models\Payment\Masterpass; use D3\Heidelpay\Models\Payment\Paypal; use D3\Heidelpay\Models\Payment\Postfinance; use D3\Heidelpay\Models\Payment\Prepayment; use D3\Heidelpay\Models\Payment\Przelewy24; use D3\Heidelpay\Models\Payment\Sofortueberweisung; use D3\Heidelpay\Models\Settings\Channels\Channels; use D3\Heidelpay\Models\Settings\Channels\DirectDebit\Unsecured as DirectdebitUnsecured; use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod; use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception; use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException; use D3\ModCfg\Application\Model\Install\d3install_updatebase; use Doctrine\DBAL\DBALException; use Exception; use OxidEsales\Eshop\Application\Model\Payment; use OxidEsales\Eshop\Core\Database\Adapter\DatabaseInterface; use OxidEsales\Eshop\Core\Exception\ConnectionException; use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException; use OxidEsales\Eshop\Core\Exception\DatabaseErrorException; use OxidEsales\Eshop\Core\Exception\InputException; use OxidEsales\Eshop\Core\Exception\StandardException; use OxidEsales\Eshop\Core\Exception\SystemComponentException; use OxidEsales\Eshop\Core\Model\BaseModel; use OxidEsales\Eshop\Core\Registry; use OxidEsales\Eshop\Core\Request; use ReflectionException; class UpdateRoutine extends d3install_updatebase { protected $_aUpdateMethods = [ [ 'check' => 'hasModCfgConfiguration', 'do' => 'showModCfgMigrationMessage', ] ]; /** * @return bool * @throws ConnectionException * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws d3ShopCompatibilityAdapterException * @throws d3_cfg_mod_exception * @throws StandardException * @throws ReflectionException */ public function migrateModCfgConfiguration() { startProfile(__METHOD__); if ($this->hasModCfgConfiguration() && $this->_getAction() !== 'checklist') { $sCurrentShopId = $this->getConfig()->getShopId(); $currentLanguage = Registry::getLang(); $currentBaseLanguageId = $currentLanguage->getBaseLanguage(); foreach ($this->getShopListByActiveModule('d3heidelpay') as $oShop) { /** @var $oShop BaseModel */ $this->_changeToShop($oShop->getId()); $shopLanguage = Registry::getLang(); $hasMultilangOption = (bool)$this->getConfig()->getShopConfVar('d3hp_allowMultipleLanguages', null, 'd3heidelpay'); $languages = [0]; //0 = base language if ($hasMultilangOption) { foreach ($shopLanguage->getLanguageArray() as $language) { if (in_array($language->id, $languages)) { continue; } $languages[] = $language->id; } } foreach ($languages as $language) { $shopLanguage->setBaseLanguage($language); $d3CfgMod = d3_cfg_mod::getNoCache('d3heidelpay'); $valueList = unserialize($d3CfgMod->getValue('d3heidelpay_aPaymentList')); if (empty($valueList) || false == is_array($valueList)) { $d3CfgMod->deleteValue('d3heidelpay_aPaymentList'); foreach ($this->getOldChannelList() as $oldChannelname) { $d3CfgMod->deleteValue($oldChannelname); } $d3CfgMod->save(); continue; } $isTestMode = (bool)$d3CfgMod->getLogStatus('test'); /** @var Factory $factory */ $factory = oxNew(Factory::class)->setModuleConfiguration($d3CfgMod); $modProfile = $factory->getModProfile(); foreach ($valueList as $oxPaymentId => $heidelpayClassName) { if (stristr($heidelpayClassName, 'billsafe')) { continue; } /** @var Factory $factory */ $mapHeidelpayClassnameToChannel = $this->_mapHeidelpayClassnameToChannel( $heidelpayClassName, $d3CfgMod ); if (empty($mapHeidelpayClassnameToChannel)) { continue; } $escapedParameter = [ 'isActive' => 1, 'isTestConfig' => $isTestMode, 'title' => $this->_mapOxpaymentIdToPaymentName($oxPaymentId), 'paymentType' => $this->_mapHeidelpayClassnameToChannelsettingsClass( $heidelpayClassName, $factory ), 'channel' => $mapHeidelpayClassnameToChannel, 'oxidpaymentIds' => [$oxPaymentId], ]; $newConfiguration = $this->retrieveNewConfiguration($escapedParameter); $newConfiguration->setId(Registry::getUtilsObject()->generateUId()); $this->saveConfigToModProfile($modProfile, $newConfiguration); } $d3CfgMod->deleteValue('d3heidelpay_aPaymentList'); foreach ($this->getOldChannelList() as $oldChannelname) { $d3CfgMod->deleteValue($oldChannelname); } $d3CfgMod->save(); } } $this->_changeToShop($sCurrentShopId); $currentLanguage = Registry::getLang(); $currentLanguage->setBaseLanguage($currentBaseLanguageId); } stopProfile(__METHOD__); return true; } /** * @return bool|DatabaseInterface * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws ConnectionException * @throws SystemComponentException */ public function hasModCfgConfiguration() { startProfile(__METHOD__); $result = false; $sCurrentShopId = $this->getConfig()->getShopId(); foreach ($this->getShopListByActiveModule('d3heidelpay') as $oShop) { /** @var $oShop BaseModel */ $this->_changeToShop($oShop->getId()); $value = d3_cfg_mod::getNoCache('d3heidelpay')->getValue('d3heidelpay_aPaymentList'); if ($value) { $result = true; break; } } $this->_changeToShop($sCurrentShopId); stopProfile(__METHOD__); return $result; } /** * @return bool * @throws ConnectionException * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws ReflectionException * @throws StandardException * @throws d3ShopCompatibilityAdapterException * @throws d3_cfg_mod_exception */ public function showModCfgMigrationMessage() { $this->setConfirmMessageSessionRequest('D3HeidelpaySetupUpdateRoutinemigrateModCfgConfiguration', true); $executeType = Registry::get(Request::class)->getRequestEscapedParameter('exectype'); if (empty($executeType) && substr(php_sapi_name(), 0, 3) !== 'cli') { return $this->_confirmMessage('D3_HEIDELPAY_UPDATE_CHANNELCONFIGURATIONS'); } elseif (substr(php_sapi_name(), 0, 3) === 'cli') { $this->_confirmMessage('D3_HEIDELPAY_UPDATE_CHANNELCONFIGURATIONS'); } return $this->migrateModCfgConfiguration(); } /** * @param $escapedParameter * * @return Channels * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws InputException * @throws StandardException * @throws d3ShopCompatibilityAdapterException * @throws d3_cfg_mod_exception */ protected function retrieveNewConfiguration($escapedParameter) { if (false == class_exists($escapedParameter['paymentType'])) { $message = 'class not found: '.$escapedParameter['paymentType'].': '.PHP_EOL.var_export( $escapedParameter, true ); /** @var InputException $exception */ $exception = oxNew(InputException::class, nl2br($message)); throw $exception; } if (false === stristr($escapedParameter['paymentType'], 'D3\Heidelpay\Models\Settings\Channels')) { $message = 'this is not a configuration class: '.$escapedParameter['paymentType'].': '.PHP_EOL.var_export( $escapedParameter, true ); /** @var InputException $exception */ $exception = oxNew(InputException::class, nl2br($message)); throw $exception; } $difference = array_diff_key( call_user_func($escapedParameter['paymentType'].'::getClassDefinition'), $escapedParameter ); $escapedParameter = array_merge($escapedParameter, $difference); /** @var Channels $newConfiguration */ $newConfiguration = oxNew($escapedParameter['paymentType'], $escapedParameter); /** @var Factory $factory */ $factory = oxNew(Factory::class)->setModuleConfiguration(d3_cfg_mod::getNoCache('d3heidelpay')); if ($factory->isBasicLicence()) { $heidelpayment = $newConfiguration->getHeidelPaymentFromChannel(); if (in_array($heidelpayment, $factory::PREMIUMHEIDELPAYMENTCLASSNAMES)) { $escapedParameter['isActive'] = 0; $newConfiguration = oxNew($escapedParameter['paymentType'], $escapedParameter); } } return $newConfiguration; } /** * @param ModProfile $modprofile * @param Channels $currentChannel * * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws Exception */ protected function saveConfigToModProfile(ModProfile $modprofile, Channels $currentChannel) { $modprofile->setValue($currentChannel->getId(), (string)$currentChannel); $modprofile->prepareSaveData(); // set oxid if inserted if (false === $modprofile->save()) { $message = 'Failed to save profile!'.PHP_EOL; $message .= 'The entered configuration may not saved.'.PHP_EOL; $message .= 'Please approach your technical contact person and tell them how to repruduce this message.'; /** @var InputException $exception */ $exception = oxNew(InputException::class, nl2br($message)); throw $exception; } } /** * @param $heidelpayClassName * @param Factory $factory * * @return string * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws StandardException * @throws ReflectionException * @throws d3ShopCompatibilityAdapterException * @throws d3_cfg_mod_exception */ protected function _mapHeidelpayClassnameToChannelsettingsClass($heidelpayClassName, Factory $factory) { $settingsClassName = ""; $classAlias = [ "d3_d3heidelpay_models_payment_invoice_unsecured" => Unsecured::class, "d3_d3heidelpay_models_payment_invoice_secured" => Secured::class, "d3_d3heidelpay_models_payment_sofortueberweisung" => Sofortueberweisung::class, "d3_d3heidelpay_models_payment_prepayment" => Prepayment::class, "d3_d3heidelpay_models_payment_paypal" => Paypal::class, "d3_d3heidelpay_models_payment_ideal" => Ideal::class, "d3_d3heidelpay_models_payment_giropay" => Giropay::class, "d3_d3heidelpay_models_payment_eps" => Eps::class, "d3_d3heidelpay_models_payment_directdebit" => Directdebit::class, "d3_d3heidelpay_models_payment_directdebit_secured" => Directdebit\Secured::class, "d3_d3heidelpay_models_payment_debitcard" => Debitcard::class, "d3_d3heidelpay_models_payment_creditcard" => Creditcard::class, "d3_d3heidelpay_models_payment_btobbillpurchase" => Btobbillpurchase::class, "d3_d3heidelpay_models_payment_easycredit" => Easycredit::class, "d3_d3heidelpay_models_payment_masterpass" => Masterpass::class, "d3_d3heidelpay_models_payment_postfinance" => Postfinance::class, "d3_d3heidelpay_models_payment_przelewy24" => Przelewy24::class, ]; if (array_key_exists(strtolower($heidelpayClassName), $classAlias)) { $heidelpayClassName = $classAlias[strtolower($heidelpayClassName)]; } $paymentConfigurations = $factory->getPaymentConfigurations(); $generatedSettingsClassname = strtolower(str_replace( 'D3\\Heidelpay\\Models\\Payment\\', "D3\\Heidelpay\\Models\\Settings\\Channels\\", $heidelpayClassName )); if ('d3\\heidelpay\\models\\settings\\channels\\directdebit' === $generatedSettingsClassname) { $generatedSettingsClassname = 'd3\\heidelpay\\models\\settings\\channels\\directdebit\\unsecured'; } if ('d3\\heidelpay\\models\\settings\\channels\\sofortueberweisung' === $generatedSettingsClassname) { $generatedSettingsClassname = 'd3\\heidelpay\\models\\settings\\channels\\sofort'; } foreach ($paymentConfigurations as $paymentConfiguration) { if ($generatedSettingsClassname === strtolower($paymentConfiguration)) { $settingsClassName = $paymentConfiguration; break; } } return $settingsClassName; } protected function _mapHeidelpayClassnameToChannel($heidelpayClassName, d3_cfg_mod $d3CfgMod) { $channel = false; $oldChannelList = $this->getOldChannelList(); $mapping = [ 'd3_d3heidelpay_models_payment_creditcard' => $oldChannelList['mainChannel'], 'd3_d3heidelpay_models_payment_debitcard' => $oldChannelList['mainChannel'], 'd3_d3heidelpay_models_payment_directdebit' => $oldChannelList['mainChannel'], 'd3_d3heidelpay_models_payment_invoice_unsecured' => $oldChannelList['mainChannel'], 'd3_d3heidelpay_models_payment_prepayment' => $oldChannelList['mainChannel'], 'd3_d3heidelpay_models_payment_sofortueberweisung' => $oldChannelList['sofortChannel'], 'd3_d3heidelpay_models_payment_paypal' => $oldChannelList['paypalChannel'], 'd3_d3heidelpay_models_payment_giropay' => $oldChannelList['giropayChannel'], 'd3_d3heidelpay_models_payment_ideal' => $oldChannelList['idealChannel'], 'd3_d3heidelpay_models_payment_invoice_secured' => $oldChannelList['ivSecuredChannel'], 'd3_d3heidelpay_models_payment_eps' => $oldChannelList['epsChannel'], 'd3_d3heidelpay_models_payment_directdebit_secured' => $oldChannelList['ddSecuredChannel'], 'd3_d3heidelpay_models_payment_przelewy24' => $oldChannelList['p24Channel'], 'd3_d3heidelpay_models_payment_postfinance' => $oldChannelList['postfinanceChannel'], 'd3_d3heidelpay_models_payment_masterpass' => $oldChannelList['masterpassChannel'], 'd3_d3heidelpay_models_payment_easycredit' => $oldChannelList['easycreditChannel'], 'd3_d3heidelpay_models_payment_btobbillpurchase' => $oldChannelList['b2bChannel'], Creditcard::class => $oldChannelList['mainChannel'], Debitcard::class => $oldChannelList['mainChannel'], Directdebit::class => $oldChannelList['mainChannel'], Unsecured::class => $oldChannelList['mainChannel'], Prepayment::class => $oldChannelList['mainChannel'], Sofortueberweisung::class => $oldChannelList['sofortChannel'], Paypal::class => $oldChannelList['paypalChannel'], Giropay::class => $oldChannelList['giropayChannel'], Ideal::class => $oldChannelList['idealChannel'], Secured::class => $oldChannelList['ivSecuredChannel'], Eps::class => $oldChannelList['epsChannel'], DirectdebitUnsecured::class => $oldChannelList['ddSecuredChannel'], Przelewy24::class => $oldChannelList['p24Channel'], Postfinance::class => $oldChannelList['postfinanceChannel'], Masterpass::class => $oldChannelList['masterpassChannel'], Easycredit::class => $oldChannelList['easycreditChannel'], Btobbillpurchase::class => $oldChannelList['b2bChannel'], ]; foreach ($mapping as $index => $oldChannelName) { if ($heidelpayClassName === $index) { $channel = $d3CfgMod->getValue($oldChannelName); } } if (false === $channel) { return ''; } return $channel; } /** * @param $oxpaymentId * * @return string * @throws SystemComponentException */ protected function _mapOxpaymentIdToPaymentName($oxpaymentId) { /** @var Payment $oxidPayment */ $oxidPayment = oxNew(Payment::class); if ($oxidPayment->load($oxpaymentId)) { $titel = $oxidPayment->getFieldData('oxdesc'); return $titel ?: $oxpaymentId; } return $oxpaymentId; } /** * @return array */ protected function getOldChannelList() { $mainChannel = 'd3heidelpay_sChannel'; $sofortChannel = 'd3heidelpay_sChannel__sofort'; $paypalChannel = 'd3heidelpay_sChannel__paypal'; $giropayChannel = 'd3heidelpay_sChannel__giro'; $idealChannel = 'd3heidelpay_sChannel__ideal'; $ivSecuredChannel = 'd3heidelpay_sChannel__assuredinv'; $epsChannel = 'd3heidelpay_sChannel__eps'; $ddSecuredChannel = 'd3heidelpay_sChannel__assureddirectdebit'; $p24Channel = 'd3heidelpay_sChannel__przelewy24'; $postfinanceChannel = 'd3heidelpay_sChannel__postfinance'; $masterpassChannel = 'd3heidelpay_sChannel__masterpass'; $easycreditChannel = 'd3heidelpay_sChannel__easycredit'; $b2bChannel = 'd3heidelpay_sChannel__Btobbillpurchase'; return [ 'mainChannel' => $mainChannel, 'sofortChannel' => $sofortChannel, 'paypalChannel' => $paypalChannel, 'giropayChannel' => $giropayChannel, 'idealChannel' => $idealChannel, 'ivSecuredChannel' => $ivSecuredChannel, 'epsChannel' => $epsChannel, 'ddSecuredChannel' => $ddSecuredChannel, 'p24Channel' => $p24Channel, 'postfinanceChannel' => $postfinanceChannel, 'masterpassChannel' => $masterpassChannel, 'easycreditChannel' => $easycreditChannel, 'b2bChannel' => $b2bChannel, ]; } }