領収証発行サービス
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

220 lines
8.4KB

  1. <?php
  2. namespace App\Util\Custom\HelloTechno;
  3. use App\Codes\EnvironmentName;
  4. use App\Exceptions\AppCommonException;
  5. use App\Models\ReceiptIssuingHTParkingCustomOrder;
  6. use App\Models\ReceiptIssuingOrder;
  7. use App\Models\ReceiptIssuingOrderTax;
  8. use Exception;
  9. use Illuminate\Support\Arr;
  10. use Illuminate\Support\Carbon;
  11. use Illuminate\Support\Facades\Http;
  12. use Illuminate\Support\Facades\Log;
  13. class API
  14. {
  15. const CONDITION_CUSTOMER_CODDE = 'customer_code';
  16. const CONDITION_PARKING_MANAGEMENT_CODDE = 'parking_management_code';
  17. const CONDITION_PARKING_NAME = 'parking_name';
  18. private const RESULT_CODE = 'result_code';
  19. private const RESULT_CODE_SUCCESS = 'SUCCESS';
  20. private const FIELD_DATA = 'data';
  21. private const URL_CUSTOMERS = 'customers';
  22. private const URL_PARKINGS = 'parkings';
  23. private const URL_ADJUST_DATA = 'adjust-data';
  24. private const URL_RECEIPT_ISSUING_ORDER = 'receipt-issuing';
  25. private const CONFIG_KEY_API_HOST = "logic.custom.hellotechno.host";
  26. public static function getCustomers(?string $customerCode = null)
  27. {
  28. $query = [];
  29. if ($customerCode) {
  30. $query['customer_code'] = $customerCode;
  31. }
  32. return static::get(static::getCustomersUrl(), $query);
  33. }
  34. public static function getParkings(array $condition)
  35. {
  36. $condition = Arr::only($condition, [
  37. self::CONDITION_CUSTOMER_CODDE,
  38. self::CONDITION_PARKING_MANAGEMENT_CODDE,
  39. self::CONDITION_PARKING_NAME,
  40. ]);
  41. return static::get(static::getParkingsUrl(), $condition);
  42. }
  43. public static function getAdjustData(string $customerCode, string $parkingManagementCode, int $adjustSeqNo)
  44. {
  45. $query['customer_code'] = $customerCode;
  46. $query['parking_management_code'] = $parkingManagementCode;
  47. $query['adjust_seq_no'] = $adjustSeqNo;
  48. return static::get(static::getAdjustDataUrl(), $query);
  49. }
  50. public static function sendReceiptIssuingOrder(
  51. ReceiptIssuingOrder $order,
  52. ReceiptIssuingHTParkingCustomOrder $customOrder,
  53. ReceiptIssuingOrderTax $tax,
  54. string $eventName,
  55. Carbon $eventDatetime
  56. ) {
  57. $param = static::makeReceiptIssuingOrderParams($order, $customOrder, $tax, $eventName, $eventDatetime);
  58. return static::post(static::getReceiptIssuingOrderUrl(), $param);
  59. }
  60. private static function getHost(): string
  61. {
  62. return config(static::CONFIG_KEY_API_HOST, "http://localhost");
  63. }
  64. private static function getCustomersUrl()
  65. {
  66. $condition = [static::getHost(), static::URL_CUSTOMERS];
  67. return implode('/', $condition);
  68. }
  69. private static function getParkingsUrl()
  70. {
  71. $condition = [static::getHost(), static::URL_PARKINGS];
  72. return implode('/', $condition);
  73. }
  74. private static function getAdjustDataUrl()
  75. {
  76. $condition = [static::getHost(), static::URL_ADJUST_DATA];
  77. return implode('/', $condition);
  78. }
  79. private static function getReceiptIssuingOrderUrl()
  80. {
  81. $condition = [];
  82. if (app()->environment([EnvironmentName::LOCAL->value])) {
  83. // テスト環境用
  84. $condition = ['http://localhost/test/HT/receipt-issuing'];
  85. } else {
  86. // 正規ルート
  87. $condition = [static::getHost(), static::URL_RECEIPT_ISSUING_ORDER];
  88. }
  89. return implode('/', $condition);
  90. }
  91. public static function makeReceiptIssuingOrderParams(
  92. ReceiptIssuingOrder $order,
  93. ReceiptIssuingHTParkingCustomOrder $customOrder,
  94. ReceiptIssuingOrderTax $tax,
  95. string $eventName,
  96. Carbon $eventDatetime
  97. ): array {
  98. $param = [];
  99. $param['id'] = $order->id;
  100. $param['event_name'] = $eventName;
  101. $param['event_datetime'] = static::formatDateTimeStr($eventDatetime);
  102. $param['customer_code'] = $customOrder->customer_code;
  103. $param['parking_management_code'] = $customOrder->parking_management_code;
  104. $param['adjust_seq_no'] = $customOrder->adjust_seq_no;
  105. $param['order_datetime'] = static::formatDateTimeStr($order->order_datetime);
  106. $param['status_done'] = $order->status_done;
  107. $param['status_sms_send_datetime'] = static::formatDateTimeStr($order->status_sms_send_datetime);
  108. $param['status_first_access_datetime'] = static::formatDateTimeStr($order->status_first_access_datetime);
  109. $param['status_receipt_confirm_datetime'] = static::formatDateTimeStr($order->status_receipt_confirm_datetime);
  110. $param['status_order_mail_datetime'] = static::formatDateTimeStr($order->status_order_mail_datetime);
  111. $param['status_mail_download_datetime'] = static::formatDateTimeStr($order->status_mail_download_datetime);
  112. $param['status_mail_post_date'] = static::formatDateStr($order->status_mail_post_date);
  113. $param['status_receipt_download_datetime'] = static::formatDateTimeStr($order->status_receipt_download_datetime);
  114. $param['status_receipt_email_send_order_datetime'] = static::formatDateTimeStr($order->status_receipt_email_send_order_datetime);
  115. $param['status_receipt_email_send_datetime'] = static::formatDateTimeStr($order->status_receipt_email_send_datetime);
  116. $param['sms_phone_number'] = $order->sms_phone_number;
  117. $param['sms_send_success'] = $order->sms_send_success;
  118. $param['receipt_no'] = $order->receipt_no;
  119. $param['receipt_use_date'] = static::formatDateStr($order->receipt_use_date);
  120. $param['receipt_shop_name'] = $order->receipt_shop_name;
  121. $param['receipt_issuer'] = $order->receipt_issuer;
  122. $param['receipt_purpose'] = $order->receipt_purpose;
  123. $param['receipt_name'] = $order->receipt_name;
  124. $param['receipt_invoice_no'] = $order->receipt_invoice_no;
  125. $param['receipt_amount'] = $order->receipt_amount;
  126. $param['tax_rate'] = $tax->tax_rate;
  127. $param['tax_amount'] = $tax->tax_amount;
  128. $param['email'] = $order->email;
  129. $param['mail_pref_code'] = $order->mail_pref_code !== null ? $order->mail_pref_code->value : null;
  130. $param['mail_zip_code'] = $order->mail_zip_code;
  131. $param['mail_address1'] = $order->mail_address1;
  132. $param['mail_address2'] = $order->mail_address2;
  133. $param['mail_address3'] = $order->mail_address3;
  134. $param['mail_name'] = $order->mail_name;
  135. $param['seq_number'] = $order->seq_number;
  136. $param['updated_at'] = static::formatDateStr($order->updated_at);
  137. return $param;
  138. }
  139. private static function formatDateStr(?Carbon $date): ?string
  140. {
  141. if ($date === null) return null;
  142. return $date->format('Y-m-d');
  143. }
  144. private static function formatDateTimeStr(?Carbon $date): ?string
  145. {
  146. if ($date === null) return null;
  147. return $date->format('Y-m-d H:i:s');
  148. }
  149. private static function get(string $url, array $query = [])
  150. {
  151. try {
  152. $res = Http::get($url, $query);
  153. if ($res->failed()) {
  154. throw $res->throw();
  155. }
  156. $data = $res->json();
  157. if (data_get($data, static::RESULT_CODE) !== static::RESULT_CODE_SUCCESS) {
  158. Log::error("HT RESPONSE ERROR");
  159. Log::error($data);
  160. throw new AppCommonException('HT API 失敗');
  161. }
  162. return data_get($data, static::FIELD_DATA, []);
  163. } catch (Exception $e) {
  164. Log::error("HelloTechno API エラー URL:{$url}]");
  165. throw $e;
  166. }
  167. }
  168. private static function post(string $url, array $param = [])
  169. {
  170. try {
  171. // そのままポストしてしまうとunicodeエスケープして送られてしまい
  172. // HT側で変換の手間がかかるため、withBodyを使って素のボディ部を設定する
  173. $res = Http::withBody(json_encode($param, JSON_UNESCAPED_UNICODE))
  174. ->post($url);
  175. if ($res->failed()) {
  176. throw $res->throw();
  177. }
  178. $data = $res->json();
  179. if (data_get($data, static::RESULT_CODE) !== static::RESULT_CODE_SUCCESS) {
  180. Log::error("HT RESPONSE ERROR");
  181. Log::error($data);
  182. throw new AppCommonException('HT API 失敗');
  183. }
  184. return data_get($data, static::FIELD_DATA, []);
  185. } catch (Exception $e) {
  186. Log::error("HelloTechno API エラー URL:{$url}]");
  187. throw $e;
  188. }
  189. }
  190. }