* @link http://www.oxidmodule.com */ namespace D3\Ordermanager\Modules\Application\Model; 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\d3ParameterNotFoundException; use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException; use D3\Ordermanager\Application\Model\d3ordermanager as Manager; use D3\Ordermanager\Application\Model\d3ordermanager_conf; use D3\Ordermanager\Application\Model\d3ordermanager_configurationcheck; use D3\Ordermanager\Application\Model\d3ordermanager_execute; use D3\Ordermanager\Application\Model\d3ordermanager_pdfhandler; use D3\Ordermanager\Application\Model\d3ordermanagerlist; use D3\Ordermanager\Application\Model\Exceptions\d3ActionRequirementAbstract; use D3\Ordermanager\Application\Model\Exceptions\d3ordermanager_templaterendererExceptionInterface; use Doctrine\DBAL\DBALException; use Exception; use InvoicepdfPDF; use oxarticleinputexception; use OxidEsales\Eshop\Application\Model\Order; use OxidEsales\Eshop\Application\Model\OrderArticle; use OxidEsales\Eshop\Application\Model\Basket; use OxidEsales\Eshop\Application\Model\Payment; use OxidEsales\Eshop\Application\Model\Voucher; use OxidEsales\Eshop\Core\Config; use OxidEsales\Eshop\Core\Exception\ArticleException; use OxidEsales\Eshop\Core\Exception\ArticleInputException; use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException; use OxidEsales\Eshop\Core\Exception\DatabaseErrorException; use OxidEsales\Eshop\Core\Exception\NoArticleException; use OxidEsales\Eshop\Core\Exception\StandardException; use OxidEsales\Eshop\Core\Registry; use OxidEsales\Eshop\Core\UtilsView; use oxnoarticleexception; class d3_oxorder_ordermanager extends d3_oxorder_ordermanager_parent { /** @var Payment */ protected $_oPayment = null; protected $_iSelectedLang; CONST PREVENTION_FINALIZEORDER = 'd3PreventOMFinalizeOrderTrigger'; CONST PREVENTION_SAVEORDER = 'd3PreventOMSaveOrderTrigger'; /** * @param string $sName * * @return mixed */ public function __get($sName) { $mContent = parent::__get($sName); if (false == $mContent && $this->{$sName}) { return $this->{$sName}; } return $mContent; } /** * @param Basket $oBasket */ public function d3setBasket4OrderManager(Basket $oBasket) { $this->_oBasket = $oBasket; } /** * @return Basket */ public function d3getBasket4OrderManager() { return $this->_oBasket; } /** * @param Payment $oPayment */ public function d3setPayment4OrderManager(Payment $oPayment) { $this->_oPayment = $oPayment; } /** * @return Payment */ public function d3getPayment4OrderManager() { return $this->_oPayment; } /** * @return Voucher * @throws Exception */ public function d3GetVoucher() { /** @var Voucher $return */ $return = d3GetModCfgDIC()->get('d3ox.ordermanager.'.Voucher::class); return $return; } /** * @param Manager $oOrderManager * @return Basket * @throws ArticleException * @throws ArticleInputException * @throws NoArticleException * @throws oxArticleInputException * @throws oxNoArticleException * @throws Exception */ public function d3getOrderBasket4OrderManager(Manager $oOrderManager) { $this->reloadDelivery(false); // reload discount to true, because there is no voucher list in basket $this->reloadDiscount(true); /** @var $oBasket d3_oxbasket_ordermanager */ $oBasket = $this->_getOrderBasket(false); $oOrderArticles = $this->getOrderArticles( false === (bool) $oOrderManager->getValue('blGetStornoArticles') ); // if no order articles, return empty basket if ($oOrderArticles->count() > 0) { //adding order articles to basket /** @var OrderArticle $oOrderArticle */ foreach ($oOrderArticles as $oOrderArticle) { $oBasket->addOrderArticleToBasket4OrderManager($oOrderArticle); } } $oBasket->calculateBasket4OrderManager(true, $this); $this->_aVoucherList = $oBasket->getVouchers(); foreach (array_keys($this->_aVoucherList) as $sKey) { $oVoucher = $this->d3GetVoucher(); $oVoucher->load($sKey); $this->_aVoucherList[$sKey] = $oVoucher; } return $oBasket; } /** * @return d3ordermanager_pdfhandler * @throws Exception */ public function d3GetPdfHandler() { d3GetModCfgDIC()->set( d3ordermanager_pdfhandler::class.'.args.ordermanager', d3GetModCfgDIC()->get(Manager::class) ); d3GetModCfgDIC()->set( d3ordermanager_pdfhandler::class.'.args.order', d3GetModCfgDIC()->get('d3ox.ordermanager.'.Order::class) ); return d3GetModCfgDIC()->get(d3ordermanager_pdfhandler::class); } /** * @return InvoicepdfPDF * @throws Exception */ public function d3GetInvoicePdf() { return d3GetModCfgDIC()->get('d3ox.ordermanager.'.InvoicepdfPDF::class); } /** * @param $sFilename * @param int $iSelLang * @param string $sDocType * @param string $sDestination * @return null|string * @throws Exception */ public function d3generatePdf($sFilename, $iSelLang = 0, $sDocType = d3ordermanager_conf::D3_ORDERMANAGER_PDFTYPE_INVOICE, $sDestination = 'S') { // setting pdf language $this->_iSelectedLang = $iSelLang; // setting invoice number if (!$this->getFieldData('oxbillnr')) { $this->_setFieldData('oxbillnr', $this->getNextBillNum()); $this->_setFieldData('oxbilldate', date('Y-m-d', mktime(0, 0, 0, date('m'), date('d'), date('Y')))); $this->save(); } $oPdfHandler = $this->d3GetPdfHandler(); if ($oPdfHandler->canGenerateOxidPdf()) { $oPdf = $this->d3GetInvoicePdf(); $oPdf->setPrintHeader(false); $oPdf->Open(); // adding header $this->pdfHeader($oPdf); $this->d3generatePdfBody( $sDocType, $oPdf ); // adding footer $this->pdfFooter($oPdf); // outputting file to browser return $oPdf->Output($sFilename, $sDestination); } return null; } /** * @param Basket $oBasket * @param object $oUser * @param bool $blRecalculatingOrder * @return int * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws StandardException * @throws d3ParameterNotFoundException * @throws d3ShopCompatibilityAdapterException * @throws d3_cfg_mod_exception * @throws Exception */ public function finalizeOrder(Basket $oBasket, $oUser, $blRecalculatingOrder = false) { $iRet = parent::finalizeOrder($oBasket, $oUser, $blRecalculatingOrder); /** @var d3_cfg_mod $oSet */ $oSet = d3GetModCfgDIC()->get('d3.ordermanager.modcfg'); $currentAdminMode = $this->isAdmin(); if ($oSet->isActive() && in_array(Registry::getSession()->getVariable(self::PREVENTION_FINALIZEORDER), [null, false], true)) { /** @var d3ordermanagerlist $oOrderManagerList */ $oOrderManagerList = d3GetModCfgDIC()->get(d3ordermanagerlist::class); /** @var Manager $oManager */ foreach ($oOrderManagerList->d3GetOrderFinishTriggeredManagerTasks() as $oManager) { try { $this->d3OrderManagerCheckForConfigurationException($oManager); $oManagerExecute = $this->d3OrdermanagerGetManagerExecute($oManager); if ($oManagerExecute->orderMeetsConditions($this->getId())) { // prevent infinit loop because of circular reference in recalculate::method Registry::getSession()->setVariable(self::PREVENTION_FINALIZEORDER, true); $oManagerExecute->exec4order($this->getId(), d3ordermanager_conf::EXECTYPE_ORDERFINISHTRIGGERED); } } catch (d3ActionRequirementAbstract $e) { $e->debugOut(); if (true === $currentAdminMode) { /** @var UtilsView $utilsView */ $utilsView = d3GetModCfgDIC()->get('d3ox.ordermanager.' . UtilsView::class); $utilsView->addErrorToDisplay($e); } } catch (d3ordermanager_templaterendererExceptionInterface $e) { $e->debugOut(); if (true === $currentAdminMode) { /** @var UtilsView $utilsView */ $utilsView = d3GetModCfgDIC()->get('d3ox.ordermanager.' . UtilsView::class); $utilsView->addErrorToDisplay($e); } } finally { Registry::getSession()->setVariable(self::PREVENTION_FINALIZEORDER, false); $oConfig = d3GetModCfgDIC()->get('d3ox.ordermanager.'.Config::class); $oConfig->setAdminMode($currentAdminMode); } } } return $iRet; } /** * @throws d3ParameterNotFoundException * @throws d3ShopCompatibilityAdapterException * @throws d3_cfg_mod_exception * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws StandardException * @throws Exception */ public function save() { $ret = parent::save(); /** @var d3_cfg_mod $oSet */ $oSet = d3GetModCfgDIC()->get('d3.ordermanager.modcfg'); $currentAdminMode = $this->isAdmin(); if ($oSet->isActive() && in_array(Registry::getSession()->getVariable(self::PREVENTION_SAVEORDER), [null, false], true)) { /** @var d3ordermanagerlist $oOrderManagerList */ $oOrderManagerList = d3GetModCfgDIC()->get(d3ordermanagerlist::class); /** @var Manager $oManager */ foreach ($oOrderManagerList->d3GetOrderSaveTriggeredManagerTasks() as $oManager) { try { $this->d3OrderManagerCheckForConfigurationException($oManager); $oManagerExecute = $this->d3OrdermanagerGetManagerExecute($oManager); if ($oManagerExecute->orderMeetsConditions($this->getId())) { // prevent infinit loop because of circular reference in save::method Registry::getSession()->setVariable(self::PREVENTION_SAVEORDER, true); $oManagerExecute->exec4order($this->getId(), d3ordermanager_conf::EXECTYPE_ORDERSAVETRIGGERED); } } catch (d3ActionRequirementAbstract $e) { $e->debugOut(); if (true === $currentAdminMode) { /** @var UtilsView $utilsView */ $utilsView = d3GetModCfgDIC()->get('d3ox.ordermanager.' . UtilsView::class); $utilsView->addErrorToDisplay($e); } } catch (d3ordermanager_templaterendererExceptionInterface $e) { $e->debugOut(); if (true === $currentAdminMode) { /** @var UtilsView $utilsView */ $utilsView = d3GetModCfgDIC()->get('d3ox.ordermanager.' . UtilsView::class); $utilsView->addErrorToDisplay($e); } } finally { Registry::getSession()->setVariable(self::PREVENTION_SAVEORDER, false); $oConfig = d3GetModCfgDIC()->get('d3ox.ordermanager.'.Config::class); $oConfig->setAdminMode($currentAdminMode); } } } return $ret; } /** * @param Manager $oManager * @return d3ordermanager_execute * @throws Exception */ public function d3OrdermanagerGetManagerExecute(Manager $oManager) { d3GetModCfgDIC()->set( d3ordermanager_execute::class.'.args.ordermanager', $oManager ); return d3GetModCfgDIC()->get(d3ordermanager_execute::class); } /** * @param $sDocType * @param InvoicepdfPDF $oPdf */ public function d3generatePdfBody( $sDocType, InvoicepdfPDF $oPdf ) { switch ( $sDocType ) { case d3ordermanager_conf::D3_ORDERMANAGER_PDFTYPE_DELIVERYNOTE: $this->exportDeliveryNote( $oPdf ); break; case d3ordermanager_conf::D3_ORDERMANAGER_PDFTYPE_INVOICE: $this->exportStandart( $oPdf ); } } /** * @param Manager $oManager * @throws d3ActionRequirementAbstract */ protected function d3OrderManagerCheckForConfigurationException(Manager $oManager) { d3GetModCfgDIC()->set(d3ordermanager_configurationcheck::class.'.args.ordermanager', $oManager); d3GetModCfgDIC()->setParameter( d3ordermanager_configurationcheck::class.'.args.checktypes', $oManager->getValue('sManuallyExecMeetCondition') ? d3ordermanager_configurationcheck::REQUIREMENTS_AND_ACTIONS : d3ordermanager_configurationcheck::ACTIONS_ONLY ); /** @var d3ordermanager_configurationcheck $confCheck */ $confCheck = d3GetModCfgDIC()->get(d3ordermanager_configurationcheck::class); $confCheck->checkThrowingExceptions(); } }