2020-12-25 13:30:12 +03:00

325 lines
8.4 KiB
PHP

<?php
namespace App\View\Components\Documents\Form;
use App\Models\Common\Contact;
use App\Models\Document\Document;
use App\Traits\Documents;
use Date;
use Illuminate\View\Component;
use Illuminate\Support\Str;
class Metadata extends Component
{
use Documents;
/** @var string */
public $type;
public $document;
public $contacts;
/** @var string */
public $contactType;
/** @var bool */
public $hideContact;
/** @var bool */
public $hideIssuedAt;
/** @var bool */
public $hideDocumentNumber;
/** @var bool */
public $hideDueAt;
/** @var bool */
public $hideOrderNumber;
/** @var string */
public $issuedAt;
/** @var string */
public $documentNumber;
/** @var string */
public $dueAt;
/** @var string */
public $orderNumber;
/** @var string */
public $textIssuedAt;
/** @var string */
public $textDueAt;
/** @var string */
public $textDocumentNumber;
/** @var string */
public $textOrderNumber;
/**
* Create a new component instance.
*
* @return void
*/
public function __construct(
string $type, $document = false, $contacts = [], string $contactType = '',
bool $hideContact = false, bool $hideIssuedAt = false, bool $hideDocumentNumber = false, bool $hideDueAt = false, bool $hideOrderNumber = false,
string $textDocumentNumber = '', string $textOrderNumber = '', string $textIssuedAt = '', string $textDueAt = '',
string $issuedAt = '', string $documentNumber = '', string $dueAt = '', string $orderNumber = ''
) {
$this->type = $type;
$this->document = $document;
$this->contacts = $this->getContacts($type, $contacts);
$this->contactType = $this->getContactType($type, $contactType);
$this->hideContact = $hideContact;
$this->hideIssuedAt = $hideIssuedAt;
$this->hideDocumentNumber = $hideDocumentNumber;
$this->hideDueAt = $hideDueAt;
$this->hideOrderNumber = $hideOrderNumber;
$this->issuedAt = $this->getissuedAt($type, $document, $issuedAt);
$this->documentNumber = $this->getDocumentNumber($type, $document, $documentNumber);
$this->dueAt = $this->getDueAt($type, $document, $dueAt);
$this->orderNumber = $this->getOrderNumber($type, $document, $orderNumber);
$this->textIssuedAt = $this->gettextIssuedAt($type, $textIssuedAt);
$this->textDocumentNumber = $this->getTextDocumentNumber($type, $textDocumentNumber);
$this->textDueAt = $this->getTextDueAt($type, $textDueAt);
$this->textOrderNumber = $this->getTextOrderNumber($type, $textOrderNumber);
}
/**
* Get the view / contents that represent the component.
*
* @return \Illuminate\Contracts\View\View|string
*/
public function render()
{
return view('components.documents.form.metadata');
}
protected function getContacts($type, $contacts)
{
if (!empty($contacts)) {
return $contacts;
}
$contact_type = $this->getContactType($type, null);
if ($contact_type) {
$contacts = Contact::$contact_type()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
} else {
$contacts = Contact::enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
}
return $contacts;
}
protected function getContactType($type, $contact_type)
{
if (!empty($contact_type)) {
return $contact_type;
}
switch ($type) {
case 'sale':
case 'income':
case 'invoice':
$contact_type = 'customer';
break;
case 'bill':
case 'expense':
case 'purchase':
$contact_type = 'vendor';
break;
}
return $contact_type;
}
protected function getissuedAt($type, $document, $issued_at)
{
if (!empty($issued_at)) {
return $issued_at;
}
if ($document) {
return $document->issued_at;
}
switch ($type) {
case 'sale':
case 'income':
case 'invoice':
$issued_at = request()->get('invoiced_at', Date::now()->toDateString());
break;
case 'bill':
case 'expense':
case 'purchase':
$issued_at = request()->get('billed_at', Date::now()->toDateString());
break;
}
return $issued_at;
}
protected function getDocumentNumber($type, $document, $document_number)
{
if (!empty($document_number)) {
return $document_number;
}
if ($document) {
return $document->document_number;
}
switch ($type) {
case 'sale':
case 'income':
case 'invoice':
$document_number = $this->getNextDocumentNumber(Document::INVOICE_TYPE);
break;
case 'bill':
case 'expense':
case 'purchase':
$document_number = $this->getNextDocumentNumber(Document::BILL_TYPE);
break;
}
return $document_number;
}
protected function getDueAt($type, $document, $due_at)
{
if (!empty($due_at)) {
return $due_at;
}
if ($document) {
return $document->due_at;
}
switch ($type) {
case 'sale':
case 'income':
case 'invoice':
$due_at = Date::parse(request()->get('invoiced_at', Date::now()->toDateString()))->addDays(setting('invoice.payment_terms', 0))->toDateString();
break;
case 'bill':
case 'expense':
case 'purchase':
$due_at = request()->get('billed_at', Date::now()->toDateString());
break;
}
return $due_at;
}
protected function getOrderNumber($type, $document, $order_number)
{
if (!empty($order_number)) {
return $order_number;
}
if ($document) {
return $document->order_number;
}
$order_number = null;
}
protected function getTextDocumentNumber($type, $textDocumentNumber)
{
if (!empty($textDocumentNumber)) {
return $textDocumentNumber;
}
switch ($type) {
case 'sale':
case 'income':
case 'invoice':
$textDocumentNumber = 'invoices.invoice_number';
break;
case 'bill':
case 'expense':
case 'purchase':
$textDocumentNumber = 'bills.bill_number';
break;
}
return $textDocumentNumber;
}
protected function getTextOrderNumber($type, $textOrderNumber)
{
if (!empty($textOrderNumber)) {
return $textOrderNumber;
}
switch ($type) {
case 'sale':
case 'income':
case 'invoice':
$textOrderNumber = 'invoices.order_number';
break;
case 'bill':
case 'expense':
case 'purchase':
$textOrderNumber = 'bills.order_number';
break;
}
return $textOrderNumber;
}
protected function gettextIssuedAt($type, $textIssuedAt)
{
if (!empty($textIssuedAt)) {
return $textIssuedAt;
}
switch ($type) {
case 'sale':
case 'income':
case 'invoice':
$textIssuedAt = 'invoices.invoice_date';
break;
case 'bill':
case 'expense':
case 'purchase':
$textIssuedAt = 'bills.bill_date';
break;
}
return $textIssuedAt;
}
protected function getTextDueAt($type, $textDueAt)
{
if (!empty($textDueAt)) {
return $textDueAt;
}
switch ($type) {
case 'sale':
case 'income':
case 'invoice':
$textDueAt = 'invoices.due_date';
break;
case 'bill':
case 'expense':
case 'purchase':
$textDueAt = 'bills.due_date';
break;
}
return $textDueAt;
}
}