You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.4 KiB
100 lines
3.4 KiB
<?php
|
|
|
|
use App\Attributes\LayoutData;
|
|
use App\Attributes\Seo;
|
|
use App\Domains\Admission\Queries\SearchAdmissionSchedulePricing;
|
|
use App\Domains\Billing\Actions\Invoicing\IssueInvoice;
|
|
use App\Domains\Billing\Actions\Invoicing\DraftInvoice;
|
|
use App\Domains\Billing\DTOs\Invoicing\InvoiceItemDTO;
|
|
use App\Domains\Billing\DTOs\Invoicing\PricingDTO;
|
|
use App\Domains\Billing\Models\Invoice;
|
|
use App\Domains\Billing\Queries\Catalog\SearchProductInfo;
|
|
use App\Domains\Channel\Models\Client;
|
|
use App\Domains\System\Support\ValueObjects\Money;
|
|
use App\Livewire\Concerns\HasLayoutDataAttributes;
|
|
use App\Livewire\Concerns\HasSeoAttributes;
|
|
use App\Livewire\Concerns\WithToast;
|
|
use App\Livewire\Forms\Billing\InvoiceForm;
|
|
use Illuminate\Support\Collection;
|
|
use Livewire\Attributes\Computed;
|
|
use Livewire\Attributes\Layout;
|
|
use Livewire\Component;
|
|
|
|
new #[Layout('components.layouts.app')]
|
|
#[LayoutData(header: 'domains/billing/seo.create_invoice.title', breadcrumbs: ['ui/menu.dashboard' => 'dashboard', 'resources.invoice' => 'invoices.index', 'domains/billing/seo.create_invoice.title' => ''])]
|
|
#[Seo(title: 'domains/billing/seo.create_invoice.title')]
|
|
class extends Component
|
|
{
|
|
use HasSeoAttributes;
|
|
use HasLayoutDataAttributes;
|
|
use WithToast;
|
|
|
|
public InvoiceForm $form;
|
|
|
|
#[Computed]
|
|
public function clients(): Collection {
|
|
return Client::all(['id', 'name'])->pluck('name', 'id');
|
|
}
|
|
|
|
#[Computed]
|
|
public function schema(): array
|
|
{
|
|
return $this->form->type
|
|
?->schema()
|
|
->withContext($this->form->client_detail)
|
|
->getSchema() ?? [];
|
|
}
|
|
|
|
public function saveDraft(DraftInvoice $createInvoice): void
|
|
{
|
|
$this->form->validate();
|
|
try {
|
|
$createInvoice->execute($this->form->toDTO());
|
|
$this->success(__('domains/billing.messages.invoice.draft_success'));
|
|
} catch (\Throwable $th) {
|
|
$this->error($th->getMessage());
|
|
}
|
|
}
|
|
|
|
public function searchStudentAdmission(): void
|
|
{
|
|
try {
|
|
$detail = $this->form->client_detail;
|
|
$feeRate = SearchAdmissionSchedulePricing::fetch(
|
|
admissionTrack: $detail['admission_track'],
|
|
academicProgram: $detail['academic_program'],
|
|
studyProgram: $detail['study_program'],
|
|
termEntry: $detail['term_entry'],
|
|
feeType: $detail['fee_type']
|
|
);
|
|
|
|
$product = SearchProductInfo::fetch(model: $feeRate->getMorphClass(), model_id: $feeRate->id);
|
|
$this->form->items = [];
|
|
$this->form->addItem(
|
|
code: $product->code,
|
|
name: $product->name,
|
|
quantity: 1,
|
|
price: $feeRate->amount,
|
|
discount: new Money(0),
|
|
product_id: $product->id,
|
|
coa_id: $product->chart_of_account_id
|
|
);
|
|
$this->form->populatePricing();
|
|
} catch (Exception $exception) {
|
|
$this->error($exception->getMessage());
|
|
}
|
|
}
|
|
|
|
public function createInvoice(IssueInvoice $issueInvoice): void
|
|
{
|
|
$this->form->validate();
|
|
try {
|
|
$issueInvoice->execute($this->form->toDTO());
|
|
$this->success(__('domains/billing.messages.invoice.issue_success'));
|
|
sleep(5);
|
|
$this->redirect(route('invoices.index'));
|
|
} catch (\Throwable $th) {
|
|
$this->error($th->getMessage());
|
|
}
|
|
}
|
|
};
|
|
|