| @@ -1,6 +1,6 @@ | |||
| <?php | |||
| namespace App\Http\Controllers\Web\ReceiptIssuingOrder; | |||
| namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||
| use App\Http\Controllers\Web\IParam; | |||
| use App\Http\Controllers\Web\WebController; | |||
| @@ -1,6 +1,6 @@ | |||
| <?php | |||
| namespace App\Http\Controllers\Web\ReceiptIssuingOrder; | |||
| namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||
| use App\Http\Controllers\Web\BaseParam; | |||
| use App\Models\ReceiptIssuingOrder; | |||
| @@ -0,0 +1,98 @@ | |||
| <?php | |||
| namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||
| use App\Codes\UserRole; | |||
| use App\Exceptions\AppCommonException; | |||
| use App\Features\LoginUser; | |||
| use App\Http\Controllers\Web\IParam; | |||
| use App\Http\Controllers\Web\WebController; | |||
| use App\Logic\ReceiptIssuingOrder\Custom\HelloTechno\PDFDownLoadManagerHelloTechno; | |||
| use App\Logic\ReceiptIssuingOrder\UpdateManager; | |||
| use App\Models\ColumnName; | |||
| use App\Models\ReceiptIssuingOrder; | |||
| use App\Repositories\Custom\HelloTechno\ReceiptIssuingOrderRepository; | |||
| use App\Util\DateUtil; | |||
| use Illuminate\Database\Eloquent\Collection; | |||
| use Illuminate\Http\Request; | |||
| use Illuminate\Http\Response; | |||
| use Illuminate\Support\Arr; | |||
| class DownloadLettersController extends HelloTechnoController | |||
| { | |||
| use LoginUser; | |||
| public function name(): string | |||
| { | |||
| return "領収証PDFダウンロード(複数)"; | |||
| } | |||
| public function description(): string | |||
| { | |||
| return "領収証PDFダウンロードする(複数)"; | |||
| } | |||
| public function __construct( | |||
| protected DownloadLettersParam $param, | |||
| private ReceiptIssuingOrderRepository $repository, | |||
| private PDFDownLoadManagerHelloTechno $manager | |||
| ) { | |||
| parent::__construct(); | |||
| $this->roleAllow(UserRole::NORMAL_ADMIN); | |||
| } | |||
| protected function getParam(): IParam | |||
| { | |||
| return $this->param; | |||
| } | |||
| protected function run(Request $request): Response | |||
| { | |||
| $param = $this->param; | |||
| $a = $param->toArray(); | |||
| try { | |||
| $this->transaction->beginTransaction(); | |||
| $targets = $this->repository->get( | |||
| [ | |||
| ...$param->toArray(), | |||
| ReceiptIssuingOrderRepository::CONDITION_CONTRACT_ID => $this->loginUser()->getCurrentContractId(), | |||
| ReceiptIssuingOrderRepository::CONDITION_IS_CONFIRMED => true, | |||
| ReceiptIssuingOrderRepository::CONDITION_HAS_MAILORDER => true, | |||
| ] | |||
| ); | |||
| $models = ReceiptIssuingOrder::findMany(Arr::pluck($targets, ReceiptIssuingOrder::COL_NAME_ID)); | |||
| $documents = $this->manager->initForDownloadLetters()->downlaodLetters($models); | |||
| $this->updatePostDate($models); | |||
| $this->transaction->commit(); | |||
| } catch (Exception $e) { | |||
| $this->transaction->rollBack(); | |||
| throw $e; | |||
| } | |||
| return $documents; | |||
| } | |||
| private function updatePostDate(Collection $models) | |||
| { | |||
| foreach ($models as $order) { | |||
| $manager = UpdateManager::instance(); | |||
| $messages = $manager->initById($order->id) | |||
| ->mailPosted(DateUtil::now()) | |||
| ->update(); | |||
| if (count($messages) !== 0) { | |||
| throw new AppCommonException(Arr::first($messages)); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| <?php | |||
| namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||
| use App\Models\ReceiptIssuingOrder; | |||
| /** | |||
| * @property string $id | |||
| */ | |||
| class DownloadLettersParam extends ReceiptIssuingsOrdersParam | |||
| { | |||
| } | |||
| @@ -5,6 +5,9 @@ namespace App\Logic\ReceiptIssuingOrder\Custom\HelloTechno;; | |||
| use App\Logic\ReceiptIssuingOrder\PDFDownLoadManager; | |||
| use App\Models\ReceiptIssuingHTParkingCustomOrder; | |||
| use App\Models\ReceiptIssuingOrder; | |||
| use App\Util\DateUtil; | |||
| use Illuminate\Database\Eloquent\Collection; | |||
| use PDF; | |||
| class PDFDownLoadManagerHelloTechno extends PDFDownLoadManager | |||
| { | |||
| @@ -16,6 +19,12 @@ class PDFDownLoadManagerHelloTechno extends PDFDownLoadManager | |||
| parent::__construct($order); | |||
| } | |||
| public function initForDownloadLetters() | |||
| { | |||
| $this->initialized = true; | |||
| return $this; | |||
| } | |||
| public function initByToken(string $token) | |||
| { | |||
| parent::initByToken($token); | |||
| @@ -32,11 +41,45 @@ class PDFDownLoadManagerHelloTechno extends PDFDownLoadManager | |||
| return $this; | |||
| } | |||
| protected function getPDFData() | |||
| /** | |||
| * @param Collection<int, ReceiptIssuingOrder> $list | |||
| */ | |||
| public function downlaodLetters(Collection $list) | |||
| { | |||
| $data = []; | |||
| foreach ($list as $ele) { | |||
| $data[] = $this->getPDFData($ele); | |||
| } | |||
| $pdf = PDF::loadView('pdf/receipt_letters', [ | |||
| 'orders' => $data | |||
| ]); | |||
| // はがきサイズを指定 | |||
| $ret = $pdf->setOption('page-height', 148) | |||
| ->setOption('page-width', 100) | |||
| ->setOption('encoding', 'utf-8') | |||
| ->inline(); | |||
| return $ret; | |||
| } | |||
| protected function getPDFData(?ReceiptIssuingOrder $order = null) | |||
| { | |||
| $p = parent::getPDFData($order); | |||
| if ($order !== null) { | |||
| $c = ReceiptIssuingHTParkingCustomOrder::whereReceiptIssuingOrderId($order->id)->firstOrFail()->toArray(); | |||
| } else { | |||
| $c = $this->customOrder->toArray(); | |||
| } | |||
| return [ | |||
| ...parent::getPDFData(), | |||
| ...$this->customOrder->toArray(), | |||
| ...$p, | |||
| ...$c, | |||
| ]; | |||
| } | |||
| } | |||
| @@ -11,6 +11,7 @@ use App\Models\ReceiptIssuingOrder; | |||
| use App\Models\ReceiptIssuingOrderTax; | |||
| use App\Util\DateUtil; | |||
| use Barryvdh\Snappy\PdfWrapper; | |||
| use Illuminate\Database\Eloquent\Collection; | |||
| use PDF; | |||
| class PDFDownLoadManager extends ReceiptIssuingOrderManager | |||
| @@ -22,7 +23,10 @@ class PDFDownLoadManager extends ReceiptIssuingOrderManager | |||
| parent::__construct($order); | |||
| } | |||
| public function initForDownloadLetters() | |||
| { | |||
| $this->initialized = true; | |||
| } | |||
| public function downlaodA4() | |||
| { | |||
| @@ -78,18 +82,20 @@ class PDFDownLoadManager extends ReceiptIssuingOrderManager | |||
| return $ret; | |||
| } | |||
| protected function getPDFData() | |||
| protected function getPDFData(?ReceiptIssuingOrder $order = null) | |||
| { | |||
| $o = $this->order; | |||
| $tax = $o->receiptIssuingOrderTaxes->firstOrFail(); | |||
| if ($order === null) { | |||
| $order = $this->order; | |||
| } | |||
| $tax = $order->receiptIssuingOrderTaxes->first() ?? new ReceiptIssuingOrderTax(); | |||
| 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)), | |||
| ...$order->toArray(), | |||
| ReceiptIssuingOrder::COL_NAME_STATUS_RECEIPT_CONFIRM_DATETIME => $order->status_receipt_confirm_datetime->format('Y/m/d'), | |||
| ReceiptIssuingOrder::COL_NAME_RECEIPT_USE_DATE => $order->receipt_use_date->format('Y/m/d'), | |||
| ReceiptIssuingOrder::COL_NAME_RECEIPT_AMOUNT => number_format($order->receipt_amount), | |||
| 'pref_name' => PrefCode::getName($order->mail_pref_code), | |||
| ReceiptIssuingOrderTax::COL_NAME_TAX_RATE => data_get($tax, ReceiptIssuingOrderTax::COL_NAME_TAX_RATE, 0) ?? 0, | |||
| ReceiptIssuingOrderTax::COL_NAME_TAX_AMOUNT => number_format(data_get($tax, ReceiptIssuingOrderTax::COL_NAME_TAX_AMOUNT, 0)) ?? 0, | |||
| ]; | |||
| } | |||
| } | |||
| @@ -9,6 +9,7 @@ use App\Events\ReceiptIssuingOrder\EmailOrderEvent; | |||
| use App\Events\ReceiptIssuingOrder\MailOrderEvent; | |||
| use App\Events\ReceiptIssuingOrder\MailPostedEvent; | |||
| use App\Exceptions\AppCommonException; | |||
| use App\Features\InstanceAble; | |||
| use App\Files\PDF\Receipt\A4Receipt; | |||
| use App\Jobs\ReceiptIssuingOrder\PollEmailSendStatus; | |||
| use App\Logic\EmailManager; | |||
| @@ -21,6 +22,7 @@ use LogicException; | |||
| class UpdateManager extends ReceiptIssuingOrderManager | |||
| { | |||
| use InstanceAble; | |||
| public function __construct( | |||
| protected ReceiptIssuingOrder $order, | |||
| @@ -68,10 +70,14 @@ class UpdateManager extends ReceiptIssuingOrderManager | |||
| */ | |||
| public function mailPosted(Carbon $postDate): static | |||
| { | |||
| $this->order->status_mail_post_date = $postDate; | |||
| // イベント登録 | |||
| MailPostedEvent::dispatch($this->order); | |||
| if ($this->order->status_mail_post_date === null) { | |||
| // ステータス更新 | |||
| $this->order->status_mail_post_date = $postDate; | |||
| // イベント登録 | |||
| MailPostedEvent::dispatch($this->order); | |||
| } | |||
| return $this; | |||
| } | |||
| @@ -39,6 +39,9 @@ class ReceiptIssuingOrderRepository extends BaseRepository | |||
| const CONDITION_RECEIPT_NO = 'receipt_no'; | |||
| const CONDITION_IS_CONFIRMED = 'is_confirmed'; | |||
| const CONDITION_HAS_MAILORDER = 'has_mailorder'; | |||
| const TABLE_ORDER = "order"; | |||
| const TABLE_CUSTOM_ORDER = "custom_order"; | |||
| const TABLE_HANDLER = "handler"; | |||
| @@ -138,6 +141,26 @@ class ReceiptIssuingOrderRepository extends BaseRepository | |||
| // 領収証番号 | |||
| $this->where($table, $condition, static::CONDITION_RECEIPT_NO, $this->makeColumnName([static::TABLE_ORDER, ReceiptIssuingOrder::COL_NAME_RECEIPT_NO])); | |||
| // 確定済み | |||
| $isConfirmed = data_get($condition, static::CONDITION_IS_CONFIRMED); | |||
| if ($isConfirmed !== null) { | |||
| if ($isConfirmed === true) { | |||
| $table->whereNotNull($this->makeColumnName([static::TABLE_ORDER, ReceiptIssuingOrder::COL_NAME_STATUS_RECEIPT_CONFIRM_DATETIME])); | |||
| } else if ($isConfirmed === false) { | |||
| $table->whereNull($this->makeColumnName([static::TABLE_ORDER, ReceiptIssuingOrder::COL_NAME_STATUS_RECEIPT_CONFIRM_DATETIME])); | |||
| } | |||
| } | |||
| // 郵送依頼あり | |||
| $hasMailOrder = data_get($condition, static::CONDITION_HAS_MAILORDER); | |||
| if ($hasMailOrder !== null) { | |||
| if ($hasMailOrder === true) { | |||
| $table->whereNotNull($this->makeColumnName([static::TABLE_ORDER, ReceiptIssuingOrder::COL_NAME_STATUS_ORDER_MAIL_DATETIME])); | |||
| } else if ($hasMailOrder === false) { | |||
| $table->whereNull($this->makeColumnName([static::TABLE_ORDER, ReceiptIssuingOrder::COL_NAME_STATUS_ORDER_MAIL_DATETIME])); | |||
| } | |||
| } | |||
| $table->select($this->columns()); | |||
| @@ -0,0 +1,103 @@ | |||
| <!DOCTYPE html> | |||
| <html lang="ja"> | |||
| <head> | |||
| <meta charset="utf-8"> | |||
| <title>領収証</title> | |||
| <style> | |||
| </style> | |||
| <link rel="stylesheet" href="{{ resource_path('css/receipt_common.css') }}"> | |||
| <link rel="stylesheet" href="{{ resource_path('css/receipt_letter.css') }}"> | |||
| </head> | |||
| <body> | |||
| @foreach($orders as $order) | |||
| <section class="page"> | |||
| <div class="section-address"> | |||
| <div class="address-field"> | |||
| <div class="zipcode">〒{{ sprintf("%s-%s", substr($order['mail_zip_code'], 0, 3), substr($order['mail_zip_code'], 3) ) }}</div> | |||
| <div class="address"> | |||
| {{ $order['pref_name'] }} | |||
| </div> | |||
| @if($order['mail_address1']) | |||
| <div class="address"> | |||
| {{ $order['mail_address1'] }} | |||
| </div> | |||
| @endif | |||
| @if($order['mail_address2']) | |||
| <div class="address"> | |||
| {{ $order['mail_address2'] }} | |||
| </div> | |||
| @endif | |||
| @if($order['mail_address3']) | |||
| <div class="address"> | |||
| {{ $order['mail_address3'] }} | |||
| </div> | |||
| @endif | |||
| <div class="name"> | |||
| {{ $order['mail_name'] }} 様 | |||
| </div> | |||
| </div> | |||
| </div> | |||
| <hr /> | |||
| <div class="section-receipt"> | |||
| <div class="container header"> | |||
| <div class="item " style="width:13mm"> | |||
| <h2></h2> | |||
| </div> | |||
| <div class="item tc" style="width:40mm"> | |||
| <h2>領収証</h2> | |||
| </div> | |||
| <div class="item" style="width:40mm"> | |||
| <div style="font-size: 3.5mm;"> | |||
| <div>発行日 {{ $order['status_receipt_confirm_datetime'] }}</div> | |||
| <div>No {{ $order['receipt_no'] }}</div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| <div class="name tc pt10 underline">{{ $order['receipt_name'] }} 様</div> | |||
| <div class="pt5 f35">利用日 {{ $order['receipt_use_date'] }}</div> | |||
| <div class="container mt5"> | |||
| <div class="pt1 tc f5 b underline item ml10"> | |||
| ¥{{ $order['receipt_amount'] }} - | |||
| </div> | |||
| <div class="item ml3 f3"> 内消費税 ¥{{ $order['tax_amount'] }}- (10%対象)</div> | |||
| </div> | |||
| </div> | |||
| <div class="pt3 f35 "> | |||
| 但し、{{ $order['parking_name'] }} | |||
| </div> | |||
| <div class="f35 "> | |||
| {{ $order['receipt_purpose'] }}として | |||
| </div> | |||
| <div class="pt1 f35 ">上記正に領収いたしました。</div> | |||
| <div class="pt2 f35 ">運営会社 {{ $order['customer_name'] }}</div> | |||
| <div class="pt1 f35 ">インボイス登録番号 {{ $order['receipt_invoice_no'] }}</div> | |||
| <div class="pt3 f35 ">発行元及び返送先</div> | |||
| <div class="pt1 container f35"> | |||
| <div class="item vt">〒550-0014</div> | |||
| <div class="item"> | |||
| <div> | |||
| 大阪府大阪市西区北堀江2-2-25 | |||
| </div> | |||
| <div> | |||
| 久慈ビル南館5階 | |||
| </div> | |||
| <div class="pt3 f5 b">ハローテクノ株式会社</div> | |||
| <div class="container"> | |||
| <div class="item f3" style="padding-right: 10mm;">TEL:06-7638-6575</div> | |||
| <div class="item f3">FAX:06-6536-5600</div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </section> | |||
| @endforeach | |||
| </body> | |||
| </html> | |||
| @@ -21,7 +21,8 @@ RouteHelper::post('/receiptIssuingOrder/create', App\Http\Controllers\Web\Receip | |||
| // 領収証ダウンロード | |||
| RouteHelper::get('/receipt/download', App\Http\Controllers\Web\ReceiptIssuingOrder\DownloadController::class); | |||
| RouteHelper::get('/receipt-letter/download', App\Http\Controllers\Web\ReceiptIssuingOrder\DownloadLetterController::class); | |||
| RouteHelper::get('/custom/hello-techno/receipt-letter/download', App\Http\Controllers\Web\Custom\HelloTechno\DownloadLetterController::class); | |||
| RouteHelper::get('/custom/hello-techno/receipt-letters/download', App\Http\Controllers\Web\Custom\HelloTechno\DownloadLettersController::class); | |||
| // CSVダウンロード | |||
| RouteHelper::get('/custom/hello-techno/use-summary/csv', App\Http\Controllers\Web\Custom\HelloTechno\UseSummaryCSVController::class); | |||