領収証発行サービス
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.

137 lines
5.1KB

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