| @@ -0,0 +1,10 @@ | |||
| <?php | |||
| namespace App\Codes; | |||
| enum EnvironmentName: string | |||
| { | |||
| case LOCAL = 'local'; | |||
| case STAGING = 'staging'; | |||
| case PRODUCTOIN = 'production'; | |||
| } | |||
| @@ -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; | |||
| } | |||
| } | |||
| @@ -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; // ダウンロード完了 | |||
| } | |||
| @@ -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; | |||
| } | |||
| } | |||
| } | |||
| @@ -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. | |||
| @@ -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); | |||
| } | |||
| /** | |||
| @@ -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("メールキュー処理"); | |||
| } | |||
| } | |||
| @@ -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("メールキュー処理"); | |||
| } | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| <?php | |||
| namespace App\Exceptions; | |||
| use Exception; | |||
| /** | |||
| * 排他エラー | |||
| */ | |||
| class ExclusiveException extends Exception | |||
| { | |||
| } | |||
| @@ -9,6 +9,6 @@ trait InstanceAble | |||
| */ | |||
| public static function instance() | |||
| { | |||
| return app()->make(self::class); | |||
| return app()->make(static::class); | |||
| } | |||
| } | |||
| @@ -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 => "駐車料金", | |||
| ]; | |||
| @@ -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()]), | |||
| @@ -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(); | |||
| } | |||
| } | |||
| @@ -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(), | |||
| ); | |||
| } | |||
| } | |||
| @@ -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), | |||
| @@ -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(); | |||
| } | |||
| } | |||
| @@ -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(); | |||
| } | |||
| } | |||
| @@ -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(), | |||
| ); | |||
| } | |||
| } | |||
| @@ -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); | |||
| } | |||
| } | |||
| @@ -0,0 +1,13 @@ | |||
| <?php | |||
| namespace App\Http\Controllers\Web; | |||
| /** | |||
| * @property ?string $sort | |||
| * @property ?string $order | |||
| * @property ?int $limit | |||
| */ | |||
| interface SortableParam | |||
| { | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| <?php | |||
| namespace App\Http\Controllers\Web; | |||
| use Illuminate\Support\Carbon; | |||
| /** | |||
| * @property ?Carbon $timestamp | |||
| */ | |||
| interface TimestampParam | |||
| { | |||
| } | |||
| @@ -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(); | |||
| } | |||
| } | |||
| @@ -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(); | |||
| } | |||
| } | |||
| @@ -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 | |||
| { | |||
| @@ -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; | |||
| } | |||
| @@ -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; | |||
| } | |||
| } | |||
| @@ -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; | |||
| } | |||
| } | |||
| @@ -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; | |||
| } | |||
| } | |||
| @@ -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) | |||
| { | |||
| @@ -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; | |||
| } | |||
| @@ -42,6 +42,9 @@ class LoginUser | |||
| public function checkAuthorization(array|Model $target): bool | |||
| { | |||
| if (app()->runningInConsole()) { | |||
| return true; | |||
| } | |||
| if (!Auth::check()) { | |||
| return false; | |||
| @@ -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 "領収証発行依頼"; | |||
| @@ -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通信実績"; | |||
| @@ -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,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); | |||
| } | |||
| @@ -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,6 +1,7 @@ | |||
| <?php | |||
| use App\Codes\SMSProviderName; | |||
| use App\Models\SMSProvider; | |||
| return [ | |||
| @@ -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(); | |||
| @@ -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(); | |||
| @@ -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; | |||
| } | |||
| @@ -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; | |||
| } | |||
| @@ -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; | |||
| } | |||
| @@ -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> | |||
| @@ -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) }}- | |||
| </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> | |||
| @@ -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 | |||