| @@ -121,8 +121,9 @@ enum PrefCode: string | |||||
| return $ret; | return $ret; | ||||
| } | } | ||||
| static public function getName(PrefCode $code) | |||||
| static public function getName(?PrefCode $code) | |||||
| { | { | ||||
| if ($code === null) return ""; | |||||
| $dic = self::getDictionary(); | $dic = self::getDictionary(); | ||||
| return data_get($dic, $code->value, ""); | return data_get($dic, $code->value, ""); | ||||
| } | } | ||||
| @@ -0,0 +1,12 @@ | |||||
| <?php | |||||
| namespace App\Codes; | |||||
| /** | |||||
| * 消費税率 | |||||
| */ | |||||
| enum TaxRate: int | |||||
| { | |||||
| case DEFAULT = 10; | |||||
| case REDUCED = 8; | |||||
| } | |||||
| @@ -2,6 +2,7 @@ | |||||
| namespace App\Http\Controllers\Web\Custom\HelloTechno; | namespace App\Http\Controllers\Web\Custom\HelloTechno; | ||||
| use App\Codes\TaxRate; | |||||
| use App\Codes\UserRole; | use App\Codes\UserRole; | ||||
| use App\Http\Controllers\Web\IParam; | use App\Http\Controllers\Web\IParam; | ||||
| use App\Http\Controllers\Web\WebController; | use App\Http\Controllers\Web\WebController; | ||||
| @@ -73,6 +74,7 @@ class CreateReceiptIssuingOrderController extends HelloTechnoController | |||||
| $messages = $this->manager->init() | $messages = $this->manager->init() | ||||
| ->fill($orderData) | ->fill($orderData) | ||||
| ->setTax(TaxRate::DEFAULT->value, $param->taxAmount) | |||||
| ->create(); | ->create(); | ||||
| if (count($messages) !== 0) { | if (count($messages) !== 0) { | ||||
| @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||||
| use App\Http\Controllers\Web\BaseParam; | use App\Http\Controllers\Web\BaseParam; | ||||
| use App\Models\ReceiptIssuingOrder; | use App\Models\ReceiptIssuingOrder; | ||||
| use App\Models\ReceiptIssuingHTParkingCustomOrder as HT; | use App\Models\ReceiptIssuingHTParkingCustomOrder as HT; | ||||
| use App\Models\ReceiptIssuingOrderTax; | |||||
| use App\Rules\PhoneNumber; | use App\Rules\PhoneNumber; | ||||
| use Carbon\Carbon; | use Carbon\Carbon; | ||||
| @@ -16,6 +17,7 @@ use Carbon\Carbon; | |||||
| * @property int $receiptAmount | * @property int $receiptAmount | ||||
| * @property ?string $memo | * @property ?string $memo | ||||
| * @property string $smsPhoneNumber | * @property string $smsPhoneNumber | ||||
| * @property int $taxAmount | |||||
| */ | */ | ||||
| class CreateReceiptIssuingOrderParam extends BaseParam | class CreateReceiptIssuingOrderParam extends BaseParam | ||||
| @@ -30,6 +32,7 @@ class CreateReceiptIssuingOrderParam extends BaseParam | |||||
| ReceiptIssuingOrder::COL_NAME_RECEIPT_AMOUNT => $this->numeric(['min:0', 'max:999999']), | ReceiptIssuingOrder::COL_NAME_RECEIPT_AMOUNT => $this->numeric(['min:0', 'max:999999']), | ||||
| ReceiptIssuingOrder::COL_NAME_MEMO => $this->text(true), | ReceiptIssuingOrder::COL_NAME_MEMO => $this->text(true), | ||||
| ReceiptIssuingOrder::COL_NAME_SMS_PHONE_NUMBER => $this->str([new PhoneNumber()]), | ReceiptIssuingOrder::COL_NAME_SMS_PHONE_NUMBER => $this->str([new PhoneNumber()]), | ||||
| ReceiptIssuingOrderTax::COL_NAME_TAX_AMOUNT => $this->numeric(), | |||||
| ]; | ]; | ||||
| } | } | ||||
| @@ -7,7 +7,9 @@ use App\Codes\SMSSendPurpose; | |||||
| use App\Events\ReceiptIssuingOrder\CreatedEvent; | use App\Events\ReceiptIssuingOrder\CreatedEvent; | ||||
| use App\Logic\SMS\SMSManager; | use App\Logic\SMS\SMSManager; | ||||
| use App\Models\ReceiptIssuingOrder; | use App\Models\ReceiptIssuingOrder; | ||||
| use App\Models\ReceiptIssuingOrderTax; | |||||
| use App\Util\DateUtil; | use App\Util\DateUtil; | ||||
| use Illuminate\Database\Eloquent\Collection; | |||||
| use Illuminate\Support\Facades\View; | use Illuminate\Support\Facades\View; | ||||
| use Illuminate\Support\Str; | use Illuminate\Support\Str; | ||||
| use LogicException; | use LogicException; | ||||
| @@ -15,11 +17,17 @@ use LogicException; | |||||
| class CreateManager extends ReceiptIssuingOrderManager | class CreateManager extends ReceiptIssuingOrderManager | ||||
| { | { | ||||
| /** | |||||
| * @var Collection<ReceiptIssuingOrderTax> | |||||
| */ | |||||
| protected Collection $taxes; | |||||
| public function __construct( | public function __construct( | ||||
| protected ReceiptIssuingOrder $order, | protected ReceiptIssuingOrder $order, | ||||
| protected SMSManager $smsManager | protected SMSManager $smsManager | ||||
| ) { | ) { | ||||
| parent::__construct($order); | parent::__construct($order); | ||||
| $this->taxes = new Collection(); | |||||
| } | } | ||||
| public function init() | public function init() | ||||
| @@ -42,6 +50,18 @@ class CreateManager extends ReceiptIssuingOrderManager | |||||
| return $this; | return $this; | ||||
| } | } | ||||
| public function setTax(int $rate, int $amount): static | |||||
| { | |||||
| $tax = new ReceiptIssuingOrderTax(); | |||||
| $tax->tax_rate = $rate; | |||||
| $tax->tax_amount = $amount; | |||||
| $this->taxes->push($tax); | |||||
| return $this; | |||||
| } | |||||
| public function create(): array | public function create(): array | ||||
| { | { | ||||
| $order = $this->order; | $order = $this->order; | ||||
| @@ -65,6 +85,14 @@ class CreateManager extends ReceiptIssuingOrderManager | |||||
| $this->save(); | $this->save(); | ||||
| // 消費税保存 | |||||
| foreach ($this->taxes as $tax) { | |||||
| $tax->setContract($order->contract_id) | |||||
| ->setReceiptIssuingOrder($this->order->id) | |||||
| ->save(); | |||||
| } | |||||
| // SMS配信 | // SMS配信 | ||||
| $smsSendOrder = $this->smsManager::makeSMSSendOrder($order, SMSSendPurpose::SEND_RECEIPT_ISSUING_ORDER_FORM, $this->makeSMSContents()); | $smsSendOrder = $this->smsManager::makeSMSSendOrder($order, SMSSendPurpose::SEND_RECEIPT_ISSUING_ORDER_FORM, $this->makeSMSContents()); | ||||
| $smsSendOrder->send(); | $smsSendOrder->send(); | ||||
| @@ -6,6 +6,7 @@ use App\Codes\PrefCode; | |||||
| use App\Events\ReceiptIssuingOrder\DownloadedEvent; | use App\Events\ReceiptIssuingOrder\DownloadedEvent; | ||||
| use App\Exceptions\AppCommonException; | use App\Exceptions\AppCommonException; | ||||
| use App\Models\ReceiptIssuingOrder; | use App\Models\ReceiptIssuingOrder; | ||||
| use App\Models\ReceiptIssuingOrderTax; | |||||
| use App\Util\DateUtil; | use App\Util\DateUtil; | ||||
| use PDF; | use PDF; | ||||
| @@ -59,12 +60,15 @@ class PDFDownLoadManager extends ReceiptIssuingOrderManager | |||||
| protected function getPDFData() | protected function getPDFData() | ||||
| { | { | ||||
| $o = $this->order; | $o = $this->order; | ||||
| $tax = $o->receiptIssuingOrderTaxes->firstOrFail(); | |||||
| return [ | return [ | ||||
| ...$this->order->toArray(), | ...$this->order->toArray(), | ||||
| ReceiptIssuingOrder::COL_NAME_STATUS_RECEIPT_CONFIRM_DATETIME => $o->status_receipt_confirm_datetime->format('Y/m/d'), | ReceiptIssuingOrder::COL_NAME_STATUS_RECEIPT_CONFIRM_DATETIME => $o->status_receipt_confirm_datetime->format('Y/m/d'), | ||||
| ReceiptIssuingOrder::COL_NAME_RECEIPT_USE_DATE => $o->receipt_use_date->format('Y/m/d'), | ReceiptIssuingOrder::COL_NAME_RECEIPT_USE_DATE => $o->receipt_use_date->format('Y/m/d'), | ||||
| ReceiptIssuingOrder::COL_NAME_RECEIPT_AMOUNT => number_format($o->receipt_amount), | ReceiptIssuingOrder::COL_NAME_RECEIPT_AMOUNT => number_format($o->receipt_amount), | ||||
| 'pref_name' => PrefCode::getName($o->mail_pref_code), | 'pref_name' => PrefCode::getName($o->mail_pref_code), | ||||
| ReceiptIssuingOrderTax::COL_NAME_TAX_RATE => data_get($tax, ReceiptIssuingOrderTax::COL_NAME_TAX_RATE, 0), | |||||
| ReceiptIssuingOrderTax::COL_NAME_TAX_AMOUNT => number_format(data_get($tax, ReceiptIssuingOrderTax::COL_NAME_TAX_AMOUNT, 0)), | |||||
| ]; | ]; | ||||
| } | } | ||||
| } | } | ||||
| @@ -4,6 +4,7 @@ namespace App\Models; | |||||
| use App\Codes\PrefCode; | use App\Codes\PrefCode; | ||||
| use App\Models\Feature\ContractFeature; | use App\Models\Feature\ContractFeature; | ||||
| use Illuminate\Database\Eloquent\Relations\HasMany; | |||||
| use Illuminate\Database\Eloquent\Relations\HasOne; | use Illuminate\Database\Eloquent\Relations\HasOne; | ||||
| class ReceiptIssuingOrder extends AppModel | class ReceiptIssuingOrder extends AppModel | ||||
| @@ -73,4 +74,9 @@ class ReceiptIssuingOrder extends AppModel | |||||
| { | { | ||||
| return $this->hasOne(ReceiptIssuingHTParkingCustomOrder::class); | return $this->hasOne(ReceiptIssuingHTParkingCustomOrder::class); | ||||
| } | } | ||||
| public function receiptIssuingOrderTaxes(): HasMany | |||||
| { | |||||
| return $this->hasMany(ReceiptIssuingOrderTax::class); | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,19 @@ | |||||
| <?php | |||||
| namespace App\Models; | |||||
| use App\Models\Feature\ContractFeature; | |||||
| use App\Models\Feature\ReceiptIssuingOrderFeature; | |||||
| class ReceiptIssuingOrderTax extends AppModel | |||||
| { | |||||
| use ContractFeature, ReceiptIssuingOrderFeature; | |||||
| const COL_NAME_TAX_RATE = "tax_rate"; | |||||
| const COL_NAME_TAX_AMOUNT = "tax_amount"; | |||||
| public function getModelName(): string | |||||
| { | |||||
| return "領収証発行依頼_消費税"; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,12 @@ | |||||
| <?php | |||||
| namespace App\Models; | |||||
| class ReceiptIssuingOrderTaxHistory extends HistoryModel | |||||
| { | |||||
| public function getModelName(): string | |||||
| { | |||||
| return "領収証発行依頼_消費税履歴"; | |||||
| } | |||||
| } | |||||
| @@ -4,6 +4,7 @@ namespace App\Repositories\Custom\HelloTechno; | |||||
| use App\Models\ReceiptIssuingHTParkingCustomOrder as CustomOrder; | use App\Models\ReceiptIssuingHTParkingCustomOrder as CustomOrder; | ||||
| use App\Models\ReceiptIssuingOrder; | use App\Models\ReceiptIssuingOrder; | ||||
| use App\Models\ReceiptIssuingOrderTax; | |||||
| use App\Models\User; | use App\Models\User; | ||||
| use App\Repositories\BaseRepository; | use App\Repositories\BaseRepository; | ||||
| use Illuminate\Database\Query\JoinClause; | use Illuminate\Database\Query\JoinClause; | ||||
| @@ -40,6 +41,7 @@ class ReceiptIssuingOrderRepository extends BaseRepository | |||||
| const TABLE_ORDER = "order"; | const TABLE_ORDER = "order"; | ||||
| const TABLE_CUSTOM_ORDER = "custom_order"; | const TABLE_CUSTOM_ORDER = "custom_order"; | ||||
| const TABLE_HANDLER = "handler"; | const TABLE_HANDLER = "handler"; | ||||
| const TABLE_TAX = "tax"; | |||||
| /** | /** | ||||
| @@ -65,6 +67,12 @@ class ReceiptIssuingOrderRepository extends BaseRepository | |||||
| $this->makeColumnName([static::TABLE_ORDER, ReceiptIssuingOrder::COL_NAME_HANDLER_ID]), | $this->makeColumnName([static::TABLE_ORDER, ReceiptIssuingOrder::COL_NAME_HANDLER_ID]), | ||||
| $this->makeColumnName([static::TABLE_HANDLER, CustomOrder::COL_NAME_ID]) | $this->makeColumnName([static::TABLE_HANDLER, CustomOrder::COL_NAME_ID]) | ||||
| ); | ); | ||||
| }) | |||||
| ->leftJoinSub(ReceiptIssuingOrderTax::getBuilder(), static::TABLE_TAX, function (JoinClause $join) { | |||||
| $join->on( | |||||
| $this->makeColumnName([static::TABLE_ORDER, ReceiptIssuingOrder::COL_NAME_ID]), | |||||
| $this->makeColumnName([static::TABLE_TAX, ReceiptIssuingOrderTax::COL_NAME_RECEIPT_ISSUING_ORDER_ID]) | |||||
| ); | |||||
| }); | }); | ||||
| // -----検索条件 | // -----検索条件 | ||||
| @@ -150,6 +158,7 @@ class ReceiptIssuingOrderRepository extends BaseRepository | |||||
| $order = static::TABLE_ORDER; | $order = static::TABLE_ORDER; | ||||
| $custom = static::TABLE_CUSTOM_ORDER; | $custom = static::TABLE_CUSTOM_ORDER; | ||||
| $handler = static::TABLE_HANDLER; | $handler = static::TABLE_HANDLER; | ||||
| $tax = static::TABLE_TAX; | |||||
| $columns = [ | $columns = [ | ||||
| $this->makeColumnNameForSelect([$order, ReceiptIssuingOrder::COL_NAME_ID], 'id'), | $this->makeColumnNameForSelect([$order, ReceiptIssuingOrder::COL_NAME_ID], 'id'), | ||||
| $this->makeColumnNameForSelect([$order, ReceiptIssuingOrder::COL_NAME_STATUS_NAME], 'status_name'), | $this->makeColumnNameForSelect([$order, ReceiptIssuingOrder::COL_NAME_STATUS_NAME], 'status_name'), | ||||
| @@ -194,7 +203,8 @@ class ReceiptIssuingOrderRepository extends BaseRepository | |||||
| $this->makeColumnNameForSelect([$custom, CustomOrder::COL_NAME_ADJUST_SEQ_NO]), | $this->makeColumnNameForSelect([$custom, CustomOrder::COL_NAME_ADJUST_SEQ_NO]), | ||||
| $this->makeColumnNameForSelect([$handler, User::COL_NAME_ID], 'handler_id'), | $this->makeColumnNameForSelect([$handler, User::COL_NAME_ID], 'handler_id'), | ||||
| $this->makeColumnNameForSelect([$handler, User::COL_NAME_NAME], 'handler_name'), | $this->makeColumnNameForSelect([$handler, User::COL_NAME_NAME], 'handler_name'), | ||||
| $this->makeColumnNameForSelect([$tax, ReceiptIssuingOrderTax::COL_NAME_TAX_RATE]), | |||||
| $this->makeColumnNameForSelect([$tax, ReceiptIssuingOrderTax::COL_NAME_TAX_AMOUNT]), | |||||
| ]; | ]; | ||||
| @@ -0,0 +1,45 @@ | |||||
| <?php | |||||
| use App\Models\ColumnName; | |||||
| use App\Util\MigrationHelper; | |||||
| use Illuminate\Database\Migrations\Migration; | |||||
| use Illuminate\Database\Schema\Blueprint; | |||||
| use Illuminate\Support\Facades\Schema; | |||||
| return new class extends Migration | |||||
| { | |||||
| /** | |||||
| * Run the migrations. | |||||
| */ | |||||
| public function up(): void | |||||
| { | |||||
| MigrationHelper::createTable('receipt_issuing_order_taxes', $this->schema()); | |||||
| MigrationHelper::createTable('receipt_issuing_order_tax_histories', $this->schema(true)); | |||||
| } | |||||
| /** | |||||
| * Reverse the migrations. | |||||
| */ | |||||
| public function down(): void | |||||
| { | |||||
| Schema::dropIfExists('receipt_issuing_order_taxes'); | |||||
| Schema::dropIfExists('receipt_issuing_order_tax_histories'); | |||||
| } | |||||
| private function schema(bool $forHistory = false) | |||||
| { | |||||
| return function (Blueprint $table, MigrationHelper $helper) use ($forHistory) { | |||||
| $helper->baseColumn() | |||||
| ->contractId() | |||||
| ->receiptIssuingOrderId(); | |||||
| $table->unsignedInteger("tax_rate")->default(0)->comment("消費税率"); | |||||
| $table->unsignedInteger("tax_amount")->default(0)->comment("消費税"); | |||||
| $helper->index(1, [ColumnName::CONTRACT_ID]); | |||||
| $helper->index(2, [ColumnName::RECEIPT_ISSUING_ORDER_ID]); | |||||
| }; | |||||
| } | |||||
| }; | |||||
| @@ -36,7 +36,7 @@ | |||||
| </div> | </div> | ||||
| </section> | </section> | ||||
| <section class="amount_sub"> | <section class="amount_sub"> | ||||
| 内消費税 ¥160- | |||||
| 内消費税 ¥{{ $tax_amount }} - | |||||
| </section> | </section> | ||||
| <section class="description"> | <section class="description"> | ||||
| <P>但し {{ $receipt_purpose }}として</P> | <P>但し {{ $receipt_purpose }}として</P> | ||||
| @@ -62,7 +62,7 @@ | |||||
| <div class="pt1 tc f5 b underline item ml10"> | <div class="pt1 tc f5 b underline item ml10"> | ||||
| ¥{{ $receipt_amount }} - | ¥{{ $receipt_amount }} - | ||||
| </div> | </div> | ||||
| <div class="item ml3 f3"> 内消費税 ¥XXX- (10%対象)</div> | |||||
| <div class="item ml3 f3"> 内消費税 ¥{{ $tax_amount }}- (10%対象)</div> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div class="pt3 f35 "> | <div class="pt3 f35 "> | ||||