発行日 2023/05/29
+領収証番号 20230529-123456
+領収証
+但し 駐車料金として
+上記正に領収いたしました。
+利用日 : 2023/05/28
+駐車場名 : 浜松町サテ駐車場
+発行者 株式会社パーキングサテライト
+インボイス登録番号 T1234567890123
+ +diff --git a/app/Codes/EnvironmentName.php b/app/Codes/EnvironmentName.php new file mode 100644 index 0000000..bf52242 --- /dev/null +++ b/app/Codes/EnvironmentName.php @@ -0,0 +1,10 @@ +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; + } +} diff --git a/app/Codes/ReceiptIssuingOrderStatus.php b/app/Codes/ReceiptIssuingOrderStatus.php deleted file mode 100644 index eff24d5..0000000 --- a/app/Codes/ReceiptIssuingOrderStatus.php +++ /dev/null @@ -1,27 +0,0 @@ -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; } } } diff --git a/app/Console/Commands/TestMail.php b/app/Console/Commands/TestMail.php index d3f7496..b0b55ea 100644 --- a/app/Console/Commands/TestMail.php +++ b/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. diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index d060081..108c7b5 100644 --- a/app/Console/Kernel.php +++ b/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); } /** diff --git a/app/Console/Schedules/MailSend.php b/app/Console/Schedules/MailSend.php deleted file mode 100644 index 6b202d2..0000000 --- a/app/Console/Schedules/MailSend.php +++ /dev/null @@ -1,19 +0,0 @@ -command( - sprintf('queue:work --queue=%s --max-time=55 ', QueueName::EMAIL->value) - ) - ->everyMinute() - ->description("メールキュー処理"); - } -} diff --git a/app/Console/Schedules/SMSSend.php b/app/Console/Schedules/SMSSend.php deleted file mode 100644 index 09f6c24..0000000 --- a/app/Console/Schedules/SMSSend.php +++ /dev/null @@ -1,19 +0,0 @@ -command( - sprintf('queue:work --queue=%s --max-time=55 ', QueueName::SMS->value) - ) - ->everyMinute() - ->description("メールキュー処理"); - } -} diff --git a/app/Exceptions/ExclusiveException.php b/app/Exceptions/ExclusiveException.php new file mode 100644 index 0000000..d63ee56 --- /dev/null +++ b/app/Exceptions/ExclusiveException.php @@ -0,0 +1,12 @@ +make(self::class); + return app()->make(static::class); } } diff --git a/app/Http/Controllers/Web/Custom/HelloTechno/CreateReceiptIssuingOrderController.php b/app/Http/Controllers/Web/Custom/HelloTechno/CreateReceiptIssuingOrderController.php index d8a6c2c..62f5081 100644 --- a/app/Http/Controllers/Web/Custom/HelloTechno/CreateReceiptIssuingOrderController.php +++ b/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 => "駐車料金", ]; diff --git a/app/Http/Controllers/Web/Custom/HelloTechno/CreateReceiptIssuingOrderParam.php b/app/Http/Controllers/Web/Custom/HelloTechno/CreateReceiptIssuingOrderParam.php index fd8f669..06f8886 100644 --- a/app/Http/Controllers/Web/Custom/HelloTechno/CreateReceiptIssuingOrderParam.php +++ b/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()]), diff --git a/app/Http/Controllers/Web/ReceiptIssuingOrder/ConfirmController.php b/app/Http/Controllers/Web/ReceiptIssuingOrder/ConfirmController.php new file mode 100644 index 0000000..49dc95b --- /dev/null +++ b/app/Http/Controllers/Web/ReceiptIssuingOrder/ConfirmController.php @@ -0,0 +1,53 @@ +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(); + } +} diff --git a/app/Http/Controllers/Web/ReceiptIssuingOrder/ConfirmParam.php b/app/Http/Controllers/Web/ReceiptIssuingOrder/ConfirmParam.php new file mode 100644 index 0000000..53992f5 --- /dev/null +++ b/app/Http/Controllers/Web/ReceiptIssuingOrder/ConfirmParam.php @@ -0,0 +1,26 @@ + $this->str(), + ReceiptIssuingOrder::COL_NAME_RECEIPT_NAME => $this->str(), + ], + $this->timestamp(), + ); + } +} diff --git a/app/Http/Controllers/Web/ReceiptIssuingOrder/CreateParam.php b/app/Http/Controllers/Web/ReceiptIssuingOrder/CreateParam.php index bf29d22..cee9fe8 100644 --- a/app/Http/Controllers/Web/ReceiptIssuingOrder/CreateParam.php +++ b/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), diff --git a/app/Http/Controllers/Web/ReceiptIssuingOrder/DownloadController.php b/app/Http/Controllers/Web/ReceiptIssuingOrder/DownloadController.php index ed2df57..57c00a2 100644 --- a/app/Http/Controllers/Web/ReceiptIssuingOrder/DownloadController.php +++ b/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(); } } diff --git a/app/Http/Controllers/Web/ReceiptIssuingOrder/MailOrderController.php b/app/Http/Controllers/Web/ReceiptIssuingOrder/MailOrderController.php new file mode 100644 index 0000000..6535bd8 --- /dev/null +++ b/app/Http/Controllers/Web/ReceiptIssuingOrder/MailOrderController.php @@ -0,0 +1,54 @@ +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(); + } +} diff --git a/app/Http/Controllers/Web/ReceiptIssuingOrder/MailOrderParam.php b/app/Http/Controllers/Web/ReceiptIssuingOrder/MailOrderParam.php new file mode 100644 index 0000000..1a4e517 --- /dev/null +++ b/app/Http/Controllers/Web/ReceiptIssuingOrder/MailOrderParam.php @@ -0,0 +1,37 @@ + $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(), + ); + } +} diff --git a/app/Http/Controllers/Web/ReceiptIssuingOrder/TokenCheckController.php b/app/Http/Controllers/Web/ReceiptIssuingOrder/TokenCheckController.php index 355351b..1dfb400 100644 --- a/app/Http/Controllers/Web/ReceiptIssuingOrder/TokenCheckController.php +++ b/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); } } diff --git a/app/Http/Controllers/Web/SortableParam.php b/app/Http/Controllers/Web/SortableParam.php new file mode 100644 index 0000000..2978ceb --- /dev/null +++ b/app/Http/Controllers/Web/SortableParam.php @@ -0,0 +1,13 @@ +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(); } } diff --git a/app/Logic/ReceiptIssuingOrder/CreateManager.php b/app/Logic/ReceiptIssuingOrder/CreateManager.php index 6db995a..6e45598 100644 --- a/app/Logic/ReceiptIssuingOrder/CreateManager.php +++ b/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(); } } diff --git a/app/Logic/ReceiptIssuingOrder/Custom/HelloTechno/CreateManager.php b/app/Logic/ReceiptIssuingOrder/Custom/HelloTechno/CreateManager.php index 0d55c62..cd7f309 100644 --- a/app/Logic/ReceiptIssuingOrder/Custom/HelloTechno/CreateManager.php +++ b/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 { diff --git a/app/Logic/ReceiptIssuingOrder/PDFDownLoadManager.php b/app/Logic/ReceiptIssuingOrder/PDFDownLoadManager.php index e745cc3..a223aa6 100644 --- a/app/Logic/ReceiptIssuingOrder/PDFDownLoadManager.php +++ b/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; } diff --git a/app/Logic/ReceiptIssuingOrder/ReceiptIssuingOrderManager.php b/app/Logic/ReceiptIssuingOrder/ReceiptIssuingOrderManager.php index fcfbd6a..ae46d98 100644 --- a/app/Logic/ReceiptIssuingOrder/ReceiptIssuingOrderManager.php +++ b/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; + } } diff --git a/app/Logic/ReceiptIssuingOrder/TokenCheckManager.php b/app/Logic/ReceiptIssuingOrder/TokenCheckManager.php index 20030d9..7bb5586 100644 --- a/app/Logic/ReceiptIssuingOrder/TokenCheckManager.php +++ b/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; } } diff --git a/app/Logic/ReceiptIssuingOrder/UpdateManager.php b/app/Logic/ReceiptIssuingOrder/UpdateManager.php index 2ae8406..385fda6 100644 --- a/app/Logic/ReceiptIssuingOrder/UpdateManager.php +++ b/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; - } } diff --git a/app/Logic/SMS/FourSMessageManager.php b/app/Logic/SMS/FourSMessageManager.php index d447b49..44fb2f1 100644 --- a/app/Logic/SMS/FourSMessageManager.php +++ b/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) { diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index a774ff0..a1c1e99 100644 --- a/app/Models/BaseModel.php +++ b/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; } diff --git a/app/Models/Ex/LoginUser.php b/app/Models/Ex/LoginUser.php index 3e6d94f..5b3c9ea 100644 --- a/app/Models/Ex/LoginUser.php +++ b/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; diff --git a/app/Models/ReceiptIssuingOrder.php b/app/Models/ReceiptIssuingOrder.php index 3a42d5f..a54b463 100644 --- a/app/Models/ReceiptIssuingOrder.php +++ b/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 "領収証発行依頼"; diff --git a/app/Models/SMSProviderFourSMessageCommunication.php b/app/Models/SMSProviderFourSMessageCommunication.php index fe6391c..01e9a12 100644 --- a/app/Models/SMSProviderFourSMessageCommunication.php +++ b/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通信実績"; diff --git a/app/Models/SMSSendOrder.php b/app/Models/SMSSendOrder.php index 0375be7..895d6bc 100644 --- a/app/Models/SMSSendOrder.php +++ b/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 diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index ebb2f36..0c072e5 100644 --- a/app/Providers/AppServiceProvider.php +++ b/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); } diff --git a/app/Repositories/Custom/HelloTechno/ReceiptIssuingOrderRepository.php b/app/Repositories/Custom/HelloTechno/ReceiptIssuingOrderRepository.php index da01bbb..d71ffad 100644 --- a/app/Repositories/Custom/HelloTechno/ReceiptIssuingOrderRepository.php +++ b/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'), diff --git a/config/logic.php b/config/logic.php index 3aacfb3..ae08339 100644 --- a/config/logic.php +++ b/config/logic.php @@ -1,6 +1,7 @@ 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(); diff --git a/database/migrations/2023_04_18_131700_create_sms_send_orders_table.php b/database/migrations/2023_04_18_131700_create_sms_send_orders_table.php index de35c39..a31fa1a 100644 --- a/database/migrations/2023_04_18_131700_create_sms_send_orders_table.php +++ b/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(); diff --git a/resources/css/receipt_a4.css b/resources/css/receipt_a4.css new file mode 100644 index 0000000..f4cdfe7 --- /dev/null +++ b/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; +} + + diff --git a/resources/css/receipt_common.css b/resources/css/receipt_common.css new file mode 100644 index 0000000..1f7afce --- /dev/null +++ b/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; +} diff --git a/resources/css/receipt_letter.css b/resources/css/receipt_letter.css new file mode 100644 index 0000000..da21dde --- /dev/null +++ b/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; +} \ No newline at end of file diff --git a/resources/views/pdf/receipt_a4.blade.php b/resources/views/pdf/receipt_a4.blade.php new file mode 100644 index 0000000..053e689 --- /dev/null +++ b/resources/views/pdf/receipt_a4.blade.php @@ -0,0 +1,56 @@ + + + +
+ +発行日 2023/05/29
+領収証番号 20230529-123456
+領収証
+但し 駐車料金として
+上記正に領収いたしました。
+利用日 : 2023/05/28
+駐車場名 : 浜松町サテ駐車場
+発行者 株式会社パーキングサテライト
+インボイス登録番号 T1234567890123
+ +