ソースを参照

全体整備

develop
sosuke.iwabuchi 2年前
コミット
7def69c569
45個のファイルの変更1067行の追加224行の削除
  1. +10
    -0
      app/Codes/EnvironmentName.php
  2. +123
    -0
      app/Codes/PrefCode.php
  3. +0
    -27
      app/Codes/ReceiptIssuingOrderStatus.php
  4. +33
    -20
      app/Console/Commands/PollSMSSendOrder.php
  5. +1
    -2
      app/Console/Commands/TestMail.php
  6. +0
    -2
      app/Console/Kernel.php
  7. +0
    -19
      app/Console/Schedules/MailSend.php
  8. +0
    -19
      app/Console/Schedules/SMSSend.php
  9. +12
    -0
      app/Exceptions/ExclusiveException.php
  10. +1
    -1
      app/Features/InstanceAble.php
  11. +10
    -12
      app/Http/Controllers/Web/Custom/HelloTechno/CreateReceiptIssuingOrderController.php
  12. +2
    -4
      app/Http/Controllers/Web/Custom/HelloTechno/CreateReceiptIssuingOrderParam.php
  13. +53
    -0
      app/Http/Controllers/Web/ReceiptIssuingOrder/ConfirmController.php
  14. +26
    -0
      app/Http/Controllers/Web/ReceiptIssuingOrder/ConfirmParam.php
  15. +2
    -2
      app/Http/Controllers/Web/ReceiptIssuingOrder/CreateParam.php
  16. +2
    -1
      app/Http/Controllers/Web/ReceiptIssuingOrder/DownloadController.php
  17. +54
    -0
      app/Http/Controllers/Web/ReceiptIssuingOrder/MailOrderController.php
  18. +37
    -0
      app/Http/Controllers/Web/ReceiptIssuingOrder/MailOrderParam.php
  19. +24
    -1
      app/Http/Controllers/Web/ReceiptIssuingOrder/TokenCheckController.php
  20. +13
    -0
      app/Http/Controllers/Web/SortableParam.php
  21. +12
    -0
      app/Http/Controllers/Web/TimestampParam.php
  22. +11
    -12
      app/Listeners/SMS/ConfirmListener.php
  23. +12
    -5
      app/Logic/ReceiptIssuingOrder/CreateManager.php
  24. +0
    -6
      app/Logic/ReceiptIssuingOrder/Custom/HelloTechno/CreateManager.php
  25. +33
    -19
      app/Logic/ReceiptIssuingOrder/PDFDownLoadManager.php
  26. +176
    -1
      app/Logic/ReceiptIssuingOrder/ReceiptIssuingOrderManager.php
  27. +12
    -1
      app/Logic/ReceiptIssuingOrder/TokenCheckManager.php
  28. +2
    -37
      app/Logic/ReceiptIssuingOrder/UpdateManager.php
  29. +12
    -5
      app/Logic/SMS/FourSMessageManager.php
  30. +0
    -3
      app/Models/BaseModel.php
  31. +3
    -0
      app/Models/Ex/LoginUser.php
  32. +26
    -6
      app/Models/ReceiptIssuingOrder.php
  33. +19
    -2
      app/Models/SMSProviderFourSMessageCommunication.php
  34. +6
    -0
      app/Models/SMSSendOrder.php
  35. +2
    -1
      app/Providers/AppServiceProvider.php
  36. +1
    -8
      app/Repositories/Custom/HelloTechno/ReceiptIssuingOrderRepository.php
  37. +1
    -0
      config/logic.php
  38. +18
    -6
      database/migrations/2023_04_15_152400_create_receipt_issuing_orders_table.php
  39. +1
    -1
      database/migrations/2023_04_18_131700_create_sms_send_orders_table.php
  40. +55
    -0
      resources/css/receipt_a4.css
  41. +80
    -0
      resources/css/receipt_common.css
  42. +29
    -0
      resources/css/receipt_letter.css
  43. +56
    -0
      resources/views/pdf/receipt_a4.blade.php
  44. +94
    -0
      resources/views/pdf/receipt_letter.blade.php
  45. +3
    -1
      routes/api.php

+ 10
- 0
app/Codes/EnvironmentName.php ファイルの表示

@@ -0,0 +1,10 @@
<?php

namespace App\Codes;

enum EnvironmentName: string
{
case LOCAL = 'local';
case STAGING = 'staging';
case PRODUCTOIN = 'production';
}

+ 123
- 0
app/Codes/PrefCode.php ファイルの表示

@@ -0,0 +1,123 @@
<?php

namespace App\Codes;

/**
* JIS X 0401都道府県コード
*/
enum PrefCode: string
{

case HOKKAIDO = '01';
case AOMORI = '02';
case IWATE = '03';
case MIYAGI = '04';
case AKITA = '05';
case YAMAGATA = '06';
case FUKUSHIMA = '07';
case IBARAGI = '08';
case TOCHIGI = '09';
case GUNMA = '10';
case SAITAMA = '11';
case CHIBA = '12';
case TOKYO = '13';
case KANAGAWA = '14';
case NIGATA = '15';
case TOYAMA = '16';
case ISHIKAWA = '17';
case FUKUI = '18';
case YAMANASHI = '19';
case NAGANO = '20';
case GIFU = '21';
case SHIZUOKA = '22';
case AICHI = '23';
case MIE = '24';
case SHIGA = '25';
case KYOTO = '26';
case OSAKA = '27';
case HYOGO = '28';
case NARA = '29';
case WAKAYAMA = '30';
case TOTTORI = '31';
case SHIMANE = '32';
case OKAYAMA = '33';
case HIROSHIMA = '34';
case YAMAGUCHI = '35';
case TOKUSHIMA = '36';
case KAGAWA = '37';
case EHIME = '38';
case KOCHI = '39';
case FUKUOKA = '40';
case SAGA = '41';
case NAGASAKI = '42';
case KUMAMOTO = '43';
case OITA = '44';
case MIYAZAKI = '45';
case KAGOSHIMA = '46';
case OKINAWA = '47';

static private function getDictionary()
{
return [
self::HOKKAIDO->value => '北海道',
self::AOMORI->value => '青森',
self::IWATE->value => '岩手',
self::MIYAGI->value => '宮城',
self::AKITA->value => '秋田',
self::YAMAGATA->value => '山形',
self::FUKUSHIMA->value => '福島',
self::IBARAGI->value => '茨城',
self::TOCHIGI->value => '栃木',
self::GUNMA->value => '群馬',
self::SAITAMA->value => '埼玉',
self::CHIBA->value => '千葉',
self::TOKYO->value => '東京',
self::KANAGAWA->value => '神奈川',
self::NIGATA->value => '新潟',
self::TOYAMA->value => '富山',
self::ISHIKAWA->value => '石川',
self::FUKUI->value => '福井',
self::YAMANASHI->value => '山梨',
self::NAGANO->value => '長野',
self::GIFU->value => '岐阜',
self::SHIZUOKA->value => '静岡',
self::AICHI->value => '愛知',
self::MIE->value => '三重',
self::SHIGA->value => '滋賀',
self::KYOTO->value => '京都',
self::OSAKA->value => '大阪',
self::HYOGO->value => '兵庫',
self::NARA->value => '奈良',
self::WAKAYAMA->value => '和歌山',
self::TOTTORI->value => '鳥取',
self::SHIMANE->value => '島根',
self::OKAYAMA->value => '岡山',
self::HIROSHIMA->value => '広島',
self::YAMAGUCHI->value => '山口',
self::TOKUSHIMA->value => '徳島',
self::KAGAWA->value => '香川',
self::EHIME->value => '愛媛',
self::KOCHI->value => '高知',
self::FUKUOKA->value => '福岡',
self::SAGA->value => '佐賀',
self::NAGASAKI->value => '長崎',
self::KUMAMOTO->value => '熊本',
self::OITA->value => '大分',
self::MIYAZAKI->value => '宮崎',
self::KAGOSHIMA->value => '鹿児島',
self::OKINAWA->value => '沖縄',
];
}

static public function toArray()
{
$ret = [];
$dic = self::getDictionary();
foreach (self::cases() as $val) {
if (isset($dic[$val->value])) {
$ret[][$val->value] = $dic[$val->value];
}
}
return $ret;
}
}

+ 0
- 27
app/Codes/ReceiptIssuingOrderStatus.php ファイルの表示

@@ -1,27 +0,0 @@
<?php

namespace App\Codes;

/**
* 領収証発行依頼ステータス
*/
enum ReceiptIssuingOrderStatus: int
{
case NONE = 0;
case CREATED = 100; // 新規作成
case SMS_SENDING = 200; // SMS送信中
case SMS_RECEIVED = 300; // SMS送信完了
case SMS_OPENED = 400; // SMS開封

// 郵送関連
case MAIL_REQUEST = 500; // 郵送依頼中
case PREPARING_FOR_MAIL = 510; // 郵送準備中
case MAIL_DONE = 520; // 郵送完了

// Email送信関連
case EMAIL_SENDING = 600; // Email送信中
case EMAIL_DONE = 610; // Email送信完了

// PDFダウンロード
case DOWNLOAD_DONE = 700; // ダウンロード完了
}

+ 33
- 20
app/Console/Commands/PollSMSSendOrder.php ファイルの表示

@@ -6,8 +6,9 @@ use App\Events\SMS\ConfirmEvent;
use App\Exceptions\AppCommonException;
use App\Logic\SMS\SMSManager;
use App\Models\SMSSendOrder;
use App\Util\DBUtil;

class TestMail extends BaseCommand
class PollSMSSendOrder extends BaseCommand
{

const COMMAND = "sms:poll";
@@ -72,26 +73,38 @@ class TestMail extends BaseCommand

public function handleOrder(SMSSendOrder $order)
{
$ret = $this->manager->setOrder($order)
->poll();

if ($ret) {
$order->save();

$this->outputInfo(sprintf(
"ID:%s 電話番号:%s %s",
$order->id,
$order->phone_number,
$order->done ? "完了" : "未"
));

// イベント発行
if ($order->done) {
ConfirmEvent::dispatch($order);

$db = DBUtil::instance();

try {
$db->beginTransaction();

$ret = $this->manager->setOrder($order)
->poll();

if ($ret) {
$order->save();

$this->outputInfo(sprintf(
"ID:%s 電話番号:%s %s",
$order->id,
$order->phone_number,
$order->done ? "完了" : "未"
));

// イベント発行
if ($order->done) {
ConfirmEvent::dispatch($order);
}
} else {
$this->outputError(printf("失敗対象:%s", $order->toJson()));
throw new AppCommonException("POLL 失敗");
}
} else {
$this->outputError(printf("失敗対象:%s", $order->toJson()));
throw new AppCommonException("POLL 失敗");

$db->commit();
} catch (Exception $e) {
$db->rollBack();
throw $e;
}
}
}

+ 1
- 2
app/Console/Commands/TestMail.php ファイルの表示

@@ -2,14 +2,13 @@

namespace App\Console\Commands;

use App\Events\Mail\ConfirmEvent;
use App\Logic\EmailManager;
use App\Mail\Test;

class TestMail extends BaseCommand
{

const COMMAND = "test:mail {email}";
const COMMAND = "mail:test {email}";

/**
* The name and signature of the console command.


+ 0
- 2
app/Console/Kernel.php ファイルの表示

@@ -13,8 +13,6 @@ class Kernel extends ConsoleKernel
protected function schedule(Schedule $schedule): void
{
Schedules\HeartBeat::register($schedule);
Schedules\MailSend::register($schedule);
Schedules\SMSSend::register($schedule);
}

/**


+ 0
- 19
app/Console/Schedules/MailSend.php ファイルの表示

@@ -1,19 +0,0 @@
<?php

namespace App\Console\Schedules;

use App\Codes\QueueName;
use Illuminate\Console\Scheduling\Schedule;

class MailSend extends BaseSchedule
{

static public function register(Schedule $schedule)
{
$schedule->command(
sprintf('queue:work --queue=%s --max-time=55 ', QueueName::EMAIL->value)
)
->everyMinute()
->description("メールキュー処理");
}
}

+ 0
- 19
app/Console/Schedules/SMSSend.php ファイルの表示

@@ -1,19 +0,0 @@
<?php

namespace App\Console\Schedules;

use App\Codes\QueueName;
use Illuminate\Console\Scheduling\Schedule;

class SMSSend extends BaseSchedule
{

static public function register(Schedule $schedule)
{
$schedule->command(
sprintf('queue:work --queue=%s --max-time=55 ', QueueName::SMS->value)
)
->everyMinute()
->description("メールキュー処理");
}
}

+ 12
- 0
app/Exceptions/ExclusiveException.php ファイルの表示

@@ -0,0 +1,12 @@
<?php

namespace App\Exceptions;

use Exception;

/**
* 排他エラー
*/
class ExclusiveException extends Exception
{
}

+ 1
- 1
app/Features/InstanceAble.php ファイルの表示

@@ -9,6 +9,6 @@ trait InstanceAble
*/
public static function instance()
{
return app()->make(self::class);
return app()->make(static::class);
}
}

+ 10
- 12
app/Http/Controllers/Web/Custom/HelloTechno/CreateReceiptIssuingOrderController.php ファイルの表示

@@ -43,28 +43,26 @@ class CreateReceiptIssuingOrderController extends HelloTechnoController
$param = $this->param;

// 顧客情報取得
// $customer = collect(API::getCustomers($param->customerCode))
// ->where('customer_code', $param->customerCode)
// ->firstOrFail();
$customer = collect(API::getCustomers($param->customerCode))
->where('customer_code', $param->customerCode)
->firstOrFail();
// 駐車場情報取得
// $parking = collect(API::getParkings($param->customerCode, $param->parkingManagementCode))
// ->where('parking_management_code', $param->parkingManagementCode)
// ->firstOrFail();
$parking = collect(API::getParkings($param->customerCode, $param->parkingManagementCode))
->where('parking_management_code', $param->parkingManagementCode)
->firstOrFail();

$orderData = [
...$param->toArray(),
// HT::COL_NAME_CUSTOMER_NAME => $customer['name'],
// HT::COL_NAME_PARKING_NAME => $parking['name'],
HT::COL_NAME_CUSTOMER_NAME => "TODOテスト運営会社",
HT::COL_NAME_PARKING_NAME => "TODOテスト駐車場",
HT::COL_NAME_CUSTOMER_NAME => $customer['name'],
HT::COL_NAME_PARKING_NAME => $parking['name'],
Order::COL_NAME_HANDLER_ID => Auth::id(),
Order::COL_NAME_SUMMARY_KEY1 => $param->customerCode,
Order::COL_NAME_SUMMARY_KEY2 => $param->parkingManagementCode,
Order::COL_NAME_RECEIPT_PURPOSE => "駐車領収証",
Order::COL_NAME_RECEIPT_INVOICE_NO => "##TODO インボイス登録番号##",
Order::COL_NAME_RECEIPT_PURPOSE => "駐車料金",
Order::COL_NAME_RECEIPT_ISSUER => "##TODO 発行者名##",
Order::COL_NAME_RECEIPT_SHOP_NAME => "##TODO 駐車場名##",
Order::COL_NAME_RECEIPT_ISSUER => $customer['name'],
Order::COL_NAME_RECEIPT_SHOP_NAME => $parking['name'],
Order::COL_NAME_RECEIPT_PURPOSE => "駐車料金",
Order::COL_NAME_MEMO => "駐車料金",
];


+ 2
- 4
app/Http/Controllers/Web/Custom/HelloTechno/CreateReceiptIssuingOrderParam.php ファイルの表示

@@ -12,8 +12,7 @@ use Carbon\Carbon;
* @property string $customerCode
* @property string $parkingManagementCode
* @property int $adjustSeqNo
* @property string $receiptName
* @property Carbon $receiptUseDatetime
* @property Carbon $receiptUseDate
* @property int $receiptAmount
* @property ?string $memo
* @property string $smsPhoneNumber
@@ -27,8 +26,7 @@ class CreateReceiptIssuingOrderParam extends BaseParam
HT::COL_NAME_CUSTOMER_CODE => $this->str(),
HT::COL_NAME_PARKING_MANAGEMENT_CODE => $this->str(),
HT::COL_NAME_ADJUST_SEQ_NO => $this->numeric(true),
ReceiptIssuingOrder::COL_NAME_RECEIPT_USE_DATETIME => $this->date(),
ReceiptIssuingOrder::COL_NAME_RECEIPT_NAME => $this->str(),
ReceiptIssuingOrder::COL_NAME_RECEIPT_USE_DATE => $this->date(),
ReceiptIssuingOrder::COL_NAME_RECEIPT_AMOUNT => $this->numeric(['min:0', 'max:999999']),
ReceiptIssuingOrder::COL_NAME_MEMO => $this->text(true),
ReceiptIssuingOrder::COL_NAME_SMS_PHONE_NUMBER => $this->str([new PhoneNumber()]),


+ 53
- 0
app/Http/Controllers/Web/ReceiptIssuingOrder/ConfirmController.php ファイルの表示

@@ -0,0 +1,53 @@
<?php

namespace App\Http\Controllers\Web\ReceiptIssuingOrder;

use App\Http\Controllers\Web\IParam;
use App\Http\Controllers\Web\WebController;
use App\Logic\ReceiptIssuingOrder\UpdateManager;
use App\Models\ReceiptIssuingOrder;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class ConfirmController extends WebController
{
public function name(): string
{
return "領収証確定";
}

public function description(): string
{
return "領収証を確定する";
}

public function __construct(
protected ConfirmParam $param,
private UpdateManager $manager
) {
parent::__construct();
}

protected function getParam(): IParam
{
return $this->param;
}

protected function run(Request $request): JsonResponse
{
$param = $this->param;


$this->manager->initById($param->id)
->checkTimestamp($param->timestamp)
->fill(
[
ReceiptIssuingOrder::COL_NAME_RECEIPT_NAME => $param->receiptName,
]
)
->setConfirm()
->update();

return $this->successResponse();
}
}

+ 26
- 0
app/Http/Controllers/Web/ReceiptIssuingOrder/ConfirmParam.php ファイルの表示

@@ -0,0 +1,26 @@
<?php

namespace App\Http\Controllers\Web\ReceiptIssuingOrder;

use App\Http\Controllers\Web\BaseParam;
use App\Http\Controllers\Web\TimestampParam;
use App\Models\ReceiptIssuingOrder;

/**
* @property string $id
* @property string $receiptName
*/

class ConfirmParam extends BaseParam implements TimestampParam
{
public function rules(): array
{
return array_merge(
[
ReceiptIssuingOrder::COL_NAME_ID => $this->str(),
ReceiptIssuingOrder::COL_NAME_RECEIPT_NAME => $this->str(),
],
$this->timestamp(),
);
}
}

+ 2
- 2
app/Http/Controllers/Web/ReceiptIssuingOrder/CreateParam.php ファイルの表示

@@ -14,7 +14,7 @@ use Carbon\Carbon;
* @property ?string $sumamryKey2
* @property ?string $smsPhoneNumber
* @property ?string $receiptNo
* @property ?Carbon $receiptUseDatetime
* @property ?Carbon $receiptUseDate
* @property ?string $receiptShopName
* @property ?string $receiptIssuer
* @property ?string $receiptPurpose
@@ -31,7 +31,7 @@ class CreateParam extends BaseParam
ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY2 => $this->str(true),
ReceiptIssuingOrder::COL_NAME_SMS_PHONE_NUMBER => $this->str([new PhoneNumber()]),
ReceiptIssuingOrder::COL_NAME_RECEIPT_NO => $this->str(true),
ReceiptIssuingOrder::COL_NAME_RECEIPT_USE_DATETIME => $this->date(true),
ReceiptIssuingOrder::COL_NAME_RECEIPT_USE_DATE => $this->date(true),
ReceiptIssuingOrder::COL_NAME_RECEIPT_SHOP_NAME => $this->str(true),
ReceiptIssuingOrder::COL_NAME_RECEIPT_ISSUER => $this->str(true),
ReceiptIssuingOrder::COL_NAME_RECEIPT_PURPOSE => $this->str(true),


+ 2
- 1
app/Http/Controllers/Web/ReceiptIssuingOrder/DownloadController.php ファイルの表示

@@ -36,6 +36,7 @@ class DownloadController extends WebController
{
$param = $this->param;

return $this->manager->initByToken($param->accessToken)->service();
return $this->manager->initByToken($param->accessToken)->downlaodA4();
// return $this->manager->initByToken($param->accessToken)->downlaodLetter();
}
}

+ 54
- 0
app/Http/Controllers/Web/ReceiptIssuingOrder/MailOrderController.php ファイルの表示

@@ -0,0 +1,54 @@
<?php

namespace App\Http\Controllers\Web\ReceiptIssuingOrder;

use App\Http\Controllers\Web\IParam;
use App\Http\Controllers\Web\WebController;
use App\Logic\ReceiptIssuingOrder\UpdateManager;
use App\Models\ReceiptIssuingOrder;
use App\Util\DateUtil;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class MailOrderController extends WebController
{
public function name(): string
{
return "領収証郵送依頼";
}

public function description(): string
{
return "領収証の郵送依頼を登録する";
}

public function __construct(
protected MailOrderParam $param,
private UpdateManager $manager
) {
parent::__construct();
}

protected function getParam(): IParam
{
return $this->param;
}

protected function run(Request $request): JsonResponse
{
$param = $this->param;


$this->manager->initById($param->id)
->checkTimestamp($param->timestamp)
->fill(
[
...$param->toArray(),
ReceiptIssuingOrder::COL_NAME_STATUS_ORDER_MAIL_DATETIME => DateUtil::now(),
]
)
->update();

return $this->successResponse();
}
}

+ 37
- 0
app/Http/Controllers/Web/ReceiptIssuingOrder/MailOrderParam.php ファイルの表示

@@ -0,0 +1,37 @@
<?php

namespace App\Http\Controllers\Web\ReceiptIssuingOrder;

use App\Http\Controllers\Web\BaseParam;
use App\Http\Controllers\Web\TimestampParam;
use App\Models\ReceiptIssuingOrder;
use App\Rules\ZipCode;

/**
* @property string $id
* @property string $mailPrefCode
* @property string $mailZipCode
* @property string mailAddress1
* @property string mailAddress2
* @property ?string mailAddress3
* @property string mailName
*/

class MailOrderParam extends BaseParam implements TimestampParam
{
public function rules(): array
{
return array_merge(
[
ReceiptIssuingOrder::COL_NAME_ID => $this->str(),
ReceiptIssuingOrder::COL_NAME_MAIL_PREF_CODE => $this->str(),
ReceiptIssuingOrder::COL_NAME_MAIL_ZIP_CODE => $this->str([new ZipCode()]),
ReceiptIssuingOrder::COL_NAME_MAIL_ADDRESS1 => $this->str(),
ReceiptIssuingOrder::COL_NAME_MAIL_ADDRESS2 => $this->str(),
ReceiptIssuingOrder::COL_NAME_MAIL_ADDRESS3 => $this->str(true),
ReceiptIssuingOrder::COL_NAME_MAIL_NAME => $this->str(),
],
$this->timestamp(),
);
}
}

+ 24
- 1
app/Http/Controllers/Web/ReceiptIssuingOrder/TokenCheckController.php ファイルの表示

@@ -6,8 +6,10 @@ use App\Codes\UserRole;
use App\Http\Controllers\Web\IParam;
use App\Http\Controllers\Web\WebController;
use App\Logic\ReceiptIssuingOrder\TokenCheckManager;
use App\Models\ReceiptIssuingOrder;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;

class TokenCheckController extends WebController
{
@@ -40,6 +42,27 @@ class TokenCheckController extends WebController
if (!$this->manager->check($param->accessToken)) {
return $this->failedResponse();
}
return $this->successResponse();

$data['receipt_issuing_order'] = array_merge(
Arr::only($this->manager->getOrder(), [
ReceiptIssuingOrder::COL_NAME_ID,
ReceiptIssuingOrder::COL_NAME_RECEIPT_SHOP_NAME,
ReceiptIssuingOrder::COL_NAME_RECEIPT_ISSUER,
ReceiptIssuingOrder::COL_NAME_RECEIPT_PURPOSE,
ReceiptIssuingOrder::COL_NAME_RECEIPT_NAME,
ReceiptIssuingOrder::COL_NAME_RECEIPT_USE_DATE,
ReceiptIssuingOrder::COL_NAME_RECEIPT_AMOUNT,
ReceiptIssuingOrder::COL_NAME_UPDATED_AT,
ReceiptIssuingOrder::COL_NAME_ACCESS_TOKEN_EXPIRES_AT,

ReceiptIssuingOrder::COL_NAME_STATUS_ORDER_MAIL_DATETIME,
ReceiptIssuingOrder::COL_NAME_STATUS_MAIL_POST_DATE,

]),
[
'confirmed' => $this->manager->isConfirmed(),
]
);
return $this->successResponse($data);
}
}

+ 13
- 0
app/Http/Controllers/Web/SortableParam.php ファイルの表示

@@ -0,0 +1,13 @@
<?php

namespace App\Http\Controllers\Web;


/**
* @property ?string $sort
* @property ?string $order
* @property ?int $limit
*/
interface SortableParam
{
}

+ 12
- 0
app/Http/Controllers/Web/TimestampParam.php ファイルの表示

@@ -0,0 +1,12 @@
<?php

namespace App\Http\Controllers\Web;

use Illuminate\Support\Carbon;

/**
* @property ?Carbon $timestamp
*/
interface TimestampParam
{
}

+ 11
- 12
app/Listeners/SMS/ConfirmListener.php ファイルの表示

@@ -3,7 +3,9 @@
namespace App\Listeners\SMS;

use App\Events\SMS\ConfirmEvent;

use App\Logic\ReceiptIssuingOrder\UpdateManager;
use App\Models\ReceiptIssuingOrder;
use App\Util\DateUtil;

/**
* SMS送信依頼の確定イベントをキャッチ
@@ -14,7 +16,7 @@ class ConfirmListener
/**
* Create the event listener.
*/
public function __construct()
public function __construct(private UpdateManager $manager)
{
//
}
@@ -26,16 +28,13 @@ class ConfirmListener
{
$smsSendOrder = $event->order;

$receiptIssuingOrder = $smsSendOrder->receiptIssuingOrder;
if ($receiptIssuingOrder === null) {
return;
}

$success = $smsSendOrder->send_datetime !== null;
$isSuccess = $smsSendOrder->send_datetime !== null;

if ($success) {
$receiptIssuingOrder->sms_send_success = true;
$receiptIssuingOrder->save();
}
$this->manager->initById($smsSendOrder->receipt_issuing_order_id)
->fill([
ReceiptIssuingOrder::COL_NAME_SMS_SEND_SUCCESS => $isSuccess,
ReceiptIssuingOrder::COL_NAME_STATUS_SMS_SEND_DATETIME => $smsSendOrder->send_datetime,
])
->update();
}
}

+ 12
- 5
app/Logic/ReceiptIssuingOrder/CreateManager.php ファイルの表示

@@ -2,7 +2,7 @@

namespace App\Logic\ReceiptIssuingOrder;

use App\Codes\ReceiptIssuingOrderStatus;
use App\Codes\EnvironmentName;
use App\Codes\SMSSendPurpose;
use App\Logic\SMS\SMSManager;
use App\Models\ReceiptIssuingOrder;
@@ -51,7 +51,6 @@ class CreateManager extends ReceiptIssuingOrderManager
}

// モデル更新
$order->status = ReceiptIssuingOrderStatus::CREATED;
$order->order_datetime = DateUtil::now();
$this->refreshToken();

@@ -59,8 +58,9 @@ class CreateManager extends ReceiptIssuingOrderManager
if ($contractId === null) {
throw new LogicException("契約不良");
}
$order->setContract($contractId)
->save();
$order->setContract($contractId);

$this->save();


// SMS配信
@@ -80,8 +80,15 @@ class CreateManager extends ReceiptIssuingOrderManager

private function makeSMSContents(): string
{

$url = "";
if (app()->environment(EnvironmentName::LOCAL->value)) {
// localhostのURLを指定できないので、空とする
} else {
$url = implode('/', [config('app.url'), 'app/receipt-issuing-oreder', $this->order->access_token]);
}
return View::make('sms.announce_receipt_issusing_order_form', [
'url' => implode('/', [config('app.url'), 'receipt-issuing-order/create', $this->order->access_token])
'url' => $url,
])->render();
}
}

+ 0
- 6
app/Logic/ReceiptIssuingOrder/Custom/HelloTechno/CreateManager.php ファイルの表示

@@ -2,14 +2,8 @@

namespace App\Logic\ReceiptIssuingOrder\Custom\HelloTechno;

use App\Codes\ReceiptIssuingOrderStatus;
use App\Codes\SMSSendPurpose;
use App\Logic\ReceiptIssuingOrder\CreateManager as BaseManager;
use App\Logic\SMS\SMSManager;
use App\Models\ReceiptIssuingHTParkingCustomOrder;
use App\Models\ReceiptIssuingOrder;
use Illuminate\Support\Facades\View;
use LogicException;

class CreateManager
{


+ 33
- 19
app/Logic/ReceiptIssuingOrder/PDFDownLoadManager.php ファイルの表示

@@ -2,9 +2,9 @@

namespace App\Logic\ReceiptIssuingOrder;

use App\Codes\ReceiptIssuingOrderStatus;
use App\Exceptions\AppCommonException;
use App\Models\ReceiptIssuingOrder;
use App\Util\DateUtil;
use PDF;

class PDFDownLoadManager extends ReceiptIssuingOrderManager
@@ -16,38 +16,52 @@ class PDFDownLoadManager extends ReceiptIssuingOrderManager
parent::__construct($order);
}

public function initByToken(string $token)
{
$ret = $this->checkToken($token);
if (!$ret) {
throw new AppCommonException("トークン不正");
}

$this->initialized = true;
return $this;
}

public function initById(string $id)
public function downlaodA4()
{
$this->fetch($id);
$order = $this->order;

$this->initialized = true;
return $this;
}
// $data = [
// 'amount'
// ];

public function service()


$pdf = PDF::loadView('pdf/receipt_a4', $order->toArray());
// はがきサイズを指定
$ret = $pdf->setPaper('A4')
->setOption('encoding', 'utf-8')
->inline();
if ($order->status_receipt_download_datetime === null) {

$order->status_receipt_download_datetime = DateUtil::now();
}
$this->save();

return $ret;
}
public function downlaodLetter()
{
$order = $this->order;

$pdf = PDF::loadView('pdf', $order);
// $data = [
// 'amount'
// ];



$pdf = PDF::loadView('pdf/receipt_letter', $order->toArray());
// はがきサイズを指定
$ret = $pdf->setOption('page-height', 148)
->setOption('page-width', 100)
->setOption('encoding', 'utf-8')
->inline();
if ($order->status_receipt_download_datetime === null) {

$order->status = ReceiptIssuingOrderStatus::DOWNLOAD_DONE;
$order->save();
$order->status_receipt_download_datetime = DateUtil::now();
}
$this->save();

return $ret;
}


+ 176
- 1
app/Logic/ReceiptIssuingOrder/ReceiptIssuingOrderManager.php ファイルの表示

@@ -3,15 +3,18 @@
namespace App\Logic\ReceiptIssuingOrder;

use App\Exceptions\AppCommonException;
use App\Exceptions\ExclusiveException;
use App\Features\InstanceAble;
use App\Features\LoginUser;
use App\Models\ReceiptIssuingOrder;
use App\Util\DateUtil;
use Illuminate\Support\Carbon;
use Illuminate\Support\Str;
use LogicException;

abstract class ReceiptIssuingOrderManager
{
use LoginUser;
use LoginUser, InstanceAble;

protected bool $initialized = false;

@@ -20,6 +23,55 @@ abstract class ReceiptIssuingOrderManager
) {
}

public function initByToken(string $token)
{
$ret = $this->checkToken($token);
if (!$ret) {
throw new AppCommonException("トークン不正");
}

$this->initialized = true;
return $this;
}

public function initById(string $id)
{
$this->fetch($id);

$this->initialized = true;
return $this;
}

public function getOrder(): array
{
if (!$this->initialized) {
throw new LogicException("初期化ミス");
}

return $this->order->toArray();
}

public function isConfirmed(): bool
{
if (!$this->initialized) {
throw new LogicException("初期化ミス");
}
return $this->order->status_receipt_confirm_datetime !== null;
}

public function checkTimestamp(Carbon $timestamp): static
{
if (!$this->initialized) {
throw new LogicException("初期化ミス");
}

if ($this->order->updated_at->notEqualTo($timestamp)) {
throw new ExclusiveException();
}

return $this;
}

protected function fetch(string $receiptIssuingOrderId)
{
$order = ReceiptIssuingOrder::findOrFail($receiptIssuingOrderId);
@@ -35,6 +87,8 @@ abstract class ReceiptIssuingOrderManager

$order->access_token = base64_encode(Str::uuid());
$order->access_token_expires_at = DateUtil::now()->adddays(7);

return $this;
}

protected function checkToken(string $token): bool
@@ -52,6 +106,7 @@ abstract class ReceiptIssuingOrderManager
}

if ($order->access_token !== $token) {
logger("TOKEN 期限切れ");
return false;
}

@@ -60,11 +115,131 @@ abstract class ReceiptIssuingOrderManager
$ret = $now->lt($this->order->access_token_expires_at);

if (!$ret) {
logger("TOKEN 期限切れ");
return false;
}



$this->order = $order;
$this->initialized = true;



return true;
}

protected function setStatus(): static
{
$order = $this->order;
$order->status_done = false;

// 郵送関連
if ($order->status_mail_post_date !== null) {
$order->status_name = "投函済み";
$order->status_done = true;
return $this;
}
if ($order->status_order_mail_datetime !== null) {
$order->status_name = "郵送依頼中";
return $this;
}

// メール配信
if ($order->status_receipt_email_send_datetime !== null) {
$order->status_name = "領収証メール配信済み";
$order->status_done = true;
return $this;
}
if ($order->status_mail_post_date !== null) {
$order->status_name = "領収証メール配信依頼中";
return $this;
}

// ダウンロード
if ($order->status_receipt_download_datetime !== null) {
$order->status_name = "ダウンロード済み";
$order->status_done = true;
return $this;
}

// 申請段階
if ($order->status_receipt_confirm_datetime !== null) {
$order->status_name = "確定済み";
return $this;
}
if ($order->status_first_access_datetime !== null) {
$order->status_name = "アクセス済み";
return $this;
}
if ($order->status_sms_send_datetime !== null) {
$order->status_name = "SMS配信済み";
return $this;
}
if ($order->sms_send_success === false) {
$order->status_name = "SMS送信失敗";
return $this;
}

$order->status_name = "新規登録";
return $this;
}

protected function save(): static
{
$this->setStatus()
->updateCheck();
$this->order->save();
return $this;
}

public function setConfirm(): static
{
if ($this->order->receipt_no !== null) {
throw new LogicException("領収証確定済み変更検知");
}
$this->order->receipt_no = $this->generateReceiptnNo();
$this->order->status_receipt_confirm_datetime = DateUtil::now();
return $this;
}

private function generateReceiptnNo(): string
{

$count = 0;
while (true) {

$now = DateUtil::now();
$receiptNo = sprintf("%04d%02d%02d-%06d", $now->year, $now->month, $now->day, random_int(0, 999999));
if (!ReceiptIssuingOrder::whereReceiptNo($receiptNo)->exists()) {
return $receiptNo;
}

$count++;
if (1000 < $count) {
throw new AppCommonException("領収証番号取得不正エラー");
}
}
}

private function updateCheck(): static
{

// 確定済みデータの変更確認
if ($this->order->getOriginal(ReceiptIssuingOrder::COL_NAME_STATUS_RECEIPT_CONFIRM_DATETIME) !== null) {
if ($this->order->isDirty([
ReceiptIssuingOrder::COL_NAME_RECEIPT_USE_DATE,
ReceiptIssuingOrder::COL_NAME_RECEIPT_SHOP_NAME,
ReceiptIssuingOrder::COL_NAME_RECEIPT_ISSUER,
ReceiptIssuingOrder::COL_NAME_RECEIPT_PURPOSE,
ReceiptIssuingOrder::COL_NAME_RECEIPT_NAME,
ReceiptIssuingOrder::COL_NAME_RECEIPT_INVOICE_NO,
ReceiptIssuingOrder::COL_NAME_RECEIPT_AMOUNT,
])) {
throw new LogicException("確定済みデータの変更を検知");
}
}

return $this;
}
}

+ 12
- 1
app/Logic/ReceiptIssuingOrder/TokenCheckManager.php ファイルの表示

@@ -3,6 +3,7 @@
namespace App\Logic\ReceiptIssuingOrder;

use App\Models\ReceiptIssuingOrder;
use App\Util\DateUtil;

class TokenCheckManager extends ReceiptIssuingOrderManager
{
@@ -15,6 +16,16 @@ class TokenCheckManager extends ReceiptIssuingOrderManager

public function check(string $token): bool
{
return $this->checkToken($token);
$ret = $this->checkToken($token);

if (
$ret &&
$this->order->status_first_access_datetime === null
) {
$this->order->status_first_access_datetime = DateUtil::now();
$this->save();
}

return $ret;
}
}

+ 2
- 37
app/Logic/ReceiptIssuingOrder/UpdateManager.php ファイルの表示

@@ -16,52 +16,17 @@ class UpdateManager extends ReceiptIssuingOrderManager
parent::__construct($order);
}

public function initByToken(string $token)
{
$ret = $this->checkToken($token);
if (!$ret) {
throw new AppCommonException("トークン不正");
}

$this->initialized = true;
return $this;
}

public function initById(string $id)
{
$this->fetch($id);

$this->initialized = true;
return $this;
}

public function fill(array $attr)
{
$this->order->fill($attr);
return $this;
}

protected function service()
public function update()
{
$order = $this->order;

// パラメータチェック
$messages = $this->paramCheck();
if (count($messages) !== 0) {
return $messages;
}

// モデル更新
$order->save();
$this->save();

return [];
}

private function paramCheck(): array
{
$ret = [];
$order = $this->order;

return $ret;
}
}

+ 12
- 5
app/Logic/SMS/FourSMessageManager.php ファイルの表示

@@ -43,8 +43,12 @@ class FourSMessageManager implements SMSManager

public static function makeSMSSendOrder(ReceiptIssuingOrder $receiptIssuingOrder, SMSSendPurpose $purpose, string $contents): SMSSendOrder
{


$order = new SMSSendOrder();



$order->receipt_issuing_order_id = $receiptIssuingOrder->id;
$order->contract_id = $receiptIssuingOrder->contract_id;
$order->phone_number = $receiptIssuingOrder->sms_phone_number;
@@ -54,9 +58,13 @@ class FourSMessageManager implements SMSManager
$order->purpose = $purpose;
$order->content = $contents;

return $$order;
return $order;
}

public static function getProvider(): SMSProvider
{
return SMSProvider::whereProviderName(SMSProviderName::FOUR_S_MESSAGE->value)->firstOrFail();
}

public function __construct(
private SMSSendOrder $order,
@@ -81,7 +89,7 @@ class FourSMessageManager implements SMSManager
return $this->order;
}

public function send(): bool
public function send(): bool
{

$sendContents = [
@@ -91,10 +99,9 @@ class FourSMessageManager implements SMSManager
'message' => $this->order->content,
'address' => $this->order->phone_number,
'urlshorterflg' => '1',
'send_date' => '202305120000',
];

$this->order->sms_provider_id = CommunicationData::getMst()->id;
$this->order->setSMSProvider(static::getProvider());
$res = $this->communication(self::SEND_URL, $sendContents);


@@ -215,7 +222,7 @@ class CommunicationData

private const RESULT_SUCCESS = 'SUCCESS';

private const DATE_FORMAT = 'YmdHi';
private const DATE_FORMAT = 'YmdHis';

public function __construct(Response $res, SMSSendOrder $order)
{


+ 0
- 3
app/Models/BaseModel.php ファイルの表示

@@ -47,9 +47,6 @@ abstract class BaseModel extends Model implements IModelFeature
{
$target = sprintf("%s::COL_NAME_%s", static::class, Str::upper($columnName));
$ret = defined($target);
if (!$ret) {
logger(sprintf("does not have column [%s] on [%s] [%s]", Str::upper($columnName), static::getTableName(), $target));
}
return $ret;
}



+ 3
- 0
app/Models/Ex/LoginUser.php ファイルの表示

@@ -42,6 +42,9 @@ class LoginUser

public function checkAuthorization(array|Model $target): bool
{
if (app()->runningInConsole()) {
return true;
}

if (!Auth::check()) {
return false;


+ 26
- 6
app/Models/ReceiptIssuingOrder.php ファイルの表示

@@ -2,7 +2,6 @@

namespace App\Models;

use App\Codes\ReceiptIssuingOrderStatus;
use App\Models\Feature\ContractFeature;

class ReceiptIssuingOrder extends AppModel
@@ -11,15 +10,27 @@ class ReceiptIssuingOrder extends AppModel

const COL_NAME_HANDLER_ID = "handler_id";
const COL_NAME_ORDER_DATETIME = "order_datetime";
const COL_NAME_STATUS = "status";
const COL_NAME_STATUS_NAME = "status_name";
const COL_NAME_SUMMARY_KEY1 = "summary_key1";
const COL_NAME_SUMMARY_KEY2 = "summary_key2";
const COL_NAME_ACCESS_TOKEN = "access_token";
const COL_NAME_ACCESS_TOKEN_EXPIRES_AT = "access_token_expires_at";

const COL_NAME_STATUS_DONE = "status_done";
const COL_NAME_STATUS_SMS_SEND_DATETIME = "status_sms_send_datetime";
const COL_NAME_STATUS_FIRST_ACCESS_DATETIME = "status_first_access_datetime";
const COL_NAME_STATUS_RECEIPT_CONFIRM_DATETIME = "status_receipt_confirm_datetime";
const COL_NAME_STATUS_ORDER_MAIL_DATETIME = "status_order_mail_datetime";
const COL_NAME_STATUS_MAIL_DOWNLOAD_DATETIME = "status_mail_download_datetime";
const COL_NAME_STATUS_MAIL_POST_DATE = "status_mail_post_date";
const COL_NAME_STATUS_RECEIPT_DOWNLOAD_DATETIME = "status_receipt_download_datetime";
const COL_NAME_STATUS_RECEIPT_EMAIL_SEND_ORDER_DATETIME = "status_receipt_email_send_order_datetime";
const COL_NAME_STATUS_RECEIPT_EMAIL_SEND_DATETIME = "status_receipt_email_send_datetime";

const COL_NAME_SMS_PHONE_NUMBER = "sms_phone_number";
const COL_NAME_SMS_SEND_SUCCESS = "sms_send_success";
const COL_NAME_RECEIPT_NO = "receipt_no";
const COL_NAME_RECEIPT_USE_DATETIME = "receipt_use_datetime";
const COL_NAME_RECEIPT_USE_DATE = "receipt_use_date";
const COL_NAME_RECEIPT_SHOP_NAME = "receipt_shop_name";
const COL_NAME_RECEIPT_ISSUER = "receipt_issuer";
const COL_NAME_RECEIPT_NAME = "receipt_name";
@@ -33,14 +44,23 @@ class ReceiptIssuingOrder extends AppModel
const COL_NAME_MAIL_ADDRESS1 = "mail_address1";
const COL_NAME_MAIL_ADDRESS2 = "mail_address2";
const COL_NAME_MAIL_ADDRESS3 = "mail_address3";
const COL_NAME_MAIL_POST_DATE = "mail_post_date";
const COL_NAME_MAIL_NAME = "mail_name";
const COL_NAME_MEMO = "memo";


protected $casts = [
self::COL_NAME_STATUS => ReceiptIssuingOrderStatus::class,
self::COL_NAME_ACCESS_TOKEN_EXPIRES_AT => 'datetime',
self::COL_NAME_STATUS_SMS_SEND_DATETIME => 'datetime',
self::COL_NAME_STATUS_FIRST_ACCESS_DATETIME => 'datetime',
self::COL_NAME_STATUS_RECEIPT_CONFIRM_DATETIME => 'datetime',
self::COL_NAME_STATUS_ORDER_MAIL_DATETIME => 'datetime',
self::COL_NAME_STATUS_MAIL_DOWNLOAD_DATETIME => 'datetime',
self::COL_NAME_STATUS_MAIL_POST_DATE => 'date',
self::COL_NAME_STATUS_RECEIPT_DOWNLOAD_DATETIME => 'datetime',
self::COL_NAME_STATUS_RECEIPT_EMAIL_SEND_DATETIME => 'datetime',
self::COL_NAME_RECEIPT_USE_DATE => 'date',
];


public function getModelName(): string
{
return "領収証発行依頼";


+ 19
- 2
app/Models/SMSProviderFourSMessageCommunication.php ファイルの表示

@@ -2,15 +2,32 @@

namespace App\Models;

use App\Codes\SMSProvicer;
use App\Models\Feature\ContractFeature;
use App\Models\Feature\SMSSendOrderFeature;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class SMSProviderFourSMessageCommunication extends AppModel
{
use ContractFeature, SMSSendOrderFeature;

const COL_NAME_REQUEST_ID = "request_id";
const COL_NAME_REQUEST_DATE = "request_date";
const COL_NAME_REQUEST_STATUS = "request_status";
const COL_NAME_CP_ID = "cp_id";
const COL_NAME_ADDRESS = "address";
const COL_NAME_REQUESTED_CARRIER_CODE = "requested_carrier_code";
const COL_NAME_REQUESTED_SEND_DATE = "requested_send_date";
const COL_NAME_REQUESTED_MESSAGE = "requested_message";
const COL_NAME_REQUESTED_OPTION = "requested_option";
const COL_NAME_MESSAGE_COUNT = "message_count";
const COL_NAME_SUCCESS_COUNT = "success_count";
const COL_NAME_SENT_CARRIER_CODE = "sent_carrier_code";
const COL_NAME_SENT_DATE = "sent_date";
const COL_NAME_DELIV_RCPT_DATE = "deliv_rcpt_date";
const COL_NAME_SENDING_STATUS = "sending_status";
const COL_NAME_RESULT_STATUS = "result_status";
const COL_NAME_EXTIME_FROM = "extime_from";
const COL_NAME_EXTIME_TO = "extime_to";

public function getModelName(): string
{
return "FourSMessage通信実績";


+ 6
- 0
app/Models/SMSSendOrder.php ファイルの表示

@@ -15,8 +15,14 @@ class SMSSendOrder extends AppModel
const COL_NAME_DONE = 'done';
const COL_NAME_PORPOSE = 'purpose';

const COL_NAME_SEND_DATETIME = "send_datetime";
const COL_NAME_COST = "cost";
const COL_NAME_CONTENT = "content";
const COL_NAME_PHONE_NUMBER = "phone_number";

protected $casts = [
self::COL_NAME_PORPOSE => SMSSendPurpose::class,
self::COL_NAME_SEND_DATETIME => 'datetime',
];

public function getModelName(): string


+ 2
- 1
app/Providers/AppServiceProvider.php ファイルの表示

@@ -2,6 +2,7 @@

namespace App\Providers;

use App\Codes\EnvironmentName;
use App\Codes\QueueName;
use App\Codes\SMSProviderName;
use Illuminate\Queue\Events\JobProcessing;
@@ -24,7 +25,7 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot(): void
{
if ($this->app->environment('local')) {
if ($this->app->environment(EnvironmentName::LOCAL->value)) {
// IDEヘルパー登録
$this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
}


+ 1
- 8
app/Repositories/Custom/HelloTechno/ReceiptIssuingOrderRepository.php ファイルの表示

@@ -14,7 +14,6 @@ class ReceiptIssuingOrderRepository extends BaseRepository
{

const CONDITION_ID = 'id';
const CONDITION_STATUS = 'status';

const CONDITION_CUSTOMER_CODE = 'customer_code';
const CONDITION_PARKING_MANAGEMENT_CODE = 'parking_management_code';
@@ -68,12 +67,6 @@ class ReceiptIssuingOrderRepository extends BaseRepository
$table->where($this->makeColumnName([static::TABLE_CUSTOM_ORDER, CustomOrder::COL_NAME_PARKING_NAME]), 'like', "%{$parkihngName}%");
}


// ステータス
$this->where($table, $condition, $this->makeColumnName([static::TABLE_ORDER, ReceiptIssuingOrder::COL_NAME_STATUS]));



$table->select($this->columns());

$main = DB::table($table, "main");
@@ -96,7 +89,7 @@ class ReceiptIssuingOrderRepository extends BaseRepository
$handler = static::TABLE_HANDLER;
$columns = [
$this->makeColumnName([$order, ReceiptIssuingOrder::COL_NAME_ID], 'id'),
$this->makeColumnName([$order, ReceiptIssuingOrder::COL_NAME_STATUS], 'status'),
$this->makeColumnName([$order, ReceiptIssuingOrder::COL_NAME_STATUS_NAME], 'status_name'),
$this->makeColumnName([$order, ReceiptIssuingOrder::COL_NAME_ORDER_DATETIME], 'order_datetime'),
$this->makeColumnName([$custom, CustomOrder::COL_NAME_CUSTOMER_CODE], 'customer_code'),
$this->makeColumnName([$custom, CustomOrder::COL_NAME_PARKING_MANAGEMENT_CODE], 'parking_management_code'),


+ 1
- 0
config/logic.php ファイルの表示

@@ -1,6 +1,7 @@
<?php

use App\Codes\SMSProviderName;
use App\Models\SMSProvider;

return [



+ 18
- 6
database/migrations/2023_04_15_152400_create_receipt_issuing_orders_table.php ファイルの表示

@@ -36,27 +36,39 @@ return new class extends Migration
->userId(true, "handler_id", "担当者ID");

$table->datetime("order_datetime")->comment("依頼日時")->nullable();
$table->string("status")->comment("ステータス")->nullable();
$table->string("status_name")->comment("ステータス")->nullable();
$table->string("summary_key1")->comment("集計キー1")->nullable();
$table->string("summary_key2")->comment("集計キー2")->nullable();
$table->string("access_token")->comment("アクセストークン")->nullable();
$table->datetime("access_token_expires_at")->comment("アクセストークン有効期限日時")->nullable();

// 以下、ステータス管理
$table->boolean("status_done")->comment("完了")->default(false);
$table->datetime("status_sms_send_datetime")->comment("SMS送信日時")->nullable();
$table->datetime("status_first_access_datetime")->comment("初回アクセス日時")->nullable();
$table->datetime("status_receipt_confirm_datetime")->comment("領収証確定日時")->nullable();
$table->datetime("status_order_mail_datetime")->comment("郵送依頼日時")->nullable();
$table->datetime("status_mail_download_datetime")->comment("郵送ダウンロード日時")->nullable();
$table->date("status_mail_post_date")->comment("郵送投函日")->nullable();
$table->datetime("status_receipt_download_datetime")->comment("領収証ダウンロード日時")->nullable();
$table->datetime("status_receipt_email_send_order_datetime")->comment("領収証メール配信依頼日時")->nullable();
$table->datetime("status_receipt_email_send_datetime")->comment("領収証メール配信日時")->nullable();


// 以下、SMS送信関連
$table->string("sms_phone_number")->comment("SMS_電話番号")->nullable();
$table->boolean("sms_send_success")->comment("SMS_送信成功")->default(false);
$table->boolean("sms_send_success")->comment("SMS_送信成功")->nullable();


// 以下、領収証関連
$table->string("receipt_no")->comment("領収証発行番号")->nullable();
$table->string("receipt_use_datetime")->comment("領収証_利用日時")->nullable();
$table->date("receipt_use_date")->comment("領収証_利用日")->nullable();
$table->string("receipt_shop_name")->comment("領収証_発行店名")->nullable();
$table->string("receipt_issuer")->comment("領収証_発行者名")->nullable();
$table->string("receipt_purpose")->comment("領収証_但書き")->nullable();
$table->string("receipt_name")->comment("領収証_宛名")->nullable();
$table->string("receipt_invoice_no")->comment("領収証_インボイス登録番号")->nullable();
$table->string("receipt_amount")->comment("領収証_金額")->nullable();
$table->string("receipt_how_to_receive")->comment("領収証_取得希望方法")->nullable();
$table->unsignedInteger("receipt_amount")->comment("領収証_金額")->nullable();
$table->string("email")->comment("Email")->nullable();

// 以下、郵送関連
@@ -65,7 +77,7 @@ return new class extends Migration
$table->string("mail_address1")->comment("郵送_住所1")->nullable();
$table->string("mail_address2")->comment("郵送_住所2")->nullable();
$table->string("mail_address3")->comment("郵送_住所3")->nullable();
$table->date("mail_post_date")->comment("郵送_投函日")->nullable();
$table->string("mail_name")->comment("郵送_宛名")->nullable();

$table->text('memo')->comment("備考")->nullable();



+ 1
- 1
database/migrations/2023_04_18_131700_create_sms_send_orders_table.php ファイルの表示

@@ -45,7 +45,7 @@ return new class extends Migration
$table->unsignedInteger("cost")->comment("コスト")->default(0);

$table->text('content')->comment("本文")->nullable();
$table->text('phone_number')->comment("送信先電話番号")->nullable();
$table->string('phone_number')->comment("送信先電話番号")->nullable();

$table->string("summary_key1")->comment("集計キー1")->nullable();
$table->string("summary_key2")->comment("集計キー2")->nullable();


+ 55
- 0
resources/css/receipt_a4.css ファイルの表示

@@ -0,0 +1,55 @@
div.main {
/* border:solid 1px;
padding: 1mm; */
}



section.header {
margin-right: 10mm;
height: 30mm;
text-align: right;
}

section.title {
font-size: 10mm;
text-align: center;
}

section.name {
margin-left: 10mm;
font-size: 7mm;
text-decoration: underline;
}

section.amount {
text-align: center;
font-size: 10mm;
background-color: lightgray;
margin-top: 5mm;
padding-top: 3mm;
padding-bottom: 3mm;
}
section.amount div.tax {
margin-left: 10mm;
text-align: center;
font-size: 5mm;
}

section.amount_sub {
text-align: right;
font-size: 5mm;
margin-top: 3mm;
margin-right:10mm;
}

section.description {
margin-left: 20mm;
}

section.issuer {
text-align: right;
margin-right: 10mm;
}



+ 80
- 0
resources/css/receipt_common.css ファイルの表示

@@ -0,0 +1,80 @@

div.container > .item {
display: inline-block;
/* レイアウト確認用 */
/* border: 1px solid black; */
}


/* レイアウト確認用 */
.bb {
border: 1px solid black;
}


/* テキスト用 */
.b {
font-weight: bold;
}
.underline {
text-decoration: underline;
}
.tc {
text-align: center;
}
.tr {
text-align: right;
}

.f5 {
font-size: 5mm;
}
.f35 {
font-size: 3.5mm;
}
.f3 {
font-size: 3mm;
}

/* パディング */
.pt10 {
padding-top: 10mm;
}
.pt5 {
padding-top: 5mm;
}
.pt3 {
padding-top: 3mm;
}
.pt2 {
padding-top: 2mm;
}
.pt1 {
padding-top: 1mm;
}

/* マージン */
.ml10 {
margin-left: 10mm;
}
.ml5 {
margin-left: 5mm;
}
.ml3 {
margin-left: 3mm;
}

.my5 {
margin-top: 5mm;
margin-bottom: 5mm;
}



/* 揃え */
.vt {
vertical-align: top;
}

+ 29
- 0
resources/css/receipt_letter.css ファイルの表示

@@ -0,0 +1,29 @@

/* 郵送先フィールド */
section.address {

height: 50mm;
}

#address {
position: absolute;
top: 10mm;
left:40mm;
}


/* ヘッダー高さ設定 */
section.receipt div.header {
height: 10mm;
}



/* スタンプ */
#stamp {
position: absolute;
top: 125mm;
left:75mm;
border: 1.5px solid black;
padding: 0.5mm;
}

+ 56
- 0
resources/views/pdf/receipt_a4.blade.php ファイルの表示

@@ -0,0 +1,56 @@
<!DOCTYPE html>
<html lang="ja">

<head>
<meta charset="utf-8">
<title>領収証</title>
<style>

</style>
<link rel="stylesheet" href="{{ resource_path('css/receipt_common.css') }}">
<link rel="stylesheet" href="{{ resource_path('css/receipt_a4.css') }}">
</head>

<body>

<div class="main">

<section class="header">
<p>発行日 2023/05/29</p>
<p>領収証番号 20230529-123456</p>
</section>
<section class="title b">
<P>領収証</P>
</section>
<section class="name">
株式会社サテライトテクノロジーズ 様
</section>
<section class="amount">
<div class="container">
<div class="item">
¥1,600-
</div>
<div class="item tax">
(内税 10%対象)
</div>
</div>
</section>
<section class="amount_sub">
内消費税 ¥160-
</section>
<section class="description">
<P>但し 駐車料金として</P>
<P>上記正に領収いたしました。</P>
<P>利用日 : 2023/05/28</P>
<P>駐車場名 : 浜松町サテ駐車場</P>
</section>
<section class="issuer">
<P>発行者 株式会社パーキングサテライト</P>
<P>インボイス登録番号 T1234567890123</P>

</section>

</div>
</body>

</html>

+ 94
- 0
resources/views/pdf/receipt_letter.blade.php ファイルの表示

@@ -0,0 +1,94 @@
<!DOCTYPE html>
<html lang="ja">

<head>
<meta charset="utf-8">
<title>領収証</title>
<style>

</style>
<link rel="stylesheet" href="{{ resource_path('css/receipt_common.css') }}">
<link rel="stylesheet" href="{{ resource_path('css/receipt_letter.css') }}">
</head>

<body>
<section class="address">
<div id="address">

<div class="zipcode">〒242-0005</div>
<div class="address">
神奈川県
</div>
<div class="name">
岩渕様
</div>
</div>
</section>
<hr />
<section class="receipt">
<div class="container header">
<div class="item " style="width:13mm">
<h2></h2>
</div>
<div class="item tc" style="width:40mm">
<h2>領収証</h2>
</div>
<div class="item" style="width:40mm">
<div style="font-size: 3.5mm;">
<div>発行日 2023/05/23</div>
<div>No 20230523-123456</div>
</div>
</div>
</div>
<div class="name tc pt10 underline">株式会社 サテライトテクノロジーズ 様</div>
<div class="pt5 f35">利用日 2023/10/12</div>
<div class="container mt5">

<div class="pt1 tc f5 b underline item ml10">
¥{{ number_format($receipt_amount) }}-&nbsp;
</div>
<div class="item ml3 f3"> 内消費税 ¥160- (10%対象)</div>
</div>
</div>
<div class="pt3 f35 ">但し、北堀江第一駐車場 駐車料金として
</div>
<div class="pt1 f35 ">上記正に領収いたしました。</div>
<div class="pt2 f35 ">運営会社 スーパーパーキング株式会社</div>
<div class="pt1 f35 ">インボイス登録番号 T1234567890123</div>
<div class="pt3 f35 ">発行元及び返送先</div>
<div class="pt1 container f35">
<div class="item vt">〒550-0014</div>
<div class="item">
<div>
大阪府大阪市西区北堀江2-2-25
</div>
<div>
久慈ビル南館5階
</div>
<div class="pt3 f5 b">ハローテクノ株式会社</div>
<div class="container">

<div class="item f3" style="padding-right: 10mm;">TEL:06-7638-6575</div>
<div class="item f3">FAX:06-6536-5600</div>
</div>
</div>
</div>

<div id="stamp" class="tc">
<div>
代理発行
</div>
<div>
につき
</div>
<div>
捺印省略
</div>
</div>


</section>

</body>

</html>

+ 3
- 1
routes/api.php ファイルの表示

@@ -18,9 +18,11 @@ RouteHelper::post('/login', App\Http\Controllers\Web\Auth\LoginController::class
RouteHelper::get('/logout', App\Http\Controllers\Web\Auth\LogoutController::class);

RouteHelper::get('/app-token-check', App\Http\Controllers\Web\ReceiptIssuingOrder\TokenCheckController::class);
RouteHelper::post('/receipt-issuing-order/confirm', App\Http\Controllers\Web\ReceiptIssuingOrder\ConfirmController::class);
RouteHelper::post('/receipt-issuing-order/mail-order', App\Http\Controllers\Web\ReceiptIssuingOrder\MailOrderController::class);


RouteHelper::get('/receip/download', App\Http\Controllers\Web\ReceiptIssuingOrder\TokenCheckController::class);
RouteHelper::get('/receipt/download', App\Http\Controllers\Web\ReceiptIssuingOrder\TokenCheckController::class);


// Custom for HelloTechno


読み込み中…
キャンセル
保存