sync code
This commit is contained in:
		
							parent
							
								
									7ef2bef4db
								
							
						
					
					
						commit
						d8e59641f9
					
				
							
								
								
									
										2
									
								
								.env
								
								
								
								
							
							
						
						
									
										2
									
								
								.env
								
								
								
								
							|  | @ -1,5 +1,5 @@ | ||||||
| # NETWORK | # NETWORK | ||||||
| APP_PORT=81 | APP_PORT=8000 | ||||||
| APP_URL=http://apac.host:${APP_PORT} | APP_URL=http://apac.host:${APP_PORT} | ||||||
| 
 | 
 | ||||||
| # MYSQL | # MYSQL | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| #!/bin/bash | #!/bin/sh | ||||||
| 
 | 
 | ||||||
| bin/magento cache:clean | bin/magento cache:clean | ||||||
| bin/magento cache:flush | bin/magento cache:flush | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| #!/bin/bash | #!/bin/sh | ||||||
| 
 | 
 | ||||||
| source "$PWD/.env" | source "$PWD/.env" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | #!/bin/sh | ||||||
|  | 
 | ||||||
|  | bin/magento setup:upgrade | ||||||
|  | bin/magento setup:static-content:deploy -f | ||||||
|  | bin/magento cache:flush | ||||||
|  | chmod 777 -R generated/ var/ | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| #!/bin/bash | #!/bin/sh | ||||||
| 
 | 
 | ||||||
| source "$PWD/.env" | source "$PWD/.env" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,11 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\AssetRecovery\Block; | ||||||
|  | 
 | ||||||
|  | class Form extends \Magento\Framework\View\Element\Template | ||||||
|  | { | ||||||
|  |     protected function _prepareLayout() | ||||||
|  |     { | ||||||
|  |         return parent::_prepareLayout(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,105 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\AssetRecovery\Controller\Index; | ||||||
|  | use Magento\Framework\Translate\Inline\StateInterface; | ||||||
|  | use Magento\Framework\Escaper; | ||||||
|  | use Magento\Framework\Mail\Template\TransportBuilder; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\App\Action\Context; | ||||||
|  | use Magento\Framework\View\Result\PageFactory; | ||||||
|  | use Magento\Framework\Controller\ResultFactory; | ||||||
|  | 
 | ||||||
|  | class Index extends \Magento\Framework\App\Action\Action { | ||||||
|  | 
 | ||||||
|  |     protected $pageFactory; | ||||||
|  |     protected $_messageManager; | ||||||
|  |     protected $resultFactory; | ||||||
|  |     protected $inlineTranslation; | ||||||
|  |     protected $escaper; | ||||||
|  |     protected $transportBuilder; | ||||||
|  |     protected $logger; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public function __construct( | ||||||
|  |         Context $context,  | ||||||
|  |         PageFactory $pageFactory,  | ||||||
|  |         \Magento\Framework\Message\ManagerInterface $messageManager, | ||||||
|  |         StateInterface $inlineTranslation, | ||||||
|  |         Escaper $escaper, | ||||||
|  |         TransportBuilder $transportBuilder, | ||||||
|  |         \Magento\Framework\App\Helper\Context $helperContext | ||||||
|  |     ) | ||||||
|  |     { | ||||||
|  |         $this->pageFactory = $pageFactory; | ||||||
|  |         $this->messageManager = $messageManager; | ||||||
|  |         $this->resultFactory = $context->getResultFactory(); | ||||||
|  |         $this->inlineTranslation = $inlineTranslation; | ||||||
|  |         $this->escaper = $escaper; | ||||||
|  |         $this->transportBuilder = $transportBuilder; | ||||||
|  |         $this->logger = $helperContext->getLogger(); | ||||||
|  |         parent::__construct($context); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public function execute() | ||||||
|  |     { | ||||||
|  |         $page = $this->resultFactory->create(ResultFactory::TYPE_PAGE); | ||||||
|  |         $data = $this->getRequest()->getPostValue(); | ||||||
|  |         if (!empty($data)) { | ||||||
|  |             if (!array_key_exists("name", $data)) { | ||||||
|  |                 $this->messageManager->addError(__("The field name is invalid")); | ||||||
|  |             } else if (!array_key_exists("company_name", $data)) { | ||||||
|  |                 $this->messageManager->addError(__("The field company name is invalid")); | ||||||
|  |             } else if (!array_key_exists("email", $data)) { | ||||||
|  |                 $this->messageManager->addError(__("The field email is invalid")); | ||||||
|  |             } else if (!array_key_exists("phone", $data)) { | ||||||
|  |                 $this->messageManager->addError(__("The field phone is invalid")); | ||||||
|  |             } else if (!array_key_exists("date", $data)) { | ||||||
|  |                 $this->messageManager->addError(__("The field date is invalid")); | ||||||
|  |             } else if (!array_key_exists("items", $data)) { | ||||||
|  |                 $this->messageManager->addError(__("The field items is invalid")); | ||||||
|  |             }else { | ||||||
|  |                 $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  |                 $scopeConfig = $objectManager->create('\Magento\Framework\App\Config\ScopeConfigInterface'); | ||||||
|  |                 $email_contact = $scopeConfig->getValue('trans_email/ident_general/email',\Magento\Store\Model\ScopeInterface::SCOPE_STORE); | ||||||
|  |                 $customerSession = $objectManager->create('Magento\Customer\Model\Session'); | ||||||
|  |                 try { | ||||||
|  |                     $this->inlineTranslation->suspend(); | ||||||
|  |                     $sender = [ | ||||||
|  |                         'name' => $this->escaper->escapeHtml($data["name"]), | ||||||
|  |                         'email' => $this->escaper->escapeHtml($data["email"]), | ||||||
|  |                     ]; | ||||||
|  |                     $transport = $this->transportBuilder | ||||||
|  |                         ->setTemplateIdentifier('email_asset_recovery_template') | ||||||
|  |                         ->setTemplateOptions( | ||||||
|  |                             [ | ||||||
|  |                                 'area' => \Magento\Framework\App\Area::AREA_FRONTEND, | ||||||
|  |                                 'store' => \Magento\Store\Model\Store::DEFAULT_STORE_ID, | ||||||
|  |                             ] | ||||||
|  |                         ) | ||||||
|  |                         ->setTemplateVars([ | ||||||
|  |                             'name'  => $data["name"], | ||||||
|  |                             'email'  => $data["email"], | ||||||
|  |                             'company_name'  => $data["company_name"], | ||||||
|  |                             'phone'  => $data["phone"], | ||||||
|  |                             'date'  => $data["date"], | ||||||
|  |                             'items'  => nl2br($data["items"]), | ||||||
|  | 
 | ||||||
|  |                         ]) | ||||||
|  |                         ->setFrom($sender) | ||||||
|  |                         ->addTo($email_contact) | ||||||
|  |                         ->getTransport(); | ||||||
|  |                     $transport->sendMessage(); | ||||||
|  |                     $this->inlineTranslation->resume(); | ||||||
|  |                     $this->messageManager->addSuccess(__("Thanks you. We'll respond to you very soon.")); | ||||||
|  |                 } catch (\Exception $e) { | ||||||
|  |                     $this->logger->debug($e->getMessage()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  |         return $page; | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,27 @@ | ||||||
|  | { | ||||||
|  |     "name": "ipsupply/assetrecovery", | ||||||
|  |     "description": "Asset Recovery form", | ||||||
|  |     "require": { | ||||||
|  |         "php": "~7.1.3||~7.2.0", | ||||||
|  |         "lib-libxml": "*", | ||||||
|  |         "magento/framework": "102.0.*", | ||||||
|  |         "magento/module-backend": "101.0.*", | ||||||
|  |         "magento/module-media-storage": "100.3.*", | ||||||
|  |         "magento/module-store": "101.0.*", | ||||||
|  |         "magento/module-ui": "101.1.*" | ||||||
|  |     }, | ||||||
|  |     "type": "magento2-module", | ||||||
|  |     "version": "100.3.0", | ||||||
|  |     "license": [ | ||||||
|  |         "OSL-3.0", | ||||||
|  |         "AFL-3.0" | ||||||
|  |     ], | ||||||
|  |     "autoload": { | ||||||
|  |         "files": [ | ||||||
|  |             "registration.php" | ||||||
|  |         ], | ||||||
|  |         "psr-4": { | ||||||
|  |             "IpSupply\\AssetRecovery\\": "" | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,4 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Email:etc/email_templates.xsd"> | ||||||
|  |     <template id="email_asset_recovery_template" label="This is email Asset Recovery" file="email_asset_recovery_template.html" type="html" module="IpSupply_AssetRecovery" area="frontend"/> | ||||||
|  | </config> | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd"> | ||||||
|  |     <router id="standard"> | ||||||
|  |         <route id="assetrecovery" frontName="asset-recovery"> | ||||||
|  |             <module name="IpSupply_AssetRecovery"/> | ||||||
|  |         </route> | ||||||
|  |     </router> | ||||||
|  | </config> | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> | ||||||
|  |     <module name="IpSupply_AssetRecovery" setup_version="1.0.0"> | ||||||
|  |     </module> | ||||||
|  | </config> | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | \Magento\Framework\Component\ComponentRegistrar::register( | ||||||
|  |     \Magento\Framework\Component\ComponentRegistrar::MODULE, | ||||||
|  |     'IpSupply_AssetRecovery', | ||||||
|  |     __DIR__ | ||||||
|  | ); | ||||||
|  | @ -0,0 +1,32 @@ | ||||||
|  | <!--@subject {{trans "Asset recovery"}}  @--> | ||||||
|  | {{template config_path="design/email/header_template"}} | ||||||
|  | <table> | ||||||
|  |     <tr> | ||||||
|  |         <td>Name : </td> | ||||||
|  |         <td>{{var name}}</td> | ||||||
|  |     </tr> | ||||||
|  |     <tr> | ||||||
|  |         <td>Email : </td> | ||||||
|  |         <td>{{var email}}</td> | ||||||
|  |     </tr> | ||||||
|  |     <tr> | ||||||
|  |         <td>Company : </td> | ||||||
|  |         <td>{{var company_name}}</td> | ||||||
|  |     </tr> | ||||||
|  |     <tr> | ||||||
|  |         <td>Phone : </td> | ||||||
|  |         <td>{{var phone}}</td> | ||||||
|  |     </tr> | ||||||
|  |     <tr> | ||||||
|  |         <td>Date : </td> | ||||||
|  |         <td>{{var date}}</td> | ||||||
|  |     </tr> | ||||||
|  |     <tr> | ||||||
|  |         <td>Items : </td> | ||||||
|  |         <td>{{var items|raw }}</td> | ||||||
|  |     </tr> | ||||||
|  | 
 | ||||||
|  | </table> | ||||||
|  | <br> | ||||||
|  | <br> | ||||||
|  | {{template config_path="design/email/footer_template"}} | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> | ||||||
|  |     <head> | ||||||
|  |         <title>Asset Recovery</title> | ||||||
|  |     </head> | ||||||
|  | 
 | ||||||
|  |     <referenceBlock name="content"> | ||||||
|  |         <block class="IpSupply\AssetRecovery\Block\Form" name="ip_supply_asset_recovery_form" template="Form.phtml" /> | ||||||
|  |     </referenceBlock> | ||||||
|  | </page> | ||||||
|  | @ -0,0 +1,100 @@ | ||||||
|  | <div class="columns"> | ||||||
|  |     <div class="column main"> | ||||||
|  |         <div class="cart-container"> | ||||||
|  |             <div class="cart-summary" style="top: 0px;"> | ||||||
|  |                 <h4>SELL YOUR EXCESS ASSET</h4> | ||||||
|  |                 <p> | ||||||
|  |                     Now there’s a simple way to dispose of the excess assets that let you get the best value for your | ||||||
|  |                     old network. Our Asset Recovery service offers you a range of flexible solutions. | ||||||
|  |                 </p> | ||||||
|  |                 <p> | ||||||
|  |                     Just follow 2 simple steps: | ||||||
|  |                 </p> | ||||||
|  |                 <div> | ||||||
|  |                     <ul> | ||||||
|  |                         <li> | ||||||
|  |                             A Fair Market Value Assessment of your equipment. | ||||||
|  |                         </li> | ||||||
|  |                         <li> | ||||||
|  |                             Then choose to sell it for instant cash or trade it in as credit towards new purchases. | ||||||
|  |                         </li> | ||||||
|  |                     </ul> | ||||||
|  |                 </div> | ||||||
|  | 
 | ||||||
|  |             </div> | ||||||
|  |             <form class="form contact form-cart " action="<?php echo $this->getBaseUrl(); ?>asset-recovery" | ||||||
|  |                 method="POST" data-mage-init='{"validation":{}}'> | ||||||
|  |                 <?= $block->getBlockHtml('formkey') ?> | ||||||
|  |                 <fieldset class="fieldset"> | ||||||
|  |                     <div class="field name required"> | ||||||
|  |                         <label class="label" for="name"><span>Contact Name</span></label> | ||||||
|  |                         <div class="control"> | ||||||
|  |                             <input name="name" id="name" title="Name" value="" class="input-text" type="text" | ||||||
|  |                                 data-validate="{required:true}" aria-required="true"> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                     <div class="field name required"> | ||||||
|  |                         <label class="label" for="company_name"><span>Company name</span></label> | ||||||
|  |                         <div class="control"> | ||||||
|  |                             <input name="company_name" id="company_name" title="Company name" value="" | ||||||
|  |                                 class="input-text" type="text" data-validate="{required:true}" aria-required="true"> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                     <div class="field email required"> | ||||||
|  |                         <label class="label" for="email"><span>Email Address</span></label> | ||||||
|  |                         <div class="control"> | ||||||
|  |                             <input name="email" id="email" title="Email" value="" class="input-text" type="email" | ||||||
|  |                                 data-validate="{required:true, 'validate-email':true}" aria-required="true"> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                     <div class="field telephone required"> | ||||||
|  |                         <label class="label" for="telephone"><span>Mobile Number</span></label> | ||||||
|  |                         <div class="control"> | ||||||
|  |                             <input name="phone" id="telephone" title="Phone Number" value="" class="input-text" | ||||||
|  |                                 type="text" data-validate="{required:true}"> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                     <div class="field date required"> | ||||||
|  |                         <label class="label" for="date"><span>Date</span></label> | ||||||
|  |                         <legend>Please use this date format: dd/mm/yyyy.</legend> | ||||||
|  |                         <div class="control"> | ||||||
|  |                             <!-- <input name="date" id="date" title="Date" value="" class="input-text" | ||||||
|  |                                 type="text" data-validate="{required:true}"> --> | ||||||
|  |                             <input  data-validate="{required:true,'validate-date-au' : true}" type="text" name="date" id="datepicker" value="" class="datepicker input-text"> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  | 
 | ||||||
|  |                     <div class="field items required"> | ||||||
|  |                         <label class="label" for="note"><span>Item list</span></label> | ||||||
|  |                         <legend>Please input follow the rule Model, Qty, Condition, Description</legend> | ||||||
|  |                         <div class="control"> | ||||||
|  |                             <textarea name="items" id="items" title="items" class="input-text" cols="5" rows="5" | ||||||
|  |                                 aria-required="true" | ||||||
|  |                                 placeholder="WS-C3850-48U-E, 1x, USEB, face damage and can not boot" | ||||||
|  |                                 data-validate="{required:true}"></textarea> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                 </fieldset> | ||||||
|  |                 <div class="actions-toolbar"> | ||||||
|  |                     <div class="primary"> | ||||||
|  |                         <button type="submit" title="Submit" class="action submit primary"> | ||||||
|  |                             <span>Send Us</span> | ||||||
|  |                         </button> | ||||||
|  |                     </div> | ||||||
|  |                 </div> | ||||||
|  |             </form> | ||||||
|  | 
 | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | </div> | ||||||
|  | <script> | ||||||
|  | require(["jquery", "mage/calendar"], function($) { | ||||||
|  |     $("#datepicker").datepicker({ | ||||||
|  |         dateFormat: 'dd/mm/yy', | ||||||
|  |         changeMonth: true, | ||||||
|  |         changeYear: true, | ||||||
|  |         yearRange: '2010:2025', | ||||||
|  |         showMonthAfterYear: false, | ||||||
|  |     }) | ||||||
|  | }); | ||||||
|  | </script> | ||||||
|  | @ -0,0 +1,40 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\CartToQuote\Api; | ||||||
|  | interface CartItemInterface | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  | * POST | ||||||
|  | * @param string[] $data | ||||||
|  | * @return string | ||||||
|  | */ | ||||||
|  | public function addItem($data); | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  | * POST | ||||||
|  | * @param string[] $data | ||||||
|  | * @return string | ||||||
|  | */ | ||||||
|  | public function updateItem($data); | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  | * POST | ||||||
|  | * @param string[] $data | ||||||
|  | * @return string | ||||||
|  | */ | ||||||
|  | public function removeItem($data); | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  | * POST | ||||||
|  | * @param string[] $data | ||||||
|  | * @return string | ||||||
|  | */ | ||||||
|  | public function clearItem($data); | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  | * get | ||||||
|  | * @return string | ||||||
|  | */ | ||||||
|  | public function getData(); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,11 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\CartToQuote\Api; | ||||||
|  | interface SendMailInterface | ||||||
|  | { | ||||||
|  | /** | ||||||
|  | * POST for test api | ||||||
|  | * @param string[] $data | ||||||
|  | * @return string | ||||||
|  | */ | ||||||
|  | public function sendEmail($data); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,29 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\CartToQuote\Block\Customer\History; | ||||||
|  | 
 | ||||||
|  | class Detail extends \Magento\Framework\View\Element\Template | ||||||
|  | {        | ||||||
|  |     protected  $carttDetailFactory; | ||||||
|  |     public function __construct( | ||||||
|  |         \Magento\Backend\Block\Template\Context $context,  | ||||||
|  |         \IpSupply\CartToQuote\Model\CartDetailFactory $carttDetailFactory,        | ||||||
|  |         array $data = [] | ||||||
|  |     ) | ||||||
|  |     {   | ||||||
|  |         $this->carttDetailFactory =  $carttDetailFactory;     | ||||||
|  |         parent::__construct($context, $data); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function getItems($customerId) | ||||||
|  |     { | ||||||
|  |         $id = (int) $this->getRequest()->getParam('id'); | ||||||
|  |         $collection = $this->carttDetailFactory->create()->getCollection(); | ||||||
|  |         $data = $collection->addFieldToFilter('quote_history_id', ['eq' => $id]) | ||||||
|  |             ->addFieldToFilter('customer_id', ['eq' => $customerId]) | ||||||
|  |             ->setOrder('name','DESC') | ||||||
|  |             ->getData(); | ||||||
|  |         return $data; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | ?>
 | ||||||
|  | @ -0,0 +1,46 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\CartToQuote\Block\Customer\History; | ||||||
|  | 
 | ||||||
|  | class Quote extends \Magento\Framework\View\Element\Template | ||||||
|  | { | ||||||
|  |     protected $carttHistoryFactory; | ||||||
|  |     public function __construct( | ||||||
|  |         \Magento\Backend\Block\Template\Context $context, | ||||||
|  |         \IpSupply\CartToQuote\Model\CartHistoryFactory $carttHistoryFactory, | ||||||
|  |         array $data = [] | ||||||
|  |     ) | ||||||
|  |     { | ||||||
|  |         $this->carttHistoryFactory = $carttHistoryFactory; | ||||||
|  |         parent::__construct($context, $data); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function getCarttHistories($customerId) | ||||||
|  |     { | ||||||
|  |         $current_page = (int) $this->getRequest()->getParam('current_page'); | ||||||
|  |         if ($current_page == 0) { | ||||||
|  |             $current_page = 1; | ||||||
|  |         } | ||||||
|  |         $size = (int) $this->getRequest()->getParam('size'); | ||||||
|  |         if ($size == 0) { | ||||||
|  |             $size = 20; | ||||||
|  |         } | ||||||
|  |         $collection = $this->carttHistoryFactory->create()->getCollection(); | ||||||
|  |         $data = $collection->addFieldToFilter('customer_id', ['eq' => $customerId]) | ||||||
|  |             ->setOrder('date','DESC') | ||||||
|  |             ->setPageSize($size) | ||||||
|  |             ->setCurPage($current_page) | ||||||
|  |             ->getData(); | ||||||
|  |         $collection = $this->carttHistoryFactory->create()->getCollection(); | ||||||
|  |         $total = $collection->addFieldToFilter('customer_id', ['eq' => $customerId]) | ||||||
|  |             ->count(); | ||||||
|  |         $result = array( | ||||||
|  |             "data" => $data, | ||||||
|  |             "total" => $total, | ||||||
|  |             "current_page" => $current_page, | ||||||
|  |             "size" => $size | ||||||
|  |         ); | ||||||
|  |         return $result; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | ?>
 | ||||||
|  | @ -0,0 +1,11 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Block; | ||||||
|  | 
 | ||||||
|  | class Quote extends \Magento\Framework\View\Element\Template | ||||||
|  | { | ||||||
|  |     protected function _prepareLayout() | ||||||
|  |     { | ||||||
|  |         return parent::_prepareLayout(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,11 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Block; | ||||||
|  | 
 | ||||||
|  | class View extends \Magento\Framework\View\Element\Template | ||||||
|  | { | ||||||
|  |     protected function _prepareLayout() | ||||||
|  |     { | ||||||
|  |         return parent::_prepareLayout(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,23 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Controller\Cart; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\App\Action\Context; | ||||||
|  | use Magento\Framework\View\Result\PageFactory; | ||||||
|  | 
 | ||||||
|  | class Detail extends \Magento\Framework\App\Action\Action { | ||||||
|  | 
 | ||||||
|  |     protected $pageFactory; | ||||||
|  | 
 | ||||||
|  |     public function __construct(Context $context, PageFactory $pageFactory) | ||||||
|  |     { | ||||||
|  |         $this->pageFactory = $pageFactory; | ||||||
|  |         parent::__construct($context); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function execute() | ||||||
|  |     { | ||||||
|  |         return $this->pageFactory->create(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,23 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Controller\Cart; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\App\Action\Context; | ||||||
|  | use Magento\Framework\View\Result\PageFactory; | ||||||
|  | 
 | ||||||
|  | class History extends \Magento\Framework\App\Action\Action { | ||||||
|  | 
 | ||||||
|  |     protected $pageFactory; | ||||||
|  | 
 | ||||||
|  |     public function __construct(Context $context, PageFactory $pageFactory) | ||||||
|  |     { | ||||||
|  |         $this->pageFactory = $pageFactory; | ||||||
|  |         parent::__construct($context); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function execute() | ||||||
|  |     { | ||||||
|  |         return $this->pageFactory->create(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,23 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Controller\Cart; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\App\Action\Context; | ||||||
|  | use Magento\Framework\View\Result\PageFactory; | ||||||
|  | 
 | ||||||
|  | class Index extends \Magento\Framework\App\Action\Action { | ||||||
|  | 
 | ||||||
|  |     protected $pageFactory; | ||||||
|  | 
 | ||||||
|  |     public function __construct(Context $context, PageFactory $pageFactory) | ||||||
|  |     { | ||||||
|  |         $this->pageFactory = $pageFactory; | ||||||
|  |         parent::__construct($context); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function execute() | ||||||
|  |     { | ||||||
|  |         return $this->pageFactory->create(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,89 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Controller\Quote; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\App\Action\Context; | ||||||
|  | use Magento\Framework\View\Result\PageFactory; | ||||||
|  | 
 | ||||||
|  | class AddItem extends \Magento\Framework\App\Action\Action { | ||||||
|  | 
 | ||||||
|  |     protected $pageFactory; | ||||||
|  |     protected $cartItemFactory; | ||||||
|  |     protected $_customerRepositoryInterface; | ||||||
|  |     protected $request; | ||||||
|  |     protected $customerSession; | ||||||
|  |     protected $objectManager; | ||||||
|  | 
 | ||||||
|  |     public function __construct( | ||||||
|  |         Context $context, | ||||||
|  |         PageFactory $pageFactory, | ||||||
|  |         \IpSupply\CartToQuote\Model\CartItemFactory $cartItemFactory, | ||||||
|  |         \Magento\Customer\Api\CustomerRepositoryInterface $customerRepositoryInterface, | ||||||
|  |         \Magento\Framework\Webapi\Rest\Request $request | ||||||
|  |         ) | ||||||
|  |     { | ||||||
|  |         $this->cartItemFactory = $cartItemFactory; | ||||||
|  |         $this->_customerRepositoryInterface = $customerRepositoryInterface; | ||||||
|  |         $this->request = $request; | ||||||
|  |         $this->objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  |         $this->customerSession = $this->objectManager->get(\Magento\Customer\Model\Session::class); | ||||||
|  | 
 | ||||||
|  |         parent::__construct($context); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private function getCartItems($customerId) { | ||||||
|  |         $collection = $this->cartItemFactory->create()->getCollection(); | ||||||
|  |         $data = $collection->addFieldToFilter('customer_id', ['eq' => $customerId]) | ||||||
|  |             ->setOrder('name','ASC') | ||||||
|  |             ->getData(); | ||||||
|  |         return $data; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private function isCartItem($item) { | ||||||
|  |         $collection = $this->cartItemFactory->create()->getCollection(); | ||||||
|  |         $count = $collection->addFieldToSelect('id') | ||||||
|  |             ->addFieldToFilter('customer_id', ['eq' => $item["customer_id"]]) | ||||||
|  |             ->addFieldToFilter('product_id', ['eq' => $item["product_id"]]) | ||||||
|  |             ->count(); | ||||||
|  |         if ($count > 0) { | ||||||
|  |              return true; | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private function addCartItem($item, $customer) { | ||||||
|  |         if (!$this->isCartItem($item)) { | ||||||
|  |             $data = $this->cartItemFactory->create()->addData([ | ||||||
|  |                 'email' => $customer->getEmail(), | ||||||
|  |                 'name' => $item["name"], | ||||||
|  |                 'sku' => $item["sku"], | ||||||
|  |                 'product_id' => $item["product_id"], | ||||||
|  |                 'qty' => $item["qty"], | ||||||
|  |                 'customer_id' => $customer->getId(), | ||||||
|  |                 'price' => $item["price"], | ||||||
|  |                 'url' => $item["url"], | ||||||
|  |                 'image' => $item["image"] | ||||||
|  |             ])->save(); | ||||||
|  |             return $data; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public function execute() | ||||||
|  |     { | ||||||
|  |         $data = json_decode(file_get_contents('php://input'), TRUE); | ||||||
|  |         if($this->customerSession->isLoggedIn()) { | ||||||
|  |             $customer = $this->customerSession->getCustomer(); | ||||||
|  |             $this->addCartItem($data, $customer); | ||||||
|  |             echo json_encode($this->getCartItems($customer->getId())); | ||||||
|  |             exit; | ||||||
|  |         } else { | ||||||
|  |             echo json_encode(array()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,63 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Controller\Quote; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\App\Action\Context; | ||||||
|  | use Magento\Framework\View\Result\PageFactory; | ||||||
|  | 
 | ||||||
|  | class Clean extends \Magento\Framework\App\Action\Action { | ||||||
|  | 
 | ||||||
|  |     protected $pageFactory; | ||||||
|  |     protected $cartItemFactory; | ||||||
|  |     protected $_customerRepositoryInterface; | ||||||
|  |     protected $request; | ||||||
|  |     protected $customerSession; | ||||||
|  |     protected $objectManager; | ||||||
|  | 
 | ||||||
|  |     public function __construct( | ||||||
|  |         Context $context, | ||||||
|  |         PageFactory $pageFactory, | ||||||
|  |         \IpSupply\CartToQuote\Model\CartItemFactory $cartItemFactory, | ||||||
|  |         \Magento\Customer\Api\CustomerRepositoryInterface $customerRepositoryInterface, | ||||||
|  |         \Magento\Framework\Webapi\Rest\Request $request | ||||||
|  |         ) | ||||||
|  |     { | ||||||
|  |         $this->cartItemFactory = $cartItemFactory; | ||||||
|  |         $this->_customerRepositoryInterface = $customerRepositoryInterface; | ||||||
|  |         $this->request = $request; | ||||||
|  |         $this->objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  |         $this->customerSession = $this->objectManager->get(\Magento\Customer\Model\Session::class); | ||||||
|  | 
 | ||||||
|  |         parent::__construct($context); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private function getCartItems($customerId) { | ||||||
|  |         $collection = $this->cartItemFactory->create()->getCollection(); | ||||||
|  |         $data = $collection->addFieldToFilter('customer_id', ['eq' => $customerId]) | ||||||
|  |             ->setOrder('name','ASC') | ||||||
|  |             ->getData(); | ||||||
|  |         return $data; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private function clearCartItem($customerId) { | ||||||
|  |         $collection = $this->cartItemFactory->create()->getCollection(); | ||||||
|  |         $count = $collection->addFieldToSelect('id') | ||||||
|  |             ->addFieldToFilter('customer_id', ['eq' => $customerId]) | ||||||
|  |             ->walk('delete'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public function execute() | ||||||
|  |     { | ||||||
|  |         if($this->customerSession->isLoggedIn()) { | ||||||
|  |             $customer = $this->customerSession->getCustomer(); | ||||||
|  |             $this->clearCartItem($customer->getId()); | ||||||
|  |             echo json_encode($this->getCartItems($customer->getId())); | ||||||
|  |             exit; | ||||||
|  |         } else { | ||||||
|  |             echo json_encode(array()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,54 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Controller\Quote; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\App\Action\Context; | ||||||
|  | use Magento\Framework\View\Result\PageFactory; | ||||||
|  | 
 | ||||||
|  | class Data extends \Magento\Framework\App\Action\Action { | ||||||
|  | 
 | ||||||
|  |     protected $pageFactory; | ||||||
|  |     protected $cartItemFactory; | ||||||
|  |     protected $_customerRepositoryInterface; | ||||||
|  |     protected $request; | ||||||
|  |     protected $customerSession; | ||||||
|  |     protected $objectManager; | ||||||
|  | 
 | ||||||
|  |     public function __construct( | ||||||
|  |         Context $context, | ||||||
|  |         PageFactory $pageFactory, | ||||||
|  |         \IpSupply\CartToQuote\Model\CartItemFactory $cartItemFactory, | ||||||
|  |         \Magento\Customer\Api\CustomerRepositoryInterface $customerRepositoryInterface, | ||||||
|  |         \Magento\Framework\Webapi\Rest\Request $request | ||||||
|  |         ) | ||||||
|  |     { | ||||||
|  |         $this->cartItemFactory = $cartItemFactory; | ||||||
|  |         $this->_customerRepositoryInterface = $customerRepositoryInterface; | ||||||
|  |         $this->request = $request; | ||||||
|  |         $this->objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  |         $this->customerSession = $this->objectManager->get(\Magento\Customer\Model\Session::class); | ||||||
|  | 
 | ||||||
|  |         parent::__construct($context); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private function getCartItems($customerId) { | ||||||
|  |         $collection = $this->cartItemFactory->create()->getCollection(); | ||||||
|  |         $data = $collection->addFieldToFilter('customer_id', ['eq' => $customerId]) | ||||||
|  |             ->setOrder('name','ASC') | ||||||
|  |             ->getData(); | ||||||
|  |         return $data; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function execute() | ||||||
|  |     { | ||||||
|  |         if($this->customerSession->isLoggedIn()) { | ||||||
|  |             $customer = $this->customerSession->getCustomer(); | ||||||
|  |             echo json_encode($this->getCartItems($customer->getId())); | ||||||
|  |             exit; | ||||||
|  |         } else { | ||||||
|  |             echo json_encode(array()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,169 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Controller\Request; | ||||||
|  | use Magento\Framework\Translate\Inline\StateInterface; | ||||||
|  | use Magento\Framework\Escaper; | ||||||
|  | use Magento\Framework\Mail\Template\TransportBuilder; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\App\Action\Context; | ||||||
|  | use Magento\Framework\View\Result\PageFactory; | ||||||
|  | use Magento\Framework\Controller\ResultFactory; | ||||||
|  | 
 | ||||||
|  | class Quote extends \Magento\Framework\App\Action\Action { | ||||||
|  | 
 | ||||||
|  |     protected $pageFactory; | ||||||
|  |     protected $_messageManager; | ||||||
|  |     protected $resultFactory; | ||||||
|  |     protected $inlineTranslation; | ||||||
|  |     protected $escaper; | ||||||
|  |     protected $transportBuilder; | ||||||
|  |     protected $logger; | ||||||
|  |     protected $carttHistoryFactory; | ||||||
|  |     protected $carttDetailFactory; | ||||||
|  |     protected $cartItemFactory; | ||||||
|  | 
 | ||||||
|  |     public function __construct( | ||||||
|  |         Context $context, | ||||||
|  |         PageFactory $pageFactory, | ||||||
|  |         \Magento\Framework\Message\ManagerInterface $messageManager, | ||||||
|  |         StateInterface $inlineTranslation, | ||||||
|  |         Escaper $escaper, | ||||||
|  |         TransportBuilder $transportBuilder, | ||||||
|  |         \Magento\Framework\App\Helper\Context $helperContext, | ||||||
|  |         \IpSupply\CartToQuote\Model\CartHistoryFactory $carttHistoryFactory, | ||||||
|  |         \IpSupply\CartToQuote\Model\CartDetailFactory $carttDetailFactory, | ||||||
|  |         \IpSupply\CartToQuote\Model\CartItemFactory $cartItemFactory | ||||||
|  |     ) | ||||||
|  |     { | ||||||
|  |         $this->pageFactory = $pageFactory; | ||||||
|  |         $this->messageManager = $messageManager; | ||||||
|  |         $this->resultFactory = $context->getResultFactory(); | ||||||
|  |         $this->inlineTranslation = $inlineTranslation; | ||||||
|  |         $this->escaper = $escaper; | ||||||
|  |         $this->transportBuilder = $transportBuilder; | ||||||
|  |         $this->logger = $helperContext->getLogger(); | ||||||
|  |         $this->carttHistoryFactory = $carttHistoryFactory; | ||||||
|  |         $this->carttDetailFactory = $carttDetailFactory; | ||||||
|  |         $this->cartItemFactory = $cartItemFactory; | ||||||
|  |         parent::__construct($context); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function addCartHistory($itemsTotal, $customerId) { | ||||||
|  |         $cartHistory = $this->carttHistoryFactory->create()->addData([ | ||||||
|  |             'items_total' => $itemsTotal, | ||||||
|  |             'customer_id' => $customerId | ||||||
|  |         ])->save(); | ||||||
|  |         return  $cartHistory->getId(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private function clearCartItem($customerId) { | ||||||
|  |         $collection = $this->cartItemFactory->create()->getCollection(); | ||||||
|  |         $count = $collection->addFieldToSelect('id') | ||||||
|  |             ->addFieldToFilter('customer_id', ['eq' => $customerId]) | ||||||
|  |             ->walk('delete'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function addCartDetail($quoteHistoryId, $items) { | ||||||
|  |         foreach ($items as $item) { | ||||||
|  |             $data = $this->carttDetailFactory->create()->addData([ | ||||||
|  |                 'product_id' => $item['product_id'], | ||||||
|  |                 'name' => $item['name'], | ||||||
|  |                 'url' => $item['url'], | ||||||
|  |                 'image' => $item['image'], | ||||||
|  |                 'sku' => $item['sku'], | ||||||
|  |                 'qty' => $item['qty'], | ||||||
|  |                 'price' => $item['price'], | ||||||
|  |                 'customer_id' => $item['customer_id'], | ||||||
|  |                 'quote_history_id' => $quoteHistoryId | ||||||
|  |             ])->save(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function getCartItems($customerId) { | ||||||
|  |         $collection = $this->cartItemFactory->create()->getCollection(); | ||||||
|  |         $data = $collection->addFieldToFilter('customer_id', ['eq' => $customerId]) | ||||||
|  |             ->setOrder('name','ASC') | ||||||
|  |             ->getData(); | ||||||
|  |         return $data; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function execute() | ||||||
|  |     { | ||||||
|  | 
 | ||||||
|  |         $page = $this->resultFactory->create(ResultFactory::TYPE_PAGE); | ||||||
|  |         $block = $page->getLayout()->getBlock('ip_supply_cart_to_quote_request_quote'); | ||||||
|  | 
 | ||||||
|  |         $data = $this->getRequest()->getPostValue(); | ||||||
|  |         if (!empty($data)) { | ||||||
|  |                 if (!array_key_exists("name", $data)) { | ||||||
|  |                     $this->messageManager->addError(__("The field name is invalid")); | ||||||
|  |                 } else if (!array_key_exists("company_name", $data)) { | ||||||
|  |                     $this->messageManager->addError(__("The field company name is invalid")); | ||||||
|  |                 } else if (!array_key_exists("email", $data)) { | ||||||
|  |                     $this->messageManager->addError(__("The field email is invalid")); | ||||||
|  |                 } else if (!array_key_exists("phone", $data)) { | ||||||
|  |                     $this->messageManager->addError(__("The field phone is invalid")); | ||||||
|  |                 } else if (!array_key_exists("inquiry", $data)) { | ||||||
|  |                     $this->messageManager->addError(__("The field inquiry is invalid")); | ||||||
|  |                 } else if (!array_key_exists("note", $data)) { | ||||||
|  |                     $this->messageManager->addError(__("The field note is invalid")); | ||||||
|  |                 }else { | ||||||
|  |                     $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  |                     $scopeConfig = $objectManager->create('\Magento\Framework\App\Config\ScopeConfigInterface'); | ||||||
|  |                     $email_contact = $scopeConfig->getValue('trans_email/ident_general/email',\Magento\Store\Model\ScopeInterface::SCOPE_STORE); | ||||||
|  |                     $customerSession = $objectManager->create('Magento\Customer\Model\Session'); | ||||||
|  |                     if ($customerSession->isLoggedIn()) { | ||||||
|  |                         $items = $this->getCartItems($customerSession->getCustomer()->getId()); | ||||||
|  |                         if (count($items) > 0) { | ||||||
|  |                             $cartHistoryId = $this->addCartHistory(count($items), $customerSession->getCustomer()->getId()); | ||||||
|  |                             if ($cartHistoryId > 0) { | ||||||
|  |                                 $this->addCartDetail($cartHistoryId, $items); | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                         $inquirys = array(); | ||||||
|  |                         foreach ($items as $item) { | ||||||
|  |                             array_push($inquirys, $item["sku"] . " : " . $item["qty"]); | ||||||
|  |                         } | ||||||
|  |                         $data["inquiry"] = implode(".",$inquirys); | ||||||
|  |                         $this->clearCartItem($customerSession->getCustomer()->getId()); | ||||||
|  |                     } | ||||||
|  |                     try { | ||||||
|  |                         $this->inlineTranslation->suspend(); | ||||||
|  |                         $sender = [ | ||||||
|  |                             'name' => $this->escaper->escapeHtml($data["name"]), | ||||||
|  |                             'email' => $this->escaper->escapeHtml($data["email"]), | ||||||
|  |                         ]; | ||||||
|  |                         $transport = $this->transportBuilder | ||||||
|  |                             ->setTemplateIdentifier('email_request_quote_template') | ||||||
|  |                             ->setTemplateOptions( | ||||||
|  |                                 [ | ||||||
|  |                                     'area' => \Magento\Framework\App\Area::AREA_FRONTEND, | ||||||
|  |                                     'store' => \Magento\Store\Model\Store::DEFAULT_STORE_ID, | ||||||
|  |                                 ] | ||||||
|  |                             ) | ||||||
|  |                             ->setTemplateVars([ | ||||||
|  |                                 'name'  => $data["name"], | ||||||
|  |                                 'email'  => $data["email"], | ||||||
|  |                                 'company_name'  => $data["company_name"], | ||||||
|  |                                 'phone'  => $data["phone"], | ||||||
|  |                                 'inquiry'  => str_replace(".","<br>",$data["inquiry"]), | ||||||
|  |                                 'note' => $data["note"], | ||||||
|  |                             ]) | ||||||
|  |                             ->setFrom($sender) | ||||||
|  |                             ->addTo($email_contact) | ||||||
|  |                             ->getTransport(); | ||||||
|  |                         $transport->sendMessage(); | ||||||
|  |                         $this->inlineTranslation->resume(); | ||||||
|  |                         $this->messageManager->addSuccess(__("Thank you. We'll get back to you very soon.")); | ||||||
|  |                     } catch (\Exception $e) { | ||||||
|  |                         $this->logger->debug($e->getMessage()); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         return $page; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Model; | ||||||
|  | 
 | ||||||
|  | class CartDetail extends \Magento\Framework\Model\AbstractModel | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     protected function _construct() | ||||||
|  |     { | ||||||
|  |         $this->_init('IpSupply\CartToQuote\Model\ResourceModel\CartDetail'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Model; | ||||||
|  | 
 | ||||||
|  | class CartHistory extends \Magento\Framework\Model\AbstractModel | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     protected function _construct() | ||||||
|  |     { | ||||||
|  |         $this->_init('IpSupply\CartToQuote\Model\ResourceModel\CartHistory'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Model; | ||||||
|  | 
 | ||||||
|  | class CartItem extends \Magento\Framework\Model\AbstractModel | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     protected function _construct() | ||||||
|  |     { | ||||||
|  |         $this->_init('IpSupply\CartToQuote\Model\ResourceModel\CartItem'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,184 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\CartToQuote\Model; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\App\Helper\Context; | ||||||
|  | use IpSupply\CartToQuote\Api\CartItemInterface; | ||||||
|  | use Magento\Framework\ObjectManagerInterface; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CartItemApi extends \Magento\Framework\App\Helper\AbstractHelper implements CartItemInterface | ||||||
|  | { | ||||||
|  |     protected $cartItemFactory; | ||||||
|  |     protected $_customerRepositoryInterface; | ||||||
|  |     protected $request; | ||||||
|  | 
 | ||||||
|  |     public function __construct( | ||||||
|  |         Context $context, | ||||||
|  |         \IpSupply\CartToQuote\Model\CartItemFactory $cartItemFactory, | ||||||
|  |         \Magento\Customer\Api\CustomerRepositoryInterface $customerRepositoryInterface, | ||||||
|  |         \Magento\Framework\Webapi\Rest\Request $request | ||||||
|  |     ) { | ||||||
|  |         $this->cartItemFactory = $cartItemFactory; | ||||||
|  |         $this->_customerRepositoryInterface = $customerRepositoryInterface; | ||||||
|  |         $this->request = $request; | ||||||
|  |         parent::__construct($context); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private function getCartItems($customerId) { | ||||||
|  |         $collection = $this->cartItemFactory->create()->getCollection(); | ||||||
|  |         $data = $collection->addFieldToFilter('customer_id', ['eq' => $customerId]) | ||||||
|  |             ->setOrder('name','ASC') | ||||||
|  |             ->getData(); | ||||||
|  |         return $data; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private function isCartItem($item) { | ||||||
|  |         $collection = $this->cartItemFactory->create()->getCollection(); | ||||||
|  |         $count = $collection->addFieldToSelect('id') | ||||||
|  |             ->addFieldToFilter('customer_id', ['eq' => $item["customer_id"]]) | ||||||
|  |             ->addFieldToFilter('product_id', ['eq' => $item["product_id"]]) | ||||||
|  |             ->count(); | ||||||
|  |         if ($count > 0) { | ||||||
|  |              return true; | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private function addCartItem($item) { | ||||||
|  |         if (!$this->isCartItem($item)) { | ||||||
|  |             $data = $this->cartItemFactory->create()->addData([ | ||||||
|  |                 'email' => $item["email"], | ||||||
|  |                 'name' => $item["name"], | ||||||
|  |                 'sku' => $item["sku"], | ||||||
|  |                 'product_id' => $item["product_id"], | ||||||
|  |                 'qty' => $item["qty"], | ||||||
|  |                 'customer_id' => $item["customer_id"], | ||||||
|  |                 'price' => $item["price"], | ||||||
|  |                 'url' => $item["url"], | ||||||
|  |                 'image' => $item["image"] | ||||||
|  |             ])->save(); | ||||||
|  |             return $data; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private function removeCartItem($item) { | ||||||
|  |         $collection = $this->cartItemFactory->create()->getCollection(); | ||||||
|  |         $count = $collection->addFieldToSelect('id') | ||||||
|  |             ->addFieldToFilter('customer_id', ['eq' => $item["customer_id"]]) | ||||||
|  |             ->addFieldToFilter('product_id', ['eq' => $item["product_id"]]) | ||||||
|  |             ->walk('delete'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private function clearCartItem($customerId) { | ||||||
|  |         $collection = $this->cartItemFactory->create()->getCollection(); | ||||||
|  |         $count = $collection->addFieldToSelect('id') | ||||||
|  |             ->addFieldToFilter('customer_id', ['eq' => $customerId]) | ||||||
|  |             ->walk('delete'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private function getCurrentCustomerId($data){ | ||||||
|  |         $customer = $this->_customerRepositoryInterface->getById($data['customer_id']); | ||||||
|  |         if ($customer) { | ||||||
|  |             if ($customer->getEmail() == $data['email']){ | ||||||
|  |                 return $customer->getId(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         $customerId = $this->sessionFactory->create()->getCustomer()->getId(); | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |     * POST | ||||||
|  |     * @param string[] $data | ||||||
|  |     * @return string | ||||||
|  |     */ | ||||||
|  |     public function addItem($data){ | ||||||
|  |         $currentCustomerId = $this->getCurrentCustomerId($data); | ||||||
|  |         if ($currentCustomerId == 0) { | ||||||
|  |             return []; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $data['customer_id'] = $currentCustomerId; | ||||||
|  | 
 | ||||||
|  |         if (!$this->isCartItem($data)) { | ||||||
|  |             $this->addCartItem($data); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         return $this->getCartItems($currentCustomerId); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |     * POST | ||||||
|  |     * @param string[] $data | ||||||
|  |     * @return string | ||||||
|  |     */ | ||||||
|  |     public function updateItem($data){ | ||||||
|  |         $currentCustomerId = $this->getCurrentCustomerId($data); | ||||||
|  |         if ($currentCustomerId == 0) { | ||||||
|  |             return []; | ||||||
|  |         } | ||||||
|  |         $data['customer_id'] = $currentCustomerId; | ||||||
|  | 
 | ||||||
|  |         if ($this->isCartItem($data)) { | ||||||
|  |             $this->removeCartItem($data); | ||||||
|  |             $this->addCartItem($data); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         return $this->getCartItems($currentCustomerId); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |     * POST | ||||||
|  |     * @param string[] $data | ||||||
|  |     * @return string | ||||||
|  |     */ | ||||||
|  |     public function removeItem($data){ | ||||||
|  |         $currentCustomerId = $this->getCurrentCustomerId($data); | ||||||
|  |         if ($currentCustomerId == 0) { | ||||||
|  |             return []; | ||||||
|  |         } | ||||||
|  |         $data['customer_id'] = $currentCustomerId; | ||||||
|  | 
 | ||||||
|  |         $this->removeCartItem($data); | ||||||
|  | 
 | ||||||
|  |         return $this->getCartItems($currentCustomerId); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |     * get | ||||||
|  |     * @return string | ||||||
|  |     */ | ||||||
|  |     public function getData(){ | ||||||
|  |         $par = $this->_request->getParams(); | ||||||
|  |         if (!array_key_exists('customer_id', $par) || !array_key_exists('email', $par)) { | ||||||
|  |             return []; | ||||||
|  |         } | ||||||
|  |         $currentCustomerId = $this->getCurrentCustomerId($par); | ||||||
|  |         if ($currentCustomerId == 0) { | ||||||
|  |             return []; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return $this->getCartItems($currentCustomerId); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |     * POST | ||||||
|  |     * @param string[] $data | ||||||
|  |     * @return string | ||||||
|  |     */ | ||||||
|  |     public function clearItem($data){ | ||||||
|  |         $currentCustomerId = $this->getCurrentCustomerId($data); | ||||||
|  |         if ($currentCustomerId == 0) { | ||||||
|  |             return []; | ||||||
|  |         } | ||||||
|  |         $this->clearCartItem($currentCustomerId); | ||||||
|  | 
 | ||||||
|  |         return $this->getCartItems($currentCustomerId); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Model\ResourceModel; | ||||||
|  | 
 | ||||||
|  | class CartDetail extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     protected function _construct() | ||||||
|  |     { | ||||||
|  |         // Table name + primary key column
 | ||||||
|  |         $this->_init('ip_supply_cart_to_quote_detail', 'id'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Model\ResourceModel\CartDetail; | ||||||
|  | 
 | ||||||
|  | class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     protected function _construct() | ||||||
|  |     { | ||||||
|  |         // Model + Resource Model
 | ||||||
|  |         $this->_init('IpSupply\CartToQuote\Model\CartDetail', 'IpSupply\CartToQuote\Model\ResourceModel\CartDetail'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Model\ResourceModel; | ||||||
|  | 
 | ||||||
|  | class CartHistory extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     protected function _construct() | ||||||
|  |     { | ||||||
|  |         // Table name + primary key column
 | ||||||
|  |         $this->_init('ip_supply_cart_to_quote_history', 'id'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Model\ResourceModel\CartHistory; | ||||||
|  | 
 | ||||||
|  | class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     protected function _construct() | ||||||
|  |     { | ||||||
|  |         // Model + Resource Model
 | ||||||
|  |         $this->_init('IpSupply\CartToQuote\Model\CartHistory', 'IpSupply\CartToQuote\Model\ResourceModel\CartHistory'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Model\ResourceModel; | ||||||
|  | 
 | ||||||
|  | class CartItem extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     protected function _construct() | ||||||
|  |     { | ||||||
|  |         // Table name + primary key column
 | ||||||
|  |         $this->_init('ip_supply_cart_to_quote_item', 'id'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CartToQuote\Model\ResourceModel\CartItem; | ||||||
|  | 
 | ||||||
|  | class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     protected function _construct() | ||||||
|  |     { | ||||||
|  |         // Model + Resource Model
 | ||||||
|  |         $this->_init('IpSupply\CartToQuote\Model\CartItem', 'IpSupply\CartToQuote\Model\ResourceModel\CartItem'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,165 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\CartToQuote\Setup; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\Setup\SchemaSetupInterface; | ||||||
|  | use Magento\Framework\Setup\ModuleContextInterface; | ||||||
|  | use Magento\Framework\DB\Ddl\Table; | ||||||
|  | 
 | ||||||
|  | class InstallSchema implements \Magento\Framework\Setup\InstallSchemaInterface | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     public function install(SchemaSetupInterface $setup, ModuleContextInterface $context) | ||||||
|  |     { | ||||||
|  |         $setup->startSetup(); | ||||||
|  | 
 | ||||||
|  |         $connection = $setup->getConnection(); | ||||||
|  |         $tableCartItem = $setup->getTable("ip_supply_cart_to_quote_item"); | ||||||
|  |         $tableCartHistory = $setup->getTable("ip_supply_cart_to_quote_history"); | ||||||
|  |         $tableCartdetail = $setup->getTable("ip_supply_cart_to_quote_detail"); | ||||||
|  | 
 | ||||||
|  |         if ($connection->isTableExists($tableCartItem) != true) { | ||||||
|  |             $table = $connection->newTable($tableCartItem)->addColumn( | ||||||
|  |                 'id', | ||||||
|  |                 Table::TYPE_INTEGER, | ||||||
|  |                 null, | ||||||
|  |                 ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'product_id', | ||||||
|  |                 Table::TYPE_INTEGER, | ||||||
|  |                 null, | ||||||
|  |                 ['nullable' => false] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'email', | ||||||
|  |                 Table::TYPE_TEXT, | ||||||
|  |                 255, | ||||||
|  |                 ['nullable' => false, 'default' => ''] | ||||||
|  |             ) | ||||||
|  |             ->addColumn( | ||||||
|  |                 'name', | ||||||
|  |                 Table::TYPE_TEXT, | ||||||
|  |                 255, | ||||||
|  |                 ['nullable' => false, 'default' => ''] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'url', | ||||||
|  |                 Table::TYPE_TEXT, | ||||||
|  |                 255, | ||||||
|  |                 ['nullable' => false, 'default' => ''] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'image', | ||||||
|  |                 Table::TYPE_TEXT, | ||||||
|  |                 255, | ||||||
|  |                 ['nullable' => false, 'default' => ''] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'sku', | ||||||
|  |                 Table::TYPE_TEXT, | ||||||
|  |                 255, | ||||||
|  |                 ['nullable' => false, 'default' => ''] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'qty', | ||||||
|  |                 Table::TYPE_INTEGER, | ||||||
|  |                 null, | ||||||
|  |                 ['nullable' => false, 'default' => 0] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'customer_id', | ||||||
|  |                 Table::TYPE_INTEGER, | ||||||
|  |                 null, | ||||||
|  |                 ['nullable' => false] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'price', | ||||||
|  |                 Table::TYPE_DECIMAL, | ||||||
|  |                 null, | ||||||
|  |                 ['nullable' => false, 'default' => 0, 'scale'=> 1, 'precision'=> 13] | ||||||
|  |             ) | ||||||
|  |             ->setOption('charset', 'utf8'); | ||||||
|  | 
 | ||||||
|  |             $connection->createTable($table); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if ($connection->isTableExists($tableCartHistory) != true) { | ||||||
|  |             $table = $connection->newTable($tableCartHistory)->addColumn( | ||||||
|  |                 'id', | ||||||
|  |                 Table::TYPE_INTEGER, | ||||||
|  |                 null, | ||||||
|  |                 ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'date', | ||||||
|  |                 Table::TYPE_TIMESTAMP, | ||||||
|  |                 null, | ||||||
|  |                 ['nullable' => false, 'default' => 'CURRENT_TIMESTAMP'] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'items_total', | ||||||
|  |                 Table::TYPE_INTEGER, | ||||||
|  |                 null, | ||||||
|  |                 ['nullable' => false] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'customer_id', | ||||||
|  |                 Table::TYPE_INTEGER, | ||||||
|  |                 null, | ||||||
|  |                 ['nullable' => false] | ||||||
|  |             ) | ||||||
|  |             ->setOption('charset', 'utf8'); | ||||||
|  | 
 | ||||||
|  |             $connection->createTable($table); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if ($connection->isTableExists($tableCartdetail) != true) { | ||||||
|  |             $table = $connection->newTable($tableCartdetail)->addColumn( | ||||||
|  |                 'id', | ||||||
|  |                 Table::TYPE_INTEGER, | ||||||
|  |                 null, | ||||||
|  |                 ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'product_id', | ||||||
|  |                 Table::TYPE_INTEGER, | ||||||
|  |                 null, | ||||||
|  |                 ['nullable' => false] | ||||||
|  |             ) | ||||||
|  |             ->addColumn( | ||||||
|  |                 'name', | ||||||
|  |                 Table::TYPE_TEXT, | ||||||
|  |                 255, | ||||||
|  |                 ['nullable' => false, 'default' => ''] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'url', | ||||||
|  |                 Table::TYPE_TEXT, | ||||||
|  |                 255, | ||||||
|  |                 ['nullable' => false, 'default' => ''] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'image', | ||||||
|  |                 Table::TYPE_TEXT, | ||||||
|  |                 255, | ||||||
|  |                 ['nullable' => false, 'default' => ''] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'sku', | ||||||
|  |                 Table::TYPE_TEXT, | ||||||
|  |                 255, | ||||||
|  |                 ['nullable' => false, 'default' => ''] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'qty', | ||||||
|  |                 Table::TYPE_INTEGER, | ||||||
|  |                 null, | ||||||
|  |                 ['nullable' => false, 'default' => 0] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'customer_id', | ||||||
|  |                 Table::TYPE_INTEGER, | ||||||
|  |                 null, | ||||||
|  |                 ['nullable' => false] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'price', | ||||||
|  |                 Table::TYPE_DECIMAL, | ||||||
|  |                 null, | ||||||
|  |                 ['nullable' => false, 'default' => 0, 'scale'=> 1, 'precision'=> 13] | ||||||
|  |             )->addColumn( | ||||||
|  |                 'quote_history_id', | ||||||
|  |                 Table::TYPE_INTEGER, | ||||||
|  |                 null, | ||||||
|  |                 ['nullable' => false] | ||||||
|  |             ) | ||||||
|  |             ->setOption('charset', 'utf8'); | ||||||
|  | 
 | ||||||
|  |             $connection->createTable($table); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $setup->endSetup(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,27 @@ | ||||||
|  | { | ||||||
|  |     "name": "ipsupply/carttoquote", | ||||||
|  |     "description": "cart to quote", | ||||||
|  |     "require": { | ||||||
|  |         "php": "~7.1.3||~7.2.0", | ||||||
|  |         "lib-libxml": "*", | ||||||
|  |         "magento/framework": "102.0.*", | ||||||
|  |         "magento/module-backend": "101.0.*", | ||||||
|  |         "magento/module-media-storage": "100.3.*", | ||||||
|  |         "magento/module-store": "101.0.*", | ||||||
|  |         "magento/module-ui": "101.1.*" | ||||||
|  |     }, | ||||||
|  |     "type": "magento2-module", | ||||||
|  |     "version": "100.3.0", | ||||||
|  |     "license": [ | ||||||
|  |         "OSL-3.0", | ||||||
|  |         "AFL-3.0" | ||||||
|  |     ], | ||||||
|  |     "autoload": { | ||||||
|  |         "files": [ | ||||||
|  |             "registration.php" | ||||||
|  |         ], | ||||||
|  |         "psr-4": { | ||||||
|  |             "IpSupply\\CartToQuote\\": "" | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | <?xml version="1.0" ?> | ||||||
|  | <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> | ||||||
|  |      | ||||||
|  |     <preference for="IpSupply\CartToQuote\Api\CartItemInterface" type="IpSupply\CartToQuote\Model\CartItemApi"/> | ||||||
|  | 
 | ||||||
|  | </config> | ||||||
|  | @ -0,0 +1,4 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Email:etc/email_templates.xsd"> | ||||||
|  | <template id="email_request_quote_template" label="This is email request quote" file="email_request_quote_template.html" type="html" module="IpSupply_CartToQuote" area="frontend"/> | ||||||
|  | </config> | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd"> | ||||||
|  |     <router id="standard"> | ||||||
|  |         <route id="carttoquote" frontName="carttoquote"> | ||||||
|  |             <module name="IpSupply_CartToQuote" /> | ||||||
|  |         </route> | ||||||
|  |     </router> | ||||||
|  | </config> | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> | ||||||
|  |     <module name="IpSupply_CartToQuote" setup_version="1.0.0"> | ||||||
|  |     </module> | ||||||
|  | </config> | ||||||
|  | @ -0,0 +1,33 @@ | ||||||
|  | <?xml version="1.0" ?> | ||||||
|  | <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd"> | ||||||
|  |     <route url="/V1/request/quote/add_item/" method="POST"> | ||||||
|  |         <service class="IpSupply\CartToQuote\Api\CartItemInterface" method="addItem"/> | ||||||
|  |         <resources> | ||||||
|  |             <resource ref="anonymous"/> | ||||||
|  |         </resources> | ||||||
|  |     </route> | ||||||
|  |     <route url="/V1/request/quote/get_data/" method="GET"> | ||||||
|  |         <service class="IpSupply\CartToQuote\Api\CartItemInterface" method="getData"/> | ||||||
|  |         <resources> | ||||||
|  |             <resource ref="anonymous"/> | ||||||
|  |         </resources> | ||||||
|  |     </route> | ||||||
|  |     <route url="/V1/request/quote/remove_item/" method="POST"> | ||||||
|  |         <service class="IpSupply\CartToQuote\Api\CartItemInterface" method="removeItem"/> | ||||||
|  |         <resources> | ||||||
|  |             <resource ref="anonymous"/> | ||||||
|  |         </resources> | ||||||
|  |     </route> | ||||||
|  |     <route url="/V1/request/quote/update_item/" method="POST"> | ||||||
|  |         <service class="IpSupply\CartToQuote\Api\CartItemInterface" method="updateItem"/> | ||||||
|  |         <resources> | ||||||
|  |             <resource ref="anonymous"/> | ||||||
|  |         </resources> | ||||||
|  |     </route> | ||||||
|  |     <route url="/V1/request/quote/clear_item/" method="POST"> | ||||||
|  |         <service class="IpSupply\CartToQuote\Api\CartItemInterface" method="clearItem"/> | ||||||
|  |         <resources> | ||||||
|  |             <resource ref="anonymous"/> | ||||||
|  |         </resources> | ||||||
|  |     </route> | ||||||
|  | </routes> | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | \Magento\Framework\Component\ComponentRegistrar::register( | ||||||
|  |     \Magento\Framework\Component\ComponentRegistrar::MODULE, | ||||||
|  |     'IpSupply_CartToQuote', | ||||||
|  |     __DIR__ | ||||||
|  | ); | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | <!--@subject {{trans "Request Quote"}}  @--> | ||||||
|  | {{template config_path="design/email/header_template"}} | ||||||
|  | <h3 style="margin-top:0;margin-bottom:0px">New request quote detail</h3> | ||||||
|  | <table> | ||||||
|  |     <td style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;vertical-align:top;background-color:#fff;padding:25px"> | ||||||
|  |         <p style="margin-top:0;margin-bottom:10px">Name: {{var name}}</p> | ||||||
|  |         <p style="margin-top:0;margin-bottom:10px">Email: {{var email|raw}}</p> | ||||||
|  |         <p style="margin-top:0;margin-bottom:10px">Company: {{var company_name}}</p> | ||||||
|  |         <p style="margin-top:0;margin-bottom:10px">Phone: {{var phone}}</p> | ||||||
|  |         <p style="margin-top:0;margin-bottom:10px"><b>Inquiry</b>: <b style="font-weight: normal; border: 1px solid #dfdfdf;padding: 5px 10px;">{{var inquiry|raw }}</b></p> | ||||||
|  |         <p style="margin-top:0;margin-bottom:10px">Note: {{var note|raw }}</p> | ||||||
|  |     </td> | ||||||
|  | 
 | ||||||
|  | </table> | ||||||
|  | {{template config_path="design/email/footer_template"}} | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> | ||||||
|  |     <update handle="customer_account"/> | ||||||
|  |     <head> | ||||||
|  |         <title> | ||||||
|  |             History Quotes Detail | ||||||
|  |         </title> | ||||||
|  |     </head> | ||||||
|  |     <body> | ||||||
|  |         <referenceContainer name="content"> | ||||||
|  |             <block class="IpSupply\CartToQuote\Block\Customer\History\Detail" name="cartToQuote.customer.history_quote.detail" template="IpSupply_CartToQuote::customer/history/detail.phtml" cacheable="false" /> | ||||||
|  |         </referenceContainer> | ||||||
|  |     </body> | ||||||
|  | </page> | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> | ||||||
|  |     <update handle="customer_account"/> | ||||||
|  |     <head> | ||||||
|  |         <title> | ||||||
|  |             History Quotes  | ||||||
|  |         </title> | ||||||
|  |     </head> | ||||||
|  |     <body> | ||||||
|  |         <referenceContainer name="content"> | ||||||
|  |             <block class="IpSupply\CartToQuote\Block\Customer\History\Quote" name="cartToQuote.customer.history_quote.index" template="IpSupply_CartToQuote::customer/history/quote.phtml" cacheable="false" /> | ||||||
|  |         </referenceContainer> | ||||||
|  |     </body> | ||||||
|  | </page> | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> | ||||||
|  |     <head> | ||||||
|  |         <title>Cart Quotes</title> | ||||||
|  |     </head> | ||||||
|  | 
 | ||||||
|  |     <referenceBlock name="content"> | ||||||
|  |         <block class="IpSupply\CartToQuote\Block\View" name="ip_supply_cart_to_quote_detail" template="view.phtml" /> | ||||||
|  |     </referenceBlock> | ||||||
|  | </page> | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> | ||||||
|  |     <update handle="customer_account"/> | ||||||
|  |     <head> | ||||||
|  |         <title> | ||||||
|  |             History Quotes  | ||||||
|  |         </title> | ||||||
|  |     </head> | ||||||
|  |     <body> | ||||||
|  |         <referenceContainer name="content"> | ||||||
|  |             <block class="IpSupply\CartToQuote\Block\Customer\History\Quote" name="cartToQuote.customer.history_quote.index" template="IpSupply_CartToQuote::customer/history/quote.phtml" cacheable="false" /> | ||||||
|  |         </referenceContainer> | ||||||
|  |     </body> | ||||||
|  | </page> | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> | ||||||
|  |     <head> | ||||||
|  |         <title>Organise a quote</title> | ||||||
|  |     </head> | ||||||
|  | 
 | ||||||
|  |     <referenceBlock name="content"> | ||||||
|  |         <block class="IpSupply\CartToQuote\Block\Quote" name="ip_supply_cart_to_quote_request_quote" template="quote.phtml" /> | ||||||
|  |     </referenceBlock> | ||||||
|  | </page> | ||||||
|  | @ -0,0 +1,16 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <!-- | ||||||
|  | /** | ||||||
|  |  * Copyright © Magento, Inc. All rights reserved. | ||||||
|  |  * See COPYING.txt for license details. | ||||||
|  |  */ | ||||||
|  | --> | ||||||
|  | <page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> | ||||||
|  |     <body> | ||||||
|  |         <referenceBlock name="product.info"> | ||||||
|  |             <action method="setTemplate"> | ||||||
|  |                 <argument name="template" xsi:type="string">IpSupply_CartToQuote::product/view/form.phtml</argument> | ||||||
|  |             </action> | ||||||
|  |         </referenceBlock> | ||||||
|  |     </body> | ||||||
|  | </page> | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> | ||||||
|  |     <body> | ||||||
|  |     <referenceBlock name="customer_account_navigation"> | ||||||
|  |         <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-demo-link"> | ||||||
|  |             <arguments> | ||||||
|  |                 <argument name="path" xsi:type="string">carttoquote/cart/history</argument> | ||||||
|  |                 <argument name="label" xsi:type="string">History Quotes</argument> | ||||||
|  |             </arguments> | ||||||
|  |         </block> | ||||||
|  |     </referenceBlock> | ||||||
|  |     </body> | ||||||
|  | </page> | ||||||
|  | @ -0,0 +1,16 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <!-- | ||||||
|  | /** | ||||||
|  |  * Copyright © Magento, Inc. All rights reserved. | ||||||
|  |  * See COPYING.txt for license details. | ||||||
|  |  */ | ||||||
|  | --> | ||||||
|  | <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> | ||||||
|  |     <body> | ||||||
|  |         <referenceBlock name="top.search"> | ||||||
|  |             <action method="setTemplate"> | ||||||
|  |                 <argument name="template" xsi:type="string">IpSupply_CartToQuote::form.mini.phtml</argument> | ||||||
|  |             </action> | ||||||
|  |         </referenceBlock> | ||||||
|  |     </body> | ||||||
|  | </page> | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <!-- | ||||||
|  | /** | ||||||
|  |  * Copyright © 2015 Magento. All rights reserved. | ||||||
|  |  * See COPYING.txt for license details. | ||||||
|  |  */ | ||||||
|  | --> | ||||||
|  | <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> | ||||||
|  |     <head> | ||||||
|  |        <css src="IpSupply_CartToQuote::css/cart_to_quote.css"/> | ||||||
|  |        <script src="IpSupply_CartToQuote::js/toast.min.js" /> | ||||||
|  |     </head> | ||||||
|  | </page> | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | var config = { | ||||||
|  |     map: { | ||||||
|  |         '*': { | ||||||
|  |             "cart_to_quote": 'IpSupply_CartToQuote/js/cart_to_quote' | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | @ -0,0 +1,49 @@ | ||||||
|  | <?php | ||||||
|  | $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  | $customerSession = $objectManager->create('Magento\Customer\Model\Session'); | ||||||
|  | if ($customerSession->isLoggedIn()) { | ||||||
|  |     $items = $block->getItems($customerSession->getCustomer()->getId()); | ||||||
|  |     if (count($items) == 0 ) { | ||||||
|  |         ?> | ||||||
|  |         <div class="message info empty"><span>You have placed no Items.</span></div> | ||||||
|  |         <?php | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         ?> | ||||||
|  |             <div class="table-wrapper orders-history"> | ||||||
|  |                 <table class="data table table-order-items history" id="my-quote-table"> | ||||||
|  |                     <caption class="table-caption">Orders</caption> | ||||||
|  |                     <thead> | ||||||
|  |                         <tr> | ||||||
|  |                             <th scope="col" class="col id">#</th> | ||||||
|  |                             <th scope="col" class="col id">Product Name</th> | ||||||
|  |                             <th scope="col" class="col date">SKU</th> | ||||||
|  |                             <th scope="col" class="col total">Qty</th> | ||||||
|  |                         </tr> | ||||||
|  |                     </thead> | ||||||
|  |                     <tbody> | ||||||
|  |                         <?php  | ||||||
|  |                         foreach ($items as $item) { | ||||||
|  |                             ?> | ||||||
|  |                             <tr> | ||||||
|  |                                 <td> | ||||||
|  |                                     <img src="<?php echo  $item['image']; ?>" | ||||||
|  |                                         style="width:100px"> | ||||||
|  |                                 </td> | ||||||
|  |                                 <td data-th="Product Name #" class="col id"><?php echo  $item['name']; ?></td> | ||||||
|  |                                 <td data-th="SKU" class="col date"><?php echo  $item['sku']; ?></td> | ||||||
|  |                                 <td data-th="Qty" class="col shipping"><?php echo  $item['qty']; ?></td> | ||||||
|  |                             </tr> | ||||||
|  |                         <?php | ||||||
|  |                         } | ||||||
|  |                          | ||||||
|  |                         ?> | ||||||
|  |                     </tbody> | ||||||
|  |                 </table> | ||||||
|  |             </div> | ||||||
|  |         <?php | ||||||
|  |     } | ||||||
|  | ?>     | ||||||
|  | <?php | ||||||
|  | } | ||||||
|  | ?> | ||||||
|  | @ -0,0 +1,133 @@ | ||||||
|  | <?php | ||||||
|  | $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  | $customerSession = $objectManager->create('Magento\Customer\Model\Session'); | ||||||
|  | if ($customerSession->isLoggedIn()) { | ||||||
|  |     $cart = $block->getCarttHistories($customerSession->getCustomer()->getId()); | ||||||
|  |     if (count($cart["data"]) == 0 ) { | ||||||
|  |         ?> | ||||||
|  |     <div class="message info empty"><span>You have placed no Items.</span></div> | ||||||
|  |         <?php | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         ?> | ||||||
|  | <div class="table-wrapper orders-history"> | ||||||
|  |     <table class="data table table-order-items history" id="my-quote-table"> | ||||||
|  |         <caption class="table-caption">Orders</caption> | ||||||
|  |         <thead> | ||||||
|  |             <tr> | ||||||
|  |                 <th scope="col" class="col id">Id #</th> | ||||||
|  |                 <th scope="col" class="col date">Date</th> | ||||||
|  |                 <th scope="col" class="col total">Items Total</th> | ||||||
|  |                 <th scope="col" class="col actions">Action</th> | ||||||
|  |             </tr> | ||||||
|  |         </thead> | ||||||
|  |         <tbody> | ||||||
|  |             <?php | ||||||
|  |             foreach ($cart["data"] as $item) { | ||||||
|  |                 ?> | ||||||
|  |             <tr> | ||||||
|  |                 <td data-th="Order #" class="col id"><?php echo $item['id']  ?></td> | ||||||
|  |                 <td data-th="Date" class="col date"><?php echo $item['date']  ?></td> | ||||||
|  |                 <td data-th="Items Total" class="col shipping"><?php echo $item['items_total']  ?></td> | ||||||
|  |                 <td data-th="Actions" class="col actions"> | ||||||
|  |                     <a href="<?php echo $this->getBaseUrl() .'carttoquote/cart'; ?>/detail?id=<?php echo $item['id']; ?>" | ||||||
|  |                         class="action view"> | ||||||
|  |                         <span>View</span> | ||||||
|  |                     </a> | ||||||
|  |                 </td> | ||||||
|  |             </tr> | ||||||
|  |             <?php | ||||||
|  |                 } | ||||||
|  |             ?> | ||||||
|  | 
 | ||||||
|  |         </tbody> | ||||||
|  |     </table> | ||||||
|  | </div> | ||||||
|  | <?php | ||||||
|  |         if ( $cart["total"] > count($cart["data"]) ) { | ||||||
|  |             ?> | ||||||
|  | 
 | ||||||
|  |             <div class="pages"> | ||||||
|  |                 <strong class="label pages-label" id="paging-label">Page</strong> | ||||||
|  |                 <ul class="items pages-items" aria-labelledby="paging-label"> | ||||||
|  |                     <?php | ||||||
|  |                         if ($cart["current_page"] > 1) { | ||||||
|  |                             ?> | ||||||
|  |                             <li class="item pages-item-previous"> | ||||||
|  |                                 <a class="action  previous" | ||||||
|  |                                     href="<?php echo $this->getBaseUrl() .'carttoquote/cart/history?size='.$cart["size"].'¤t_page='.($cart["current_page"] - 1 ); ?>" | ||||||
|  |                                     title="Previous"> | ||||||
|  |                                     <span class="label">Page</span> | ||||||
|  |                                     <span>Previous</span> | ||||||
|  |                                 </a> | ||||||
|  |                             </li> | ||||||
|  |                             <?php | ||||||
|  |                         } | ||||||
|  |                     ?> | ||||||
|  | 
 | ||||||
|  |                     <?php | ||||||
|  |                     $totalPage = (int) ($cart["total"] / $cart["size"]); | ||||||
|  |                     if ( ( $cart["total"] % $cart["size"]) > 0 ) { | ||||||
|  |                         $totalPage = $totalPage + 1; | ||||||
|  |                     } | ||||||
|  |                     $start = $cart["current_page"] - 2; | ||||||
|  |                     if ($start < 1) { | ||||||
|  |                         $start = 1; | ||||||
|  |                     } | ||||||
|  |                     $end  = $cart["current_page"] + 2; | ||||||
|  |                     if ($end > $totalPage) { | ||||||
|  |                         $end = $totalPage; | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     if ($end > $start) { | ||||||
|  |                         for ($i = $start; $i <= $end; $i++) { | ||||||
|  |                             if ($i == $cart["current_page"] || ( $totalPage == $i && $cart["current_page"] > $totalPage)) { | ||||||
|  |                                 ?> | ||||||
|  |                                 <li class="item current"> | ||||||
|  |                                     <strong class="page"> | ||||||
|  |                                         <span class="label">You're currently reading page</span> | ||||||
|  |                                         <span><?php echo $i; ?></span> | ||||||
|  |                                     </strong> | ||||||
|  |                                 </li> | ||||||
|  |                                 <?php | ||||||
|  | 
 | ||||||
|  |                             } | ||||||
|  |                             else { | ||||||
|  |                                 ?> | ||||||
|  |                                 <li class="item"> | ||||||
|  |                                     <a href="<?php echo $this->getBaseUrl() .'carttoquote/cart/history?size='.$cart["size"].'¤t_page='.$i; ?>" | ||||||
|  |                                         class="page"> | ||||||
|  |                                         <span class="label">Page</span> | ||||||
|  |                                         <span><?php  echo  $i; ?></span> | ||||||
|  |                                     </a> | ||||||
|  |                                 </li> | ||||||
|  | 
 | ||||||
|  |                                 <?php | ||||||
|  |                             } | ||||||
|  | 
 | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     if ( $totalPage > $cart["current_page"]) { | ||||||
|  |                     ?> | ||||||
|  |                         <li class="item pages-item-next"> | ||||||
|  |                             <a class="action  next" href="<?php echo $this->getBaseUrl() .'carttoquote/cart/history?size='.$cart["size"].'¤t_page='.($cart["current_page"] + 1 ); ?>" title="Next"> | ||||||
|  |                                 <span class="label">Page</span> | ||||||
|  |                                 <span>Next</span> | ||||||
|  |                             </a> | ||||||
|  |                         </li> | ||||||
|  |                     <?php | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     ?> | ||||||
|  | 
 | ||||||
|  |                 </ul> | ||||||
|  |             </div> | ||||||
|  | 
 | ||||||
|  |         <?php | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | ?> | ||||||
|  | <?php | ||||||
|  | } | ||||||
|  | ?> | ||||||
|  | @ -0,0 +1,95 @@ | ||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * Copyright © Magento, Inc. All rights reserved. | ||||||
|  |  * See COPYING.txt for license details. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | // @codingStandardsIgnoreFile | ||||||
|  | ?> | ||||||
|  | <?php | ||||||
|  | /** @var $block \Magento\Framework\View\Element\Template */ | ||||||
|  | /** @var $helper \Magento\Search\Helper\Data */ | ||||||
|  | $helper = $this->helper(\Magento\Search\Helper\Data::class); | ||||||
|  | $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  | $request = $objectManager->get('\Magento\Framework\App\Request\Http'); | ||||||
|  | if ($request->getFullActionName() == 'catalog_category_view') { | ||||||
|  |     ?> | ||||||
|  |     <script> | ||||||
|  |     require(['jquery'], function($) { | ||||||
|  |         $("#maincontent").addClass("page-categories"); | ||||||
|  |     }); | ||||||
|  |     </script> | ||||||
|  |     <?php | ||||||
|  | } | ||||||
|  | $customerSession = $objectManager->create('Magento\Customer\Model\Session'); | ||||||
|  | $email = ""; | ||||||
|  | $customer_id = ""; | ||||||
|  | if ($customerSession->isLoggedIn()) { | ||||||
|  |     $email = $customerSession->getCustomer()->getEmail(); | ||||||
|  |     $customer_id = $customerSession->getCustomer()->getId(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ?> | ||||||
|  | 
 | ||||||
|  | <div class="block block-search"> | ||||||
|  |     <div class="block block-title"><strong><?= /* @escapeNotVerified */ __('Search') ?></strong></div> | ||||||
|  |     <div class="block block-content"> | ||||||
|  |         <form class="form minisearch" id="search_mini_form" action="<?= /* @escapeNotVerified */ $helper->getResultUrl() ?>" method="get"> | ||||||
|  |             <div class="field search"> | ||||||
|  |                 <label class="label" for="search" data-role="minisearch-label"> | ||||||
|  |                     <span><?= /* @escapeNotVerified */ __('Search') ?></span> | ||||||
|  |                 </label> | ||||||
|  |                 <div class="control"> | ||||||
|  |                     <input id="search" | ||||||
|  |                            data-mage-init='{"quickSearch":{ | ||||||
|  |                                 "formSelector":"#search_mini_form", | ||||||
|  |                                 "url":"<?= /* @escapeNotVerified */ $helper->getSuggestUrl()?>", | ||||||
|  |                                 "destinationSelector":"#search_autocomplete"} | ||||||
|  |                            }' | ||||||
|  |                            type="text" | ||||||
|  |                            name="<?= /* @escapeNotVerified */ $helper->getQueryParamName() ?>" | ||||||
|  |                            value="<?= /* @escapeNotVerified */ $helper->getEscapedQueryText() ?>" | ||||||
|  |                            placeholder="<?= /* @escapeNotVerified */ __('Search entire store here...') ?>" | ||||||
|  |                            class="input-text" | ||||||
|  |                            maxlength="<?= /* @escapeNotVerified */ $helper->getMaxQueryLength() ?>" | ||||||
|  |                            role="combobox" | ||||||
|  |                            aria-haspopup="false" | ||||||
|  |                            aria-autocomplete="both" | ||||||
|  |                            autocomplete="off"/> | ||||||
|  |                     <div id="search_autocomplete" class="search-autocomplete"></div> | ||||||
|  |                     <?= $block->getChildHtml() ?> | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="actions"> | ||||||
|  |                 <button type="submit" | ||||||
|  |                         title="<?= $block->escapeHtml(__('Search')) ?>" | ||||||
|  |                         class="action search"> | ||||||
|  |                     <span><?= /* @escapeNotVerified */ __('Search') ?></span> | ||||||
|  |                 </button> | ||||||
|  |             </div> | ||||||
|  |         </form> | ||||||
|  |     </div> | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  |     require(['jquery'], function($) { | ||||||
|  |         $( document ).ready(function() { | ||||||
|  |             if ($(".stock.unavailable span").length > 0 ) { | ||||||
|  |                 $(".stock.unavailable span").html("Price on request"); | ||||||
|  |                 $(".stock.unavailable").show(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             $( document ).ajaxComplete(function( event, xhr, settings ) { | ||||||
|  |                 if (settings.url.includes("mageworx_searchsuiteautocomplete/ajax/index")) { | ||||||
|  |                     $(".qs-option-price .normal-price .price").each(function( index ) { | ||||||
|  |                         $(this).html("From " + $(this).html()); | ||||||
|  |                     }); | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  |     </script> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @ -0,0 +1,99 @@ | ||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * Copyright © Magento, Inc. All rights reserved. | ||||||
|  |  * See COPYING.txt for license details. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | // @codingStandardsIgnoreFile | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Product view template | ||||||
|  |  * | ||||||
|  |  * @var $block \Magento\Catalog\Block\Product\View | ||||||
|  |  */ | ||||||
|  | ?> | ||||||
|  | <?php $_helper = $this->helper('Magento\Catalog\Helper\Output'); ?> | ||||||
|  | <?php | ||||||
|  | $_product = $block->getProduct(); | ||||||
|  | $configId = $_product->getTypeId(); | ||||||
|  | $price = round($_product->getPrice(), 2); | ||||||
|  | if ($configId == 'configurable') { | ||||||
|  |     $regularPrice = $_product->getPriceInfo()->getPrice('regular_price'); | ||||||
|  |     $price = $regularPrice->getMinRegularAmount(); | ||||||
|  | } | ||||||
|  | $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  | $customerSession = $objectManager->create('Magento\Customer\Model\Session'); | ||||||
|  | $email = ""; | ||||||
|  | $customer_id = 0; | ||||||
|  | //echo $_product->getId() . '_' . $_product->getSku(); | ||||||
|  | // die; | ||||||
|  | 
 | ||||||
|  | if ($customerSession->isLoggedIn()) { | ||||||
|  |     // $customerSession->getCustomerId();  // get Customer Id | ||||||
|  |     // $customerSession->getCustomerGroupId(); | ||||||
|  |     // $customerSession->getCustomer(); | ||||||
|  |     // $customerSession->getCustomerData(); | ||||||
|  |     $email = $customerSession->getCustomer()->getEmail(); | ||||||
|  |     $customer_id = $customerSession->getCustomer()->getId(); | ||||||
|  | } | ||||||
|  | ?> | ||||||
|  | <script> | ||||||
|  |     //alert("<?= $_product->getId(); ?>") | ||||||
|  |     console.log("id : ","<?php echo $_product->getId(); ?>"); | ||||||
|  |     window._product = { | ||||||
|  |         product_id : "<?php echo $_product->getId(); ?>", | ||||||
|  |         sku : "<?php echo $_product->getSku(); ?>", | ||||||
|  |         name : "<?php echo str_replace(array('"',"'"),"",$_product->getName()); ?>", | ||||||
|  |         price : <?php echo $price; ?>, | ||||||
|  |         qty : 1, | ||||||
|  |         email : "<?php echo $email; ?>", | ||||||
|  |         customer_id : "<?php echo $customer_id; ?>", | ||||||
|  |         image : "<?php echo str_replace(array( '\\'),"/",$block->getImage($block->getProduct(), 'product_base_image')->getImageUrl()) ?>", | ||||||
|  |         url : "<?php echo $_product->getProductUrl(); ?>" | ||||||
|  |     }; | ||||||
|  | </script> | ||||||
|  | <div class="product attribute"> | ||||||
|  |         <!-- <button disabled="disabled" title="Add to Quote" id="product-addtocartquote-button"> | ||||||
|  |             <span>Add to Quote</span> | ||||||
|  |         </button> --> | ||||||
|  | </div> | ||||||
|  | <div class="product-add-form"> | ||||||
|  |     <form data-product-sku="<?= $block->escapeHtml($_product->getSku()) ?>" | ||||||
|  |           action="<?= /* @NoEscape */ $block->getSubmitUrl($_product) ?>" method="post" | ||||||
|  |           id="product_addtocart_form"<?php if ($_product->getOptions()): ?> enctype="multipart/form-data"<?php endif; ?>> | ||||||
|  |         <input type="hidden" name="product" value="<?= /* @escapeNotVerified */ $_product->getId() ?>" /> | ||||||
|  |         <input type="hidden" name="selected_configurable_option" value="" /> | ||||||
|  |         <input type="hidden" name="related_product" id="related-products-field" value="" /> | ||||||
|  |         <input type="hidden" name="item"  value="<?= /* @noEscape */ $block->getRequest()->getParam('id') ?>" /> | ||||||
|  |         <?= $block->getBlockHtml('formkey') ?> | ||||||
|  |         <?= $block->getChildHtml('form_top') ?> | ||||||
|  |         <?php if (!$block->hasOptions()):?> | ||||||
|  |             <?= $block->getChildHtml('product_info_form_content') ?> | ||||||
|  |         <?php else:?> | ||||||
|  |             <?php if ($block->getOptionsContainer() == 'container1'):?> | ||||||
|  |                 <?= $block->getChildChildHtml('options_container') ?> | ||||||
|  |             <?php endif;?> | ||||||
|  |         <?php endif; ?> | ||||||
|  | 
 | ||||||
|  |         <?php if ($block->hasOptions() && $block->getOptionsContainer() == 'container2'):?> | ||||||
|  |             <?= $block->getChildChildHtml('options_container') ?> | ||||||
|  |         <?php endif;?> | ||||||
|  |         <?= $block->getChildHtml('form_bottom') ?> | ||||||
|  |     </form> | ||||||
|  | </div> | ||||||
|  | <script> | ||||||
|  |     require([ | ||||||
|  |         'jquery', | ||||||
|  |         'priceBox' | ||||||
|  |     ], function($){ | ||||||
|  |         var dataPriceBoxSelector = '[data-role=priceBox]', | ||||||
|  |             dataProductIdSelector = '[data-product-id=<?= $block->escapeHtml($_product->getId()) ?>]', | ||||||
|  |             priceBoxes = $(dataPriceBoxSelector + dataProductIdSelector); | ||||||
|  | 
 | ||||||
|  |         priceBoxes = priceBoxes.filter(function(index, elem){ | ||||||
|  |             return !$(elem).find('.price-from').length; | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         priceBoxes.priceBox({'priceConfig': <?= /* @escapeNotVerified */ $block->getJsonConfig() ?>}); | ||||||
|  |     }); | ||||||
|  | </script> | ||||||
|  | @ -0,0 +1,112 @@ | ||||||
|  | 
 | ||||||
|  | <div class="columns"> | ||||||
|  |     <div class="column main"> | ||||||
|  | 
 | ||||||
|  |         <div class="cart-container"> | ||||||
|  |             <div class="cart-summary" style="top: 0px;"> | ||||||
|  |                 <h4>How to bulk quote processing? <?php echo $block->getData('postData');  ?></h4> | ||||||
|  |                 <div> | ||||||
|  |                     <ul> | ||||||
|  |                         <li> | ||||||
|  |                             Fill your basic information in the form (keep in mind the require fields) | ||||||
|  |                         </li> | ||||||
|  |                         <li> | ||||||
|  |                             Add model name and quantities to “Inquiry detail” | ||||||
|  |                         </li> | ||||||
|  |                         <li> | ||||||
|  |                             Review your full selection in the form | ||||||
|  |                         </li> | ||||||
|  |                         <li> | ||||||
|  |                             Click “Send Us” | ||||||
|  |                         </li> | ||||||
|  |                         <li> | ||||||
|  |                             Alternatively call us on +61 2 8061 6886, and we'll get back to you as soon as possible. | ||||||
|  |                         </li> | ||||||
|  |                     </ul> | ||||||
|  |                 </div> | ||||||
|  | 
 | ||||||
|  |             </div> | ||||||
|  |             <form class="form contact form-cart form-quote" action="<?php echo $this->getBaseUrl(); ?>carttoquote/request/quote" method="POST" data-mage-init='{"validation":{}}'> | ||||||
|  |                 <?= $block->getBlockHtml('formkey') ?> | ||||||
|  |                 <fieldset class="fieldset"> | ||||||
|  |                     <div class="field name required"> | ||||||
|  |                         <label class="label" for="name"><span>Name</span></label> | ||||||
|  |                         <div class="control"> | ||||||
|  |                             <input name="name" id="name" title="Name" value="" class="input-text" type="text" | ||||||
|  |                                 data-validate="{required:true}" aria-required="true"> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                     <div class="field name required"> | ||||||
|  |                         <label class="label" for="company_name"><span>Company name</span></label> | ||||||
|  |                         <div class="control"> | ||||||
|  |                             <input name="company_name" id="company_name" title="Company name" value="" | ||||||
|  |                                 class="input-text" type="text"  data-validate="{required:true}" aria-required="true"> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                     <div class="field email required"> | ||||||
|  |                         <label class="label" for="email"><span>Email</span></label> | ||||||
|  |                         <div class="control"> | ||||||
|  |                             <input name="email" id="email" title="Email" value="" class="input-text" type="email" | ||||||
|  |                                 data-validate="{required:true, 'validate-email':true}" aria-required="true"> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                     <div class="field telephone "> | ||||||
|  |                         <label class="label" for="telephone"><span>Phone Number</span></label> | ||||||
|  |                         <div class="control"> | ||||||
|  |                             <input name="phone" id="telephone" title="Phone Number" value="" class="input-text" | ||||||
|  |                                 type="text"> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                     <div class="field inquiry required"> | ||||||
|  |                         <label class="label" for="inquiry"><span>Inquiry detail</span></label> | ||||||
|  |                         <div class="control"> | ||||||
|  |                             <textarea readonly name="inquiry" id="inquiry" title="Inquiry" class="input-text" | ||||||
|  |                                 cols="5" rows="5" data-validate="{required:true}" aria-required="true"></textarea> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  | 
 | ||||||
|  |                     <div class="field note"> | ||||||
|  |                         <label class="label" for="note"><span>Note</span></label> | ||||||
|  |                         <div class="control"> | ||||||
|  |                             <textarea name="note" id="note" title="Note" class="input-text" | ||||||
|  |                                 cols="5" rows="5" aria-required="true"></textarea> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                 </fieldset> | ||||||
|  |                 <div class="actions-toolbar"> | ||||||
|  |                     <div class="primary"> | ||||||
|  |                         <button type="submit" title="Submit" class="action submit primary"> | ||||||
|  |                             <span>Send Us</span> | ||||||
|  |                         </button> | ||||||
|  |                     </div> | ||||||
|  |                 </div> | ||||||
|  |             </form> | ||||||
|  | 
 | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | </div> | ||||||
|  | <script> | ||||||
|  |     require(['jquery', 'cart_to_quote'], function($, cart_to_quote) { | ||||||
|  | 
 | ||||||
|  |         $( document ).ready(function() { | ||||||
|  |             window.isCleanCart = 0; | ||||||
|  |             function listenCleanCart() { | ||||||
|  |                 console.log("message-success.success.message : ", $(".message-success.success.message").length); | ||||||
|  |                 if ($(".message-success.success.message").length > 0) { | ||||||
|  |                     window.isCleanCart = 6; | ||||||
|  |                     cart_to_quote.clearItems(); | ||||||
|  |                     cart_to_quote.updateCounternumber(); | ||||||
|  |                 } | ||||||
|  |                 // 10 second listen | ||||||
|  |                 if (window.isCleanCart < 6) { | ||||||
|  |                     window.isCleanCart++; | ||||||
|  |                     setTimeout(function() { | ||||||
|  |                         listenCleanCart(); | ||||||
|  |                     }, 1000); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             listenCleanCart(); | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |     }); | ||||||
|  | </script> | ||||||
|  | @ -0,0 +1,46 @@ | ||||||
|  | 
 | ||||||
|  | <div class="columns"> | ||||||
|  |     <div class="column main"> | ||||||
|  | 
 | ||||||
|  |         <div class="cart-container"> | ||||||
|  |             <div class="cart-summary" style="top: 0px;"> | ||||||
|  |                 <strong class="summary title">Request Quote</strong> | ||||||
|  |                 <br> | ||||||
|  |                 <h3 class="total-cart-quote"></h3> | ||||||
|  |                 <ul class="checkout methods items checkout-methods-items"> | ||||||
|  |                     <li class="item"> <a href="<?php echo $this->getBaseUrl() .'carttoquote/request/quote'; ?>" type="button" data-role="proceed-to-checkout" title="Submit" | ||||||
|  |                             class="action primary checkout"> | ||||||
|  |                             <span>Submit</span> | ||||||
|  |                             </a> | ||||||
|  |                     </li> | ||||||
|  |                 </ul> | ||||||
|  |             </div> | ||||||
|  |             <div id="form-validate" | ||||||
|  |                 class="form form-cart cart-quote"> | ||||||
|  |                 <div class="cart table-wrapper"> | ||||||
|  |                     <table id="shopping-cart-table" class="cart items data table"> | ||||||
|  |                         <caption role="heading" aria-level="2" class="table-caption">Shopping Cart Items</caption> | ||||||
|  |                         <thead> | ||||||
|  |                             <tr> | ||||||
|  |                                 <th class="col item" scope="col"><span>Item</span></th> | ||||||
|  |                                 <!-- <th class="col price" scope="col"><span>Price</span></th> --> | ||||||
|  |                                 <th class="col qty" scope="col"><span>Qty</span></th> | ||||||
|  |                                 <th class="col subtotal" scope="col"><span>Action</span></th> | ||||||
|  |                             </tr> | ||||||
|  |                         </thead> | ||||||
|  |                         <tbody class="cart item cart-quote-content"> | ||||||
|  | 
 | ||||||
|  |                         </tbody> | ||||||
|  |                     </table> | ||||||
|  |                 </div> | ||||||
|  |                 <div class="cart main actions"> | ||||||
|  |                     <button class="cart-quote-clean" style="display:none"> | ||||||
|  |                         <span>Clean Cart</span> | ||||||
|  |                     </button> | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  | 
 | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 8.4 KiB | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 8.6 KiB | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 16 KiB | 
|  | @ -0,0 +1,484 @@ | ||||||
|  | define([ | ||||||
|  |     "jquery" | ||||||
|  | ], function($){ | ||||||
|  |     "use strict"; | ||||||
|  |     var cart_to_quote = { | ||||||
|  |         dataname : "cart_to_quote", | ||||||
|  |         init : function() { | ||||||
|  |             //this.displayAddToQuoteButton();
 | ||||||
|  |             this.updateCounternumber(); | ||||||
|  |             this.bindClickAddToQuote(); | ||||||
|  |             this.renderCartQuotedetail(); | ||||||
|  |             this.bindClickCleanCart(); | ||||||
|  |             this.updateInquiry(); | ||||||
|  |             console.log("cart_to_quote init"); | ||||||
|  |         }, | ||||||
|  |         getData : function() { | ||||||
|  |             if (this.dataname in localStorage) { | ||||||
|  |                 return JSON.parse(localStorage.getItem(this.dataname)); | ||||||
|  |             } else { | ||||||
|  |                 return null; | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         setData : function(data) { | ||||||
|  |             localStorage.setItem(this.dataname, JSON.stringify(data)); | ||||||
|  |         }, | ||||||
|  |         getCurrentEmail : function() { | ||||||
|  |             if ("email" in localStorage) { | ||||||
|  |                 return localStorage.getItem("email"); | ||||||
|  |             } else { | ||||||
|  |                 return ""; | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         setCurrentEmail : function(email) { | ||||||
|  |            localStorage.setItem("email", email); | ||||||
|  |         }, | ||||||
|  |         addItem : function(item) { | ||||||
|  |             if (!this.isExistItem(item)) { | ||||||
|  |                 var data = []; | ||||||
|  |                 if (this.dataname in localStorage) { | ||||||
|  |                     data = JSON.parse(localStorage.getItem(this.dataname)); | ||||||
|  |                     data.push(item); | ||||||
|  |                     localStorage.setItem(this.dataname, JSON.stringify(data)); | ||||||
|  | 
 | ||||||
|  |                 } else { | ||||||
|  |                     data.push(item) | ||||||
|  |                     localStorage.setItem(this.dataname, JSON.stringify(data)); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         updateQtyById : function(qty, product_id) { | ||||||
|  |             if (this.dataname in localStorage) { | ||||||
|  |                 var data = JSON.parse(localStorage.getItem(this.dataname)); | ||||||
|  |                 for (let i = 0; i < data.length; i++) { | ||||||
|  |                     if (data[i].product_id == product_id) { | ||||||
|  |                         data[i].qty = qty; | ||||||
|  |                         localStorage.setItem(this.dataname, JSON.stringify(data)); | ||||||
|  |                         break; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         deleteById : function(product_id) { | ||||||
|  |             if (this.dataname in localStorage) { | ||||||
|  |                 var data = JSON.parse(localStorage.getItem(this.dataname)); | ||||||
|  |                 for (let i = 0; i < data.length; i++) { | ||||||
|  |                     if (data[i].product_id == product_id) { | ||||||
|  |                         data.splice(i, 1); | ||||||
|  |                         localStorage.setItem(this.dataname, JSON.stringify(data)); | ||||||
|  |                         break; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         isData : function() { | ||||||
|  |             if (this.getData() != null) { | ||||||
|  |                 return true; | ||||||
|  |             } | ||||||
|  |             return false; | ||||||
|  |         }, | ||||||
|  |         isExistItem : function(item) { | ||||||
|  |             if (this.dataname in localStorage) { | ||||||
|  |                 var data = JSON.parse(localStorage.getItem(this.dataname)); | ||||||
|  |                 for (let i = 0; i < data.length; i++) { | ||||||
|  |                     if (data[i].product_id == item.product_id) { | ||||||
|  |                         return true; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             return false; | ||||||
|  |         }, | ||||||
|  |         getSizeItem : function(){ | ||||||
|  |             if (this.dataname in localStorage) { | ||||||
|  |                 return JSON.parse(localStorage.getItem(this.dataname)).length; | ||||||
|  |             } | ||||||
|  |             return 0; | ||||||
|  |         }, | ||||||
|  |         getItemByProductId : function(product_id){ | ||||||
|  |             if (this.dataname in localStorage) { | ||||||
|  |                 var data = JSON.parse(localStorage.getItem(this.dataname)); | ||||||
|  |                 for (let i = 0; i < data.length; i++) { | ||||||
|  |                     if (data[i].product_id == product_id) { | ||||||
|  |                         return data[i]; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             return null; | ||||||
|  |         }, | ||||||
|  |         clearItems : function(){ | ||||||
|  |             localStorage.removeItem(this.dataname); | ||||||
|  |         }, | ||||||
|  |         updateCounternumber : function(){ | ||||||
|  |             $(".menu-cart-quote .counter-number").html(this.getSizeItem()); | ||||||
|  |             if ($(".cart-quote-clean").length > 0 ) { | ||||||
|  |                 $(".total-cart-quote").html("Total : " + this.getSizeItem()); | ||||||
|  |             } | ||||||
|  |             if ($(".cart-quote-clean").length > 0 ) { | ||||||
|  |                 if (this.getSizeItem() > 0) { | ||||||
|  |                     $(".cart-quote-clean").show(); | ||||||
|  |                 } else { | ||||||
|  |                     $(".cart-quote-clean").hide(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         }, | ||||||
|  |         showToastAddedToQuote :function() { | ||||||
|  |             iqwerty.toast.toast('Added to quote', { | ||||||
|  |                 style: { | ||||||
|  |                     main: { | ||||||
|  |                         'background': '#218838', | ||||||
|  |                         'color': 'white', | ||||||
|  |                         'width': '200px', | ||||||
|  |                     }, | ||||||
|  |                 }, | ||||||
|  |             }); | ||||||
|  |         }, | ||||||
|  |         showToastError :function() { | ||||||
|  |             iqwerty.toast.toast('Error', { | ||||||
|  |                 style: { | ||||||
|  |                     main: { | ||||||
|  |                         'background': '#c82333', | ||||||
|  |                         'color': 'white', | ||||||
|  |                         'width': '200px', | ||||||
|  |                     }, | ||||||
|  |                 }, | ||||||
|  |             }); | ||||||
|  |         }, | ||||||
|  |         showToastUpdateCartSuccessful :function() { | ||||||
|  |             iqwerty.toast.toast('Update successful', { | ||||||
|  |                 style: { | ||||||
|  |                     main: { | ||||||
|  |                         'background': '#218838', | ||||||
|  |                         'color': 'white', | ||||||
|  |                         'width': '200px', | ||||||
|  |                     }, | ||||||
|  |                 }, | ||||||
|  |             }); | ||||||
|  |         }, | ||||||
|  |         showToastRemoveCartSuccessful :function() { | ||||||
|  |             iqwerty.toast.toast('Remove successful', { | ||||||
|  |                 style: { | ||||||
|  |                     main: { | ||||||
|  |                         'background': '#28a745', | ||||||
|  |                         'color': 'white', | ||||||
|  |                         'width': '200px', | ||||||
|  |                     }, | ||||||
|  |                 }, | ||||||
|  |             }); | ||||||
|  |         }, | ||||||
|  |         bindClickAddToQuote : function() { | ||||||
|  |             var root = this; | ||||||
|  |             if ($("#product-addtocartquote-button").length > 0 ) { | ||||||
|  |                 $("#product-addtocartquote-button").click(function() { | ||||||
|  |                     if (!root.isExistItem (window._product)){ | ||||||
|  |                         if (root.getCurrentEmail() != "" ) { | ||||||
|  |                             root.addProductToDb(); | ||||||
|  |                         } else { | ||||||
|  |                             root.addItem(window._product); | ||||||
|  |                             root.updateCounternumber(); | ||||||
|  |                             //$("#product-addtocartquote-button").hide();
 | ||||||
|  |                             $("#product-addtocartquote-button").attr("disabled", true); | ||||||
|  |                             root.showToastAddedToQuote(); | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                     } | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         displayAddToQuoteButton : function() { | ||||||
|  |             if ($("#product-addtocartquote-button").length > 0 ) { | ||||||
|  |                 if (window._product != undefined) { | ||||||
|  |                     if (!this.isExistItem(window._product)) { | ||||||
|  |                         $("#product-addtocartquote-button").removeAttr("disabled"); | ||||||
|  |                         //$("#product-addtocartquote-button").show();
 | ||||||
|  |                     } else { | ||||||
|  |                         $("#product-addtocartquote-button").attr("disabled", true); | ||||||
|  |                         //$("#product-addtocartquote-button").hide();
 | ||||||
|  | 
 | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         renderCartQuotedetail : function() { | ||||||
|  |             if ($(".cart-quote-content").length > 0 ) { | ||||||
|  |                 if (this.isData()) { | ||||||
|  |                     var data = this.getData(); | ||||||
|  |                     data.sort((a, b) => a.name.localeCompare(b.name)); | ||||||
|  |                     $(".cart-quote-content").html(""); | ||||||
|  |                     for (let i = 0; i < data.length; i++) { | ||||||
|  |                         var html ='<tr class="item-info cart-quote-content-row-'+ data[i].product_id +'">'+ | ||||||
|  |                         '<td data-th="Item" class="col item">'+ | ||||||
|  |                             '<a href="'+ data[i].url +'"'+ | ||||||
|  |                                 'title="'+ data[i].name +'" tabindex="-1" class="product-item-photo">'+ | ||||||
|  |                                 '<span class="product-image-container" style="width:165px;">'+ | ||||||
|  |                                     '<span class="product-image-wrapper" style="padding-bottom: 100%;">'+ | ||||||
|  |                                         '<img class="product-image-photo"'+ | ||||||
|  |                                             'src="'+ data[i].image +'"'+ | ||||||
|  |                                             'style="width:100px"></span>'+ | ||||||
|  |                                 '</span>'+ | ||||||
|  |                             '</a>'+ | ||||||
|  |                             '<div class="product-item-details">'+ | ||||||
|  |                                 '<strong class="product-item-name">'+ | ||||||
|  |                                     '<a href="'+ data[i].url +'">'+ data[i].name +'</a>'+ | ||||||
|  |                                 '</strong>'+ | ||||||
|  |                             '</div>'+ | ||||||
|  |                         '</td>'+ | ||||||
|  |                         // '<td class="col price" data-th="Price">'+
 | ||||||
|  |                         //     '<span class="price-excluding-tax" data-label="Excl. Tax">'+
 | ||||||
|  |                         //         '<span class="cart-price">'+
 | ||||||
|  |                         //             '<span class="price">$' + data[i].price + '</span> </span>'+
 | ||||||
|  |                         //     '</span>'+
 | ||||||
|  |                         // '</td>'+
 | ||||||
|  |                         '<td class="col qty" data-th="Qty">'+ | ||||||
|  |                             '<div class="field qty">'+ | ||||||
|  |                                 '<label class="label" for="cart-1-qty">'+ | ||||||
|  |                                     '<span>Qty</span>'+ | ||||||
|  |                                 '</label>'+ | ||||||
|  |                                 '<div class="control qty">'+ | ||||||
|  |                                     '<input product_id="'+ data[i].product_id +'" id="cart-qty-'+ data[i].product_id +'" value="'+ data[i].qty +'" type="number" title="Qty" class="input-text qty input-qty-item-quote">'+ | ||||||
|  |                                 '</div>'+ | ||||||
|  |                             '</div>'+ | ||||||
|  |                         '</td>'+ | ||||||
|  |                         '<td style="text-align: center;" class="col action" data-th="Action">'+ | ||||||
|  |                             '<button style="display:none" class="update" product_id="'+ data[i].product_id +'" title="Update">'+ | ||||||
|  |                                 '<span> Update </span>'+ | ||||||
|  |                             '</button>'+ | ||||||
|  |                             '<button class="remove" product_id="'+ data[i].product_id +'" title="Remove item">'+ | ||||||
|  |                                 '<span> Remove item </span>'+ | ||||||
|  |                             '</button>'+ | ||||||
|  |                         '</td>'+ | ||||||
|  |                     '</tr>'; | ||||||
|  |                     $(".cart-quote-content").append(html); | ||||||
|  |                     } | ||||||
|  |                     this.bindEventUpdateForCartItem(); | ||||||
|  |                     this.bindEventRemoveForCartItem(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         }, | ||||||
|  |         bindEventUpdateForCartItem : function() { | ||||||
|  |             var root = this; | ||||||
|  |             $(".cart-quote-content button.update").click(function() { | ||||||
|  |                 var product_id = $(this).attr("product_id"); | ||||||
|  |                 var qty = $("#cart-qty-"+ product_id).val(); | ||||||
|  |                 if (qty == '') { | ||||||
|  |                     qty = 0; | ||||||
|  |                 } | ||||||
|  |                 if (root.getCurrentEmail() != "" ) { | ||||||
|  |                     var product = root.getItemByProductId(product_id); | ||||||
|  |                     if (!product != null) { | ||||||
|  |                         product.qty = qty; | ||||||
|  |                         root.updateProductOnDb(product, $(this)); | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     root.updateQtyById(qty, product_id); | ||||||
|  |                     root.showToastUpdateCartSuccessful(); | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  | 
 | ||||||
|  |             $( ".input-qty-item-quote" ).on( "change", function() { | ||||||
|  |                 var product_id = $(this).attr("product_id"); | ||||||
|  |                 var qty = $("#cart-qty-"+ product_id).val(); | ||||||
|  |                 if (qty == '') { | ||||||
|  |                     qty = 0; | ||||||
|  |                 } | ||||||
|  |                 if (root.getCurrentEmail() != "" ) { | ||||||
|  |                     var product = root.getItemByProductId(product_id); | ||||||
|  |                     if (!product != null) { | ||||||
|  |                         product.qty = qty; | ||||||
|  |                         root.updateProductOnDb(product, $(this)); | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     root.updateQtyById(qty, product_id); | ||||||
|  |                     root.showToastUpdateCartSuccessful(); | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |         }, | ||||||
|  |         bindEventRemoveForCartItem : function() { | ||||||
|  |             var root = this; | ||||||
|  |             $(".cart-quote-content button.remove").click(function() { | ||||||
|  |                 var product_id = $(this).attr("product_id"); | ||||||
|  |                 if (root.getCurrentEmail() != "" ) { | ||||||
|  |                     var product = root.getItemByProductId(product_id); | ||||||
|  |                     if (!product != null) { | ||||||
|  |                         root.removeProductOnDb(product, $(this)); | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     root.deleteById(product_id); | ||||||
|  |                     root.updateCounternumber(); | ||||||
|  |                     $(".cart-quote-content-row-"+ product_id).remove(); | ||||||
|  |                     root.showToastRemoveCartSuccessful(); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |             }); | ||||||
|  |         }, | ||||||
|  |         bindClickCleanCart : function() { | ||||||
|  |             if ($(".cart-quote-clean").length > 0 ) { | ||||||
|  |                 var root = this; | ||||||
|  |                 $(".cart-quote-clean").click(function() { | ||||||
|  |                     let text = "Are you sure to delete?"; | ||||||
|  |                     if (confirm(text) == true) { | ||||||
|  |                         if (root.getCurrentEmail() != "" ) { | ||||||
|  |                                 root.cleanProductOnDb($(this)); | ||||||
|  |                         } else { | ||||||
|  |                             root.clearItems(); | ||||||
|  |                             $(".cart-quote-content").html(""); | ||||||
|  |                             root.updateCounternumber(); | ||||||
|  |                             root.showToastRemoveCartSuccessful(); | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                     } | ||||||
|  |                 }) | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         updateInquiry : function() { | ||||||
|  |             if ($("#inquiry").length > 0) { | ||||||
|  |                 if (this.isData()) { | ||||||
|  |                     var data = this.getData(); | ||||||
|  |                     data.sort((a, b) => a.name.localeCompare(b.name)); | ||||||
|  |                     var inquirys = []; | ||||||
|  |                     for (let i = 0; i < data.length; i++) { | ||||||
|  |                         inquirys.push(data[i].sku + " : " + data[i].qty); | ||||||
|  |                     } | ||||||
|  |                     $("#inquiry").val(inquirys.join(" . \n")); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         getDataFromDb : function() { | ||||||
|  |             var root = this; | ||||||
|  |             $.ajax({ | ||||||
|  |                 type: "GET", | ||||||
|  |                 url: $(".menu-cart-quote").attr("host")+"carttoquote/quote/data", | ||||||
|  |                 error: function(xhr) { | ||||||
|  |                     // root.showToastError();
 | ||||||
|  |                     console.log(xhr); | ||||||
|  |                 }, | ||||||
|  |                 success: function(data) | ||||||
|  |                 { | ||||||
|  |                     root.setData(JSON.parse(data)); | ||||||
|  |                     $( document ).ready(function() { | ||||||
|  |                         root.init(); | ||||||
|  |                     }); | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |         }, | ||||||
|  |         addProductToDb : function() { | ||||||
|  |             var root = this; | ||||||
|  |             var postData = window._product; | ||||||
|  |             $.ajax({ | ||||||
|  |                 type: "POST", | ||||||
|  |                 url: $(".menu-cart-quote").attr("host")+"carttoquote/quote/additem", | ||||||
|  |                 dataType : "json", | ||||||
|  |                 contentType: "application/json; charset=utf-8", | ||||||
|  |                 data: JSON.stringify(postData), | ||||||
|  |                 beforeSend: function() { | ||||||
|  |                     $("#product-addtocartquote-button span").html("Adding to Quote"); | ||||||
|  |                     $("#product-addtocartquote-button").attr("disabled", true); | ||||||
|  |                 }, | ||||||
|  |                 error: function(xhr) { | ||||||
|  |                     $("#product-addtocartquote-button").attr("disabled", true); | ||||||
|  |                     root.showToastError(); | ||||||
|  |                 }, | ||||||
|  |                 success: function(data){ | ||||||
|  |                     root.setData(data); | ||||||
|  |                     root.displayAddToQuoteButton(); | ||||||
|  |                     root.updateCounternumber(); | ||||||
|  |                     root.showToastAddedToQuote(); | ||||||
|  |                 }, | ||||||
|  |                 complete: function() { | ||||||
|  |                     $("#product-addtocartquote-button span").html("Add to Quote"); | ||||||
|  |                     //$("#product-addtocartquote-button").removeAttr("disabled");
 | ||||||
|  |                 }, | ||||||
|  |             }); | ||||||
|  |         }, | ||||||
|  |         updateProductOnDb : function(product, context) { | ||||||
|  |             var root = this; | ||||||
|  |             var postData = { | ||||||
|  |                 data : product | ||||||
|  |             }; | ||||||
|  |             $.ajax({ | ||||||
|  |                 type: "POST", | ||||||
|  |                 url: $(".menu-cart-quote").attr("host")+"rest/all/V1/request/quote/update_item", | ||||||
|  |                 dataType : "json", | ||||||
|  |                 contentType: "application/json; charset=utf-8", | ||||||
|  |                 data: JSON.stringify(postData), | ||||||
|  |                 beforeSend: function() { | ||||||
|  |                     context.find("span").html("Updating"); | ||||||
|  |                     context.attr("disabled", true); | ||||||
|  |                 }, | ||||||
|  |                 error: function(xhr) { | ||||||
|  |                     root.showToastError(); | ||||||
|  |                 }, | ||||||
|  |                 success: function(data){ | ||||||
|  |                     root.setData(data); | ||||||
|  |                     root.showToastRemoveCartSuccessful(); | ||||||
|  |                 }, | ||||||
|  |                 complete: function() { | ||||||
|  |                     context.find("span").html("Update"); | ||||||
|  |                     context.removeAttr("disabled"); | ||||||
|  |                 }, | ||||||
|  |             }); | ||||||
|  |         }, | ||||||
|  |         removeProductOnDb : function(product, context) { | ||||||
|  |             var root = this; | ||||||
|  |             var postData = { | ||||||
|  |                 data : product | ||||||
|  |             }; | ||||||
|  |             $.ajax({ | ||||||
|  |                 type: "POST", | ||||||
|  |                 url: $(".menu-cart-quote").attr("host")+"rest/all/V1/request/quote/remove_item", | ||||||
|  |                 dataType : "json", | ||||||
|  |                 contentType: "application/json; charset=utf-8", | ||||||
|  |                 data: JSON.stringify(postData), | ||||||
|  |                 beforeSend: function() { | ||||||
|  |                     context.find("span").html("Removing item"); | ||||||
|  |                     context.attr("disabled", true); | ||||||
|  |                 }, | ||||||
|  |                 error: function(xhr) { | ||||||
|  |                     root.showToastError(); | ||||||
|  |                 }, | ||||||
|  |                 success: function(data){ | ||||||
|  |                     $(".cart-quote-content-row-"+ product.product_id).remove(); | ||||||
|  |                     root.setData(data); | ||||||
|  |                     root.updateCounternumber(); | ||||||
|  |                     root.showToastRemoveCartSuccessful(); | ||||||
|  |                 }, | ||||||
|  |                 complete: function() { | ||||||
|  |                     context.find("span").html("Remove item"); | ||||||
|  |                     context.removeAttr("disabled"); | ||||||
|  |                 }, | ||||||
|  |             }); | ||||||
|  |         }, | ||||||
|  |         cleanProductOnDb : function(context) { | ||||||
|  |             var root = this; | ||||||
|  |             var postData = { | ||||||
|  |                 data : {} | ||||||
|  |             }; | ||||||
|  |             $.ajax({ | ||||||
|  |                 type: "POST", | ||||||
|  |                 url: $(".menu-cart-quote").attr("host")+"carttoquote/quote/clean", | ||||||
|  |                 dataType : "json", | ||||||
|  |                 contentType: "application/json; charset=utf-8", | ||||||
|  |                 data: JSON.stringify(postData), | ||||||
|  |                 beforeSend: function() { | ||||||
|  |                     context.find("span").html("Cleanning Cart"); | ||||||
|  |                     context.attr("disabled", true); | ||||||
|  |                 }, | ||||||
|  |                 error: function(xhr) { | ||||||
|  |                     root.showToastError(); | ||||||
|  |                 }, | ||||||
|  |                 success: function(data){ | ||||||
|  |                     root.setData([]); | ||||||
|  |                     $(".cart-quote-content").html(""); | ||||||
|  |                     root.updateCounternumber(); | ||||||
|  |                     root.showToastRemoveCartSuccessful(); | ||||||
|  |                 }, | ||||||
|  |                 complete: function() { | ||||||
|  |                     context.find("span").html("Clean Cart"); | ||||||
|  |                     context.removeAttr("disabled"); | ||||||
|  |                 }, | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |    return cart_to_quote; | ||||||
|  | }); | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | !function(t){"use strict";function n(t,r){var e=r;for(var i in t)e.hasOwnProperty(i)?null!==t[i]&&t[i].constructor===Object&&(e[i]=n(t[i],e[i])):e[i]=t[i];return e}function r(t,n){Object.keys(n).forEach((function(r){t.style[r]=n[r]}))}var e=function(){var t,e,i={SHOW:{"-webkit-transition":"opacity 400ms, -webkit-transform 400ms",transition:"opacity 400ms, transform 400ms",opacity:"1","-webkit-transform":"translateY(-100%) translateZ(0)",transform:"translateY(-100%) translateZ(0)"},HIDE:{opacity:"0","-webkit-transform":"translateY(150%) translateZ(0)",transform:"translateY(150%) translateZ(0)"}},a={style:{main:{background:"rgba(0, 0, 0, .85)","box-shadow":"0 0 10px rgba(0, 0, 0, .8)","border-radius":"3px","z-index":"99999",color:"rgba(255, 255, 255, .9)","font-family":"sans-serif",padding:"10px 15px","max-width":"60%",width:"100%","word-break":"keep-all",margin:"0 auto","text-align":"center",position:"fixed",left:"0",right:"0",bottom:"0","-webkit-transform":"translateY(150%) translateZ(0)",transform:"translateY(150%) translateZ(0)","-webkit-filter":"blur(-1)",opacity:"0"}},settings:{duration:4e3}},o=[];function s(t,s,c){var l=c||i;if(void 0!==f())o.push({text:t,options:s,transitions:l});else{var m=s||{};(function(t,n,i){!function(t,n){var e=document.createElement("div");"string"==typeof t&&(t=document.createTextNode(t));e.appendChild(t),d(e),r(f(),n)}(t,n.style.main);var a=f();document.body.insertBefore(a,document.body.firstChild),a.offsetHeight,r(a,i.SHOW),clearTimeout(e),0!==n.settings.duration&&(e=setTimeout((function(){return u(i)}),n.settings.duration))})(t,m=n(a,m),l)}return{hide:function(){return u(l)}}}function u(t){var n=f();r(n,t.HIDE),clearTimeout(e),n.addEventListener("transitionend",c,{once:!0})}function c(){var t=f();if(document.body.removeChild(t),d(void 0),o.length>0){var n=o.shift();s(n.text,n.options,n.transitions)}}function f(){return t}function d(n){t=n}return{toast:s}}();t.mergeOptions=n,t.stylize=r,t.toast=e}(this.iqwerty=this.iqwerty||{}); | ||||||
|  | @ -0,0 +1,26 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\CatalogSearch\Override\Magento\Catalog\Ui\DataProvider\Product; | ||||||
|  | 
 | ||||||
|  | class ProductDataProvider extends \Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider | ||||||
|  | { | ||||||
|  |     /** | ||||||
|  |      * Add the category id to filter | ||||||
|  |      * | ||||||
|  |      * @param \Magento\Framework\Api\Filter $filter | ||||||
|  |      */ | ||||||
|  |     public function addFilter(\Magento\Framework\Api\Filter $filter) | ||||||
|  |     { | ||||||
|  |         if ($filter->getField() == 'category_id') { | ||||||
|  |             $this->getCollection()->addCategoriesFilter(['in' => $filter->getValue()]); | ||||||
|  |         } elseif (isset($this->addFilterStrategies[$filter->getField()])) { | ||||||
|  |             $this->addFilterStrategies[$filter->getField()] | ||||||
|  |                 ->addFilter( | ||||||
|  |                     $this->getCollection(), | ||||||
|  |                     $filter->getField(), | ||||||
|  |                     [$filter->getConditionType() => $filter->getValue()] | ||||||
|  |                 ); | ||||||
|  |         } else { | ||||||
|  |             parent::addFilter($filter); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,81 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CatalogSearch\Ui\Component\Listing\Column; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\View\Element\UiComponentFactory; | ||||||
|  | use Magento\Framework\View\Element\UiComponent\ContextInterface; | ||||||
|  | 
 | ||||||
|  | class Category extends \Magento\Ui\Component\Listing\Columns\Column | ||||||
|  | { | ||||||
|  |     /** | ||||||
|  |      * @var \Magento\Catalog\Model\ProductCategoryList | ||||||
|  |      */ | ||||||
|  |     private $productCategory; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @var \Magento\Catalog\Api\CategoryRepositoryInterface | ||||||
|  |      */ | ||||||
|  |     private $categoryRepository; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param \Magento\Framework\View\Element\UiComponent\ContextInterface $context | ||||||
|  |      * @param \Magento\Framework\View\Element\UiComponentFactory $uiComponentFactory | ||||||
|  |      * @param array $components | ||||||
|  |      * @param array $data | ||||||
|  |      * @param \Magento\Catalog\Model\ProductCategoryList $productCategory | ||||||
|  |      * @param \Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository | ||||||
|  |      */ | ||||||
|  |     public function __construct( | ||||||
|  |         \Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository, | ||||||
|  |         \Magento\Catalog\Model\ProductCategoryList $productCategory, | ||||||
|  |         ContextInterface $context, | ||||||
|  |         UiComponentFactory $uiComponentFactory, | ||||||
|  |         array $components = [], | ||||||
|  |         array $data = [] | ||||||
|  |     ) { | ||||||
|  |         parent::__construct($context, $uiComponentFactory, $components, $data); | ||||||
|  |         $this->productCategory = $productCategory; | ||||||
|  |         $this->categoryRepository = $categoryRepository; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Prepare data for the category column | ||||||
|  |      * @param  array  $dataSource | ||||||
|  |      * @return array | ||||||
|  |      */ | ||||||
|  |     public function prepareDataSource(array $dataSource) | ||||||
|  |     { | ||||||
|  |         $fieldName = $this->getData('name'); | ||||||
|  |         if (isset($dataSource['data']['items'])) { | ||||||
|  |             foreach ($dataSource['data']['items'] as &$item) { | ||||||
|  |                 $productId = $item['entity_id']; | ||||||
|  |                 $categoryIds = $this->getCategoryIds($productId); | ||||||
|  |                 $categories = []; | ||||||
|  |                 if (count($categoryIds)) { | ||||||
|  |                     foreach ($categoryIds as $categoryId) { | ||||||
|  |                         $categoryData = $this->categoryRepository->get($categoryId); | ||||||
|  |                         $categories[] = $categoryData->getName(); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 $item[$fieldName] = implode(', ', $categories); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return $dataSource; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Retrieve all the category ids | ||||||
|  |      * | ||||||
|  |      * @param integer $productId | ||||||
|  |      * @return array | ||||||
|  |      */ | ||||||
|  |     private function getCategoryIds($productId) | ||||||
|  |     { | ||||||
|  |         $categoryIds = $this->productCategory->getCategoryIds($productId); | ||||||
|  |         $_categoryIds = []; | ||||||
|  |         if ($categoryIds) { | ||||||
|  |             $_categoryIds = array_unique($categoryIds); | ||||||
|  |         } | ||||||
|  |         return $_categoryIds; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										105
									
								
								app/code/IpSupply/CatalogSearch/Ui/Component/Product/Form/Categories/Options.php
								
								
								
								
									Executable file
								
							
							
						
						
									
										105
									
								
								app/code/IpSupply/CatalogSearch/Ui/Component/Product/Form/Categories/Options.php
								
								
								
								
									Executable file
								
							|  | @ -0,0 +1,105 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CatalogSearch\Ui\Component\Product\Form\Categories; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\Data\OptionSourceInterface; | ||||||
|  | use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory as CategoryCollectionFactory; | ||||||
|  | use Magento\Framework\App\RequestInterface; | ||||||
|  | use Magento\Catalog\Model\Category as CategoryModel; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Options tree for "Categories" field | ||||||
|  |  */ | ||||||
|  | class Options implements OptionSourceInterface | ||||||
|  | { | ||||||
|  |     /** | ||||||
|  |      * @var \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory | ||||||
|  |      */ | ||||||
|  |     protected $categoryCollectionFactory; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @var RequestInterface | ||||||
|  |      */ | ||||||
|  |     protected $request; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @var array | ||||||
|  |      */ | ||||||
|  |     protected $categoriesTree; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param CategoryCollectionFactory $categoryCollectionFactory | ||||||
|  |      * @param RequestInterface $request | ||||||
|  |      */ | ||||||
|  |     public function __construct( | ||||||
|  |         CategoryCollectionFactory $categoryCollectionFactory, | ||||||
|  |         RequestInterface $request | ||||||
|  |     ) { | ||||||
|  |         $this->categoryCollectionFactory = $categoryCollectionFactory; | ||||||
|  |         $this->request = $request; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * {@inheritdoc} | ||||||
|  |      */ | ||||||
|  |     public function toOptionArray() | ||||||
|  |     { | ||||||
|  |         return $this->getCategoriesTree(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Retrieve categories tree | ||||||
|  |      * | ||||||
|  |      * @return array | ||||||
|  |      */ | ||||||
|  |     protected function getCategoriesTree() | ||||||
|  |     { | ||||||
|  |         if ($this->categoriesTree === null) { | ||||||
|  |             $storeId = $this->request->getParam('store'); | ||||||
|  |             /* @var $matchingNamesCollection \Magento\Catalog\Model\ResourceModel\Category\Collection */ | ||||||
|  |             $matchingNamesCollection = $this->categoryCollectionFactory->create(); | ||||||
|  | 
 | ||||||
|  |             $matchingNamesCollection->addAttributeToSelect('path') | ||||||
|  |                 ->addAttributeToFilter('entity_id', ['nin' => [CategoryModel::TREE_ROOT_ID, '3', '2']]) | ||||||
|  |                 ->setStoreId($storeId); | ||||||
|  | 
 | ||||||
|  |             $shownCategoriesIds = []; | ||||||
|  | 
 | ||||||
|  |             /** @var \Magento\Catalog\Model\Category $category */ | ||||||
|  |             foreach ($matchingNamesCollection as $category) { | ||||||
|  |                 foreach (explode('/', $category->getPath()) as $parentId) { | ||||||
|  |                     $shownCategoriesIds[$parentId] = 1; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             /* @var $collection \Magento\Catalog\Model\ResourceModel\Category\Collection */ | ||||||
|  |             $collection = $this->categoryCollectionFactory->create(); | ||||||
|  | 
 | ||||||
|  |             $collection->addAttributeToFilter('entity_id', ['in' => array_keys($shownCategoriesIds)]) | ||||||
|  |                 ->addAttributeToSelect(['name', 'is_active', 'parent_id']) | ||||||
|  |                 ->setStoreId($storeId); | ||||||
|  | 
 | ||||||
|  |             $categoryById = [ | ||||||
|  |                 CategoryModel::TREE_ROOT_ID => [ | ||||||
|  |                     'value' => CategoryModel::TREE_ROOT_ID | ||||||
|  |                 ], | ||||||
|  |             ]; | ||||||
|  | 
 | ||||||
|  |             foreach ($collection as $category) { | ||||||
|  |                 foreach ([$category->getId(), $category->getParentId()] as $categoryId) { | ||||||
|  |                     if (!isset($categoryById[$categoryId])) { | ||||||
|  |                         $categoryById[$categoryId] = ['value' => $categoryId]; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 $categoryById[$category->getId()]['is_active'] = $category->getIsActive(); | ||||||
|  |                 $categoryById[$category->getId()]['label'] = $category->getName(); | ||||||
|  |                 $categoryById[$category->getParentId()]['optgroup'][] = &$categoryById[$category->getId()]; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             $this->categoriesTree = $categoryById[CategoryModel::TREE_ROOT_ID]['optgroup']; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return $this->categoriesTree; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,27 @@ | ||||||
|  | { | ||||||
|  |     "name": "ipsupply/catalogsearch", | ||||||
|  |     "description": "Catalog Search", | ||||||
|  |     "require": { | ||||||
|  |         "php": "~7.1.3||~7.2.0", | ||||||
|  |         "lib-libxml": "*", | ||||||
|  |         "magento/framework": "102.0.*", | ||||||
|  |         "magento/module-backend": "101.0.*", | ||||||
|  |         "magento/module-media-storage": "100.3.*", | ||||||
|  |         "magento/module-store": "101.0.*", | ||||||
|  |         "magento/module-ui": "101.1.*" | ||||||
|  |     }, | ||||||
|  |     "type": "magento2-module", | ||||||
|  |     "version": "100.3.0", | ||||||
|  |     "license": [ | ||||||
|  |         "OSL-3.0", | ||||||
|  |         "AFL-3.0" | ||||||
|  |     ], | ||||||
|  |     "autoload": { | ||||||
|  |         "files": [ | ||||||
|  |             "registration.php" | ||||||
|  |         ], | ||||||
|  |         "psr-4": { | ||||||
|  |             "IpSupply\\CatalogSearch\\": "" | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,4 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> | ||||||
|  |     <preference for="Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider" type="IpSupply\CatalogSearch\Override\Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider" /> | ||||||
|  | </config> | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> | ||||||
|  |     <module name="IpSupply_CatalogSearch" setup_version="1.0.0"> | ||||||
|  |     </module> | ||||||
|  | </config> | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | \Magento\Framework\Component\ComponentRegistrar::register( | ||||||
|  |     \Magento\Framework\Component\ComponentRegistrar::MODULE, | ||||||
|  |     'IpSupply_CatalogSearch', | ||||||
|  |     __DIR__ | ||||||
|  | ); | ||||||
|  | @ -0,0 +1,34 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> | ||||||
|  |     <listingToolbar name="listing_top"> | ||||||
|  |         <filters name="listing_filters"> | ||||||
|  |             <filterSelect name="category_id" provider="${ $.parentName }" component="Magento_Ui/js/form/element/ui-select" template="ui/grid/filters/elements/ui-select"> | ||||||
|  |                 <argument name="data" xsi:type="array"> | ||||||
|  |                     <item name="config" xsi:type="array"> | ||||||
|  |                         <item name="filterOptions" xsi:type="boolean">true</item> | ||||||
|  |                         <item name="levelsVisibility" xsi:type="number">1</item> | ||||||
|  |                     </item> | ||||||
|  |                 </argument> | ||||||
|  |                 <settings> | ||||||
|  |                     <options class="IpSupply\CatalogSearch\Ui\Component\Product\Form\Categories\Options"/> | ||||||
|  |                     <caption translate="true">– Please Select a Category –</caption> | ||||||
|  |                     <label translate="true">Categories</label> | ||||||
|  |                     <dataScope>category_id</dataScope> | ||||||
|  |                     <imports> | ||||||
|  |                         <link name="visible">componentType = column, index = ${ $.index }:visible</link> | ||||||
|  |                     </imports> | ||||||
|  |                 </settings> | ||||||
|  |             </filterSelect> | ||||||
|  |         </filters> | ||||||
|  |     </listingToolbar> | ||||||
|  |     <columns name="product_columns" class="Magento\Catalog\Ui\Component\Listing\Columns"> | ||||||
|  |         <column name="category_id" class="IpSupply\CatalogSearch\Ui\Component\Listing\Column\Category"> | ||||||
|  |             <argument name="data" xsi:type="array"> | ||||||
|  |                <item name="config" xsi:type="array"> | ||||||
|  |                    <item name="label" xsi:type="string" translate="true">Categories</item> | ||||||
|  |                    <item name="sortOrder" xsi:type="number">110</item> | ||||||
|  |                </item> | ||||||
|  |             </argument> | ||||||
|  |         </column> | ||||||
|  |     </columns> | ||||||
|  | </listing> | ||||||
|  | @ -0,0 +1,208 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CategoryApi\Api\Controller; | ||||||
|  | 
 | ||||||
|  | use IpSupply\CategoryApi\Api\Interface\CategoryApiInterface; | ||||||
|  | use Magento\Framework\App\Helper\Context; | ||||||
|  | use Magento\Framework\App\Helper\AbstractHelper; | ||||||
|  | use Magento\Framework\Webapi\Rest\Request; | ||||||
|  | use Magento\Framework\App\ObjectManager; | ||||||
|  | use Magento\Catalog\Api\ProductRepositoryInterface; | ||||||
|  | use Magento\Store\Model\StoreManagerInterface; | ||||||
|  | 
 | ||||||
|  | class CategoryApiController extends AbstractHelper implements CategoryApiInterface { | ||||||
|  |     protected $_request; | ||||||
|  |     protected $_objectManager; | ||||||
|  |     protected $_productRepository; | ||||||
|  |     protected $_storeManager; | ||||||
|  |     protected $_baseURL; | ||||||
|  | 
 | ||||||
|  |     public function __construct(Context $context, Request $request, ProductRepositoryInterface $productRepository, StoreManagerInterface $storeManager) { | ||||||
|  |         $this->_request = $request; | ||||||
|  |         $this->_objectManager = ObjectManager::getInstance(); | ||||||
|  |         $this->_productRepository = $productRepository; | ||||||
|  |         $this->_storeManager = $storeManager; | ||||||
|  |         $this->_baseURL = $this->_storeManager->getStore()->getBaseUrl(); | ||||||
|  |         parent::__construct($context); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* | ||||||
|  |     request structure:  | ||||||
|  |     { | ||||||
|  |         category_id: <id of category> | ||||||
|  |     } | ||||||
|  |     */ | ||||||
|  |     public function getProductByCategory() { | ||||||
|  |         try { | ||||||
|  |             $request = $this->_request->getParams(); | ||||||
|  |             if (isset($request["category_id"])) { | ||||||
|  |                 $response = []; | ||||||
|  |                 $categoryFactory = $this->_objectManager->get('\Magento\Catalog\Model\CategoryFactory'); | ||||||
|  | 
 | ||||||
|  |                 $categoryID = $this->_request->getParams()['category_id']; | ||||||
|  |                 $category = $categoryFactory->create()->load($categoryID); | ||||||
|  |                 $products = $category->getProductCollection()->addAttributeToSelect('*')->addFieldToFilter('type_id', 'configurable'); | ||||||
|  |                 foreach($products as $product) { | ||||||
|  |                     $dataResponse = []; | ||||||
|  |                     $dataResponse["sku"] = $product->getSku(); | ||||||
|  |                     $dataResponse["name"] = $product->getSku(); | ||||||
|  |                     $dataResponse["categories"] = [(int)$categoryID]; | ||||||
|  |                     $dataResponse["description"] = ""; | ||||||
|  |                     $dataResponse["shortDescription"] = ""; | ||||||
|  |                     $dataResponse["imageUrls"] = $this->getProductImageURL($product); | ||||||
|  |                     $dataResponse["brands"] = ""; | ||||||
|  |                     if($product->getResource()->getAttribute("brands") != false) { | ||||||
|  |                         if($product->getResource()->getAttribute("brands")->getFrontend()->getValue($product) != false) { | ||||||
|  |                             $dataResponse["brands"] = $product->getResource()->getAttribute("brands")->getFrontend()->getValue($product); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     $dataResponse["types"] = ""; | ||||||
|  |                     if($product->getResource()->getAttribute("types") != false) { | ||||||
|  |                         if($product->getResource()->getAttribute("types")->getFrontend()->getValue($product) != false) { | ||||||
|  |                             $dataResponse["types"] = $product->getResource()->getAttribute("types")->getFrontend()->getValue($product); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     $dataResponse["condition"] = $this->getProductVariants($product); | ||||||
|  |                     $dataResponse["relatedProduct"] = $this->getRelatedProduct($product, $categoryID); | ||||||
|  |                     $dataResponse["upsellProduct"] = $this->getUpSellProduct($product, $categoryID); | ||||||
|  |                     $dataResponse["crosssellProduct"] = $this->getCrossSellProduct($product, $categoryID); | ||||||
|  |                     $response[] = $dataResponse; | ||||||
|  |                 } | ||||||
|  |                 return $response; | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 return json_encode(["code" => 500, "message" => "Incorrect argument"]); | ||||||
|  |             }    | ||||||
|  |         } | ||||||
|  |         catch (Exception $e) { | ||||||
|  |             return json_encode(["code" => 500, "message" => "Error".$e]); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public function getProductImageURL($product) { | ||||||
|  |         return $product["thumbnail"] != "" ? [$this->_baseURL."media/catalog/product".$product["thumbnail"]] : []; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public function getProductVariants($product) { | ||||||
|  |         $productVariants = $product->getTypeInstance()->getUsedProducts($product); | ||||||
|  |         if(!empty($productVariants)) { | ||||||
|  |             $response = []; | ||||||
|  |             foreach($productVariants as $variant) { | ||||||
|  |                 $optionText = $variant->getResource()->getAttribute('choose_condition')->getFrontend()->getValue($variant); | ||||||
|  |                 $response[strtolower($optionText)] = array( | ||||||
|  |                     // "qty" => $variant->getQty(),
 | ||||||
|  |                     "qty" => 0, | ||||||
|  |                     "price" => $variant->getPrice(), | ||||||
|  |                     "imageUrls" => $this->getProductImageURL($variant) | ||||||
|  |                 ); | ||||||
|  |             } | ||||||
|  |             return $response; | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public function getRelatedProduct($rootProduct, $categoryID) { | ||||||
|  |         $response = []; | ||||||
|  |         $relatedProduct = $rootProduct->getRelatedProducts(); | ||||||
|  |         $productRepo = $this->_objectManager->get('\Magento\Catalog\Model\ProductRepository'); | ||||||
|  |         if(!empty($relatedProduct)) { | ||||||
|  |             foreach($relatedProduct as $product) { | ||||||
|  |                 $dataResponse = []; | ||||||
|  |                 $productData = $productRepo->getById($product->getID()); | ||||||
|  |                 $dataResponse["sku"] = $productData->getSku(); | ||||||
|  |                 $dataResponse["name"] = $product->getSku(); | ||||||
|  |                 $dataResponse["categories"] = [(int)$categoryID]; | ||||||
|  |                 $dataResponse["description"] = ""; | ||||||
|  |                 $dataResponse["shortDescription"] = ""; | ||||||
|  |                 $dataResponse["imageUrls"] = $this->getProductImageURL($productData); | ||||||
|  |                 $dataResponse["brands"] = ""; | ||||||
|  |                 if($productData->getResource()->getAttribute("brands") != false) { | ||||||
|  |                     if($productData->getResource()->getAttribute("brands")->getFrontend()->getValue($productData) != false) { | ||||||
|  |                         $dataResponse["brands"] = $productData->getResource()->getAttribute("brands")->getFrontend()->getValue($productData); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 $dataResponse["types"] = ""; | ||||||
|  |                 if($productData->getResource()->getAttribute("types") != false) { | ||||||
|  |                     if($productData->getResource()->getAttribute("types")->getFrontend()->getValue($productData) != false) { | ||||||
|  |                         $dataResponse["types"] = $productData->getResource()->getAttribute("types")->getFrontend()->getValue($productData); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 $dataResponse["condition"] = $this->getProductVariants($productData); | ||||||
|  |                 $response[] = $dataResponse; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return $response; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public function getUpSellProduct($rootProduct, $categoryID) { | ||||||
|  |         $response = []; | ||||||
|  |         $upSellProduct = $rootProduct->getUpSellProducts(); | ||||||
|  |         $productRepo = $this->_objectManager->get('\Magento\Catalog\Model\ProductRepository'); | ||||||
|  |         if(!empty($upSellProduct)) { | ||||||
|  |             foreach($upSellProduct as $product) { | ||||||
|  |                 $dataResponse = []; | ||||||
|  |                 $productData = $productRepo->getById($product->getID()); | ||||||
|  |                 $dataResponse["sku"] = $productData->getSku(); | ||||||
|  |                 $dataResponse["name"] = $product->getSku(); | ||||||
|  |                 $dataResponse["categories"] = [(int)$categoryID]; | ||||||
|  |                 $dataResponse["description"] = ""; | ||||||
|  |                 $dataResponse["shortDescription"] = ""; | ||||||
|  |                 $dataResponse["imageUrls"] = $this->getProductImageURL($productData); | ||||||
|  |                 $dataResponse["brands"] = ""; | ||||||
|  |                 if($productData->getResource()->getAttribute("brands") != false) { | ||||||
|  |                     if($productData->getResource()->getAttribute("brands")->getFrontend()->getValue($productData) != false) { | ||||||
|  |                         $dataResponse["brands"] = $productData->getResource()->getAttribute("brands")->getFrontend()->getValue($productData); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 $dataResponse["types"] = ""; | ||||||
|  |                 if($productData->getResource()->getAttribute("types") != false) { | ||||||
|  |                     if($productData->getResource()->getAttribute("types")->getFrontend()->getValue($productData) != false) { | ||||||
|  |                         $dataResponse["types"] = $productData->getResource()->getAttribute("types")->getFrontend()->getValue($productData); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 $dataResponse["condition"] = $this->getProductVariants($productData); | ||||||
|  |                 $response[] = $dataResponse; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return $response; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function getCrossSellProduct($rootProduct, $categoryID) { | ||||||
|  |         $response = []; | ||||||
|  |         $crossSellProduct = $rootProduct->getCrossSellProducts(); | ||||||
|  |         $productRepo = $this->_objectManager->get('\Magento\Catalog\Model\ProductRepository'); | ||||||
|  |         if(!empty($crossSellProduct)) { | ||||||
|  |             foreach($crossSellProduct as $product) { | ||||||
|  |                 $dataResponse = []; | ||||||
|  |                 $productData = $productRepo->getById($product->getID()); | ||||||
|  |                 $dataResponse["sku"] = $productData->getSku(); | ||||||
|  |                 $dataResponse["name"] = $product->getSku(); | ||||||
|  |                 $dataResponse["categories"] = [(int)$categoryID]; | ||||||
|  |                 $dataResponse["description"] = ""; | ||||||
|  |                 $dataResponse["shortDescription"] = ""; | ||||||
|  |                 $dataResponse["imageUrls"] = $this->getProductImageURL($productData); | ||||||
|  |                 $dataResponse["brands"] = ""; | ||||||
|  |                 if($productData->getResource()->getAttribute("brands") != false) { | ||||||
|  |                     if($productData->getResource()->getAttribute("brands")->getFrontend()->getValue($productData) != false) { | ||||||
|  |                         $dataResponse["brands"] = $productData->getResource()->getAttribute("brands")->getFrontend()->getValue($productData); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 $dataResponse["types"] = ""; | ||||||
|  |                 if($productData->getResource()->getAttribute("types") != false) { | ||||||
|  |                     if($productData->getResource()->getAttribute("types")->getFrontend()->getValue($productData) != false) { | ||||||
|  |                         $dataResponse["types"] = $productData->getResource()->getAttribute("types")->getFrontend()->getValue($productData); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 $dataResponse["condition"] = $this->getProductVariants($productData); | ||||||
|  |                 $response[] = $dataResponse; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return $response; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,11 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CategoryApi\Api\Interface; | ||||||
|  | 
 | ||||||
|  | interface CategoryApiInterface { | ||||||
|  |     /** | ||||||
|  | 	* Api for get product by category | ||||||
|  | 	* @return array  | ||||||
|  | 	*/ | ||||||
|  | 	public function getProductByCategory(); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,36 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\CategoryApi\Helper; | ||||||
|  | 
 | ||||||
|  | use Magento\Catalog\Model\ProductRepository; | ||||||
|  | 
 | ||||||
|  | class ProductHelper | ||||||
|  | { | ||||||
|  |     protected $productRepository; | ||||||
|  |     protected $objectManager; | ||||||
|  | 
 | ||||||
|  |     public function __construct( | ||||||
|  |         ProductRepository $productRepository, | ||||||
|  |     ) { | ||||||
|  |         $this->productRepository = $productRepository; | ||||||
|  |         $this->objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function removeDisallowedLinks($sku) { | ||||||
|  |         $productObject = $this->objectManager->get('Magento\Catalog\Model\Product'); | ||||||
|  |         $product = $productObject->loadByAttribute("sku", $sku); | ||||||
|  |         if ($product) { | ||||||
|  |             $product = $product->getCollection() | ||||||
|  |             ->addFieldToSelect("*") | ||||||
|  |             ->addAttributeToFilter('sku', $sku) | ||||||
|  |             ->addMediaGalleryData() | ||||||
|  |             ->getFirstItem(); | ||||||
|  |             echo $sku." is exist"; | ||||||
|  |             $product->setName("test"); | ||||||
|  |             $product->save(); | ||||||
|  |         } else { | ||||||
|  |             echo $sku." not exist"; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  | ||||||
|  |         xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> | ||||||
|  |     <preference for="IpSupply\CategoryApi\Api\Interface\CategoryApiInterface"  | ||||||
|  |                 type="IpSupply\CategoryApi\Api\Controller\CategoryApiController"/> | ||||||
|  | </config> | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | 
 | ||||||
|  | <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||||
|  |         xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> | ||||||
|  |     <module name="IpSupply_CategoryApi" setup_version="1.0.0"></module> | ||||||
|  | </config> | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | <?xml version="1.0"?> | ||||||
|  | <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  | ||||||
|  | 		xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd"> | ||||||
|  |     <route method="GET" url="/V1/client/get-product-by-category"> | ||||||
|  | 		<service class="IpSupply\CategoryApi\Api\Interface\CategoryApiInterface" method="getProductByCategory"/> | ||||||
|  | 		<resources> | ||||||
|  |             <resource ref="anonymous"/> | ||||||
|  |         </resources> | ||||||
|  | 	</route>         | ||||||
|  | </routes> | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\Component\ComponentRegistrar; | ||||||
|  | 
 | ||||||
|  | ComponentRegistrar::register(ComponentRegistrar::MODULE, "IpSupply_CategoryApi", __DIR__); | ||||||
|  | @ -0,0 +1,244 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\ChatMessage\Api\Controller; | ||||||
|  | 
 | ||||||
|  | use GuzzleHttp\Client; | ||||||
|  | use GuzzleHttp\Psr7\Request as GuzzRequest; | ||||||
|  | use IpSupply\ChatMessage\Api\Interface\MessageApiInterface; | ||||||
|  | use IpSupply\ChatMessage\Config\ChatConfig; | ||||||
|  | use Magento\Framework\App\Helper\AbstractHelper; | ||||||
|  | use Magento\Framework\App\Helper\Context; | ||||||
|  | use Magento\Framework\Webapi\Rest\Request; | ||||||
|  | 
 | ||||||
|  | class MessageApi extends AbstractHelper implements MessageApiInterface { | ||||||
|  | 	protected $_request; | ||||||
|  | 	protected $_chatConfig; | ||||||
|  | 
 | ||||||
|  | 	public function __construct(Context $context, Request $request) { | ||||||
|  | 		$this->_request = $request; | ||||||
|  | 		// $this->_chatConfig = $_chatConfig;
 | ||||||
|  | 		parent::__construct($context); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public function getMessage() { | ||||||
|  |       	try { | ||||||
|  |       		$topic = $this->_request->getParams()["topic"]; | ||||||
|  |       		$streamName = $this->_chatConfig->getStreamName(); | ||||||
|  |       		$client = new Client(); | ||||||
|  |       		$headers = [ | ||||||
|  | 			  'Authorization' => $this->_chatConfig->getZulipAuthToken() | ||||||
|  | 			]; | ||||||
|  | 			$url = $this->_chatConfig->getHostDomain().'api/v1/messages?anchor=newest&num_before=100&num_after=0&narrow=[{"operator":"stream","operand":"'.$streamName.'"},{"operator":"topic","operand":"'.$topic.'"}]&apply_markdown=false'; | ||||||
|  | 			$request = new GuzzRequest('GET', $url, $headers); | ||||||
|  | 			$promise = $client->sendAsync($request)->then(function ($response) { | ||||||
|  | 				echo $response->getBody(); | ||||||
|  | 				exit(); | ||||||
|  | 			}); | ||||||
|  | 			$promise->wait(); | ||||||
|  |       	} | ||||||
|  |       	catch (\Exception $e) { | ||||||
|  |       		return json_encode(["code" => 500, "message" => "Error".$e]); | ||||||
|  |       	} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public function getMessageUnRead() { | ||||||
|  |       	try { | ||||||
|  |       		$topic = $this->_request->getParams()["topic"]; | ||||||
|  |       		$streamName = $this->_chatConfig->getStreamName(); | ||||||
|  |       		$client = new Client(); | ||||||
|  |       		$headers = [ | ||||||
|  | 			  'Authorization' => $this->_chatConfig->getZulipAuthToken() | ||||||
|  | 			]; | ||||||
|  | 			$url = $this->_chatConfig->getHostDomain().'api/v1/messages?anchor=first_unread&num_before=0&num_after=99&narrow=[{"operator":"stream","operand":"'.$streamName.'"},{"operator":"topic","operand":"'.$topic.'"}]&apply_markdown=false'; | ||||||
|  | 			$request = new GuzzRequest('GET', $url, $headers); | ||||||
|  | 			$promise = $client->sendAsync($request)->then(function ($response) { | ||||||
|  | 				echo $response->getBody(); | ||||||
|  | 				exit(); | ||||||
|  | 			}); | ||||||
|  | 			$promise->wait(); | ||||||
|  |       	} | ||||||
|  |       	catch (\Exception $e) { | ||||||
|  |       		return json_encode(["code" => 500, "message" => "Error".$e]); | ||||||
|  |       	} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public function registerQueue() { | ||||||
|  | 		try { | ||||||
|  | 			$topic = $this->_request->getParams()["topic"]; | ||||||
|  | 			$streamName = $this->_chatConfig->getStreamName(); | ||||||
|  |       		$client = new Client(); | ||||||
|  |       		$headers = [ | ||||||
|  | 			  'Authorization' => $this->_chatConfig->getZulipAuthToken() | ||||||
|  | 			]; | ||||||
|  | 			$options = [ | ||||||
|  | 			    'multipart' => [ | ||||||
|  | 				    [ | ||||||
|  | 				      'name' => 'event_types', | ||||||
|  | 				      'contents' => '["message"]', | ||||||
|  | 				    ], | ||||||
|  | 				    [ | ||||||
|  | 				    	'name' => 'narrow', | ||||||
|  | 				    	'contents' => '[["stream", "'.$streamName.'"], ["topic", "'.$topic.'"]]', | ||||||
|  | 				    ] | ||||||
|  | 				] | ||||||
|  | 			]; | ||||||
|  | 			$request = new GuzzRequest('POST', $this->_chatConfig->getHostDomain().'api/v1/register', $headers); | ||||||
|  | 			$promise = $client->sendAsync($request, $options)->then(function ($response) { | ||||||
|  | 				echo $response->getBody(); | ||||||
|  | 				exit(); | ||||||
|  | 			}); | ||||||
|  | 			$promise->wait(); | ||||||
|  |       	} | ||||||
|  |       	catch (\Exception $e) { | ||||||
|  |       		return json_encode(["code" => 500, "message" => "Error".$e]); | ||||||
|  |       	} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public function listenMessage() { | ||||||
|  | 		try { | ||||||
|  | 			$params = $this->_request->getParams(); | ||||||
|  | 			$queueId = $params["queue_id"]; | ||||||
|  | 			$lastEventId = $params["last_event_id"]; | ||||||
|  | 			$client = new Client(); | ||||||
|  |       		$headers = [ | ||||||
|  | 			  'Authorization' => $this->_chatConfig->getZulipAuthToken() | ||||||
|  | 			]; | ||||||
|  | 			$url = $this->_chatConfig->getHostDomain().'api/v1/events?queue_id='.$queueId.'&last_event_id='.$lastEventId; | ||||||
|  | 			$request = new GuzzRequest('GET', $url, $headers); | ||||||
|  | 			$promise = $client->sendAsync($request)->then(function ($response) { | ||||||
|  | 				echo $response->getBody(); | ||||||
|  | 				exit(); | ||||||
|  | 			}); | ||||||
|  | 			$promise->wait(); | ||||||
|  | 		} | ||||||
|  | 		catch (\Exception $e) { | ||||||
|  |       		return json_encode(["code" => 500, "message" => "Error".$e]); | ||||||
|  |       	} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public function sendMessage() { | ||||||
|  |       	try { | ||||||
|  |       		$params = $this->_request->getParams(); | ||||||
|  | 			$content = $params["content"]; | ||||||
|  | 			$topic = $params["topic"]; | ||||||
|  | 			$streamName = $this->_chatConfig->getStreamName(); | ||||||
|  | 
 | ||||||
|  | 			$client = new Client(); | ||||||
|  |       		$headers = [ | ||||||
|  | 			  'Authorization' => $this->_chatConfig->getZulipAuthToken() | ||||||
|  | 			]; | ||||||
|  | 			$url = $this->_chatConfig->getHostDomain().'api/v1/messages'; | ||||||
|  | 			$options = [ | ||||||
|  | 			    'multipart' => [ | ||||||
|  | 				    [ | ||||||
|  | 				      'name' => 'to', | ||||||
|  | 				      'contents' => $streamName, | ||||||
|  | 				    ], | ||||||
|  | 				    [ | ||||||
|  | 				    	'name' => 'type', | ||||||
|  | 				    	'contents' => 'stream', | ||||||
|  | 				    ], | ||||||
|  | 				    [ | ||||||
|  | 				    	'name' => 'topic', | ||||||
|  | 				    	'contents' => $topic, | ||||||
|  | 				    ], | ||||||
|  | 				    [ | ||||||
|  | 				    	'name' => 'content', | ||||||
|  | 				    	'contents' => $content, | ||||||
|  | 				    ] | ||||||
|  | 				] | ||||||
|  | 			]; | ||||||
|  | 			$request = new GuzzRequest('POST', $url, $headers); | ||||||
|  | 			$promise = $client->sendAsync($request, $options)->then(function ($response) { | ||||||
|  | 				return json_encode(["code" => 200, "message" => "Success"]); | ||||||
|  | 			}); | ||||||
|  | 			$promise->wait(); | ||||||
|  |       	} | ||||||
|  |       	catch (\Exception $e) { | ||||||
|  |       		return json_encode(["code" => 500, "message" => "Error".$e]); | ||||||
|  |       	} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public function markTopicAsRead() { | ||||||
|  | 		try { | ||||||
|  |       		$params = $this->_request->getParams(); | ||||||
|  | 			$topic = $params["topic"]; | ||||||
|  | 			$streamID = $this->_chatConfig->getStreamID(); | ||||||
|  | 
 | ||||||
|  | 			$client = new Client(); | ||||||
|  |       		$headers = [ | ||||||
|  | 			  'Authorization' => $this->_chatConfig->getZulipAuthToken() | ||||||
|  | 			]; | ||||||
|  | 			$url = $this->_chatConfig->getHostDomain().'api/v1/mark_topic_as_read'; | ||||||
|  | 			$options = [ | ||||||
|  | 			    'multipart' => [ | ||||||
|  | 				    [ | ||||||
|  | 				      'name' => 'stream_id', | ||||||
|  | 				      'contents' => $streamID, | ||||||
|  | 				    ], | ||||||
|  | 				    [ | ||||||
|  | 				    	'name' => 'topic_name', | ||||||
|  | 				    	'contents' => $topic, | ||||||
|  | 				    ] | ||||||
|  | 				] | ||||||
|  | 			]; | ||||||
|  | 			$request = new GuzzRequest('POST', $url, $headers); | ||||||
|  | 			$promise = $client->sendAsync($request, $options)->then(function ($response) { | ||||||
|  | 				return json_encode(["code" => 200, "message" => "Success"]); | ||||||
|  | 			}); | ||||||
|  | 			$promise->wait(); | ||||||
|  |       	} | ||||||
|  |       	catch (\Exception $e) { | ||||||
|  |       		return json_encode(["code" => 500, "message" => "Error".$e]); | ||||||
|  |       	} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	* Api for make offer | ||||||
|  | 	* @param string[] $data | ||||||
|  |     * @return string | ||||||
|  | 	*/ | ||||||
|  | 	public function makeAnOffer($data) { | ||||||
|  | 		try { | ||||||
|  | 			$topic = $data["customer-email"]; | ||||||
|  | 			// $streamName = $this->_chatConfig->getStreamMakeOffer();
 | ||||||
|  | 			$streamName = $this->_chatConfig->getStreamName(); | ||||||
|  | 			$content = "Product: [".$data["product-sku"]."](".$data["product-url"].") \nSell Price: **".$data["product-sell-price"]."** \nCustomer Offer Price: **".$data["customer-offer"]."** \nCustomer: ".$data["customer-name"]." \nEmail: ".$data["customer-email"]." \nPhone: ".$data["customer-mobile-phone"]." \nCustomer shipping destination: ".$data["customer-country"]." \nMessage: ".$data["customer-message"]; | ||||||
|  | 
 | ||||||
|  | 			$client = new Client(); | ||||||
|  |       		$headers = [ | ||||||
|  | 			  'Authorization' => $this->_chatConfig->getZulipAuthToken() | ||||||
|  | 			]; | ||||||
|  | 			$url = $this->_chatConfig->getHostDomain().'api/v1/messages'; | ||||||
|  | 			$options = [ | ||||||
|  | 			    'multipart' => [ | ||||||
|  | 				    [ | ||||||
|  | 				      'name' => 'to', | ||||||
|  | 				      'contents' => $streamName, | ||||||
|  | 				    ], | ||||||
|  | 				    [ | ||||||
|  | 				    	'name' => 'type', | ||||||
|  | 				    	'contents' => 'stream', | ||||||
|  | 				    ], | ||||||
|  | 				    [ | ||||||
|  | 				    	'name' => 'topic', | ||||||
|  | 				    	'contents' => $topic, | ||||||
|  | 				    ], | ||||||
|  | 				    [ | ||||||
|  | 				    	'name' => 'content', | ||||||
|  | 				    	'contents' => $content, | ||||||
|  | 				    ] | ||||||
|  | 				] | ||||||
|  | 			]; | ||||||
|  | 			$request = new GuzzRequest('POST', $url, $headers); | ||||||
|  | 			$promise = $client->sendAsync($request, $options)->then(function ($response) { | ||||||
|  | 				return true; | ||||||
|  | 			}); | ||||||
|  | 			$promise->wait(); | ||||||
|  | 			return $request->getBody()->getContents(); | ||||||
|  | 		} | ||||||
|  | 		catch (\Exception $e) { | ||||||
|  |       		return false; | ||||||
|  |       	} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,49 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\ChatMessage\Api\Interface; | ||||||
|  | 
 | ||||||
|  | interface MessageApiInterface { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	* Api for get message | ||||||
|  | 	* @return array  | ||||||
|  | 	*/ | ||||||
|  | 	public function getMessage(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	* Api for get message unread | ||||||
|  | 	* @return array  | ||||||
|  | 	*/ | ||||||
|  | 	public function getMessageUnRead(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	* Api for send message | ||||||
|  | 	* @return array  | ||||||
|  | 	*/ | ||||||
|  | 	public function sendMessage(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	* Api for register queue | ||||||
|  | 	* @return array  | ||||||
|  | 	*/ | ||||||
|  | 	public function registerQueue(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	* Api for listen message | ||||||
|  | 	* @return array  | ||||||
|  | 	*/ | ||||||
|  | 	public function listenMessage(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	* Api for listen message | ||||||
|  | 	* @return string | ||||||
|  | 	*/ | ||||||
|  | 	public function markTopicAsRead(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	* Api for make offer | ||||||
|  | 	* @param string[] $data | ||||||
|  |     * @return string | ||||||
|  | 	*/ | ||||||
|  | 	public function makeAnOffer($data); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,43 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\ChatMessage\Block\Widget; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\View\Element\Template; | ||||||
|  | use Magento\Widget\Block\BlockInterface; | ||||||
|  | use Magento\Framework\View\Element\Template\Context; | ||||||
|  | use Magento\Framework\App\ObjectManager; | ||||||
|  | use Magento\Store\Model\StoreManagerInterface; | ||||||
|  | use Magento\Framework\UrlInterface; | ||||||
|  | use GuzzleHttp\Client; | ||||||
|  | use GuzzleHttp\Psr7\Request as GuzzRequest; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ChatBlockControl extends Template implements BlockInterface { | ||||||
|  | 	protected $_objectManager; | ||||||
|  | 	protected $_storeManager; | ||||||
|  | 
 | ||||||
|  | 	public function __construct(StoreManagerInterface $_storeManager, Context $context, array $data = []) { | ||||||
|  | 		$this->_objectManager = ObjectManager::getInstance(); | ||||||
|  | 		$this->_storeManager = $_storeManager; | ||||||
|  | 		parent::__construct($context, $data); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	function getAssetUrl($asset) { | ||||||
|  | 	    $assetRepository = $this->_objectManager->get('Magento\Framework\View\Asset\Repository'); | ||||||
|  | 	    return $assetRepository->createAsset($asset)->getUrl(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	function getBaseUrl() { | ||||||
|  | 		$storeManager = $this->_objectManager->get('\Magento\Store\Model\StoreManagerInterface'); | ||||||
|  | 		$baseUrl = $storeManager->getStore()->getBaseUrl(); | ||||||
|  | 		return $baseUrl; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	function getCustomerInfo() { | ||||||
|  | 		$customerSession = $this->_objectManager->create('Magento\Customer\Model\Session'); | ||||||
|  | 		if ($customerSession->isLoggedIn()) { | ||||||
|  | 			return ["logged" => True]; | ||||||
|  | 		} | ||||||
|  | 		return ["logged" => False]; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,40 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\ChatMessage\Controller\Api; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\App\Action\Context; | ||||||
|  | 
 | ||||||
|  | class CurrentCustomerInfo extends \Magento\Framework\App\Action\Action { | ||||||
|  | 
 | ||||||
|  |     protected $customerSession; | ||||||
|  |     protected $objectManager; | ||||||
|  | 
 | ||||||
|  |     public function __construct( | ||||||
|  |         Context $context, | ||||||
|  |         ) | ||||||
|  |     { | ||||||
|  |         $this->objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  |         $this->customerSession = $this->objectManager->get(\Magento\Customer\Model\Session::class); | ||||||
|  | 
 | ||||||
|  |         parent::__construct($context); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public function execute() | ||||||
|  |     { | ||||||
|  |         if($this->customerSession->isLoggedIn()) { | ||||||
|  |             $customer = $this->customerSession->getCustomer(); | ||||||
|  |             $response = array(); | ||||||
|  |             $response["email"] = $customer->getEmail(); | ||||||
|  |             $response["fullname"] = $customer->getName(); | ||||||
|  |             echo json_encode($response); | ||||||
|  |             exit; | ||||||
|  |         } else { | ||||||
|  |             echo null; | ||||||
|  |             exit; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,37 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace IpSupply\ChatMessage\Controller\Api; | ||||||
|  | 
 | ||||||
|  | use Magento\Framework\App\Action\Context; | ||||||
|  | 
 | ||||||
|  | class Register extends \Magento\Framework\App\Action\Action { | ||||||
|  | 
 | ||||||
|  |     protected $customerSession; | ||||||
|  |     protected $objectManager; | ||||||
|  | 
 | ||||||
|  |     public function __construct( | ||||||
|  |         Context $context, | ||||||
|  |         ) | ||||||
|  |     { | ||||||
|  |         $this->objectManager = \Magento\Framework\App\ObjectManager::getInstance(); | ||||||
|  |         $this->customerSession = $this->objectManager->get(\Magento\Customer\Model\Session::class); | ||||||
|  | 
 | ||||||
|  |         parent::__construct($context); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public function execute() | ||||||
|  |     { | ||||||
|  |         if($this->customerSession->isLoggedIn()) { | ||||||
|  |             $customer = $this->customerSession->getCustomer(); | ||||||
|  |             echo json_encode($customer->getEmail()); | ||||||
|  |             exit; | ||||||
|  |         } else { | ||||||
|  |             echo null; | ||||||
|  |             exit; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,56 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\ChatMessage\Helper; | ||||||
|  | 
 | ||||||
|  | class Authentication { | ||||||
|  |     /** | ||||||
|  |      * Username used for authentication | ||||||
|  |      * | ||||||
|  |      * @var string | ||||||
|  |      */ | ||||||
|  |     protected $username; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * API key used for authentication | ||||||
|  |      * | ||||||
|  |      * @var string | ||||||
|  |      */ | ||||||
|  |     protected $apiKey; | ||||||
|  | 
 | ||||||
|  |     public function __construct($username, $apiKey) | ||||||
|  |     { | ||||||
|  |         $this->setUsername($username); | ||||||
|  |         $this->setApiKey($apiKey); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function getUsername() | ||||||
|  |     { | ||||||
|  |         return $this->username; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param string $username | ||||||
|  |      */ | ||||||
|  |     public function setUsername($username) | ||||||
|  |     { | ||||||
|  |         $this->username = $username; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function getApiKey() | ||||||
|  |     { | ||||||
|  |         return $this->apiKey; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param string $apiKey | ||||||
|  |      */ | ||||||
|  |     public function setApiKey($apiKey) | ||||||
|  |     { | ||||||
|  |         $this->apiKey = $apiKey; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,171 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\ChatMessage\Helper; | ||||||
|  | 
 | ||||||
|  | use GuzzleHttp\ClientInterface; | ||||||
|  | use Psr\Log\LoggerAwareInterface; | ||||||
|  | use Psr\Log\LoggerAwareTrait; | ||||||
|  | use Psr\Log\LoggerInterface; | ||||||
|  | use Psr\Log\NullLogger; | ||||||
|  | use IpSupply\ChatMessage\Helper\Request\GetEventsParameters; | ||||||
|  | use IpSupply\ChatMessage\Helper\Request\MessageParameters; | ||||||
|  | use IpSupply\ChatMessage\Helper\Request\ParametersInterface; | ||||||
|  | use IpSupply\ChatMessage\Helper\Request\RegisterQueueParameters; | ||||||
|  | use IpSupply\ChatMessage\Helper\Request\RequestInterface; | ||||||
|  | use IpSupply\ChatMessage\Helper\Request\ValidationException; | ||||||
|  | 
 | ||||||
|  | class Client implements LoggerAwareInterface | ||||||
|  | { | ||||||
|  |     use LoggerAwareTrait; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @var ClientInterface | ||||||
|  |      */ | ||||||
|  |     private $client; | ||||||
|  |     /** | ||||||
|  |      * @var Authentication | ||||||
|  |      */ | ||||||
|  |     private $defaultAuthentication; | ||||||
|  |     /** | ||||||
|  |      * @var string | ||||||
|  |      */ | ||||||
|  |     private $serverUrl; | ||||||
|  | 
 | ||||||
|  |     public function __construct($serverUrl, LoggerInterface $logger = null) | ||||||
|  |     { | ||||||
|  |         $this->setLogger(is_null($logger) ? new NullLogger() : $logger); | ||||||
|  |         $this->serverUrl = $serverUrl; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param Authentication $defaultAuthentication | ||||||
|  |      */ | ||||||
|  |     public function setDefaultAuthentication($defaultAuthentication) | ||||||
|  |     { | ||||||
|  |         $this->defaultAuthentication = $defaultAuthentication; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Send message to zulip | ||||||
|  |      * | ||||||
|  |      * @param array|MessageParameters $messageParameters | ||||||
|  |      * @return mixed | ||||||
|  |      * @throws ValidationException | ||||||
|  |      * @throws \Exception | ||||||
|  |      */ | ||||||
|  |     public function sendMessage($messageParameters) | ||||||
|  |     { | ||||||
|  |         if (is_array($messageParameters)) { | ||||||
|  |             $messageParameters = new MessageParameters($messageParameters); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!$messageParameters instanceof MessageParameters) { | ||||||
|  |             throw new \BadMethodCallException('$messageParameter must be an instance of MessageParameters or an array'); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return $this->createRequest('\IpSupply\ChatMessage\Helper\Request\MessageRequest', $messageParameters); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Register a queue with zulip | ||||||
|  |      * | ||||||
|  |      * @param $queueParameters | ||||||
|  |      * @return mixed | ||||||
|  |      * @throws ValidationException | ||||||
|  |      * @throws \Exception | ||||||
|  |      */ | ||||||
|  |     public function registerQueue($queueParameters) | ||||||
|  |     { | ||||||
|  |         if (is_array($queueParameters)) { | ||||||
|  |             $queueParameters = new RegisterQueueParameters($queueParameters); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!$queueParameters instanceof RegisterQueueParameters) { | ||||||
|  |             throw new \BadMethodCallException('$queueParameters must be an instance of RegisterQueueParameters or an array'); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return $this->createRequest('\IpSupply\ChatMessage\Helper\Request\RegisterQueueRequest', $queueParameters); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get events for queue | ||||||
|  |      * | ||||||
|  |      * @param $params | ||||||
|  |      * @return mixed | ||||||
|  |      * @throws ValidationException | ||||||
|  |      * @throws \Exception | ||||||
|  |      */ | ||||||
|  |     public function getEventsFromQueue($params) | ||||||
|  |     { | ||||||
|  |         if (is_array($params)) { | ||||||
|  |             $params = new GetEventsParameters($params); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!$params instanceof GetEventsParameters) { | ||||||
|  |             throw new \BadMethodCallException('$params must be an instance of GetEventsParameters or an array'); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return $this->createRequest('\IpSupply\ChatMessage\Helper\Request\GetEventsRequest', $params); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @return ClientInterface | ||||||
|  |      */ | ||||||
|  |     public function getHttpClient() | ||||||
|  |     { | ||||||
|  |         if (empty($this->client)) { | ||||||
|  |             $this->setHttpClient(new \GuzzleHttp\Client()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return $this->client; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param ClientInterface $client | ||||||
|  |      */ | ||||||
|  |     public function setHttpClient($client) | ||||||
|  |     { | ||||||
|  |         $this->client = $client; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param $class | ||||||
|  |      * @param ParametersInterface $parameters | ||||||
|  |      * @return mixed | ||||||
|  |      * @throws ValidationException | ||||||
|  |      * @throws \Exception | ||||||
|  |      */ | ||||||
|  |     protected function createRequest($class, ParametersInterface $parameters) | ||||||
|  |     { | ||||||
|  |         $this->logger->info("Sending request type: '" . $class. "", ['params' => $parameters->getData()]); | ||||||
|  | 
 | ||||||
|  |         $authentication = $parameters->getAuthentication(); | ||||||
|  |         if (is_null($authentication)) { | ||||||
|  |             $authentication = $this->defaultAuthentication; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!$authentication instanceof Authentication) { | ||||||
|  |             throw new \Exception('Missing authentication'); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             /** @var RequestInterface $request */ | ||||||
|  |             $request = new $class($this->getHttpClient()); | ||||||
|  |             return $request->initialize($this->serverUrl, $parameters, $authentication); | ||||||
|  |         }catch(ValidationException $e) { | ||||||
|  |             $this->logger->error("Error during validation", [ | ||||||
|  |                 'message' => $e->getMessage(), | ||||||
|  |                 'errors'  => $e->getErrors(), | ||||||
|  |                 'params'  => $parameters->getData() | ||||||
|  |             ]); | ||||||
|  | 
 | ||||||
|  |             throw $e; | ||||||
|  |         }catch(\Exception $e) { | ||||||
|  |             $this->logger->error('Exception occurred', [ | ||||||
|  |                 'message' => $e->getMessage(), | ||||||
|  |                 'params'  => $parameters->getData() | ||||||
|  |             ]); | ||||||
|  | 
 | ||||||
|  |             throw $e; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,24 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\ChatMessage\Helper\Request; | ||||||
|  | 
 | ||||||
|  | class GetEventsParameters extends ParametersAbstract | ||||||
|  | { | ||||||
|  |     use SimpleParamTrait; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritDoc | ||||||
|  |      */ | ||||||
|  |     public function __construct(array $parameters = []) | ||||||
|  |     { | ||||||
|  |         $this->params = [ | ||||||
|  |             'queue_id'      => '', | ||||||
|  |             'last_event_id' => '', | ||||||
|  |             'dont_block'    => '', | ||||||
|  |         ]; | ||||||
|  | 
 | ||||||
|  |         foreach ($parameters as $key => $val) { | ||||||
|  |             $this->params[$key] = $val; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,49 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\ChatMessage\Helper\Request; | ||||||
|  | 
 | ||||||
|  | use GuzzleHttp\ClientInterface; | ||||||
|  | use IpSupply\ChatMessage\Helper\Authentication; | ||||||
|  | 
 | ||||||
|  | class GetEventsRequest extends RequestAbstract | ||||||
|  | { | ||||||
|  |     use SimpleValidationTrait; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @var ClientInterface | ||||||
|  |      */ | ||||||
|  |     protected $httpClient; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritDoc | ||||||
|  |      */ | ||||||
|  |     public function __construct(ClientInterface $client) | ||||||
|  |     { | ||||||
|  |         $this->httpClient = $client; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritDoc | ||||||
|  |      */ | ||||||
|  |     public function initialize($serverUrl, ParametersInterface $params, Authentication $defaultAuthentication) | ||||||
|  |     { | ||||||
|  |         $this->validate($params, ['queue_id', 'last_event_id']); | ||||||
|  |         $auth = $params->getAuthentication(); | ||||||
|  |         if (empty($auth)) { | ||||||
|  |             $auth = $defaultAuthentication; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $response = $this->httpClient->request('POST', | ||||||
|  |             $serverUrl . '/api/v1/events', | ||||||
|  |             [ | ||||||
|  |                 'auth' => [ | ||||||
|  |                     $auth->getUsername(), | ||||||
|  |                     $auth->getApiKey(), | ||||||
|  |                 ], | ||||||
|  |                 'form_params' => $params->getData() | ||||||
|  |             ] | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         return GetEventsResponse::fromHttpResponse($response); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,50 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\ChatMessage\Helper\Request; | ||||||
|  | 
 | ||||||
|  | use Psr\Http\Message\ResponseInterface as PsrHttpResponseInterface; | ||||||
|  | 
 | ||||||
|  | class GetEventsResponse implements  ResponseInterface | ||||||
|  | { | ||||||
|  |     /** | ||||||
|  |      * @var array | ||||||
|  |      */ | ||||||
|  |     private $events; | ||||||
|  |     /** | ||||||
|  |      * @var string | ||||||
|  |      */ | ||||||
|  |     private $result; | ||||||
|  | 
 | ||||||
|  |     public function __construct($events, $result) | ||||||
|  |     { | ||||||
|  |         $this->events = $events; | ||||||
|  |         $this->result = $result; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function isSuccessful() | ||||||
|  |     { | ||||||
|  |         return $this->getResult() == self::RESULT_SUCCESSFUL; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @return array | ||||||
|  |      */ | ||||||
|  |     public function getEvents() | ||||||
|  |     { | ||||||
|  |         return $this->events; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function getResult() | ||||||
|  |     { | ||||||
|  |         return $this->result; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static function fromHttpResponse(PsrHttpResponseInterface $response) | ||||||
|  |     { | ||||||
|  |         $body = (string)$response->getBody(); | ||||||
|  |         $data = json_decode($body, true); | ||||||
|  |         return new static($data['events'], $data['result']); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,39 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\ChatMessage\Helper\Request; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Class MessageParameters | ||||||
|  |  * @package Zulip\Request | ||||||
|  |  * @method string setType() set message type | ||||||
|  |  * @method string setContent() set content for message | ||||||
|  |  * @method string setTo() set to | ||||||
|  |  * @method string setSubject() set message subject | ||||||
|  |  */ | ||||||
|  | // use IpSupply\ChatMessage\Helper\Request\SimpleParamTrait;
 | ||||||
|  | 
 | ||||||
|  | class MessageParameters extends ParametersAbstract | ||||||
|  | { | ||||||
|  |     const TYPE_PRIVATE = 'private'; | ||||||
|  |     const TYPE_STREAM  = 'stream'; | ||||||
|  | 
 | ||||||
|  |     use SimpleParamTrait; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritDoc | ||||||
|  |      */ | ||||||
|  |     public function __construct(array $params = []) | ||||||
|  |     { | ||||||
|  |         $this->params = [ | ||||||
|  |             'type'    => '', | ||||||
|  |             'content' => '', | ||||||
|  |             'to'      => '', | ||||||
|  |             'subject' => '' | ||||||
|  |         ]; | ||||||
|  | 
 | ||||||
|  |         foreach ($params as $key => $param) { | ||||||
|  |             if (array_key_exists($key, $this->params)) { | ||||||
|  |                 $this->params[$key] = $param; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,43 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\ChatMessage\Helper\Request; | ||||||
|  | 
 | ||||||
|  | use GuzzleHttp\ClientInterface; | ||||||
|  | use IpSupply\ChatMessage\Helper\Authentication; | ||||||
|  | 
 | ||||||
|  | class MessageRequest extends RequestAbstract | ||||||
|  | { | ||||||
|  |     use SimpleValidationTrait; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @var ClientInterface | ||||||
|  |      */ | ||||||
|  |     private $client; | ||||||
|  | 
 | ||||||
|  |     public function __construct(ClientInterface $client) | ||||||
|  |     { | ||||||
|  |         $this->client = $client; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function initialize($serverUrl, ParametersInterface $params, Authentication $defaultAuthentication) | ||||||
|  |     { | ||||||
|  |         $this->validate($params, ['type', 'to', 'subject', 'content']); | ||||||
|  |         $auth = $params->getAuthentication(); | ||||||
|  |         if (empty($auth)) { | ||||||
|  |             $auth = $defaultAuthentication; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $response = $this->client->request('POST', | ||||||
|  |             $serverUrl . '/api/v1/messages', | ||||||
|  |             [ | ||||||
|  |                 'auth' => [ | ||||||
|  |                     $auth->getUsername(), | ||||||
|  |                     $auth->getApiKey(), | ||||||
|  |                 ], | ||||||
|  |                 'form_params' => $params->getData() | ||||||
|  |             ] | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         return MessageResponse::fromHttpResponse($response); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,92 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\ChatMessage\Helper\Request; | ||||||
|  | 
 | ||||||
|  | use Psr\Http\Message\ResponseInterface as PsrHttpResponseInterface; | ||||||
|  | 
 | ||||||
|  | class MessageResponse implements ResponseInterface | ||||||
|  | { | ||||||
|  |     /** | ||||||
|  |      * @var string | ||||||
|  |      */ | ||||||
|  |     protected $msg; | ||||||
|  |     /** | ||||||
|  |      * @var string | ||||||
|  |      */ | ||||||
|  |     protected $result; | ||||||
|  |     /** | ||||||
|  |      * @var string | ||||||
|  |      */ | ||||||
|  |     protected $id; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param string $msg | ||||||
|  |      * @param string $result | ||||||
|  |      * @param string $id | ||||||
|  |      */ | ||||||
|  |     public function __construct($msg, $result, $id) | ||||||
|  |     { | ||||||
|  |         $this->setMsg($msg); | ||||||
|  |         $this->setId($id); | ||||||
|  |         $this->setResult($result); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function isSuccessful() | ||||||
|  |     { | ||||||
|  |         return $this->getMsg() == 'success'; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function getMsg() | ||||||
|  |     { | ||||||
|  |         return $this->msg; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param string $msg | ||||||
|  |      */ | ||||||
|  |     public function setMsg($msg) | ||||||
|  |     { | ||||||
|  |         $this->msg = $msg; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function getResult() | ||||||
|  |     { | ||||||
|  |         return $this->result; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param string $result | ||||||
|  |      */ | ||||||
|  |     public function setResult($result) | ||||||
|  |     { | ||||||
|  |         $this->result = $result; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function getId() | ||||||
|  |     { | ||||||
|  |         return $this->id; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param string $id | ||||||
|  |      */ | ||||||
|  |     public function setId($id) | ||||||
|  |     { | ||||||
|  |         $this->id = $id; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static function fromHttpResponse(PsrHttpResponseInterface $response) | ||||||
|  |     { | ||||||
|  |         $body = (string)$response->getBody(); | ||||||
|  |         $data = json_decode($body, true); | ||||||
|  |         return new static($data['msg'], $data['result'], $data['id']); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\ChatMessage\Helper\Request; | ||||||
|  | 
 | ||||||
|  | use IpSupply\ChatMessage\Helper\Request\ValidationException; | ||||||
|  | 
 | ||||||
|  | class MissingFieldsValidationException extends ValidationException | ||||||
|  | { | ||||||
|  | } | ||||||
|  | @ -0,0 +1,28 @@ | ||||||
|  | <?php | ||||||
|  | namespace IpSupply\ChatMessage\Helper\Request; | ||||||
|  | 
 | ||||||
|  | use IpSupply\ChatMessage\Helper\Authentication; | ||||||
|  | 
 | ||||||
|  | abstract class ParametersAbstract implements ParametersInterface | ||||||
|  | { | ||||||
|  |     /** | ||||||
|  |      * @var Authentication; | ||||||
|  |      */ | ||||||
|  |     protected $authentication; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritDoc | ||||||
|  |      */ | ||||||
|  |     public function setAuthentication(Authentication $authentication) | ||||||
|  |     { | ||||||
|  |        $this->authentication = $authentication; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritDoc | ||||||
|  |      */ | ||||||
|  |     public function getAuthentication() | ||||||
|  |     { | ||||||
|  |         return $this->authentication; | ||||||
|  |     } | ||||||
|  | } | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue