2022-06-01 10:15:55 +03:00

643 lines
18 KiB
PHP

<?php
namespace App\Abstracts\View\Components\Documents;
use Akaunting\Module\Module;
use App\Abstracts\View\Component;
use App\Events\Common\BulkActionsAdding;
use App\Traits\Documents;
use App\Traits\Modules;
use App\Traits\ViewComponents;
use Illuminate\Support\Str;
use Illuminate\View\View;
abstract class Index extends Component
{
use Documents, Modules, ViewComponents;
public const OBJECT_TYPE = 'document';
public const DEFAULT_TYPE = 'invoice';
public const DEFAULT_PLURAL_TYPE = 'invoices';
/* -- Main Start -- */
/** @var string */
public $type;
/** @var string */
public $alias;
public $documents;
/** @var string */
public $group;
/** @var string */
public $page;
/** @var string */
public $textTabDocument;
/** @var string */
public $routeTabDocument;
/** @var string */
public $routeTabRecurring;
/** @var string */
public $textPage;
/** @var string */
public $permissionCreate;
/** @var string */
public $permissionUpdate;
/** @var string */
public $permissionDelete;
/* -- Main End -- */
/* -- Buttons Start -- */
/** @var bool */
public $hideAcceptPayment;
/** @var bool */
public $checkPermissionCreate;
/** @var bool */
public $hideCreate;
/** @var bool */
public $hideImport;
/** @var bool */
public $hideExport;
/** @var string */
public $createRoute;
/** @var string */
public $importRoute;
/** @var array */
public $importRouteParameters;
/** @var string */
public $exportRoute;
/* -- Buttons End -- */
/* -- Content Start -- */
/** @var bool */
public $hideEmptyPage;
/** @var array */
public $emptyPageButtons;
/** @var string */
public $imageEmptyPage;
/** @var string */
public $textEmptyPage;
/** @var string */
public $urlDocsPath;
/** @var bool */
public $hideSummary;
/** @var array */
public $summaryItems;
/** @var bool */
public $withoutTabs;
/** @var string */
public $tabActive;
/** @var bool */
public $hideRecurringTemplates;
/** @var bool */
public $hideSearchString;
/** @var bool */
public $hideBulkAction;
/** @var string */
public $searchStringModel;
/** @var string */
public $bulkActionClass;
/** @var array */
public $bulkActionRouteParameters;
/** @var string */
public $searchRoute;
/** @var string */
public $classBulkAction;
/** @var bool */
public $hideDueAt;
/** @var bool */
public $hideIssuedAt;
/** @var string */
public $classDueAtAndIssueAt;
/** @var string */
public $textDueAt;
/** @var string */
public $textIssuedAt;
/** @var bool */
public $hideStatus;
/** @var string */
public $classStatus;
/** @var bool */
public $hideContactName;
/** @var bool */
public $hideDocumentNumber;
/** @var string */
public $classContactNameAndDocumentNumber;
/** @var string */
public $textContactName;
/** @var string */
public $showContactRoute;
/** @var string */
public $textDocumentNumber;
/** @var bool */
public $hideAmount;
/** @var string */
public $classAmount;
/** @var bool */
public $hideShow;
/** @var string */
public $showRoute;
/** @var bool */
public $hideEdit;
/** @var string */
public $editRoute;
/** @var bool */
public $hideDuplicate;
/** @var string */
public $duplicateRoute;
/** @var string */
public $textDocumentStatus;
/** @var bool */
public $checkButtonReconciled;
/** @var bool */
public $checkButtonCancelled;
/* -- Content End -- */
/**
* Create a new component instance.
*
* @return void
*/
public function __construct(
string $type, string $alias = '', $documents = [], string $group = '', string $page = '', string $textTabDocument = '', string $textPage = '',
string $routeTabDocument = '', string $routeTabRecurring = '',
string $permissionCreate = '', string $permissionUpdate = '', string $permissionDelete = '',
bool $hideAcceptPayment = false, bool $checkPermissionCreate = true,
bool $hideCreate = false, bool $hideImport = false, bool $hideExport = false,
string $createRoute = '', string $importRoute = '', array $importRouteParameters = [], string $exportRoute = '',
bool $hideEmptyPage = false, array $emptyPageButtons = [], string $imageEmptyPage = '', string $textEmptyPage = '', string $urlDocsPath = '',
bool $hideSummary = false, array $summaryItems = [],
bool $withoutTabs = false, string $tabActive = '', bool $hideRecurringTemplates = false,
bool $hideSearchString = false, bool $hideBulkAction = false,
string $searchStringModel = '', string $bulkActionClass = '', array $bulkActions = [], array $bulkActionRouteParameters = [], string $searchRoute = '', string $classBulkAction = '',
bool $hideDueAt = false, bool $hideIssuedAt = false, string $classDueAtAndIssueAt = '', string $textDueAt = '', string $textIssuedAt = '',
bool $hideStatus = false, string $classStatus = '',
bool $hideContactName = false, bool $hideDocumentNumber = false, string $classContactNameAndDocumentNumber = '', string $textContactName = '', string $showContactRoute = '', string $textDocumentNumber = '',
bool $hideAmount = false, string $classAmount = '',
bool $hideShow = false, string $showRoute = '', bool $hideEdit = false, string $editRoute = '', bool $hideDuplicate = false, string $duplicateRoute = '',
string $textDocumentStatus = '',
bool $checkButtonReconciled = true, bool $checkButtonCancelled = true
) {
/* -- Main Start -- */
$this->type = $type;
$this->alias = $this->getAlias($type, $alias);
$this->documents = ($documents) ? $documents : collect();
$this->group = $this->getGroup($type, $group);
$this->page = $this->getPage($type, $page);
$this->textTabDocument = $this->getTextTabDocument($type, $textTabDocument);
$this->textPage = $this->getTextPage($type, $textPage);
$this->permissionCreate = $this->getPermissionCreate($type, $permissionCreate);
$this->permissionUpdate = $this->getPermissionUpdate($type, $permissionUpdate);
$this->permissionDelete = $this->getPermissionDelete($type, $permissionDelete);
$this->routeTabDocument = $this->getRouteTabDocument($type, $routeTabDocument);
$this->routeTabRecurring = $this->getRouteTabRecurring($type, $routeTabRecurring);
/* -- Main End -- */
/* -- Buttons Start -- */
$this->hideAcceptPayment = $hideAcceptPayment;
$this->checkPermissionCreate = $checkPermissionCreate;
$this->hideCreate = $hideCreate;
$this->hideImport = $hideImport;
$this->hideExport = $hideExport;
$this->createRoute = $this->getCreateRoute($type, $createRoute);
$this->importRoute = $this->getImportRoute($importRoute);
$this->importRouteParameters = $this->getImportRouteParameters($type, $importRouteParameters);
$this->exportRoute = $this->getExportRoute($type, $exportRoute);
/* -- Buttons End -- */
/* -- Content Start -- */
/* -- Empty Page Start -- */
$this->hideEmptyPage = $hideEmptyPage;
$this->emptyPageButtons = $this->getEmptyPageButtons($type, $emptyPageButtons);
$this->imageEmptyPage = $this->getImageEmptyPage($type, $imageEmptyPage);
$this->textEmptyPage = $this->getTextEmptyPage($type, $textEmptyPage);
$this->urlDocsPath = $this->getUrlDocsPath($type, $urlDocsPath);
/* -- Empty Page End -- */
/* -- Summary Start -- */
$this->hideSummary = $hideSummary;
$this->summaryItems = $this->getSummaryItems($type, $summaryItems);
/* -- Sumamry End -- */
/* Container Start */
$this->withoutTabs = $withoutTabs;
$this->tabActive = $this->getTabActive($type, $tabActive);
$this->hideRecurringTemplates = $hideRecurringTemplates;
$this->hideSearchString = $hideSearchString;
$this->hideBulkAction = $hideBulkAction;
$this->searchStringModel = $this->getSearchStringModel($type, $searchStringModel);
$this->bulkActionClass = $this->getBulkActionClass($type, $bulkActionClass);
$this->bulkActionRouteParameters = $this->getBulkActionRouteParameters($type, $bulkActionRouteParameters);
$this->searchRoute = $this->getIndexRoute($type, $searchRoute);
$this->classBulkAction = $this->getClassBulkAction($type, $classBulkAction);
/* Document Start */
$this->hideDueAt = $hideDueAt;
$this->hideIssuedAt = $hideIssuedAt;
$this->classDueAtAndIssueAt = $this->getClassDueAtAndIssueAt($type, $classDueAtAndIssueAt);
$this->textDueAt = $this->getTextDueAt($type, $textDueAt);
$this->textIssuedAt = $this->getTextIssuedAt($type, $textIssuedAt);
$this->hideStatus = $hideStatus;
$this->classStatus = $this->getClassStatus($type, $classStatus);
$this->hideContactName = $hideContactName;
$this->hideDocumentNumber = $hideDocumentNumber;
$this->classContactNameAndDocumentNumber = $this->getClassContactNameAndDocumentNumber($type, $classContactNameAndDocumentNumber);
$this->textContactName = $this->getTextContactName($type, $textContactName);
$this->showContactRoute = $this->getShowContactRoute($type, $showContactRoute);
$this->textDocumentNumber = $this->getTextDocumentNumber($type, $textDocumentNumber);
$this->hideAmount = $hideAmount;
$this->classAmount = $this->getClassAmount($type, $classAmount);
$this->hideShow = $hideShow;
$this->showRoute = $this->getShowRoute($type, $showRoute);
$this->hideEdit = $hideEdit;
$this->editRoute = $this->getEditRoute($type, $editRoute);
$this->hideDuplicate = $hideDuplicate;
$this->duplicateRoute = $this->getDuplicateRoute($type, $duplicateRoute);
$this->textDocumentStatus = $this->getTextDocumentStatus($type, $textDocumentStatus);
$this->checkButtonReconciled = $checkButtonReconciled;
$this->checkButtonCancelled = $checkButtonCancelled;
/* Document End */
/* Container End */
/* -- Content End -- */
// Set Parent data
$this->setParentData();
}
protected function getEmptyPageButtons($type, $emptyPageButtons)
{
if (! empty($emptyPageButtons)) {
return $emptyPageButtons;
}
$prefix = config('type.' . static::OBJECT_TYPE . '.' . $type . '.route.prefix', 'invoices');
$buttons = [];
if (! $this->hideCreate) {
$route = $this->getRouteFromConfig($type, 'create');
$buttons[] = [
'permission' => $this->permissionCreate,
'url' => route($this->createRoute),
'text' => trans('general.title.new', ['type' => trans_choice($this->textPage ?? 'general.' . $prefix, 1)]),
'description' => trans('general.empty.actions.new', ['type' => strtolower(trans_choice($this->textPage ?? 'general.' . $prefix, 1))]),
'active_badge' => true,
];
}
if (! $this->hideImport) {
$route = $this->getRouteFromConfig($type, 'import');
$buttons[] = [
'permission' => $this->permissionCreate,
'url' => route($this->importRoute, $this->importRouteParameters),
'text' => trans('import.title', ['type' => trans_choice($this->textPage ?? 'general.' . $prefix, 1)]),
'description' => trans('general.empty.actions.import', ['type' => strtolower(trans_choice($this->textPage ?? 'general.' . $prefix, 1))]),
];
}
return $buttons;
}
public function getSummaryItems($type, $summaryItems)
{
if (! empty($summaryItems)) {
return $summaryItems;
}
$route = $this->getIndexRoute($type, null);
$totals = $this->getTotalsForFutureDocuments($type);
$items = [];
foreach ($totals as $key => $total) {
$title = ($key == 'overdue') ? trans('general.overdue') : trans('documents.statuses.' . $key);
$href = route($route, ['search' => 'status:' . $key]);
$amount = money($total, setting('default.currency'), true);
$items[] = [
'title' => $title,
'href' => $href,
'amount' => $amount,
];
}
return $items;
}
protected function getTextTabDocument($type, $textTabDocument)
{
if (! empty($textTabDocument)) {
return $textTabDocument;
}
$default_key = config('type.' . static::OBJECT_TYPE . '.' . $type . '.translation.prefix');
$translation = $this->getTextFromConfig($type, 'tab_document', $default_key);
if (! empty($translation)) {
return $translation;
}
return 'general.invoices';
}
public function getTabActive($type, $tabActive)
{
if (! empty($tabActive)) {
return $tabActive;
}
return $type;
}
protected function getRouteTabDocument($type, $routeTabDocument)
{
if (! empty($routeTabDocument)) {
return $routeTabDocument;
}
$route = $this->getRouteFromConfig($type, 'document', 'invoices');
if (! empty($route)) {
return $route;
}
return 'invoices.index';
}
protected function getRouteTabRecurring($type, $routeTabDocument)
{
if (! empty($routeTabDocument)) {
return $routeTabDocument;
}
$route = $this->getRouteFromConfig($type, 'recurring', 'recurring-invoices');
if (! empty($route)) {
return $route;
}
return 'recurring-invoices.index';
}
protected function getClassDueAtAndIssueAt($type, $classDueAtAndIssueAt)
{
if (! empty($classDueAtAndIssueAt)) {
return $classDueAtAndIssueAt;
}
$class = $this->getClassFromConfig($type, 'due_at_and_issue_at');
if (! empty($class)) {
return $class;
}
return 'w-4/12 table-title hidden sm:table-cell';
}
protected function getTextDueAt($type, $textDueAt)
{
if (! empty($textDueAt)) {
return $textDueAt;
}
$translation = $this->getTextFromConfig($type, 'due_at', 'due_date');
if (! empty($translation)) {
return $translation;
}
return 'invoices.due_date';
}
protected function getTextIssuedAt($type, $textIssuedAt)
{
if (! empty($textIssuedAt)) {
return $textIssuedAt;
}
switch ($type) {
case 'bill':
case 'expense':
case 'purchase':
$default_key = 'bill_date';
break;
default:
$default_key = 'invoice_date';
break;
}
$translation = $this->getTextFromConfig($type, 'issued_at', $default_key);
if (! empty($translation)) {
return $translation;
}
return 'invoices.invoice_date';
}
protected function getClassStatus($type, $classStatus)
{
if (! empty($classStatus)) {
return $classStatus;
}
$class = $this->getClassFromConfig($type, 'status');
if (! empty($class)) {
return $class;
}
return 'w-3/12 table-title hidden sm:table-cell';
}
protected function getClassContactNameAndDocumentNumber($type, $classContactNameAndDocumentNumber)
{
if (! empty($classContactNameAndDocumentNumber)) {
return $classContactNameAndDocumentNumber;
}
$class = $this->getClassFromConfig($type, 'contact_name');
if (! empty($class)) {
return $class;
}
return 'w-6/12 sm:w-3/12 table-title';
}
protected function getTextContactName($type, $textContactName)
{
if (! empty($textContactName)) {
return $textContactName;
}
$default_key = Str::plural(config('type.' . static::OBJECT_TYPE . '.' . $type . '.contact_type'), 2);
$translation = $this->getTextFromConfig($type, 'contact_name', $default_key, 'trans_choice');
if (! empty($translation)) {
return $translation;
}
return 'general.customers';
}
protected function getShowContactRoute($type, $showContactRoute)
{
if (! empty($showContactRoute)) {
return $showContactRoute;
}
if (! empty($showRoute)) {
return $showRoute;
}
$route = $this->getRouteFromConfig($type, 'contact.show', 1);
if (!empty($route)) {
return $route;
}
$default_key = Str::plural(config('type.' . static::OBJECT_TYPE . '.' . $type . '.contact_type'), 2);
return $default_key . '.show';
}
protected function getTextDocumentNumber($type, $textDocumentNumber)
{
if (! empty($textDocumentNumber)) {
return $textDocumentNumber;
}
$translation = $this->getTextFromConfig($type, 'document_number', 'numbers');
if (! empty($translation)) {
return $translation;
}
return 'general.numbers';
}
protected function getClassAmount($type, $classAmount)
{
if (! empty($classAmount)) {
return $classAmount;
}
$class = $this->getClassFromConfig($type, 'amount');
if (! empty($class)) {
return $class;
}
return 'w-6/12 sm:w-2/12';
}
protected function getTextDocumentStatus($type, $textDocumentStatus)
{
if (! empty($textDocumentStatus)) {
return $textDocumentStatus;
}
$translation = $this->getTextFromConfig($type, 'document_status', 'statuses.');
if (! empty($translation)) {
return $translation;
}
$alias = config('type.' . static::OBJECT_TYPE . '.' . $type . '.alias');
if (! empty($alias)) {
$translation = $alias . '::' . config('type.' . static::OBJECT_TYPE . '.' . $type . '.translation.prefix') . '.statuses';
if (is_array(trans($translation))) {
return $translation . '.';
}
}
return 'documents.statuses.';
}
}