| @@ -4,6 +4,7 @@ namespace App\Email\Members; | |||
| use App\Kintone\Models\Parking; | |||
| use App\Kintone\Models\SeasonTicketContractEntry; | |||
| use App\Kintone\Models\SeasonTicketContractPlan; | |||
| class EntryApprove extends Members | |||
| { | |||
| @@ -11,6 +12,7 @@ class EntryApprove extends Members | |||
| public function __construct( | |||
| private Parking $parking, | |||
| private SeasonTicketContractEntry $entry, | |||
| private SeasonTicketContractPlan $plan, | |||
| ) { | |||
| $this->setEmail($entry->email); | |||
| parent::__construct(null); | |||
| @@ -28,17 +30,21 @@ class EntryApprove extends Members | |||
| public function getMemberParams(): array | |||
| { | |||
| $entry = $this->entry; | |||
| return [ | |||
| 'customer_name' => $this->entry->customerName, | |||
| 'customer_name_kana' => $this->entry->customerNameKana, | |||
| 'parking_name' => $this->entry->parkingName, | |||
| 'type_name' => '##TODO##', | |||
| 'season_ticket_select' => '##TODO##', | |||
| 'plan_name' => '##TODO##', | |||
| 'vehicle_no' => $this->entry->vehicleNo, | |||
| 'use_start_date' => $this->entry->useStartDate->format('Y/m/d'), | |||
| 'payment_method' => $this->entry->paymentMethod, | |||
| 'amount' => '##TODO##', | |||
| 'customer_name' => $entry->customerName ?? "-", | |||
| 'customer_name_kana' => $entry->customerNameKana ?? "-", | |||
| 'parking_name' => $entry->parkingName ?? "-", | |||
| 'type_name' => "##TODO どの値を設定する??", //##TODO | |||
| 'season_ticket_select' => null, //##TODO | |||
| 'plan_name' => $entry->planName ?? "-", | |||
| 'vehicle_no' => $entry->vehicleNo ?? "-", | |||
| 'use_start_date' => $entry->useStartDate ? $entry->useStartDate->format('Y/m/d') : "-", | |||
| 'payment_method' => $entry->paymentMethod ?? "-", | |||
| 'amount' => number_format($entry->amount ?? 0), | |||
| 'paymentExplain' => EntryMessageBuilder::getPaymentExplainStr($this->entry), | |||
| 'taxExplain' => EntryMessageBuilder::getTaxExplain($this->plan), | |||
| 'can_terminate_15' => in_array(Parking::ELEMENT_CAN_TERMINATE_DATE_15, $this->parking->canTerminateDate), | |||
| 'can_terminate_end_of_month' => in_array(Parking::ELEMENT_CAN_TERMINATE_DATE_END_OF_MONTH, $this->parking->canTerminateDate), | |||
| ]; | |||
| @@ -0,0 +1,43 @@ | |||
| <?php | |||
| namespace App\Email\Members; | |||
| use App\Kintone\Models\SeasonTicketContractEntry; | |||
| use App\Kintone\Models\SeasonTicketContractPlan; | |||
| abstract class EntryMessageBuilder | |||
| { | |||
| public static function getPaymentExplainStr(SeasonTicketContractEntry $entry): string | |||
| { | |||
| if (!$entry->paymentLimitDate) { | |||
| return ""; | |||
| } | |||
| if (!$entry->firstAmount) { | |||
| return ""; | |||
| } | |||
| $hiwariStr = !!$entry->hiwariAmount ? sprintf( | |||
| "%d月分日割分%s円と", | |||
| $entry->hiwariMonth, | |||
| number_format($entry->hiwariAmount) | |||
| ) : ""; | |||
| return sprintf( | |||
| "※料金は利用日までの前払いのため、%s%d月分%s円 (合計%s円)を%sまでにお振込下さい。(手数料は振込者負担でお願い致します。)", | |||
| $hiwariStr, | |||
| $entry->targetMonth, | |||
| number_format($entry->targetAmount), | |||
| number_format($entry->firstAmount), | |||
| $entry->paymentLimitDate->format("Y年m月d日") | |||
| ); | |||
| } | |||
| public static function getTaxExplain(SeasonTicketContractPlan $plan): string | |||
| { | |||
| return sprintf( | |||
| "(消費税等含む,適用税率%d%% 消費税額 %s円)", | |||
| $plan->taxRate ?? 0, | |||
| number_format($plan->taxAmount ?? 0), | |||
| ); | |||
| } | |||
| } | |||
| @@ -4,6 +4,7 @@ namespace App\Email\Members; | |||
| use App\Kintone\Models\Parking; | |||
| use App\Kintone\Models\SeasonTicketContractEntry; | |||
| use App\Kintone\Models\SeasonTicketContractPlan; | |||
| class EntryPaymentComplete extends Members | |||
| { | |||
| @@ -11,6 +12,7 @@ class EntryPaymentComplete extends Members | |||
| public function __construct( | |||
| private Parking $parking, | |||
| private SeasonTicketContractEntry $entry, | |||
| private SeasonTicketContractPlan $plan, | |||
| ) { | |||
| $this->setEmail($entry->email); | |||
| parent::__construct(null); | |||
| @@ -28,17 +30,21 @@ class EntryPaymentComplete extends Members | |||
| public function getMemberParams(): array | |||
| { | |||
| $entry = $this->entry; | |||
| return [ | |||
| 'customer_name' => $this->entry->customerName, | |||
| 'customer_name_kana' => $this->entry->customerNameKana, | |||
| 'parking_name' => $this->entry->parkingName, | |||
| 'type_name' => '##TODO##', | |||
| 'season_ticket_select' => '##TODO##', | |||
| 'plan_name' => '##TODO##', | |||
| 'vehicle_no' => $this->entry->vehicleNo, | |||
| 'use_start_date' => $this->entry->useStartDate->format('Y/m/d'), | |||
| 'payment_method' => $this->entry->paymentMethod, | |||
| 'amount' => '##TODO##', | |||
| 'customer_name' => $entry->customerName ?? "-", | |||
| 'customer_name_kana' => $entry->customerNameKana ?? "-", | |||
| 'parking_name' => $entry->parkingName ?? "-", | |||
| 'type_name' => "##TODO どの値を設定する??", //##TODO | |||
| 'season_ticket_select' => null, //##TODO | |||
| 'plan_name' => $entry->planName ?? "-", | |||
| 'vehicle_no' => $entry->vehicleNo ?? "-", | |||
| 'use_start_date' => $entry->useStartDate ? $entry->useStartDate->format('Y/m/d') : "-", | |||
| 'payment_method' => $entry->paymentMethod ?? "-", | |||
| 'amount' => number_format($entry->amount ?? 0), | |||
| 'paymentExplain' => EntryMessageBuilder::getPaymentExplainStr($this->entry), | |||
| 'taxExplain' => EntryMessageBuilder::getTaxExplain($this->plan), | |||
| 'can_terminate_15' => in_array(Parking::ELEMENT_CAN_TERMINATE_DATE_15, $this->parking->canTerminateDate), | |||
| 'can_terminate_end_of_month' => in_array(Parking::ELEMENT_CAN_TERMINATE_DATE_END_OF_MONTH, $this->parking->canTerminateDate), | |||
| ]; | |||
| @@ -89,13 +89,15 @@ class EmailSendController extends FromKintoneController | |||
| if ($emailId === Email::ENTRY_APPROVE) { | |||
| $entry = SeasonTicketContractEntry::find($this->param->seasonTicketContractEntryRecordNo); | |||
| $parking = $entry->getParking(); | |||
| $this->setEmail(new EntryApprove($parking, $entry)); | |||
| $plan = $entry->getPlan(); | |||
| $this->setEmail(new EntryApprove($parking, $entry, $plan)); | |||
| return; | |||
| } | |||
| if ($emailId === Email::ENTRY_PAYMENT_COMPLETE) { | |||
| $entry = SeasonTicketContractEntry::find($this->param->seasonTicketContractEntryRecordNo); | |||
| $parking = $entry->getParking(); | |||
| $this->setEmail(new EntryPaymentComplete($parking, $entry)); | |||
| $plan = $entry->getPlan(); | |||
| $this->setEmail(new EntryPaymentComplete($parking, $entry, $plan)); | |||
| return; | |||
| } | |||
| @@ -8,7 +8,7 @@ use Illuminate\Validation\Rules\Enum; | |||
| /** | |||
| * @property Email emailId | |||
| * @property ?string seasonTicketContractEntryRecordNo | |||
| * @property ?int seasonTicketContractEntryRecordNo | |||
| * @property ?string applicationNo | |||
| */ | |||
| class EmailSendParam extends BaseParam | |||
| @@ -17,7 +17,7 @@ class EmailSendParam extends BaseParam | |||
| { | |||
| return [ | |||
| 'email_id' => $this->enum([new Enum(Email::class)]), | |||
| 'season_ticket_contract_entry_record_no' => $this->str(true), | |||
| 'season_ticket_contract_entry_record_no' => $this->numeric(true), | |||
| 'application_no' => $this->str(true), | |||
| ]; | |||
| } | |||
| @@ -0,0 +1,13 @@ | |||
| <?php | |||
| namespace App\Http\Controllers\Web; | |||
| use App\Http\Controllers\Web\BaseParam; | |||
| class NoneParams extends BaseParam | |||
| { | |||
| public function rules(): array | |||
| { | |||
| return []; | |||
| } | |||
| } | |||
| @@ -19,6 +19,14 @@ use Illuminate\Support\Carbon; | |||
| * @property string paymentMethod | |||
| * @property Carbon entryDatetime | |||
| * @property string planName | |||
| * @property ?string seasonTicketPlanName | |||
| * @property ?int amount | |||
| * @property ?int firstAmount | |||
| * @property ?int hiwariMonth | |||
| * @property ?int hiwariAmount | |||
| * @property ?int targetMonth | |||
| * @property ?int targetAmount | |||
| * @property ?Carbon paymentLimitDate | |||
| */ | |||
| class SeasonTicketContractEntry extends KintoneModel | |||
| { | |||
| @@ -37,6 +45,14 @@ class SeasonTicketContractEntry extends KintoneModel | |||
| const FIELD_PAYMENT_METHOD = "支払方法"; | |||
| const FIELD_ENTRY_DATETIME = "受付日時"; | |||
| const FIELD_PLAN_NAME = "ParkingNaviプラン"; | |||
| const FIELD_SEASON_TICKET_PLAN_NAME = "定期駐車場プラン"; | |||
| const FIELD_AMOUNT = "定期駐車料金"; | |||
| const FIELD_HIWARI_MONTH = "日割り分_月"; | |||
| const FIELD_HIWARI_AMOUNT = "日割り分_金額"; | |||
| const FIELD_TARGET_MONTH = "請求対象分_月"; | |||
| const FIELD_TARGET_AMOUNT = "請求対象分_金額"; | |||
| const FIELD_FIRST_AMOUNT = "初回振り込み合計額"; | |||
| const FIELD_PAYMENT_LIMIT_DATE = "振込期日"; | |||
| protected const FIELDS = [ | |||
| ...parent::FIELDS, | |||
| @@ -51,6 +67,14 @@ class SeasonTicketContractEntry extends KintoneModel | |||
| self::FIELD_PAYMENT_METHOD => FieldType::DROP_DOWN, | |||
| self::FIELD_ENTRY_DATETIME => FieldType::DATETIME, | |||
| self::FIELD_PLAN_NAME => FieldType::SINGLE_LINE_TEXT, | |||
| self::FIELD_SEASON_TICKET_PLAN_NAME => FieldType::SINGLE_LINE_TEXT, | |||
| self::FIELD_AMOUNT => FieldType::NUMBER, | |||
| self::FIELD_HIWARI_MONTH => FieldType::NUMBER, | |||
| self::FIELD_HIWARI_AMOUNT => FieldType::NUMBER, | |||
| self::FIELD_TARGET_MONTH => FieldType::NUMBER, | |||
| self::FIELD_TARGET_AMOUNT => FieldType::NUMBER, | |||
| self::FIELD_FIRST_AMOUNT => FieldType::NUMBER, | |||
| self::FIELD_PAYMENT_LIMIT_DATE => FieldType::DATE, | |||
| ]; | |||
| protected const FIELD_NAMES = [ | |||
| @@ -69,4 +93,12 @@ class SeasonTicketContractEntry extends KintoneModel | |||
| { | |||
| return Parking::findByParkingName($this->parkingName); | |||
| } | |||
| public function getPlan(): ?SeasonTicketContractPlan | |||
| { | |||
| if (!$this->planName) { | |||
| return null; | |||
| } | |||
| return SeasonTicketContractPlan::findByName($this->seasonTicketPlanName); | |||
| } | |||
| } | |||
| @@ -9,6 +9,8 @@ namespace App\Kintone\Models; | |||
| * @property string parkingName | |||
| * @property string[] sendItem | |||
| * @property string vehicleType | |||
| * @property ?int taxAmount | |||
| * @property ?int taxRate | |||
| */ | |||
| class SeasonTicketContractPlan extends KintoneModel | |||
| { | |||
| @@ -18,12 +20,16 @@ class SeasonTicketContractPlan extends KintoneModel | |||
| const FIELD_PARKING_NAME = "定期_駐車場名"; | |||
| const FIELD_SEND_ITEM = "送付物"; | |||
| const FIELD_VEHICLE_TYPE = "種別"; | |||
| const FIELD_TAX_AMOUNT = "内税"; | |||
| const FIELD_TAX_RATE = "税率"; | |||
| protected const FIELDS = [ | |||
| ...parent::FIELDS, | |||
| self::FIELD_PARKING_NAME => FieldType::SINGLE_LINE_TEXT, | |||
| self::FIELD_SEND_ITEM => FieldType::CHECK_BOX, | |||
| self::FIELD_VEHICLE_TYPE => FieldType::SINGLE_LINE_TEXT, | |||
| self::FIELD_TAX_AMOUNT => FieldType::NUMBER, | |||
| self::FIELD_TAX_RATE => FieldType::NUMBER, | |||
| ]; | |||
| protected const FIELD_NAMES = [ | |||
| @@ -38,4 +44,9 @@ class SeasonTicketContractPlan extends KintoneModel | |||
| 'has_sticker' => in_array("シール", $item), | |||
| ]; | |||
| } | |||
| public static function findByName(string $name): static | |||
| { | |||
| return static::getAccess()->first(static::getQuery()->where(static::FIELD_PLAN_NAME, $name)); | |||
| } | |||
| } | |||
| @@ -20,21 +20,25 @@ | |||
| ◆プラン | |||
| {{ $plan_name }} | |||
| @if($season_ticket_select) | |||
| ◆定期券の選択 | |||
| {{ $season_ticket_select }} | |||
| @endif | |||
| @if($vehicle_no) | |||
| ◆利用車両番号 | |||
| {{ $vehicle_no }} | |||
| @endif | |||
| @endif | |||
| ◆利用開始日(希望) | |||
| {{ $use_start_date }} | |||
| ◆◆お支払方法及び定期駐車料金 | |||
| お支払方法:{{ $payment_method }} | |||
| 定期駐車料金:{{ $amount }} | |||
| ※料金は利用日までの前払いのため、○月日割分○○円と○月分○○円 (合計○○円)を○年○月○日までにお振込下さい。(手数料は振込者負担でお願い致します。) | |||
| 定期駐車料金:{{ $amount }}円 {{ $taxExplain }} | |||
| @if($paymentExplain) | |||
| {{ $paymentExplain }} | |||
| @endif | |||
| 銀行:ゆうちょ銀行 | |||
| 店名:四四八(ヨンヨンハチ) | |||
| @@ -1,4 +1,4 @@ | |||
| @extends('emails.layouts.members') | |||
| @extends('emails.layouts.member') | |||
| @section('contents') | |||
| ご入金を確認致しました。誠にありがとうございます。 | |||
| @@ -46,9 +46,11 @@ | |||
| ◆プラン | |||
| {{ $plan_name }} | |||
| @if($season_ticket_select) | |||
| ◆定期券の選択 | |||
| XXXXXX | |||
| {{ $season_ticket_select }} | |||
| @endif | |||
| @if($vehicle_no) | |||
| ◆利用車両番号 | |||
| {{ $vehicle_no }} | |||
| @@ -59,7 +61,7 @@ XXXXXX | |||
| ◆お支払方法及び定期駐車料金 | |||
| お支払方法:{{ $payment_method }} | |||
| 定期駐車料金:XXXX円(消費税等含む,適用税率1 0% 消費税額 XX円) | |||
| 定期駐車料金:{{ $amount }}円 {{ $taxExplain }} | |||
| ◆備考 | |||
| 定期利用にあたり、必ず各駐車場・駐輪場ページ掲載の定期利用取扱事項と、ホームページ・メ ール及び現地の案内に従いご利用下さい。 | |||