| @@ -121,8 +121,9 @@ enum PrefCode: string | |||
| return $ret; | |||
| } | |||
| static public function getName(PrefCode $code) | |||
| static public function getName(?PrefCode $code) | |||
| { | |||
| if ($code === null) return ""; | |||
| $dic = self::getDictionary(); | |||
| 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; | |||
| use App\Codes\TaxRate; | |||
| use App\Codes\UserRole; | |||
| use App\Http\Controllers\Web\IParam; | |||
| use App\Http\Controllers\Web\WebController; | |||
| @@ -73,6 +74,7 @@ class CreateReceiptIssuingOrderController extends HelloTechnoController | |||
| $messages = $this->manager->init() | |||
| ->fill($orderData) | |||
| ->setTax(TaxRate::DEFAULT->value, $param->taxAmount) | |||
| ->create(); | |||
| if (count($messages) !== 0) { | |||
| @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||
| use App\Http\Controllers\Web\BaseParam; | |||
| use App\Models\ReceiptIssuingOrder; | |||
| use App\Models\ReceiptIssuingHTParkingCustomOrder as HT; | |||
| use App\Models\ReceiptIssuingOrderTax; | |||
| use App\Rules\PhoneNumber; | |||
| use Carbon\Carbon; | |||
| @@ -16,6 +17,7 @@ use Carbon\Carbon; | |||
| * @property int $receiptAmount | |||
| * @property ?string $memo | |||
| * @property string $smsPhoneNumber | |||
| * @property int $taxAmount | |||
| */ | |||
| 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_MEMO => $this->text(true), | |||
| 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\Logic\SMS\SMSManager; | |||
| use App\Models\ReceiptIssuingOrder; | |||
| use App\Models\ReceiptIssuingOrderTax; | |||
| use App\Util\DateUtil; | |||
| use Illuminate\Database\Eloquent\Collection; | |||
| use Illuminate\Support\Facades\View; | |||
| use Illuminate\Support\Str; | |||
| use LogicException; | |||
| @@ -15,11 +17,17 @@ use LogicException; | |||
| class CreateManager extends ReceiptIssuingOrderManager | |||
| { | |||
| /** | |||
| * @var Collection<ReceiptIssuingOrderTax> | |||
| */ | |||
| protected Collection $taxes; | |||
| public function __construct( | |||
| protected ReceiptIssuingOrder $order, | |||
| protected SMSManager $smsManager | |||
| ) { | |||
| parent::__construct($order); | |||
| $this->taxes = new Collection(); | |||
| } | |||
| public function init() | |||
| @@ -42,6 +50,18 @@ class CreateManager extends ReceiptIssuingOrderManager | |||
| 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 | |||
| { | |||
| $order = $this->order; | |||
| @@ -65,6 +85,14 @@ class CreateManager extends ReceiptIssuingOrderManager | |||
| $this->save(); | |||
| // 消費税保存 | |||
| foreach ($this->taxes as $tax) { | |||
| $tax->setContract($order->contract_id) | |||
| ->setReceiptIssuingOrder($this->order->id) | |||
| ->save(); | |||
| } | |||
| // SMS配信 | |||
| $smsSendOrder = $this->smsManager::makeSMSSendOrder($order, SMSSendPurpose::SEND_RECEIPT_ISSUING_ORDER_FORM, $this->makeSMSContents()); | |||
| $smsSendOrder->send(); | |||
| @@ -6,6 +6,7 @@ use App\Codes\PrefCode; | |||
| use App\Events\ReceiptIssuingOrder\DownloadedEvent; | |||
| use App\Exceptions\AppCommonException; | |||
| use App\Models\ReceiptIssuingOrder; | |||
| use App\Models\ReceiptIssuingOrderTax; | |||
| use App\Util\DateUtil; | |||
| use PDF; | |||
| @@ -59,12 +60,15 @@ class PDFDownLoadManager extends ReceiptIssuingOrderManager | |||
| protected function getPDFData() | |||
| { | |||
| $o = $this->order; | |||
| $tax = $o->receiptIssuingOrderTaxes->firstOrFail(); | |||
| return [ | |||
| ...$this->order->toArray(), | |||
| 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_AMOUNT => number_format($o->receipt_amount), | |||
| '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\Models\Feature\ContractFeature; | |||
| use Illuminate\Database\Eloquent\Relations\HasMany; | |||
| use Illuminate\Database\Eloquent\Relations\HasOne; | |||
| class ReceiptIssuingOrder extends AppModel | |||
| @@ -73,4 +74,9 @@ class ReceiptIssuingOrder extends AppModel | |||
| { | |||
| 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\ReceiptIssuingOrder; | |||
| use App\Models\ReceiptIssuingOrderTax; | |||
| use App\Models\User; | |||
| use App\Repositories\BaseRepository; | |||
| use Illuminate\Database\Query\JoinClause; | |||
| @@ -40,6 +41,7 @@ class ReceiptIssuingOrderRepository extends BaseRepository | |||
| const TABLE_ORDER = "order"; | |||
| const TABLE_CUSTOM_ORDER = "custom_order"; | |||
| 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_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; | |||
| $custom = static::TABLE_CUSTOM_ORDER; | |||
| $handler = static::TABLE_HANDLER; | |||
| $tax = static::TABLE_TAX; | |||
| $columns = [ | |||
| $this->makeColumnNameForSelect([$order, ReceiptIssuingOrder::COL_NAME_ID], 'id'), | |||
| $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([$handler, User::COL_NAME_ID], 'handler_id'), | |||
| $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> | |||
| </section> | |||
| <section class="amount_sub"> | |||
| 内消費税 ¥160- | |||
| 内消費税 ¥{{ $tax_amount }} - | |||
| </section> | |||
| <section class="description"> | |||
| <P>但し {{ $receipt_purpose }}として</P> | |||
| @@ -62,7 +62,7 @@ | |||
| <div class="pt1 tc f5 b underline item ml10"> | |||
| ¥{{ $receipt_amount }} - | |||
| </div> | |||
| <div class="item ml3 f3"> 内消費税 ¥XXX- (10%対象)</div> | |||
| <div class="item ml3 f3"> 内消費税 ¥{{ $tax_amount }}- (10%対象)</div> | |||
| </div> | |||
| </div> | |||
| <div class="pt3 f35 "> | |||