PageRenderTime 54ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/src/OroCRM/Bundle/DemoDataBundle/Migrations/Data/Demo/ORM/LoadMagentoData.php

https://github.com/jrcollado1987/crm
PHP | 436 lines | 311 code | 45 blank | 80 comment | 7 complexity | 817861ca8b4de71c1a2ee05244f34a64 MD5 | raw file
  1. <?php
  2. namespace OroCRM\Bundle\DemoDataBundle\Migrations\Data\Demo\ORM;
  3. use Doctrine\Common\DataFixtures\AbstractFixture;
  4. use Doctrine\Common\Persistence\ObjectManager;
  5. use Doctrine\Common\DataFixtures\DependentFixtureInterface;
  6. use Oro\Bundle\AddressBundle\Entity\Country;
  7. use Oro\Bundle\AddressBundle\Entity\Region;
  8. use Oro\Bundle\IntegrationBundle\Entity\Channel;
  9. use Oro\Bundle\UserBundle\Entity\User;
  10. use OroCRM\Bundle\ContactBundle\Entity\Contact;
  11. use OroCRM\Bundle\MagentoBundle\Entity\Cart;
  12. use OroCRM\Bundle\MagentoBundle\Entity\CartItem;
  13. use OroCRM\Bundle\MagentoBundle\Entity\Customer;
  14. use OroCRM\Bundle\MagentoBundle\Entity\CustomerGroup;
  15. use OroCRM\Bundle\MagentoBundle\Entity\MagentoSoapTransport;
  16. use OroCRM\Bundle\MagentoBundle\Entity\OrderItem;
  17. use OroCRM\Bundle\MagentoBundle\Entity\Store;
  18. use OroCRM\Bundle\MagentoBundle\Entity\Website;
  19. use OroCRM\Bundle\MagentoBundle\Entity\CartStatus;
  20. use OroCRM\Bundle\MagentoBundle\Entity\Order;
  21. use OroCRM\Bundle\MagentoBundle\Entity\OrderAddress;
  22. class LoadMagentoData extends AbstractFixture implements DependentFixtureInterface
  23. {
  24. const VAT = 0.0838;
  25. const CHANNEL_NAME = 'Demo Web store';
  26. /** @var array */
  27. protected $users;
  28. /**
  29. * {@inheritdoc}
  30. */
  31. public function getDependencies()
  32. {
  33. return ['OroCRM\Bundle\DemoDataBundle\Migrations\Data\Demo\ORM\LoadContactData'];
  34. }
  35. /**
  36. * {@inheritDoc}
  37. */
  38. public function load(ObjectManager $om)
  39. {
  40. $this->users = $om->getRepository('OroUserBundle:User')->findAll();
  41. $website = new Website();
  42. $website->setCode('admin')
  43. ->setName('Admin');
  44. $om->persist($website);
  45. $store = new Store();
  46. $store->setCode('admin')
  47. ->setName('Admin')
  48. ->setWebsite($website);
  49. $om->persist($website);
  50. $group = new CustomerGroup();
  51. $group->setName('General');
  52. $om->persist($group);
  53. $transport = new MagentoSoapTransport();
  54. $transport->setApiUser('api_user');
  55. $transport->setApiKey('api_key');
  56. $transport->setWsdlUrl('http://magento.domain');
  57. $om->persist($transport);
  58. $channel = new Channel();
  59. $channel->setType('magento');
  60. $channel->setConnectors(['customer', 'cart', 'order']);
  61. $channel->setName(self::CHANNEL_NAME);
  62. $channel->setTransport($transport);
  63. $om->persist($channel);
  64. $this->persistDemoCustomers($om, $website, $store, $group, $channel);
  65. $om->flush();
  66. $this->persistDemoCarts($om, $store, $channel);
  67. $om->flush();
  68. $this->persistDemoOrders($om, $store, $channel);
  69. $om->flush();
  70. }
  71. /**
  72. * @param ObjectManager $om
  73. * @param Store $store
  74. * @param Channel $channel
  75. */
  76. protected function persistDemoCarts(
  77. ObjectManager $om,
  78. Store $store,
  79. Channel $channel
  80. ) {
  81. /** @var Customer[] $customers */
  82. $customers = $om->getRepository('OroCRMMagentoBundle:Customer')->findAll();
  83. /** @var CartStatus $status */
  84. $status = $om->getRepository('OroCRMMagentoBundle:CartStatus')->findOneBy(array('name' => 'open'));
  85. for ($i = 0; $i < 10; ++$i) {
  86. $customerRandom = rand(0, count($customers)-1);
  87. $cart = $this->generateShoppingCart($om, $store, $channel, $customers[$customerRandom], $status, $i);
  88. $this->generateShoppingCartItem($om, $cart);
  89. }
  90. }
  91. /**
  92. * @param ObjectManager $om
  93. * @param Store $store
  94. * @param Channel $channel
  95. */
  96. protected function persistDemoOrders(
  97. ObjectManager $om,
  98. Store $store,
  99. Channel $channel
  100. ) {
  101. /** @var Cart[] $carts */
  102. $carts = $om->getRepository('OroCRMMagentoBundle:Cart')->findAll();
  103. $paymentMethod = ['Ccsave', 'Checkmo'];
  104. $paymentMethodDetails = ['Card[MC]', 'Card[AE]', 'N/A'];
  105. $status = ['Pending', 'Processing', 'Completed', 'Canceled'];
  106. $i = 0;
  107. foreach ($carts as $cart) {
  108. /** @var Cart $cart */
  109. $order = $this->generateOrder(
  110. $om,
  111. $store,
  112. $channel,
  113. $cart->getCustomer(),
  114. $status[rand(0, count($status)-1)],
  115. $cart,
  116. $paymentMethod[rand(0, count($paymentMethod)-1)],
  117. $paymentMethodDetails[rand(0, count($paymentMethodDetails)-1)],
  118. $i++
  119. );
  120. $this->generateOrderItem($om, $order, $cart);
  121. }
  122. }
  123. /**
  124. * @param ObjectManager $om
  125. * @param Store $store
  126. * @param Channel $channel
  127. * @param Customer $customer
  128. * @param string $status
  129. * @param Cart $cart
  130. * @param string $paymentMethod
  131. * @param string $paymentMethodDetails
  132. * @param mixed $origin
  133. *
  134. * @return Order
  135. */
  136. protected function generateOrder(
  137. ObjectManager $om,
  138. Store $store,
  139. Channel $channel,
  140. Customer $customer,
  141. $status,
  142. Cart $cart,
  143. $paymentMethod,
  144. $paymentMethodDetails,
  145. $origin
  146. ) {
  147. $order = new Order();
  148. $order->setChannel($channel);
  149. $order->setCustomer($customer);
  150. $order->setOwner($customer->getOwner());
  151. $order->setStatus($status);
  152. $order->setStore($store);
  153. $order->setStoreName($store->getName());
  154. $order->setIsGuest(0);
  155. $order->setIncrementId((string)$origin);
  156. $order->setCreatedAt(new \DateTime('now'));
  157. $order->setUpdatedAt(new \DateTime('now'));
  158. $order->setCart($cart);
  159. $order->setCurrency($cart->getBaseCurrencyCode());
  160. $order->setTotalAmount($cart->getGrandTotal());
  161. $order->setTotalInvoicedAmount($cart->getGrandTotal());
  162. if ($status == 'Completed') {
  163. $order->setTotalPaidAmount($cart->getGrandTotal());
  164. }
  165. $order->setSubtotalAmount($cart->getSubTotal());
  166. $order->setShippingAmount(rand(5, 10));
  167. $order->setPaymentMethod($paymentMethod);
  168. $order->setPaymentDetails($paymentMethodDetails);
  169. $order->setShippingMethod('flatrate_flatrate');
  170. $address = $this->getOrderAddress($om);
  171. $order->addAddress($address);
  172. $address->setOwner($order);
  173. $om->persist($order);
  174. return $order;
  175. }
  176. /**
  177. * @param ObjectManager $om
  178. * @param Order $order
  179. * @param Cart $cart
  180. *
  181. * @return OrderItem[]
  182. */
  183. protected function generateOrderItem(ObjectManager $om, Order $order, Cart $cart)
  184. {
  185. $cartItems = $cart->getCartItems();
  186. $orderItems = array();
  187. foreach ($cartItems as $cartItem) {
  188. $orderItem = new OrderItem();
  189. $orderItem->setOriginId($cartItem->getOriginId());
  190. $orderItem->setOrder($order);
  191. $orderItem->setTaxAmount($cartItem->getTaxAmount());
  192. $orderItem->setTaxPercent($cartItem->getTaxPercent());
  193. $orderItem->setRowTotal($cartItem->getRowTotal());
  194. $orderItem->setProductType($cartItem->getProductType());
  195. $orderItem->setIsVirtual((bool)$cartItem->getIsVirtual());
  196. $orderItem->setQty($cartItem->getQty());
  197. $orderItem->setSku($cartItem->getSku());
  198. $orderItem->setPrice($cartItem->getPrice());
  199. $orderItem->setOriginalPrice($cartItem->getPrice());
  200. $orderItem->setName($cartItem->getName());
  201. $orderItems[] = $orderItem;
  202. $om->persist($orderItem);
  203. }
  204. $order->setItems($orderItems);
  205. $om->persist($order);
  206. return $orderItems;
  207. }
  208. /**
  209. * @param ObjectManager $om
  210. * @param Store $store
  211. * @param Channel $channel
  212. * @param Customer $customer
  213. * @param CartStatus $status
  214. * @param int $origin
  215. * @param string $currency
  216. * @param int $rate
  217. *
  218. * @return Cart
  219. */
  220. protected function generateShoppingCart(
  221. ObjectManager $om,
  222. Store $store,
  223. Channel $channel,
  224. Customer $customer,
  225. CartStatus $status,
  226. $origin,
  227. $currency = 'USD',
  228. $rate = 1
  229. ) {
  230. $cart = new Cart();
  231. $cart->setChannel($channel);
  232. $cart->setCustomer($customer);
  233. $cart->setOwner($customer->getOwner());
  234. $cart->setStatus($status);
  235. $cart->setStore($store);
  236. $cart->setBaseCurrencyCode($currency);
  237. $cart->setStoreCurrencyCode($currency);
  238. $cart->setQuoteCurrencyCode($currency);
  239. $cart->setStoreToBaseRate($rate);
  240. $cart->setStoreToQuoteRate($rate);
  241. $cart->setIsGuest(0);
  242. $cart->setEmail($customer->getEmail());
  243. $cart->setCreatedAt(new \DateTime('now'));
  244. $cart->setUpdatedAt(new \DateTime('now'));
  245. $cart->setOriginId($origin);
  246. $om->persist($cart);
  247. return $cart;
  248. }
  249. /**
  250. * @param ObjectManager $om
  251. * @param Cart $cart
  252. *
  253. * @return CartItem[]
  254. */
  255. protected function generateShoppingCartItem(ObjectManager $om, Cart $cart)
  256. {
  257. $products = array('Computer', 'Gaming Computer', 'Universal Camera Case', 'SLR Camera Tripod',
  258. 'Two Year Extended Warranty - Parts and Labor', 'Couch', 'Chair', 'Magento Red Furniture Set');
  259. $cartItems = array();
  260. $cartItemsCount = rand(0, 2);
  261. $total = 0.0;
  262. $totalTaxAmount = 0.0;
  263. $shipping = rand(0, 1);
  264. for ($i = 0; $i <= $cartItemsCount; $i++) {
  265. $product = $products[rand(0, count($products)-1)];
  266. $origin = $i+1;
  267. $price = rand(10, 200);
  268. $price = $price + rand(0, 99)/100.0;
  269. $taxAmount = $price * self::VAT;
  270. $totalTaxAmount = $totalTaxAmount + $taxAmount;
  271. $total = $total + $price + $taxAmount;
  272. $cartItem = new CartItem();
  273. $cartItem->setProductId(rand(1, 100));
  274. $cartItem->setFreeShipping((string)$shipping);
  275. $cartItem->setIsVirtual(0);
  276. $cartItem->setRowTotal($price + $taxAmount);
  277. $cartItem->setPriceInclTax($price + $taxAmount);
  278. $cartItem->setTaxAmount($taxAmount);
  279. $cartItem->setSku('sku-' . $product);
  280. $cartItem->setProductType('simple');
  281. $cartItem->setName($product);
  282. $cartItem->setQty(1);
  283. $cartItem->setPrice($price);
  284. $cartItem->setDiscountAmount(0);
  285. $cartItem->setTaxPercent(self::VAT);
  286. $cartItem->setCreatedAt(new \DateTime('now'));
  287. $cartItem->setUpdatedAt(new \DateTime('now'));
  288. $cartItem->setOriginId($origin);
  289. $cartItem->setCart($cart);
  290. $cart->getCartItems()->add($cartItem);
  291. $cart->setItemsQty($i+1);
  292. $cart->setItemsCount($i+1);
  293. $om->persist($cartItem);
  294. $cartItems[] = $cartItem;
  295. }
  296. $cart->setSubTotal($total);
  297. $shippingAmount = 0.0;
  298. if ((bool)$shipping) {
  299. $shippingAmount = rand(3, 10);
  300. }
  301. $cart->setGrandTotal($total + $shippingAmount);
  302. $cart->setTaxAmount($totalTaxAmount);
  303. $om->persist($cart);
  304. return $cartItems;
  305. }
  306. protected function getOrderAddress(ObjectManager $om)
  307. {
  308. $address = new OrderAddress;
  309. $address->setCity('City');
  310. $address->setStreet('First street');
  311. $address->setPostalCode(123456);
  312. $address->setFirstName('John');
  313. $address->setLastName('Doe');
  314. /** @var Country $country */
  315. $country = $om->getRepository('OroAddressBundle:Country')->findOneBy(array('iso2Code' => 'US'));
  316. $address->setCountry($country);
  317. /** @var Region $region */
  318. $region = $om->getRepository('OroAddressBundle:Region')->findOneBy(array('combinedCode' => 'US-AK'));
  319. $address->setRegion($region);
  320. $om->persist($address);
  321. return $address;
  322. }
  323. /**
  324. * @param ObjectManager $om
  325. * @param Website $website
  326. * @param Store $store
  327. * @param CustomerGroup $group
  328. * @param Channel $channel
  329. */
  330. protected function persistDemoCustomers(
  331. ObjectManager $om,
  332. Website $website,
  333. Store $store,
  334. CustomerGroup $group,
  335. Channel $channel
  336. ) {
  337. $accounts = $om->getRepository('OroCRMAccountBundle:Account')->findAll();
  338. $contacts = $om->getRepository('OroCRMContactBundle:Contact')->findAll();
  339. $buffer = range(0, 48);
  340. shuffle($buffer);
  341. for ($i = 0; $i < 49; ++$i) {
  342. $birthday = $this->generateBirthday();
  343. /** @var Contact $contact */
  344. $contact = $contacts[$buffer[$i]];
  345. $customer = new Customer();
  346. if (is_null($accounts[$buffer[$i]])) {
  347. var_dump($buffer[$i]);
  348. }
  349. $customer->setWebsite($website)
  350. ->setChannel($channel)
  351. ->setStore($store)
  352. ->setFirstName($contact->getFirstName())
  353. ->setLastName($contact->getLastName())
  354. ->setEmail($contact->getPrimaryEmail())
  355. ->setBirthday($birthday)
  356. ->setVat(self::VAT * 100.0)
  357. ->setGroup($group)
  358. ->setCreatedAt(new \DateTime('now'))
  359. ->setUpdatedAt(new \DateTime('now'))
  360. ->setOriginId($i + 1)
  361. ->setAccount($accounts[$buffer[$i]])
  362. ->setContact($contact)
  363. ->setOwner($this->getRandomOwner());
  364. $om->persist($customer);
  365. }
  366. }
  367. /**
  368. * Generates a date of birth
  369. *
  370. * @return \DateTime
  371. */
  372. private function generateBirthday()
  373. {
  374. // Convert to timestamps
  375. $min = strtotime('1950-01-01');
  376. $max = strtotime('2000-01-01');
  377. // Generate random number using above bounds
  378. $val = rand($min, $max);
  379. // Convert back to desired date format
  380. return new \DateTime(date('Y-m-d', $val), new \DateTimeZone('UTC'));
  381. }
  382. /**
  383. * @return User
  384. */
  385. protected function getRandomOwner()
  386. {
  387. $randomUser = count($this->users)-1;
  388. $user = $this->users[rand(0, $randomUser)];
  389. return $user;
  390. }
  391. }