public function getCustomerByEmail(Mirasvit_Helpdesk_Model_Email $email) { $customers = Mage::getModel('customer/customer')->getCollection(); $customers->addAttributeToSelect('*')->addFieldToFilter('email', $email->getFromEmail())->addFieldToFilter('store_id', $email->getGateway()->getStoreId()); if ($customers->count()) { return $customers->getFirstItem(); } // customer may be registered in store A, but sends email to gateway of store B $customers = Mage::getModel('customer/customer')->getCollection(); $customers->addAttributeToSelect('*')->addFieldToFilter('email', $email->getFromEmail()); if ($customers->count()) { return $customers->getFirstItem(); } /** @var Mage_Customer_Model_Customer $address */ $address = $customers->getLastItem(); if ($address->getId()) { $customer = new Varien_Object(); $customer->setName($address->getName()); $customer->setEmail($address->getEmail()); $customer->setQuoteAddressId($address->getId()); return $customer; } $customer = new Varien_Object(); if ($email->getSenderName() == '') { $customer->setName($email->getFromEmail()); } else { $customer->setName($email->getSenderName()); } $customer->setEmail($email->getFromEmail()); return $customer; }
/** * @param Mirasvit_Helpdesk_Model_Email $email * @param string $code * * @return bool|Mirasvit_Helpdesk_Model_Ticket * * @throws Exception */ public function processEmail($email, $code) { $ticket = false; $customer = false; $user = false; $triggeredBy = Mirasvit_Helpdesk_Model_Config::CUSTOMER; $messageType = Mirasvit_Helpdesk_Model_Config::MESSAGE_PUBLIC; if ($code) { //try to find customer for this email $tickets = Mage::getModel('helpdesk/ticket')->getCollection(); $tickets->addFieldToFilter('code', $code)->addFieldToFilter('customer_email', $email->getFromEmail()); if ($tickets->count()) { $ticket = $tickets->getFirstItem(); } else { //try to find staff user for this email $users = Mage::getModel('admin/user')->getCollection()->addFieldToFilter('email', $email->getFromEmail()); if ($users->count()) { $user = $users->getFirstItem(); $tickets = Mage::getModel('helpdesk/ticket')->getCollection()->addFieldToFilter('code', $code); if ($tickets->count()) { $ticket = $tickets->getFirstItem(); $ticket->setUserId($user->getId()); $ticket->save(); $triggeredBy = Mirasvit_Helpdesk_Model_Config::USER; } else { $user = false; //@temp dva for testing } } else { //third party $tickets = Mage::getModel('helpdesk/ticket')->getCollection()->addFieldToFilter('code', $code); if ($tickets->count()) { $ticket = $tickets->getFirstItem(); $triggeredBy = Mirasvit_Helpdesk_Model_Config::THIRD; if ($ticket->isThirdPartyPublic()) { $messageType = Mirasvit_Helpdesk_Model_Config::MESSAGE_PUBLIC_THIRD; } else { $messageType = Mirasvit_Helpdesk_Model_Config::MESSAGE_INTERNAL_THIRD; } } } } } if (!$user) { $customer = Mage::helper('helpdesk/customer')->getCustomerByEmail($email); } // create a new ticket if (!$ticket) { $ticket = Mage::getModel('helpdesk/ticket'); if (!$code) { $ticket->setCode(Mage::helper('helpdesk/string')->generateTicketCode()); } else { $ticket->setCode($code); //temporary for testing to fix @dva } $gateway = Mage::getModel('helpdesk/gateway')->load($email->getGatewayId()); if ($gateway->getId()) { if ($gateway->getDepartmentId()) { $ticket->setDepartmentId($gateway->getDepartmentId()); } else { //if department was removed $departments = Mage::getModel('helpdesk/department')->getCollection()->addFieldToFilter('is_active', true); if ($departments->count()) { $department = $departments->getFirstItem(); $ticket->setDepartmentId($department->getId()); } else { // throw new Exception("Helpdesk MX - Can't find any active department. Helpdesk can't fetch tickets correctly!"); Mage::log('Helpdesk MX - Can\'t find any active department. Helpdesk can\'t fetch tickets correctly!'); } } $ticket->setStoreId($gateway->getStoreId()); } $ticket->setName($email->getSubject())->setCustomerName($customer->getName())->setCustomerId($customer->getId())->setQuoteAddressId($customer->getQuoteAddressId())->setCustomerEmail($email->getFromEmail())->setChannel(Mirasvit_Helpdesk_Model_Config::CHANNEL_EMAIL)->setCc($email->getCc()); $ticket->setEmailId($email->getId()); $ticket->save(); if ($pattern = $this->checkForSpamPattern($email)) { $ticket->markAsSpam($pattern); if ($email) { $email->setPatternId($pattern->getId())->save(); } } } if ($customer) { //parse order ID from email subject preg_match_all('[[0-9]{9}]', $email->getSubject(), $numbers); foreach ($numbers[0] as $number) { $orders = Mage::getModel('sales/order')->getCollection()->addFieldToFilter('increment_id', $number)->addFieldToFilter('customer_id', $customer->getId()); if (count($orders)) { // Case 1: this is registered customer and has an order $order = Mage::getModel('sales/order')->loadByAttribute('increment_id', $number); $ticket->setCustomerId($order->getCustomerId()); $ticket->setOrderId($order->getId()); $ticket->save(); break; } else { $order = Mage::getModel('sales/order')->loadByAttribute('increment_id', $number); $ticket->setOrderId($order->getId()); // Case 2: this is known guest customer or known another email of registered customer $prevTickets = Mage::getModel('helpdesk/ticket')->getCollection()->addFieldToFilter('customer_email', $email->getFromEmail())->addFieldToFilter('order_id', $order->getId()); if (count($prevTickets)) { $ticket->setCustomerId($order->getCustomerId()); $ticket->save(); break; } // Case 3: this is generic guest customer with existing order $quotes = Mage::getModel('sales/order_address')->getCollection(); $quotes->addFieldToFilter('email', $email->getFromEmail()); $quotes->getSelect()->group('email'); if ($quotes->count()) { $ticket->setQuoteAddressId($quotes->getFirstItem()->getId()); $ticket->save(); break; } } } } //add message to ticket $text = $email->getBody(); $encodingHelper = Mage::helper('helpdesk/encoding'); $text = $encodingHelper->toUTF8($text); $body = Mage::helper('helpdesk/string')->parseBody($text, $email->getFormat()); $ticket->addMessage($body, $customer, $user, $triggeredBy, $messageType, $email); Mage::dispatchEvent('helpdesk_process_email', array('body' => $body, 'customer' => $customer, 'user' => $user, 'ticket' => $ticket)); Mage::helper('helpdesk/history')->changeTicket($ticket, $triggeredBy, array('user' => $user, 'customer' => $customer)); return $ticket; }