| @@ -4,6 +4,7 @@ namespace App\Email\Members; | |||||
| use App\Kintone\Models\Parking; | use App\Kintone\Models\Parking; | ||||
| use App\Kintone\Models\SeasonTicketContractEntry; | use App\Kintone\Models\SeasonTicketContractEntry; | ||||
| use App\Kintone\Models\SeasonTicketContractPlan; | |||||
| class EntryApprove extends Members | class EntryApprove extends Members | ||||
| { | { | ||||
| @@ -11,6 +12,7 @@ class EntryApprove extends Members | |||||
| public function __construct( | public function __construct( | ||||
| private Parking $parking, | private Parking $parking, | ||||
| private SeasonTicketContractEntry $entry, | private SeasonTicketContractEntry $entry, | ||||
| private SeasonTicketContractPlan $plan, | |||||
| ) { | ) { | ||||
| $this->setEmail($entry->email); | $this->setEmail($entry->email); | ||||
| parent::__construct(null); | parent::__construct(null); | ||||
| @@ -28,17 +30,21 @@ class EntryApprove extends Members | |||||
| public function getMemberParams(): array | public function getMemberParams(): array | ||||
| { | { | ||||
| $entry = $this->entry; | |||||
| return [ | 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_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), | '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\Parking; | ||||
| use App\Kintone\Models\SeasonTicketContractEntry; | use App\Kintone\Models\SeasonTicketContractEntry; | ||||
| use App\Kintone\Models\SeasonTicketContractPlan; | |||||
| class EntryPaymentComplete extends Members | class EntryPaymentComplete extends Members | ||||
| { | { | ||||
| @@ -11,6 +12,7 @@ class EntryPaymentComplete extends Members | |||||
| public function __construct( | public function __construct( | ||||
| private Parking $parking, | private Parking $parking, | ||||
| private SeasonTicketContractEntry $entry, | private SeasonTicketContractEntry $entry, | ||||
| private SeasonTicketContractPlan $plan, | |||||
| ) { | ) { | ||||
| $this->setEmail($entry->email); | $this->setEmail($entry->email); | ||||
| parent::__construct(null); | parent::__construct(null); | ||||
| @@ -28,17 +30,21 @@ class EntryPaymentComplete extends Members | |||||
| public function getMemberParams(): array | public function getMemberParams(): array | ||||
| { | { | ||||
| $entry = $this->entry; | |||||
| return [ | 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_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), | '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) { | if ($emailId === Email::ENTRY_APPROVE) { | ||||
| $entry = SeasonTicketContractEntry::find($this->param->seasonTicketContractEntryRecordNo); | $entry = SeasonTicketContractEntry::find($this->param->seasonTicketContractEntryRecordNo); | ||||
| $parking = $entry->getParking(); | $parking = $entry->getParking(); | ||||
| $this->setEmail(new EntryApprove($parking, $entry)); | |||||
| $plan = $entry->getPlan(); | |||||
| $this->setEmail(new EntryApprove($parking, $entry, $plan)); | |||||
| return; | return; | ||||
| } | } | ||||
| if ($emailId === Email::ENTRY_PAYMENT_COMPLETE) { | if ($emailId === Email::ENTRY_PAYMENT_COMPLETE) { | ||||
| $entry = SeasonTicketContractEntry::find($this->param->seasonTicketContractEntryRecordNo); | $entry = SeasonTicketContractEntry::find($this->param->seasonTicketContractEntryRecordNo); | ||||
| $parking = $entry->getParking(); | $parking = $entry->getParking(); | ||||
| $this->setEmail(new EntryPaymentComplete($parking, $entry)); | |||||
| $plan = $entry->getPlan(); | |||||
| $this->setEmail(new EntryPaymentComplete($parking, $entry, $plan)); | |||||
| return; | return; | ||||
| } | } | ||||
| @@ -8,7 +8,7 @@ use Illuminate\Validation\Rules\Enum; | |||||
| /** | /** | ||||
| * @property Email emailId | * @property Email emailId | ||||
| * @property ?string seasonTicketContractEntryRecordNo | |||||
| * @property ?int seasonTicketContractEntryRecordNo | |||||
| * @property ?string applicationNo | * @property ?string applicationNo | ||||
| */ | */ | ||||
| class EmailSendParam extends BaseParam | class EmailSendParam extends BaseParam | ||||
| @@ -17,7 +17,7 @@ class EmailSendParam extends BaseParam | |||||
| { | { | ||||
| return [ | return [ | ||||
| 'email_id' => $this->enum([new Enum(Email::class)]), | '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), | '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 string paymentMethod | ||||
| * @property Carbon entryDatetime | * @property Carbon entryDatetime | ||||
| * @property string planName | * @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 | class SeasonTicketContractEntry extends KintoneModel | ||||
| { | { | ||||
| @@ -37,6 +45,14 @@ class SeasonTicketContractEntry extends KintoneModel | |||||
| const FIELD_PAYMENT_METHOD = "支払方法"; | const FIELD_PAYMENT_METHOD = "支払方法"; | ||||
| const FIELD_ENTRY_DATETIME = "受付日時"; | const FIELD_ENTRY_DATETIME = "受付日時"; | ||||
| const FIELD_PLAN_NAME = "ParkingNaviプラン"; | 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 = [ | protected const FIELDS = [ | ||||
| ...parent::FIELDS, | ...parent::FIELDS, | ||||
| @@ -51,6 +67,14 @@ class SeasonTicketContractEntry extends KintoneModel | |||||
| self::FIELD_PAYMENT_METHOD => FieldType::DROP_DOWN, | self::FIELD_PAYMENT_METHOD => FieldType::DROP_DOWN, | ||||
| self::FIELD_ENTRY_DATETIME => FieldType::DATETIME, | self::FIELD_ENTRY_DATETIME => FieldType::DATETIME, | ||||
| self::FIELD_PLAN_NAME => FieldType::SINGLE_LINE_TEXT, | 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 = [ | protected const FIELD_NAMES = [ | ||||
| @@ -69,4 +93,12 @@ class SeasonTicketContractEntry extends KintoneModel | |||||
| { | { | ||||
| return Parking::findByParkingName($this->parkingName); | 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 parkingName | ||||
| * @property string[] sendItem | * @property string[] sendItem | ||||
| * @property string vehicleType | * @property string vehicleType | ||||
| * @property ?int taxAmount | |||||
| * @property ?int taxRate | |||||
| */ | */ | ||||
| class SeasonTicketContractPlan extends KintoneModel | class SeasonTicketContractPlan extends KintoneModel | ||||
| { | { | ||||
| @@ -18,12 +20,16 @@ class SeasonTicketContractPlan extends KintoneModel | |||||
| const FIELD_PARKING_NAME = "定期_駐車場名"; | const FIELD_PARKING_NAME = "定期_駐車場名"; | ||||
| const FIELD_SEND_ITEM = "送付物"; | const FIELD_SEND_ITEM = "送付物"; | ||||
| const FIELD_VEHICLE_TYPE = "種別"; | const FIELD_VEHICLE_TYPE = "種別"; | ||||
| const FIELD_TAX_AMOUNT = "内税"; | |||||
| const FIELD_TAX_RATE = "税率"; | |||||
| protected const FIELDS = [ | protected const FIELDS = [ | ||||
| ...parent::FIELDS, | ...parent::FIELDS, | ||||
| self::FIELD_PARKING_NAME => FieldType::SINGLE_LINE_TEXT, | self::FIELD_PARKING_NAME => FieldType::SINGLE_LINE_TEXT, | ||||
| self::FIELD_SEND_ITEM => FieldType::CHECK_BOX, | self::FIELD_SEND_ITEM => FieldType::CHECK_BOX, | ||||
| self::FIELD_VEHICLE_TYPE => FieldType::SINGLE_LINE_TEXT, | self::FIELD_VEHICLE_TYPE => FieldType::SINGLE_LINE_TEXT, | ||||
| self::FIELD_TAX_AMOUNT => FieldType::NUMBER, | |||||
| self::FIELD_TAX_RATE => FieldType::NUMBER, | |||||
| ]; | ]; | ||||
| protected const FIELD_NAMES = [ | protected const FIELD_NAMES = [ | ||||
| @@ -38,4 +44,9 @@ class SeasonTicketContractPlan extends KintoneModel | |||||
| 'has_sticker' => in_array("シール", $item), | '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 }} | {{ $plan_name }} | ||||
| @if($season_ticket_select) | |||||
| ◆定期券の選択 | ◆定期券の選択 | ||||
| {{ $season_ticket_select }} | {{ $season_ticket_select }} | ||||
| @endif | |||||
| @if($vehicle_no) | @if($vehicle_no) | ||||
| ◆利用車両番号 | ◆利用車両番号 | ||||
| {{ $vehicle_no }} | {{ $vehicle_no }} | ||||
| @endif | |||||
| @endif | |||||
| ◆利用開始日(希望) | ◆利用開始日(希望) | ||||
| {{ $use_start_date }} | {{ $use_start_date }} | ||||
| ◆◆お支払方法及び定期駐車料金 | ◆◆お支払方法及び定期駐車料金 | ||||
| お支払方法:{{ $payment_method }} | お支払方法:{{ $payment_method }} | ||||
| 定期駐車料金:{{ $amount }} | |||||
| ※料金は利用日までの前払いのため、○月日割分○○円と○月分○○円 (合計○○円)を○年○月○日までにお振込下さい。(手数料は振込者負担でお願い致します。) | |||||
| 定期駐車料金:{{ $amount }}円 {{ $taxExplain }} | |||||
| @if($paymentExplain) | |||||
| {{ $paymentExplain }} | |||||
| @endif | |||||
| 銀行:ゆうちょ銀行 | 銀行:ゆうちょ銀行 | ||||
| 店名:四四八(ヨンヨンハチ) | 店名:四四八(ヨンヨンハチ) | ||||
| @@ -1,4 +1,4 @@ | |||||
| @extends('emails.layouts.members') | |||||
| @extends('emails.layouts.member') | |||||
| @section('contents') | @section('contents') | ||||
| ご入金を確認致しました。誠にありがとうございます。 | ご入金を確認致しました。誠にありがとうございます。 | ||||
| @@ -46,9 +46,11 @@ | |||||
| ◆プラン | ◆プラン | ||||
| {{ $plan_name }} | {{ $plan_name }} | ||||
| @if($season_ticket_select) | |||||
| ◆定期券の選択 | ◆定期券の選択 | ||||
| XXXXXX | |||||
| {{ $season_ticket_select }} | |||||
| @endif | |||||
| @if($vehicle_no) | @if($vehicle_no) | ||||
| ◆利用車両番号 | ◆利用車両番号 | ||||
| {{ $vehicle_no }} | {{ $vehicle_no }} | ||||
| @@ -59,7 +61,7 @@ XXXXXX | |||||
| ◆お支払方法及び定期駐車料金 | ◆お支払方法及び定期駐車料金 | ||||
| お支払方法:{{ $payment_method }} | お支払方法:{{ $payment_method }} | ||||
| 定期駐車料金:XXXX円(消費税等含む,適用税率1 0% 消費税額 XX円) | |||||
| 定期駐車料金:{{ $amount }}円 {{ $taxExplain }} | |||||
| ◆備考 | ◆備考 | ||||
| 定期利用にあたり、必ず各駐車場・駐輪場ページ掲載の定期利用取扱事項と、ホームページ・メ ール及び現地の案内に従いご利用下さい。 | 定期利用にあたり、必ず各駐車場・駐輪場ページ掲載の定期利用取扱事項と、ホームページ・メ ール及び現地の案内に従いご利用下さい。 | ||||