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

132 lines
4.9KB

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