OrderMapper.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. class OrderMapper {
  3. /**
  4. * Convert a Reverb order object into an OpenCart addOrder() data array.
  5. *
  6. * @param array $reverb_order Order object from GET /my/orders/{number}.
  7. * @param array $oc_product Matching OC product row (product_id, name, model, price).
  8. * @param array $store_info ['store_id', 'store_name', 'store_url', 'language_id',
  9. * 'currency_id', 'currency_code', 'currency_value'].
  10. * @param int $order_status_id Default order status ID (typically 1 = Pending).
  11. * @return array Ready to pass to model_checkout_order->addOrder().
  12. */
  13. public static function toOpenCart(array $reverb_order, array $oc_product, array $store_info, $order_status_id = 1) {
  14. // --- Buyer name split ---
  15. $buyer_name = isset($reverb_order['buyer_name']) ? $reverb_order['buyer_name'] : 'Reverb Buyer';
  16. $name_parts = explode(' ', trim($buyer_name), 2);
  17. $first_name = $name_parts[0];
  18. $last_name = isset($name_parts[1]) ? $name_parts[1] : '';
  19. $buyer_email = isset($reverb_order['buyer_email']) ? $reverb_order['buyer_email'] : '';
  20. // --- Shipping address ---
  21. $ship = isset($reverb_order['shipping_address']) ? $reverb_order['shipping_address'] : [];
  22. $ship_name = isset($ship['name']) ? $ship['name'] : $buyer_name;
  23. $ship_parts = explode(' ', trim($ship_name), 2);
  24. $ship_first = $ship_parts[0];
  25. $ship_last = isset($ship_parts[1]) ? $ship_parts[1] : '';
  26. $ship_addr1 = isset($ship['street_address']) ? $ship['street_address'] : '';
  27. $ship_city = isset($ship['locality']) ? $ship['locality'] : '';
  28. $ship_state = isset($ship['region']) ? $ship['region'] : '';
  29. $ship_post = isset($ship['postal_code']) ? $ship['postal_code'] : '';
  30. $ship_country = isset($ship['country_code']) ? strtoupper($ship['country_code']) : 'AU';
  31. // --- Totals ---
  32. $total_amount = isset($reverb_order['total']['amount'])
  33. ? (float)$reverb_order['total']['amount']
  34. : (float)$oc_product['price'] * (isset($reverb_order['quantity']) ? (int)$reverb_order['quantity'] : 1);
  35. $quantity = isset($reverb_order['quantity']) ? (int)$reverb_order['quantity'] : 1;
  36. $order_data = [
  37. // Store
  38. 'invoice_prefix' => 'INV-',
  39. 'invoice_no' => 0,
  40. 'store_id' => $store_info['store_id'],
  41. 'store_name' => $store_info['store_name'],
  42. 'store_url' => $store_info['store_url'],
  43. // Customer (guest)
  44. 'customer_id' => 0,
  45. 'customer_group_id' => 1,
  46. 'firstname' => $first_name,
  47. 'lastname' => $last_name,
  48. 'email' => $buyer_email,
  49. 'telephone' => '',
  50. 'fax' => '',
  51. 'custom_field' => [],
  52. // Payment (use shipping address for Reverb orders)
  53. 'payment_firstname' => $ship_first,
  54. 'payment_lastname' => $ship_last,
  55. 'payment_company' => '',
  56. 'payment_address_1' => $ship_addr1,
  57. 'payment_address_2' => '',
  58. 'payment_city' => $ship_city,
  59. 'payment_postcode' => $ship_post,
  60. 'payment_country' => $ship_country,
  61. 'payment_country_id' => 0,
  62. 'payment_zone' => $ship_state,
  63. 'payment_zone_id' => 0,
  64. 'payment_address_format'=> '',
  65. 'payment_custom_field' => [],
  66. 'payment_method' => 'Reverb',
  67. 'payment_code' => 'reverb',
  68. // Shipping
  69. 'shipping_firstname' => $ship_first,
  70. 'shipping_lastname' => $ship_last,
  71. 'shipping_company' => '',
  72. 'shipping_address_1' => $ship_addr1,
  73. 'shipping_address_2' => '',
  74. 'shipping_city' => $ship_city,
  75. 'shipping_postcode' => $ship_post,
  76. 'shipping_country' => $ship_country,
  77. 'shipping_country_id' => 0,
  78. 'shipping_zone' => $ship_state,
  79. 'shipping_zone_id' => 0,
  80. 'shipping_address_format' => '',
  81. 'shipping_custom_field' => [],
  82. 'shipping_method' => 'Reverb Shipping',
  83. 'shipping_code' => 'reverb.reverb',
  84. // Misc
  85. 'comment' => 'Reverb Order #' . ($reverb_order['order_number'] ?? ''),
  86. 'total' => $total_amount,
  87. 'affiliate_id' => 0,
  88. 'commission' => 0,
  89. 'language_id' => $store_info['language_id'],
  90. 'currency_id' => $store_info['currency_id'],
  91. 'currency_code' => $store_info['currency_code'],
  92. 'currency_value' => $store_info['currency_value'],
  93. 'ip' => '',
  94. 'forwarded_ip' => '',
  95. 'user_agent' => '',
  96. 'accept_language' => '',
  97. 'order_status_id' => $order_status_id,
  98. // Products
  99. 'products' => [
  100. [
  101. 'product_id' => (int)$oc_product['product_id'],
  102. 'name' => $oc_product['name'],
  103. 'model' => $oc_product['model'],
  104. 'quantity' => $quantity,
  105. 'price' => (float)$oc_product['price'],
  106. 'total' => (float)$oc_product['price'] * $quantity,
  107. 'tax' => 0.00,
  108. 'reward' => 0,
  109. 'option' => [],
  110. 'download' => [],
  111. 'subscription' => '',
  112. 'tax_class_id' => 0,
  113. ],
  114. ],
  115. // Totals
  116. 'totals' => [
  117. [
  118. 'code' => 'sub_total',
  119. 'title' => 'Sub-Total',
  120. 'value' => $total_amount,
  121. 'sort_order' => 1,
  122. ],
  123. [
  124. 'code' => 'total',
  125. 'title' => 'Total',
  126. 'value' => $total_amount,
  127. 'sort_order' => 9,
  128. ],
  129. ],
  130. 'vouchers' => [],
  131. ];
  132. return $order_data;
  133. }
  134. }