Aplikasi Keuangan yang mengatur lalu lintas transaksi antara bank dan aplikasi internal Kampus
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

<?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());
}
}
};