領収証発行サービス
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
5.7KB

  1. <?php
  2. namespace App\Http\Controllers\Web\Custom\HelloTechno;
  3. use App\Codes\UserRole;
  4. use App\Features\LoginUser;
  5. use App\Files\CsvFile;
  6. use App\Http\Controllers\Web\IParam;
  7. use App\Models\ReceiptIssuingOrder;
  8. use App\Repositories\Custom\HelloTechno\ReceiptIssuingOrderRepository;
  9. use App\Repositories\Custom\HelloTechno\ReceiptIssuingOrderRepositoryData as RDATA;
  10. use App\Repositories\Custom\HelloTechno\UseSummaryRepository;
  11. use App\Util\DateUtil;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Str;
  14. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  15. class UseSummaryCSVController extends HelloTechnoController
  16. {
  17. use LoginUser;
  18. public function name(): string
  19. {
  20. return "[HelloTechno専用]利用実績一覧CSV取得";
  21. }
  22. public function description(): string
  23. {
  24. return "[HelloTechno専用]利用実績の一覧CSVを取得する";
  25. }
  26. public function __construct(
  27. protected UseSummaryCSVParam $param,
  28. private ReceiptIssuingOrderRepository $receiptIssuingOrderRepository,
  29. private UseSummaryRepository $useSummaryRepository,
  30. ) {
  31. parent::__construct();
  32. $this->roleAllow(UserRole::NORMAL_ADMIN);
  33. }
  34. protected function getParam(): IParam
  35. {
  36. return $this->param;
  37. }
  38. protected function run(Request $request): BinaryFileResponse
  39. {
  40. $param = $this->param;
  41. // データ取得
  42. $condition = [
  43. UseSummaryRepository::CONDITION_CONTRACT_ID => $this->loginUser()->getCurrentContractId(),
  44. UseSummaryRepository::CONDITION_SORT_TARGET => 'customer_code',
  45. ReceiptIssuingOrderRepository::CONDITION_ORDER_DATE_FROM => $param->dateFrom,
  46. ReceiptIssuingOrderRepository::CONDITION_ORDER_DATE_TO => $param->dateTo,
  47. UseSummaryRepository::CONDITION_ORDER_DATE_FROM => $param->dateFrom,
  48. UseSummaryRepository::CONDITION_ORDER_DATE_TO => $param->dateTo,
  49. UseSummaryRepository::CONDITION_CUSTOMER_CODE => $param->customerCode,
  50. ];
  51. $receiptIssuingOrderList = $this->receiptIssuingOrderRepository->get([
  52. ...$condition,
  53. UseSummaryRepository::CONDITION_SORT_TARGET => ReceiptIssuingOrder::COL_NAME_ORDER_DATETIME,
  54. UseSummaryRepository::CONDITION_SORT_ORDER => UseSummaryRepository::ORDER_ASC,
  55. ]);
  56. $summaryList = $this->useSummaryRepository->get($condition);
  57. // CSVファイル作成
  58. // 領収証発行依頼データ
  59. $csv = new CsvFile($this->getReceiptIssuingOrdersLabel(), CsvFile::ENCODE_SJIS);
  60. $sortDef = array_keys($this->getReceiptIssuingOrdersLabel());
  61. foreach ($receiptIssuingOrderList as $row) {
  62. $csv->addLine($row->toArray(), $sortDef);
  63. }
  64. // 集計データ
  65. $csv->addLine([]);
  66. $csv->addLine($this->getSummaryHeaderLabels());
  67. $sortDef = array_keys($this->getSummaryHeaderLabels());
  68. $customerName = "xx";
  69. foreach ($summaryList as $row) {
  70. $csv->addLine($row->toArray(), $sortDef);
  71. $customerName = $row->customer_name;
  72. }
  73. return $csv->download($this->getDownloadFileName($customerName));
  74. }
  75. private function getReceiptIssuingOrdersLabel(): array
  76. {
  77. return [
  78. RDATA::COL_NAME_ORDER_DATETIME => '受付時刻',
  79. RDATA::COL_NAME_STATUS_NAME => 'ステータス',
  80. RDATA::COL_NAME_PARKING_NAME => '駐車場名',
  81. RDATA::COL_NAME_RECEIPT_USE_DATE => '利用日',
  82. RDATA::COL_NAME_ADJUST_SEQ_NO => '精算連番',
  83. RDATA::COL_NAME_RECEIPT_AMOUNT => '金額',
  84. RDATA::COL_NAME_RECEIPT_NAME => '宛名',
  85. RDATA::COL_NAME_STATUS_DONE => '完了',
  86. RDATA::COL_NAME_RECEIPT_NO => '領収証番号',
  87. // アクション日付
  88. RDATA::COL_NAME_SMS_PHONE_NUMBER => 'SMS送信先',
  89. RDATA::COL_NAME_STATUS_SMS_SEND_DATETIME => 'SMS送信日時',
  90. RDATA::COL_NAME_STATUS_FIRST_ACCESS_DATETIME => '初回アクセス日時',
  91. RDATA::COL_NAME_STATUS_RECEIPT_CONFIRM_DATETIME => '領収証確定日時',
  92. RDATA::COL_NAME_STATUS_ORDER_MAIL_DATETIME => '郵送依頼日時',
  93. RDATA::COL_NAME_STATUS_MAIL_POST_DATE => '投函日',
  94. RDATA::COL_NAME_STATUS_RECEIPT_DOWNLOAD_DATETIME => '領収証ダウンロード日時',
  95. RDATA::COL_NAME_STATUS_RECEIPT_EMAIL_SEND_ORDER_DATETIME => 'EMAIL送信依頼日時',
  96. RDATA::COL_NAME_STATUS_RECEIPT_EMAIL_SEND_DATETIME => 'EMAIL送信日時',
  97. // 郵送先
  98. RDATA::COL_NAME_MAIL_ZIP_CODE => '郵便番号',
  99. RDATA::COL_NAME_MAIL_ADDRESS1 => '住所1',
  100. RDATA::COL_NAME_MAIL_ADDRESS2 => '住所2',
  101. RDATA::COL_NAME_MAIL_ADDRESS3 => '住所3',
  102. RDATA::COL_NAME_MAIL_NAME => '郵送宛名',
  103. ];
  104. }
  105. private function getSummaryHeaderLabels(): array
  106. {
  107. return [
  108. 'date_from' => '開始年月日',
  109. 'date_to' => '終了年月日',
  110. 'customer_name' => '顧客名',
  111. 'receipt_order_count' => '領収証発行依頼件数',
  112. 'mail_order_count' => '郵送依頼件数',
  113. 'sms_send_count' => 'SMS送信件数',
  114. ];
  115. }
  116. private function getDownloadFileName(string $customerName)
  117. {
  118. $customerName = Str::of($customerName)->remove(" ")->remove(" ")->toString();
  119. $param = $this->param;
  120. return sprintf(
  121. "利用実績_%s_%s_%s_%s.csv",
  122. $customerName,
  123. $param->dateFrom->format('Ymd'),
  124. $param->dateTo->format('Ymd'),
  125. DateUtil::now()->format('YmdHis')
  126. );
  127. }
  128. }