Compare commits

..

1 Commits

Author SHA1 Message Date
509f59ea45 Ajustes varios de permisos y visuales 2025-01-27 08:34:28 -03:00
41 changed files with 1876 additions and 2380 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@
/** /**
* A helper file for Laravel, to provide autocomplete information to your IDE * A helper file for Laravel, to provide autocomplete information to your IDE
* Generated for Laravel 11.37.0. * Generated for Laravel 11.40.0.
* *
* This file should not be included in your code, only analyzed by your IDE! * This file should not be included in your code, only analyzed by your IDE!
* *
@@ -4765,9 +4765,9 @@ namespace Illuminate\Support\Facades {
* *
* @template TCacheValue * @template TCacheValue
* @param string $key * @param string $key
* @param \Illuminate\Cache\array{ 0: \DateTimeInterface|\DateInterval|int, 1: \DateTimeInterface|\DateInterval|int } $ttl * @param array{ 0: \DateTimeInterface|\DateInterval|int, 1: \DateTimeInterface|\DateInterval|int } $ttl
* @param (callable(): TCacheValue) $callback * @param (callable(): TCacheValue) $callback
* @param \Illuminate\Cache\array{ seconds?: int, owner?: string }|null $lock * @param array{ seconds?: int, owner?: string }|null $lock
* @return TCacheValue * @return TCacheValue
* @static * @static
*/ */
@@ -4850,6 +4850,18 @@ namespace Illuminate\Support\Facades {
return $instance->tags($names); return $instance->tags($names);
} }
/**
* Get the name of the cache store.
*
* @return string|null
* @static
*/
public static function getName()
{
/** @var \Illuminate\Cache\Repository $instance */
return $instance->getName();
}
/** /**
* Determine if the current store supports tags. * Determine if the current store supports tags.
* *
@@ -14322,7 +14334,7 @@ namespace Illuminate\Support\Facades {
* *
* *
* @internal * @internal
* @param \Symfony\Component\HttpFoundation\callable(): SessionInterface $factory * @param callable(): SessionInterface $factory
* @static * @static
*/ */
public static function setSessionFactory($factory) public static function setSessionFactory($factory)
@@ -15794,6 +15806,19 @@ namespace Illuminate\Support\Facades {
return $instance->enums($key, $enumClass); return $instance->enums($key, $enumClass);
} }
/**
* Retrieve data from the instance as an array.
*
* @param array|string|null $key
* @return array
* @static
*/
public static function array($key = null)
{
/** @var \Illuminate\Http\Request $instance */
return $instance->array($key);
}
/** /**
* Retrieve data from the instance as a collection. * Retrieve data from the instance as a collection.
* *
@@ -22161,7 +22186,7 @@ namespace Illuminate\Support\Facades {
/** /**
* Set the prefetching strategy. * Set the prefetching strategy.
* *
* @param \Illuminate\Foundation\'waterfall'|\Illuminate\Foundation\'aggressive'|null $strategy * @param 'waterfall'|'aggressive'|null $strategy
* @param array $config * @param array $config
* @return \Illuminate\Foundation\Vite * @return \Illuminate\Foundation\Vite
* @static * @static
@@ -22640,7 +22665,7 @@ namespace Barryvdh\Debugbar\Facades {
/** /**
* Returns an array of all data collectors * Returns an array of all data collectors
* *
* @return \DebugBar\array[DataCollectorInterface] * @return array[DataCollectorInterface]
* @static * @static
*/ */
public static function getCollectors() public static function getCollectors()
@@ -24231,6 +24256,23 @@ namespace {
return $instance->updateOrCreate($attributes, $values); return $instance->updateOrCreate($attributes, $values);
} }
/**
* Create a record matching the attributes, or increment the existing record.
*
* @param array $attributes
* @param string $column
* @param int|float $default
* @param int|float $step
* @param array $extra
* @return TModel
* @static
*/
public static function incrementOrCreate($attributes, $column = 'count', $default = 1, $step = 1, $extra = [])
{
/** @var \Illuminate\Database\Eloquent\Builder $instance */
return $instance->incrementOrCreate($attributes, $column, $default, $step, $extra);
}
/** /**
* Execute the query and get the first result or throw an exception. * Execute the query and get the first result or throw an exception.
* *
@@ -24602,6 +24644,22 @@ namespace {
return $instance->newModelInstance($attributes); return $instance->newModelInstance($attributes);
} }
/**
* Specify attributes that should be added to any new models created by this builder.
*
* The given key / value pairs will also be added as where conditions to the query.
*
* @param \Illuminate\Contracts\Database\Query\Expression|array|string $attributes
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder<static>
* @static
*/
public static function withAttributes($attributes, $value = null)
{
/** @var \Illuminate\Database\Eloquent\Builder $instance */
return $instance->withAttributes($attributes, $value);
}
/** /**
* Apply query-time casts to the model instance. * Apply query-time casts to the model instance.
* *
@@ -24808,7 +24866,7 @@ namespace {
* Chunk the results of the query. * Chunk the results of the query.
* *
* @param int $count * @param int $count
* @param \Illuminate\Database\Eloquent\callable(\Illuminate\Support\Collection<int, TValue>, int): mixed $callback * @param callable(\Illuminate\Support\Collection<int, TValue>, int): mixed $callback
* @return bool * @return bool
* @static * @static
*/ */
@@ -24822,7 +24880,7 @@ namespace {
* Run a map over each item while chunking. * Run a map over each item while chunking.
* *
* @template TReturn * @template TReturn
* @param \Illuminate\Database\Eloquent\callable(TValue): TReturn $callback * @param callable(TValue): TReturn $callback
* @param int $count * @param int $count
* @return \Illuminate\Support\Collection<int, TReturn> * @return \Illuminate\Support\Collection<int, TReturn>
* @static * @static
@@ -24836,7 +24894,7 @@ namespace {
/** /**
* Execute a callback over each item while chunking. * Execute a callback over each item while chunking.
* *
* @param \Illuminate\Database\Eloquent\callable(TValue, int): mixed $callback * @param callable(TValue, int): mixed $callback
* @param int $count * @param int $count
* @return bool * @return bool
* @throws \RuntimeException * @throws \RuntimeException
@@ -24852,7 +24910,7 @@ namespace {
* Chunk the results of a query by comparing IDs. * Chunk the results of a query by comparing IDs.
* *
* @param int $count * @param int $count
* @param \Illuminate\Database\Eloquent\callable(\Illuminate\Support\Collection<int, TValue>, int): mixed $callback * @param callable(\Illuminate\Support\Collection<int, TValue>, int): mixed $callback
* @param string|null $column * @param string|null $column
* @param string|null $alias * @param string|null $alias
* @return bool * @return bool
@@ -24868,7 +24926,7 @@ namespace {
* Chunk the results of a query by comparing IDs in descending order. * Chunk the results of a query by comparing IDs in descending order.
* *
* @param int $count * @param int $count
* @param \Illuminate\Database\Eloquent\callable(\Illuminate\Support\Collection<int, TValue>, int): mixed $callback * @param callable(\Illuminate\Support\Collection<int, TValue>, int): mixed $callback
* @param string|null $column * @param string|null $column
* @param string|null $alias * @param string|null $alias
* @return bool * @return bool
@@ -24884,7 +24942,7 @@ namespace {
* Chunk the results of a query by comparing IDs in a given order. * Chunk the results of a query by comparing IDs in a given order.
* *
* @param int $count * @param int $count
* @param \Illuminate\Database\Eloquent\callable(\Illuminate\Support\Collection<int, TValue>, int): mixed $callback * @param callable(\Illuminate\Support\Collection<int, TValue>, int): mixed $callback
* @param string|null $column * @param string|null $column
* @param string|null $alias * @param string|null $alias
* @param bool $descending * @param bool $descending
@@ -24901,7 +24959,7 @@ namespace {
/** /**
* Execute a callback over each item while chunking by ID. * Execute a callback over each item while chunking by ID.
* *
* @param \Illuminate\Database\Eloquent\callable(TValue, int): mixed $callback * @param callable(TValue, int): mixed $callback
* @param int $count * @param int $count
* @param string|null $column * @param string|null $column
* @param string|null $alias * @param string|null $alias
@@ -24991,7 +25049,7 @@ namespace {
/** /**
* Pass the query to a given callback. * Pass the query to a given callback.
* *
* @param \Illuminate\Database\Eloquent\callable($this): mixed $callback * @param callable($this): mixed $callback
* @return \Illuminate\Database\Eloquent\Builder<static> * @return \Illuminate\Database\Eloquent\Builder<static>
* @static * @static
*/ */
@@ -25438,7 +25496,7 @@ namespace {
* Add a morph-to relationship condition to the query. * Add a morph-to relationship condition to the query.
* *
* @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation
* @param \Illuminate\Database\Eloquent\Model|string|null $model * @param \Illuminate\Database\Eloquent\Model|iterable<int, \Illuminate\Database\Eloquent\Model>|string|null $model
* @return \Illuminate\Database\Eloquent\Builder<static> * @return \Illuminate\Database\Eloquent\Builder<static>
* @static * @static
*/ */
@@ -25452,7 +25510,7 @@ namespace {
* Add a not morph-to relationship condition to the query. * Add a not morph-to relationship condition to the query.
* *
* @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation
* @param \Illuminate\Database\Eloquent\Model|string $model * @param \Illuminate\Database\Eloquent\Model|iterable<int, \Illuminate\Database\Eloquent\Model>|string $model
* @return \Illuminate\Database\Eloquent\Builder<static> * @return \Illuminate\Database\Eloquent\Builder<static>
* @static * @static
*/ */
@@ -25466,7 +25524,7 @@ namespace {
* Add a morph-to relationship condition to the query with an "or where" clause. * Add a morph-to relationship condition to the query with an "or where" clause.
* *
* @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation
* @param \Illuminate\Database\Eloquent\Model|string|null $model * @param \Illuminate\Database\Eloquent\Model|iterable<int, \Illuminate\Database\Eloquent\Model>|string|null $model
* @return \Illuminate\Database\Eloquent\Builder<static> * @return \Illuminate\Database\Eloquent\Builder<static>
* @static * @static
*/ */
@@ -25480,7 +25538,7 @@ namespace {
* Add a not morph-to relationship condition to the query with an "or where" clause. * Add a not morph-to relationship condition to the query with an "or where" clause.
* *
* @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation
* @param \Illuminate\Database\Eloquent\Model|string $model * @param \Illuminate\Database\Eloquent\Model|iterable<int, \Illuminate\Database\Eloquent\Model>|string $model
* @return \Illuminate\Database\Eloquent\Builder<static> * @return \Illuminate\Database\Eloquent\Builder<static>
* @static * @static
*/ */

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Console\Commands;
use App\Enums\RoleName;
use App\Models\Role;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Contracts\Console\PromptsForMissingInput;
use Illuminate\Support\Facades\Hash;
class CreateAdmin extends Command implements PromptsForMissingInput
{
protected $signature = 'app:create-admin {user : E-Mail for the admin account} {password : Password for the admin account}';
protected $description = 'Creates a super admin for the system';
public function handle(): void
{
$user = $this->argument('user');
$password = $this->argument('password');
$user = User::create([
'name' => $user,
'email' => $user,
'password' => Hash::make($password),
]);
$role = Role::where('name', RoleName::SuperAdmin)->first();
$user->roles()->attach($role);
$this->info("Admin account created");
}
}

View File

@@ -58,7 +58,7 @@ class ResetPassword extends Component
); );
if ($status === Password::PASSWORD_RESET) { if ($status === Password::PASSWORD_RESET) {
Session::flash('toast', ['type' => 'success', 'message' => __($status)]); $this->toast()->success("Éxito", __($status))->flash()->send();
$this->redirectRoute('login', navigate: true); $this->redirectRoute('login', navigate: true);
} else { } else {
throw ValidationException::withMessages(['email' => __($status)]); throw ValidationException::withMessages(['email' => __($status)]);

View File

@@ -10,7 +10,6 @@ use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Session;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use Livewire\Attributes\Computed; use Livewire\Attributes\Computed;
use Livewire\Attributes\On;
use Livewire\Component; use Livewire\Component;
use Livewire\WithPagination; use Livewire\WithPagination;
use Log; use Log;
@@ -22,6 +21,8 @@ class Index extends Component
public $searchFecha = null; public $searchFecha = null;
public $modal = false;
public $fecha = null; public $fecha = null;
public $caja = null; public $caja = null;
@@ -35,16 +36,15 @@ class Index extends Component
public function createTurno(): void public function createTurno(): void
{ {
$this->modal = true;
$this->fecha = now()->format('Y-m-d'); $this->fecha = now()->format('Y-m-d');
$this->caja = 1; $this->caja = 1;
if (Turno::where('fecha', now())->exists()) { if (Turno::where('fecha', $this->fecha)->exists()) {
$this->turno = Turno::where('fecha', now())->max('numero_turno') + 1; $this->turno = Turno::where('fecha', $this->fecha)->max('numero_turno') + 1;
} else { } else {
$this->turno = 1; $this->turno = 1;
} }
$this->dispatch('show-modal', "turno");
} }
public function storeTurno(): void public function storeTurno(): void
@@ -82,21 +82,19 @@ class Index extends Component
'diez' => 0, 'diez' => 0,
]); ]);
Session::flash('toast', ['type' => 'success', 'message' => 'Caja registrada correctamente']); $this->toast()->success("Éxito", "Caja registrada correctamente")->flash()->send();
$this->redirectRoute('cajas.edit', $turno, navigate: true); $this->redirectRoute('cajas.edit', $turno, navigate: true);
} }
#[On('close-modal-turno')]
public function closeTurnoModal(): void public function closeTurnoModal(): void
{ {
Log::info("Cerrando modal"); $this->modal = false;
$this->fecha = null; $this->fecha = null;
$this->caja = null; $this->caja = null;
$this->turno = null; $this->turno = null;
$this->clearValidation(); $this->clearValidation();
$this->dispatch('hide-modal', 'turno');
} }
public function confirmDelete($id): void public function confirmDelete($id): void
@@ -115,6 +113,20 @@ class Index extends Component
$this->toast()->success('Turno eliminado correctamente')->send(); $this->toast()->success('Turno eliminado correctamente')->send();
} }
#[Computed]
public function headers(): array
{
return [
['index' => 'fecha', 'label' => 'Fecha'],
['index' => 'numero_caja', 'label' => 'Caja'],
['index' => 'numero_turno', 'label' => 'Turno'],
['index' => 'ingresos', 'label' => 'Ingresos'],
['index' => 'egresos', 'label' => 'Egresos'],
['index' => 'arqueo', 'label' => 'Arqueo'],
['index' => 'action', 'label' => 'Acciones'],
];
}
#[Computed] #[Computed]
public function rows(): LengthAwarePaginator public function rows(): LengthAwarePaginator
{ {

View File

@@ -7,6 +7,7 @@ use App\Models\Role;
use App\Models\User; use App\Models\User;
use Illuminate\Contracts\View\View; use Illuminate\Contracts\View\View;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Session;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
@@ -53,7 +54,7 @@ class Edit extends Component
{ {
return [ return [
'name' => 'required|string', 'name' => 'required|string',
'email' => ['required', 'email', Rule::unique('users', 'email')->ignore($this->user->id)], 'email' => ['required', 'email', Rule::unique('users', 'email')->ignore($this->user?->id)],
'password' => $this->change_password ? 'required|string|min:8|confirmed' : 'nullable|string|min:8|confirmed', 'password' => $this->change_password ? 'required|string|min:8|confirmed' : 'nullable|string|min:8|confirmed',
'password_confirmation' => $this->change_password ? 'required' : 'nullable', 'password_confirmation' => $this->change_password ? 'required' : 'nullable',
'roles' => 'nullable', 'roles' => 'nullable',
@@ -86,19 +87,26 @@ class Edit extends Component
$this->user->save(); $this->user->save();
$isSuperAdmin = $this->user->roles()->where('name', RoleName::SuperAdmin)->exists(); $isSuperAdmin = $this->user->isAn(RoleName::SuperAdmin);
$this->user->roles()->sync($this->roles); if($isSuperAdmin) {
if ($isSuperAdmin) { $this->roles[] = Role::where('name', RoleName::SuperAdmin)->first()->id;
$this->user->roles()->attach(Role::where('name', RoleName::SuperAdmin)->first()->id);
} }
Session::flash('toast', ['type' => 'success', 'message' => 'Usuario modificado correctamente']); $this->user->roles()->sync($this->roles);
$this->toast()->success("Éxito", "Usuario modificado correctamente")->flash()->send();
} }
public function store(): void public function store(): void
{ {
$this->authorize('create', User::class); $this->authorize('create', User::class);
$superadmin = Role::whereName(RoleName::SuperAdmin)->first();
if(collect($this->roles)->contains($superadmin->id)) {
Gate::authorize('create-super-admin', User::class);
}
$user = User::create([ $user = User::create([
'name' => $this->name, 'name' => $this->name,
'email' => $this->email, 'email' => $this->email,
@@ -107,12 +115,16 @@ class Edit extends Component
$user->roles()->sync($this->roles); $user->roles()->sync($this->roles);
Session::flash('toast', ['type' => 'success', 'message' => 'Usuario registrado correctamente']); $this->toast()->success("Éxito", "Usuario registrado correctamente")->flash()->send();
} }
#[Computed] #[Computed]
public function availableRoles(): Collection public function availableRoles(): Collection
{ {
return Role::whereNot('name', RoleName::SuperAdmin)->get(); if(Gate::allows('create-super-admin', User::class)) {
return Role::all();
} else {
return Role::whereNot('name', RoleName::SuperAdmin)->get();
}
} }
} }

View File

@@ -51,6 +51,7 @@ class Index extends Component
return [ return [
['index' => 'name', 'label' => 'Nombre'], ['index' => 'name', 'label' => 'Nombre'],
['index' => 'email', 'label' => 'Email'], ['index' => 'email', 'label' => 'Email'],
['index' => 'roles', 'label' => 'Roles'],
['index' => 'action', 'label' => 'Acciones'], ['index' => 'action', 'label' => 'Acciones'],
]; ];
} }
@@ -58,6 +59,6 @@ class Index extends Component
#[Computed] #[Computed]
public function rows(): LengthAwarePaginator public function rows(): LengthAwarePaginator
{ {
return User::paginate(); return User::filterSuperadmin()->with('roles')->paginate();
} }
} }

View File

@@ -2,6 +2,8 @@
namespace App\Models; namespace App\Models;
use App\Enums\RoleName;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Concerns\HasUlids; use Illuminate\Database\Eloquent\Concerns\HasUlids;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\BelongsToMany;
@@ -30,6 +32,23 @@ class User extends Authenticatable
return $this->belongsToMany(Role::class, 'user_roles', 'user_id', 'role_id'); return $this->belongsToMany(Role::class, 'user_roles', 'user_id', 'role_id');
} }
public function isAn(...$roles): bool
{
return $this->roles()->whereIn('name', $roles)->exists();
}
public function scopeFilterSuperadmin(Builder $query) {
if(!auth()->check()) {
return;
}
if (!auth()->user()->isAn(RoleName::SuperAdmin)) {
$query->whereDoesntHave('roles', function (Builder $builder) {
$builder->where('name', RoleName::SuperAdmin);
});
}
}
protected function casts(): array protected function casts(): array
{ {
return [ return [

View File

@@ -10,68 +10,65 @@ class UserPolicy
{ {
public function before(User $user, string $ability): bool|null public function before(User $user, string $ability): bool|null
{ {
$isAdmin = $user->roles()->whereIn('name', [RoleName::SuperAdmin, RoleName::Admin])->exists(); if (!$user->isAn(RoleName::SuperAdmin, RoleName::Admin)) {
if (!$isAdmin) {
return false; return false;
} }
return null; return null;
} }
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool public function viewAny(User $user): bool
{ {
return true; return true;
} }
/**
* Determine whether the user can view the model.
*/
public function view(User $user, User $model): bool public function view(User $user, User $model): bool
{ {
if($model->isAn(RoleName::SuperAdmin)) {
return $user->isAn(RoleName::SuperAdmin);
}
return true; return true;
} }
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool public function create(User $user): bool
{ {
return true; return true;
} }
/** public function createSuperAdmin(User $user): bool
* Determine whether the user can update the model. {
*/ return $user->isAn(RoleName::SuperAdmin);
}
public function update(User $user, User $model): bool public function update(User $user, User $model): bool
{ {
if($model->isAn(RoleName::SuperAdmin)) {
return $user->isAn(RoleName::SuperAdmin);
}
return true; return true;
} }
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, User $model): bool public function delete(User $user, User $model): bool
{ {
if($model->isAn(RoleName::SuperAdmin)) {
return $user->isAn(RoleName::SuperAdmin);
}
return true; return true;
} }
/**
* Determine whether the user can restore the model.
*/
public function restore(User $user, User $model): bool public function restore(User $user, User $model): bool
{ {
if($model->isAn(RoleName::SuperAdmin)) {
return $user->isAn(RoleName::SuperAdmin);
}
return true; return true;
} }
/**
* Determine whether the user can permanently delete the model.
*/
public function forceDelete(User $user, User $model): bool public function forceDelete(User $user, User $model): bool
{ {
if($model->isAn(RoleName::SuperAdmin)) {
return $user->isAn(RoleName::SuperAdmin);
}
return true; return true;
} }
} }

186
composer.lock generated
View File

@@ -2563,16 +2563,16 @@
}, },
{ {
"name": "laravel-lang/publisher", "name": "laravel-lang/publisher",
"version": "16.4.0", "version": "16.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/Laravel-Lang/publisher.git", "url": "https://github.com/Laravel-Lang/publisher.git",
"reference": "7812e7a07e6f2fdb7d258f3ab1d481d1cbf7f32c" "reference": "fc33816edbb13e9fd032243afd565efec265926d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/Laravel-Lang/publisher/zipball/7812e7a07e6f2fdb7d258f3ab1d481d1cbf7f32c", "url": "https://api.github.com/repos/Laravel-Lang/publisher/zipball/fc33816edbb13e9fd032243afd565efec265926d",
"reference": "7812e7a07e6f2fdb7d258f3ab1d481d1cbf7f32c", "reference": "fc33816edbb13e9fd032243afd565efec265926d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2657,7 +2657,7 @@
"issues": "https://github.com/Laravel-Lang/publisher/issues", "issues": "https://github.com/Laravel-Lang/publisher/issues",
"source": "https://github.com/Laravel-Lang/publisher" "source": "https://github.com/Laravel-Lang/publisher"
}, },
"time": "2024-06-02T00:22:33+00:00" "time": "2025-01-17T10:45:02+00:00"
}, },
{ {
"name": "laravel-lang/routes", "name": "laravel-lang/routes",
@@ -2738,16 +2738,16 @@
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v11.37.0", "version": "v11.40.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "6cb103d2024b087eae207654b3f4b26646119ba5" "reference": "599a28196d284fee158cc10086fd56ac625ad7a3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/6cb103d2024b087eae207654b3f4b26646119ba5", "url": "https://api.github.com/repos/laravel/framework/zipball/599a28196d284fee158cc10086fd56ac625ad7a3",
"reference": "6cb103d2024b087eae207654b3f4b26646119ba5", "reference": "599a28196d284fee158cc10086fd56ac625ad7a3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2773,7 +2773,7 @@
"league/flysystem-local": "^3.25.1", "league/flysystem-local": "^3.25.1",
"league/uri": "^7.5.1", "league/uri": "^7.5.1",
"monolog/monolog": "^3.0", "monolog/monolog": "^3.0",
"nesbot/carbon": "^2.72.2|^3.4", "nesbot/carbon": "^2.72.6|^3.8.4",
"nunomaduro/termwind": "^2.0", "nunomaduro/termwind": "^2.0",
"php": "^8.2", "php": "^8.2",
"psr/container": "^1.1.1|^2.0.1", "psr/container": "^1.1.1|^2.0.1",
@@ -2848,6 +2848,7 @@
"fakerphp/faker": "^1.24", "fakerphp/faker": "^1.24",
"guzzlehttp/promises": "^2.0.3", "guzzlehttp/promises": "^2.0.3",
"guzzlehttp/psr7": "^2.4", "guzzlehttp/psr7": "^2.4",
"laravel/pint": "^1.18",
"league/flysystem-aws-s3-v3": "^3.25.1", "league/flysystem-aws-s3-v3": "^3.25.1",
"league/flysystem-ftp": "^3.25.1", "league/flysystem-ftp": "^3.25.1",
"league/flysystem-path-prefixing": "^3.25.1", "league/flysystem-path-prefixing": "^3.25.1",
@@ -2948,7 +2949,7 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2025-01-02T20:10:21+00:00" "time": "2025-01-24T16:17:42+00:00"
}, },
{ {
"name": "laravel/octane", "name": "laravel/octane",
@@ -3042,16 +3043,16 @@
}, },
{ {
"name": "laravel/prompts", "name": "laravel/prompts",
"version": "v0.3.2", "version": "v0.3.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/prompts.git", "url": "https://github.com/laravel/prompts.git",
"reference": "0e0535747c6b8d6d10adca8b68293cf4517abb0f" "reference": "749395fcd5f8f7530fe1f00dfa84eb22c83d94ea"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/prompts/zipball/0e0535747c6b8d6d10adca8b68293cf4517abb0f", "url": "https://api.github.com/repos/laravel/prompts/zipball/749395fcd5f8f7530fe1f00dfa84eb22c83d94ea",
"reference": "0e0535747c6b8d6d10adca8b68293cf4517abb0f", "reference": "749395fcd5f8f7530fe1f00dfa84eb22c83d94ea",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3095,9 +3096,9 @@
"description": "Add beautiful and user-friendly forms to your command-line applications.", "description": "Add beautiful and user-friendly forms to your command-line applications.",
"support": { "support": {
"issues": "https://github.com/laravel/prompts/issues", "issues": "https://github.com/laravel/prompts/issues",
"source": "https://github.com/laravel/prompts/tree/v0.3.2" "source": "https://github.com/laravel/prompts/tree/v0.3.3"
}, },
"time": "2024-11-12T14:59:47+00:00" "time": "2024-12-30T15:53:31+00:00"
}, },
{ {
"name": "laravel/serializable-closure", "name": "laravel/serializable-closure",
@@ -3162,16 +3163,16 @@
}, },
{ {
"name": "laravel/telescope", "name": "laravel/telescope",
"version": "v5.2.6", "version": "v5.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/telescope.git", "url": "https://github.com/laravel/telescope.git",
"reference": "7ee46fbea8e3b01108575c8edf7377abddfe8bb9" "reference": "216fd8d41eb17b49469bea9359b4f0f711b882b3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/telescope/zipball/7ee46fbea8e3b01108575c8edf7377abddfe8bb9", "url": "https://api.github.com/repos/laravel/telescope/zipball/216fd8d41eb17b49469bea9359b4f0f711b882b3",
"reference": "7ee46fbea8e3b01108575c8edf7377abddfe8bb9", "reference": "216fd8d41eb17b49469bea9359b4f0f711b882b3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3225,9 +3226,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/laravel/telescope/issues", "issues": "https://github.com/laravel/telescope/issues",
"source": "https://github.com/laravel/telescope/tree/v5.2.6" "source": "https://github.com/laravel/telescope/tree/v5.3.0"
}, },
"time": "2024-11-25T20:34:58+00:00" "time": "2024-12-26T21:37:35+00:00"
}, },
{ {
"name": "laravel/tinker", "name": "laravel/tinker",
@@ -8032,16 +8033,16 @@
}, },
{ {
"name": "barryvdh/laravel-ide-helper", "name": "barryvdh/laravel-ide-helper",
"version": "v3.5.3", "version": "v3.5.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/barryvdh/laravel-ide-helper.git", "url": "https://github.com/barryvdh/laravel-ide-helper.git",
"reference": "271682a2a6d57691e1c7ff378f44e4ae6ac2aba0" "reference": "980a87e250fc2a7558bc46e07f61c7594500ea53"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/271682a2a6d57691e1c7ff378f44e4ae6ac2aba0", "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/980a87e250fc2a7558bc46e07f61c7594500ea53",
"reference": "271682a2a6d57691e1c7ff378f44e4ae6ac2aba0", "reference": "980a87e250fc2a7558bc46e07f61c7594500ea53",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -8110,7 +8111,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/barryvdh/laravel-ide-helper/issues", "issues": "https://github.com/barryvdh/laravel-ide-helper/issues",
"source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.5.3" "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.5.4"
}, },
"funding": [ "funding": [
{ {
@@ -8122,20 +8123,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2025-01-08T10:01:30+00:00" "time": "2025-01-14T09:07:00+00:00"
}, },
{ {
"name": "barryvdh/reflection-docblock", "name": "barryvdh/reflection-docblock",
"version": "v2.3.0", "version": "v2.3.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/barryvdh/ReflectionDocBlock.git", "url": "https://github.com/barryvdh/ReflectionDocBlock.git",
"reference": "818be8de6af4d16ef3ad51ea9234b3d37026ee5f" "reference": "b6ff9f93603561f50e53b64310495d20b8dff5d8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/818be8de6af4d16ef3ad51ea9234b3d37026ee5f", "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/b6ff9f93603561f50e53b64310495d20b8dff5d8",
"reference": "818be8de6af4d16ef3ad51ea9234b3d37026ee5f", "reference": "b6ff9f93603561f50e53b64310495d20b8dff5d8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -8172,9 +8173,9 @@
} }
], ],
"support": { "support": {
"source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.3.0" "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.3.1"
}, },
"time": "2024-12-30T10:35:04+00:00" "time": "2025-01-18T19:26:32+00:00"
}, },
{ {
"name": "brianium/paratest", "name": "brianium/paratest",
@@ -8440,16 +8441,16 @@
}, },
{ {
"name": "filp/whoops", "name": "filp/whoops",
"version": "2.16.0", "version": "2.17.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/filp/whoops.git", "url": "https://github.com/filp/whoops.git",
"reference": "befcdc0e5dce67252aa6322d82424be928214fa2" "reference": "075bc0c26631110584175de6523ab3f1652eb28e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2", "url": "https://api.github.com/repos/filp/whoops/zipball/075bc0c26631110584175de6523ab3f1652eb28e",
"reference": "befcdc0e5dce67252aa6322d82424be928214fa2", "reference": "075bc0c26631110584175de6523ab3f1652eb28e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -8499,7 +8500,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/filp/whoops/issues", "issues": "https://github.com/filp/whoops/issues",
"source": "https://github.com/filp/whoops/tree/2.16.0" "source": "https://github.com/filp/whoops/tree/2.17.0"
}, },
"funding": [ "funding": [
{ {
@@ -8507,7 +8508,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-09-25T12:00:00+00:00" "time": "2025-01-25T12:00:00+00:00"
}, },
{ {
"name": "hamcrest/hamcrest-php", "name": "hamcrest/hamcrest-php",
@@ -8621,16 +8622,16 @@
}, },
{ {
"name": "laravel/pint", "name": "laravel/pint",
"version": "v1.19.0", "version": "v1.20.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/pint.git", "url": "https://github.com/laravel/pint.git",
"reference": "8169513746e1bac70c85d6ea1524d9225d4886f0" "reference": "53072e8ea22213a7ed168a8a15b96fbb8b82d44b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/pint/zipball/8169513746e1bac70c85d6ea1524d9225d4886f0", "url": "https://api.github.com/repos/laravel/pint/zipball/53072e8ea22213a7ed168a8a15b96fbb8b82d44b",
"reference": "8169513746e1bac70c85d6ea1524d9225d4886f0", "reference": "53072e8ea22213a7ed168a8a15b96fbb8b82d44b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -8683,7 +8684,7 @@
"issues": "https://github.com/laravel/pint/issues", "issues": "https://github.com/laravel/pint/issues",
"source": "https://github.com/laravel/pint" "source": "https://github.com/laravel/pint"
}, },
"time": "2024-12-30T16:20:10+00:00" "time": "2025-01-14T16:20:53+00:00"
}, },
{ {
"name": "maximebf/debugbar", "name": "maximebf/debugbar",
@@ -8898,37 +8899,37 @@
}, },
{ {
"name": "nunomaduro/collision", "name": "nunomaduro/collision",
"version": "v8.5.0", "version": "v8.6.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nunomaduro/collision.git", "url": "https://github.com/nunomaduro/collision.git",
"reference": "f5c101b929c958e849a633283adff296ed5f38f5" "reference": "86f003c132143d5a2ab214e19933946409e0cae7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nunomaduro/collision/zipball/f5c101b929c958e849a633283adff296ed5f38f5", "url": "https://api.github.com/repos/nunomaduro/collision/zipball/86f003c132143d5a2ab214e19933946409e0cae7",
"reference": "f5c101b929c958e849a633283adff296ed5f38f5", "reference": "86f003c132143d5a2ab214e19933946409e0cae7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"filp/whoops": "^2.16.0", "filp/whoops": "^2.16.0",
"nunomaduro/termwind": "^2.1.0", "nunomaduro/termwind": "^2.3.0",
"php": "^8.2.0", "php": "^8.2.0",
"symfony/console": "^7.1.5" "symfony/console": "^7.2.1"
}, },
"conflict": { "conflict": {
"laravel/framework": "<11.0.0 || >=12.0.0", "laravel/framework": "<11.39.1 || >=13.0.0",
"phpunit/phpunit": "<10.5.1 || >=12.0.0" "phpunit/phpunit": "<11.5.3 || >=12.0.0"
}, },
"require-dev": { "require-dev": {
"larastan/larastan": "^2.9.8", "larastan/larastan": "^2.9.12",
"laravel/framework": "^11.28.0", "laravel/framework": "^11.39.1",
"laravel/pint": "^1.18.1", "laravel/pint": "^1.20.0",
"laravel/sail": "^1.36.0", "laravel/sail": "^1.40.0",
"laravel/sanctum": "^4.0.3", "laravel/sanctum": "^4.0.7",
"laravel/tinker": "^2.10.0", "laravel/tinker": "^2.10.0",
"orchestra/testbench-core": "^9.5.3", "orchestra/testbench-core": "^9.9.2",
"pestphp/pest": "^2.36.0 || ^3.4.0", "pestphp/pest": "^3.7.3",
"sebastian/environment": "^6.1.0 || ^7.2.0" "sebastian/environment": "^6.1.0 || ^7.2.0"
}, },
"type": "library", "type": "library",
@@ -8966,6 +8967,7 @@
"cli", "cli",
"command-line", "command-line",
"console", "console",
"dev",
"error", "error",
"handling", "handling",
"laravel", "laravel",
@@ -8991,41 +8993,41 @@
"type": "patreon" "type": "patreon"
} }
], ],
"time": "2024-10-15T16:06:32+00:00" "time": "2025-01-23T13:41:43+00:00"
}, },
{ {
"name": "pestphp/pest", "name": "pestphp/pest",
"version": "v3.7.1", "version": "v3.7.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/pestphp/pest.git", "url": "https://github.com/pestphp/pest.git",
"reference": "bf3178473dcaa53b0458f21dfdb271306ea62512" "reference": "4a987d3d5c4e3ba36c76fecbf56113baac2d1b2b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/pestphp/pest/zipball/bf3178473dcaa53b0458f21dfdb271306ea62512", "url": "https://api.github.com/repos/pestphp/pest/zipball/4a987d3d5c4e3ba36c76fecbf56113baac2d1b2b",
"reference": "bf3178473dcaa53b0458f21dfdb271306ea62512", "reference": "4a987d3d5c4e3ba36c76fecbf56113baac2d1b2b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"brianium/paratest": "^7.7.0", "brianium/paratest": "^7.7.0",
"nunomaduro/collision": "^8.5.0", "nunomaduro/collision": "^8.6.1",
"nunomaduro/termwind": "^2.3.0", "nunomaduro/termwind": "^2.3.0",
"pestphp/pest-plugin": "^3.0.0", "pestphp/pest-plugin": "^3.0.0",
"pestphp/pest-plugin-arch": "^3.0.0", "pestphp/pest-plugin-arch": "^3.0.0",
"pestphp/pest-plugin-mutate": "^3.0.5", "pestphp/pest-plugin-mutate": "^3.0.5",
"php": "^8.2.0", "php": "^8.2.0",
"phpunit/phpunit": "^11.5.1" "phpunit/phpunit": "^11.5.3"
}, },
"conflict": { "conflict": {
"filp/whoops": "<2.16.0", "filp/whoops": "<2.16.0",
"phpunit/phpunit": ">11.5.1", "phpunit/phpunit": ">11.5.3",
"sebastian/exporter": "<6.0.0", "sebastian/exporter": "<6.0.0",
"webmozart/assert": "<1.11.0" "webmozart/assert": "<1.11.0"
}, },
"require-dev": { "require-dev": {
"pestphp/pest-dev-tools": "^3.3.0", "pestphp/pest-dev-tools": "^3.3.0",
"pestphp/pest-plugin-type-coverage": "^3.2.0", "pestphp/pest-plugin-type-coverage": "^3.2.3",
"symfony/process": "^7.2.0" "symfony/process": "^7.2.0"
}, },
"bin": [ "bin": [
@@ -9091,7 +9093,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/pestphp/pest/issues", "issues": "https://github.com/pestphp/pest/issues",
"source": "https://github.com/pestphp/pest/tree/v3.7.1" "source": "https://github.com/pestphp/pest/tree/v3.7.4"
}, },
"funding": [ "funding": [
{ {
@@ -9103,7 +9105,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-12-12T11:52:01+00:00" "time": "2025-01-23T14:03:29+00:00"
}, },
{ {
"name": "pestphp/pest-plugin", "name": "pestphp/pest-plugin",
@@ -9247,27 +9249,27 @@
}, },
{ {
"name": "pestphp/pest-plugin-laravel", "name": "pestphp/pest-plugin-laravel",
"version": "v3.0.0", "version": "v3.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/pestphp/pest-plugin-laravel.git", "url": "https://github.com/pestphp/pest-plugin-laravel.git",
"reference": "7dd98c0c3b3542970ec21fce80ec5c88916ac469" "reference": "1c4e994476375c72aa7aebaaa97aa98f5d5378cd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/7dd98c0c3b3542970ec21fce80ec5c88916ac469", "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/1c4e994476375c72aa7aebaaa97aa98f5d5378cd",
"reference": "7dd98c0c3b3542970ec21fce80ec5c88916ac469", "reference": "1c4e994476375c72aa7aebaaa97aa98f5d5378cd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"laravel/framework": "^11.22.0", "laravel/framework": "^11.39.1|^12.0.0",
"pestphp/pest": "^3.0.0", "pestphp/pest": "^3.7.4",
"php": "^8.2.0" "php": "^8.2.0"
}, },
"require-dev": { "require-dev": {
"laravel/dusk": "^8.2.5", "laravel/dusk": "^8.2.13|dev-develop",
"orchestra/testbench": "^9.4.0", "orchestra/testbench": "^9.9.0|^10.0.0",
"pestphp/pest-dev-tools": "^3.0.0" "pestphp/pest-dev-tools": "^3.3.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@@ -9305,7 +9307,7 @@
"unit" "unit"
], ],
"support": { "support": {
"source": "https://github.com/pestphp/pest-plugin-laravel/tree/v3.0.0" "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v3.1.0"
}, },
"funding": [ "funding": [
{ {
@@ -9317,7 +9319,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-09-08T23:32:52+00:00" "time": "2025-01-24T13:22:39+00:00"
}, },
{ {
"name": "pestphp/pest-plugin-mutate", "name": "pestphp/pest-plugin-mutate",
@@ -10056,16 +10058,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "11.5.1", "version": "11.5.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "2b94d4f2450b9869fa64a46fd8a6a41997aef56a" "reference": "30e319e578a7b5da3543073e30002bf82042f701"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2b94d4f2450b9869fa64a46fd8a6a41997aef56a", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/30e319e578a7b5da3543073e30002bf82042f701",
"reference": "2b94d4f2450b9869fa64a46fd8a6a41997aef56a", "reference": "30e319e578a7b5da3543073e30002bf82042f701",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10079,14 +10081,14 @@
"phar-io/manifest": "^2.0.4", "phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1", "phar-io/version": "^3.2.1",
"php": ">=8.2", "php": ">=8.2",
"phpunit/php-code-coverage": "^11.0.7", "phpunit/php-code-coverage": "^11.0.8",
"phpunit/php-file-iterator": "^5.1.0", "phpunit/php-file-iterator": "^5.1.0",
"phpunit/php-invoker": "^5.0.1", "phpunit/php-invoker": "^5.0.1",
"phpunit/php-text-template": "^4.0.1", "phpunit/php-text-template": "^4.0.1",
"phpunit/php-timer": "^7.0.1", "phpunit/php-timer": "^7.0.1",
"sebastian/cli-parser": "^3.0.2", "sebastian/cli-parser": "^3.0.2",
"sebastian/code-unit": "^3.0.1", "sebastian/code-unit": "^3.0.2",
"sebastian/comparator": "^6.2.1", "sebastian/comparator": "^6.3.0",
"sebastian/diff": "^6.0.2", "sebastian/diff": "^6.0.2",
"sebastian/environment": "^7.2.0", "sebastian/environment": "^7.2.0",
"sebastian/exporter": "^6.3.0", "sebastian/exporter": "^6.3.0",
@@ -10137,7 +10139,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy", "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.1" "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.3"
}, },
"funding": [ "funding": [
{ {
@@ -10153,7 +10155,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-12-11T10:52:48+00:00" "time": "2025-01-13T09:36:00+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",

112
package-lock.json generated
View File

@@ -1,20 +1,15 @@
{ {
"name": "app", "name": "zenithar",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"dependencies": {
"air-datepicker": "^3.5.3"
},
"devDependencies": { "devDependencies": {
"@tailwindcss/forms": "^0.5.9", "@tailwindcss/forms": "^0.5.9",
"@tailwindcss/typography": "^0.5.16",
"autoprefixer": "^10.4.2", "autoprefixer": "^10.4.2",
"axios": "^1.7.4", "axios": "^1.7.4",
"chokidar": "^4.0.3", "chokidar": "^4.0.3",
"concurrently": "^9.0.1", "concurrently": "^9.0.1",
"daisyui": "^4.12.23",
"laravel-vite-plugin": "^1.0", "laravel-vite-plugin": "^1.0",
"postcss": "^8.4.31", "postcss": "^8.4.31",
"tailwindcss": "^3.1.0", "tailwindcss": "^3.1.0",
@@ -858,36 +853,6 @@
"tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20" "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20"
} }
}, },
"node_modules/@tailwindcss/typography": {
"version": "0.5.16",
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz",
"integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==",
"dev": true,
"license": "MIT",
"dependencies": {
"lodash.castarray": "^4.4.0",
"lodash.isplainobject": "^4.0.6",
"lodash.merge": "^4.6.2",
"postcss-selector-parser": "6.0.10"
},
"peerDependencies": {
"tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
}
},
"node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": {
"version": "6.0.10",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
"integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
"dev": true,
"license": "MIT",
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@types/estree": { "node_modules/@types/estree": {
"version": "1.0.6", "version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
@@ -895,12 +860,6 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/air-datepicker": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/air-datepicker/-/air-datepicker-3.5.3.tgz",
"integrity": "sha512-Elf9gLhv/jidN1+TfeRJYMQRUfYx5apXw2dY5DuAMPRnNtQ4Iw9fTTJK772osmXSUB9xQ2Y8Q1Pt6pgBOQLPQw==",
"license": "MIT"
},
"node_modules/ansi-regex": { "node_modules/ansi-regex": {
"version": "6.1.0", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
@@ -1330,17 +1289,6 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/css-selector-tokenizer": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz",
"integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==",
"dev": true,
"license": "MIT",
"dependencies": {
"cssesc": "^3.0.0",
"fastparse": "^1.1.2"
}
},
"node_modules/cssesc": { "node_modules/cssesc": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -1354,36 +1302,6 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/culori": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz",
"integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/daisyui": {
"version": "4.12.23",
"resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.23.tgz",
"integrity": "sha512-EM38duvxutJ5PD65lO/AFMpcw+9qEy6XAZrTpzp7WyaPeO/l+F/Qiq0ECHHmFNcFXh5aVoALY4MGrrxtCiaQCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"css-selector-tokenizer": "^0.8",
"culori": "^3",
"picocolors": "^1",
"postcss-js": "^4"
},
"engines": {
"node": ">=16.9.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/daisyui"
}
},
"node_modules/delayed-stream": { "node_modules/delayed-stream": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -1510,13 +1428,6 @@
"node": ">= 6" "node": ">= 6"
} }
}, },
"node_modules/fastparse": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
"integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
"dev": true,
"license": "MIT"
},
"node_modules/fastq": { "node_modules/fastq": {
"version": "1.18.0", "version": "1.18.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
@@ -1851,27 +1762,6 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/lodash.castarray": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
"integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
"dev": true,
"license": "MIT"
},
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
"dev": true,
"license": "MIT"
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true,
"license": "MIT"
},
"node_modules/lru-cache": { "node_modules/lru-cache": {
"version": "10.4.3", "version": "10.4.3",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",

View File

@@ -7,18 +7,13 @@
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/forms": "^0.5.9", "@tailwindcss/forms": "^0.5.9",
"@tailwindcss/typography": "^0.5.16",
"autoprefixer": "^10.4.2", "autoprefixer": "^10.4.2",
"axios": "^1.7.4", "axios": "^1.7.4",
"chokidar": "^4.0.3", "chokidar": "^4.0.3",
"concurrently": "^9.0.1", "concurrently": "^9.0.1",
"daisyui": "^4.12.23",
"laravel-vite-plugin": "^1.0", "laravel-vite-plugin": "^1.0",
"postcss": "^8.4.31", "postcss": "^8.4.31",
"tailwindcss": "^3.1.0", "tailwindcss": "^3.1.0",
"vite": "^6.0" "vite": "^6.0"
},
"dependencies": {
"air-datepicker": "^3.5.3"
} }
} }

View File

@@ -1,20 +1 @@
import './bootstrap'; import './bootstrap';
import 'air-datepicker/air-datepicker.css';
import {Alpine} from '../../vendor/livewire/livewire/dist/livewire.esm';
import AirDatepicker from "air-datepicker";
import localeEs from 'air-datepicker/locale/es';
Alpine.data('datepicker', () => ({
init() {
new AirDatepicker(this.$el, {
locale: localeEs,
autoClose: true,
buttons: 'clear',
onSelect: ({date}) => {
this.$el.dispatchEvent(new Event('input'));
}
})
}
}))
Livewire.start();

View File

@@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
{{$attributes}}>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M5 12l14 0"/>
<path d="M5 12l6 6"/>
<path d="M5 12l6 -6"/>
</svg>

Before

Width:  |  Height:  |  Size: 350 B

View File

@@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
{{$attributes}}>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M7 9m0 2a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2z"/>
<path d="M14 14m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0"/>
<path d="M17 9v-2a2 2 0 0 0 -2 -2h-10a2 2 0 0 0 -2 2v6a2 2 0 0 0 2 2h2"/>
</svg>

Before

Width:  |  Height:  |  Size: 500 B

View File

@@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
{{$attributes}}>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M3 5m0 3a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3z"/>
<path d="M3 10l18 0"/>
<path d="M7 15l.01 0"/>
<path d="M11 15l2 0"/>
</svg>

Before

Width:  |  Height:  |  Size: 447 B

View File

@@ -1,7 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
{{$attributes}}>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M16.7 8a3 3 0 0 0 -2.7 -2h-4a3 3 0 0 0 0 6h4a3 3 0 0 1 0 6h-4a3 3 0 0 1 -2.7 -2"/>
<path d="M12 3v3m0 12v3"/>
</svg>

Before

Width:  |  Height:  |  Size: 397 B

View File

@@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
{{$attributes}}>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M6 4h10l4 4v10a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2"/>
<path d="M12 14m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0"/>
<path d="M14 4l0 4l-6 0l0 -4"/>
</svg>

Before

Width:  |  Height:  |  Size: 448 B

View File

@@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
{{$attributes}}>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1"/>
<path d="M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z"/>
<path d="M16 5l3 3"/>
</svg>

Before

Width:  |  Height:  |  Size: 458 B

View File

@@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
{{$attributes}}>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M5 12l-2 0l9 -9l9 9l-2 0"/>
<path d="M5 12v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-7"/>
<path d="M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v6"/>
</svg>

Before

Width:  |  Height:  |  Size: 428 B

View File

@@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
{{$attributes}}>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M5 12l14 0"/>
</svg>

Before

Width:  |  Height:  |  Size: 297 B

View File

@@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
{{$attributes}}>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 7h6"/>
<path d="M7 4v6"/>
<path d="M20 18h-6"/>
<path d="M5 19l14 -14"/>
</svg>

Before

Width:  |  Height:  |  Size: 371 B

View File

@@ -1,7 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
{{$attributes}}>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M12 5l0 14"/>
<path d="M5 12l14 0"/>
</svg>

Before

Width:  |  Height:  |  Size: 324 B

View File

@@ -1,12 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
{{$attributes}}>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M8 5h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h5.697"/>
<path d="M18 14v4h4"/>
<path d="M18 11v-4a2 2 0 0 0 -2 -2h-2"/>
<path d="M8 3m0 2a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v0a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z"/>
<path d="M18 18m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0"/>
<path d="M8 11h4"/>
<path d="M8 15h3"/>
</svg>

Before

Width:  |  Height:  |  Size: 602 B

View File

@@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
{{$attributes}}>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path
d="M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z"/>
<path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0"/>
</svg>

Before

Width:  |  Height:  |  Size: 869 B

View File

@@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
{{$attributes}}>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 7l16 0"/>
<path d="M10 11l0 6"/>
<path d="M14 11l0 6"/>
<path d="M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12"/>
<path d="M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3"/>
</svg>

Before

Width:  |  Height:  |  Size: 470 B

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" data-theme="emerald"> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
@@ -11,9 +11,6 @@
<link <link
href="https://fonts.googleapis.com/css2?family=Domine:wght@400..700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Karla:ital,wght@0,200..800;1,200..800&family=Nunito:ital,wght@0,200..1000;1,200..1000&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" href="https://fonts.googleapis.com/css2?family=Domine:wght@400..700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Karla:ital,wght@0,200..800;1,200..800&family=Nunito:ital,wght@0,200..1000;1,200..1000&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap"
rel="stylesheet"> rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/tabler-icons.min.css">
<tallstackui:script/> <tallstackui:script/>
@livewireStyles @livewireStyles
@vite(['resources/css/app.css', 'resources/js/app.js']) @vite(['resources/css/app.css', 'resources/js/app.js'])
@@ -22,15 +19,14 @@
<body class="flex flex-col min-h-screen"> <body class="flex flex-col min-h-screen">
<x-dialog/> <x-dialog/>
<x-toast/> <x-toast/>
<x-flash/>
<x-navbar/> <x-navbar/>
<div class="flex-1 bg-secondary-50 overflow-x-auto"> <div class="flex-1 bg-secondary-50 overflow-x-auto">
<main class="container mx-auto px-4 py-8"> <main class="container mx-auto px-4 py-8">
{{ $slot }} {{ $slot }}
</main> </main>
</div> </div>
@livewireScriptConfig @livewireScripts
</body> </body>
</html> </html>

View File

@@ -11,8 +11,6 @@
<link <link
href="https://fonts.googleapis.com/css2?family=Domine:wght@400..700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Karla:ital,wght@0,200..800;1,200..800&family=Nunito:ital,wght@0,200..1000;1,200..1000&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" href="https://fonts.googleapis.com/css2?family=Domine:wght@400..700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Karla:ital,wght@0,200..800;1,200..800&family=Nunito:ital,wght@0,200..1000;1,200..1000&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap"
rel="stylesheet"> rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/tabler-icons.min.css">
<tallstackui:script/> <tallstackui:script/>
@livewireStyles @livewireStyles
@vite(['resources/css/app.css', 'resources/js/app.js']) @vite(['resources/css/app.css', 'resources/js/app.js'])

View File

@@ -1,37 +0,0 @@
<div x-data="{}"
x-init="$refs.dialog.addEventListener('close', () => $dispatch('close-modal-{{$name}}'))"
x-on:show-modal.window="
console.log($event)
if($event.detail[0] === '{{$name}}') {
$refs.dialog.showModal();
}
"
x-on:hide-modal.window="
if($event.detail[0] === '{{$name}}') {
$refs.dialog.close();
}
"
>
<dialog class="modal" x-ref="dialog" wire:ignore>
<div class="modal-box">
<form method="dialog">
<button class="btn btn-sm btn-circle btn-ghost absolute right-2 top-2">
</button>
</form>
@if(isset($title))
<h3 class="text-lg font-bold">{{$title}}</h3>
@endif
{{$slot}}
@if(isset($footer))
<div class="modal-action">
{{$footer}}
</div>
@endif
</div>
</dialog>
</div>

View File

@@ -3,36 +3,37 @@
<div <div
class="container mx-auto flex flex-col items-center justify-between gap-2 px-4 py-4 sm:py-0 sm:h-14 sm:flex-row"> class="container mx-auto flex flex-col items-center justify-between gap-2 px-4 py-4 sm:py-0 sm:h-14 sm:flex-row">
<span class="text-4xl sm:text-2xl font-semibold text-primary-700">Aureon</span> <span class="text-4xl sm:text-2xl font-semibold text-primary-700">Aureon</span>
<div class="dropdown"> <x-dropdown>
<div tabindex="0" role="button" class="btn btn-ghost m-1 text-left"> <x-slot:action>
<img class="h-8 rounded" src="https://api.dicebear.com/9.x/thumbs/svg" alt="avatar"/> <button
<div class="font-normal"> class="flex items-center gap-2 rounded p-1 text-start hover:bg-secondary-50 active:bg-secondary-100"
<p class="text-sm">{{auth()->user()->name}}</p> x-on:click="show = !show">
<p class="text-xs text-secondary">{{auth()->user()->email}}</p> <img class="h-8 rounded" src="https://api.dicebear.com/9.x/thumbs/svg" alt="avatar"/>
</div> <div>
</div> <p class="text-sm">{{auth()->user()->name}}</p>
<ul tabindex="0" class="dropdown-content menu bg-base-100 rounded-box z-[1] w-52 p-2 shadow"> <p class="text-xs text-secondary">{{auth()->user()->email}}</p>
<li> </div>
<form action="{{route('logout')}}" method="POST"> </button>
@csrf </x-slot:action>
<button type="submit" class="w-full">
Cerrar Sesión <form action="{{route('logout')}}" method="POST">
</button> @csrf
</form> <button type="submit" class="w-full">
</li> <x-dropdown.items text="Cerrar Sesión" separator/>
</ul> </button>
</div> </form>
</x-dropdown>
</div> </div>
</div> </div>
<div class="container mx-auto">
<ul class="menu lg:menu-horizontal"> <div class="border-b">
<x-navlink icon="home" :route="route('home.index')" :active="Route::is('home.*')" <nav class="container mx-auto flex flex-col sm:h-14 sm:flex-row sm:px-4">
title="Inicio"/> <x-navlink icon="home" :route="route('home.index')" :active="Route::is('home.*')" title="Inicio"/>
<x-navlink icon="cash" :route="route('cajas.index')" :active="Route::is('cajas.*')" title="Cajas"/> <x-navlink icon="cash" :route="route('cajas.index')" :active="Route::is('cajas.*')" title="Cajas"/>
<x-navlink icon="report" :route="route('reportes.index')" :active="Route::is('reportes.*')" <x-navlink icon="report" :route="route('reportes.index')" :active="Route::is('reportes.*')"
title="Reportes"/> title="Reportes"/>
<x-navlink icon="settings" :route="route('configuracion.index')" :active="Route::is('configuracion.*')" <x-navlink icon="settings" :route="route('configuracion.index')" :active="Route::is('configuracion.*')"
title="Configuración"/> title="Configuración"/>
</ul> </nav>
</div> </div>
</div> </div>

View File

@@ -3,10 +3,11 @@
$active = false; $active = false;
} }
@endphp @endphp
<a class="{{ $active
<li> ? 'bg-primary text-white hover:bg-primary-600 active:bg-primary-700'
<a href="{{ $route }}" wire:navigate class="{{$active ? 'active' : ''}}"> : 'text-secondary-600 hover:bg-secondary-50 active:bg-secondary-100' }}
<x-dynamic-component :component="'icons.'.$icon" class="w-5 h-5"/> flex items-center gap-1 px-4 py-2 text-sm"
{{$title}} href="{{ $route }}" wire:navigate>
</a> <x-icon name="{{ $icon }}" sm />
</li> <span>{{ $title }}</span>
</a>

View File

@@ -1,30 +1,16 @@
@use(Illuminate\Support\Number) @use(Illuminate\Support\Number)
<div> <div>
<form wire:submit.prevent="save" class="grid lg:grid-cols-[repeat(2,minmax(0,2fr))_1fr] gap-2 mb-4 items-end"> <form wire:submit.prevent="save" class="grid lg:grid-cols-[repeat(2,minmax(0,2fr))_1fr] gap-2 mb-4 items-end">
<x-input label="Total" wire:model="valor" invalidate/>
<x-input label="Descripción" wire:model="descripcion" invalidate/>
<label class="form-control"> <x-button type="submit" icon="{{$this->currentCalculo ? 'device-floppy' : 'plus'}}">
<div class="label">
<span class="label-text">Total</span>
</div>
<input type="number" class="input input-bordered" wire:model="valor"/>
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Descripción</span>
</div>
<input class="input input-bordered" wire:model="descripcion"/>
</label>
<button class="btn" type="submit">
@if($this->currentCalculo) @if($this->currentCalculo)
<x-icons.device-floppy/>
Guardar Guardar
@else @else
<x-icons.plus/>
Agregar Agregar
@endif @endif
</button> </x-button>
<p class="text-sm font-medium text-red-500"> <p class="text-sm font-medium text-red-500">
@error('valor'){{$message}}@enderror @error('valor'){{$message}}@enderror
@@ -34,56 +20,24 @@
</p> </p>
</form> </form>
<x-table striped :headers="$this->headers" :rows="$this->rows">
<div class="overflox-x-auto"> @interact('column_valor', $row)
<table class="table"> {{Number::currency($row->valor)}}
<thead> @endinteract
<tr> @interact('column_action', $row)
<th>Total</th> <x-button sm wire:click="edit('{{$row->id}}')" :key="uniqid()">
<th>Descripción</th> Editar
<th class="text-end">Acciones</th> </x-button>
</tr> <x-button sm color="red" wire:click="confirmDelete('{{$row->id}}')" :key="uniqid()">
</thead> Eliminar
<tbody> </x-button>
@foreach($this->rows as $row) @endinteract
<tr> </x-table>
<td>{{Number::currency($row->valor)}}</td>
<td>{{$row->descripcion}}</td>
<td class="w-0 whitespace-nowrap">
<button class="btn btn-circle btn-sm" wire:click="edit('{{$row->id}}')">
<x-icons.edit class="w-5 h-5"/>
</button>
<button class="btn btn-circle btn-error btn-sm" wire:click="confirmDelete('{{$row->id}}')">
<x-icons.trash class="w-5 h-5"/>
</button>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="mt-4 grid lg:grid-cols-3 gap-4"> <div class="mt-4 grid lg:grid-cols-3 gap-4">
<label class="form-control"> <x-input label="Fondo" type="number" wire:model.live.debounce="fondo"/>
<div class="label"> <x-input label="Suma de Dinero" value="{{Number::currency($this->totalCalculo)}}" readonly/>
<span class="label-text">Fondo</span> <x-input label="Deposito" value="{{Number::currency($this->totalCalculo - (is_numeric($fondo) ? $fondo : 0))}}"
</div> readonly/>
<input type="number" class="input input-bordered" wire:model.live="fondo"/>
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Suma de Dinero</span>
</div>
<input class="input input-bordered bg-neutral-content" value="{{Number::currency($this->totalCalculo)}}"
readonly/>
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Deposito</span>
</div>
<input class="input input-bordered bg-neutral-content"
value="{{Number::currency($this->totalCalculo - (is_numeric($fondo) ? $fondo : 0))}}" readonly/>
</label>
</div> </div>
</div> </div>

View File

@@ -1,39 +1,19 @@
@use(Illuminate\Support\Number) @use(Illuminate\Support\Number)
<div> <div>
<form wire:submit.prevent="save" class="grid lg:grid-cols-[repeat(3,minmax(0,2fr))_1fr] gap-2 mb-4 items-end"> <form wire:submit.prevent="save" class="grid lg:grid-cols-[repeat(3,minmax(0,2fr))_1fr] gap-2 mb-4 items-end">
<label class="form-control"> <x-select.styled label="Tipo Documento" :options="$this->tipos" wire:model="tipo" id="tipo" required
<div class="label"> searchable invalidate/>
<span class="label-text">Tipo Documento</span> <x-input label="Descripción" wire:model="descripcion" invalidate/>
</div> <x-input label="Total" wire:model="valor" invalidate/>
<select class="select select-bordered" required wire:model="tipo">
@foreach($this->tipos as $tipo)
<option>{{$tipo}}</option>
@endforeach
</select>
</label>
<label class="form-control"> <x-button type="submit" icon="{{$this->currentDocumento ? 'device-floppy' : 'plus'}}">
<div class="label">
<span class="label-text">Descripción</span>
</div>
<input class="input input-bordered" wire:model="descripcion"/>
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Total</span>
</div>
<input type="number" class="input input-bordered" wire:model="valor"/>
</label>
<button class="btn" type="submit">
@if($this->currentDocumento) @if($this->currentDocumento)
<x-icons.device-floppy/>
Guardar Guardar
@else @else
<x-icons.plus/>
Agregar Agregar
@endif @endif
</button> </x-button>
<p class="text-sm font-medium text-red-500"> <p class="text-sm font-medium text-red-500">
@error('tipo'){{$message}}@enderror @error('tipo'){{$message}}@enderror
@@ -44,38 +24,21 @@
<p class="text-sm font-medium text-red-500"> <p class="text-sm font-medium text-red-500">
@error('valor'){{$message}}@enderror @error('valor'){{$message}}@enderror
</p> </p>
</form> </form>
<x-table striped :headers="$this->headers" :rows="$this->rows">
@interact('column_valor', $row)
<div class="overflox-x-auto"> {{Number::currency($row->valor)}}
<table class="table"> @endinteract
<thead> @interact('column_action', $row)
<tr> <x-button sm wire:click="edit('{{$row->id}}')" :key="uniqid()">
<th>Tipo Documento</th> Editar
<th>Descripción</th> </x-button>
<th>Total</th> <x-button sm color="red" wire:click="confirmDelete('{{$row->id}}')" :key="uniqid()">
<th class="text-end">Acciones</th> Eliminar
</tr> </x-button>
</thead> @endinteract
<tbody> </x-table>
@foreach($this->rows as $row)
<tr>
<td>{{$row->tipo_documento}}</td>
<td>{{$row->descripcion}}</td>
<td>{{Number::currency($row->valor)}}</td>
<td class="w-0 whitespace-nowrap">
<button class="btn btn-circle btn-sm" wire:click="edit('{{$row->id}}')">
<x-icons.edit class="w-5 h-5"/>
</button>
<button class="btn btn-circle btn-error btn-sm" wire:click="confirmDelete('{{$row->id}}')">
<x-icons.trash class="w-5 h-5"/>
</button>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="mt-4"> <div class="mt-4">
<p class="text-xl">Documentos Totales: <span class="font-bold">{{$this->totalDocumentos}}</span></p> <p class="text-xl">Documentos Totales: <span class="font-bold">{{$this->totalDocumentos}}</span></p>

View File

@@ -2,37 +2,26 @@
<div> <div>
<div class="grid grid-cols-[auto,minmax(0,1fr)] gap-4 items-baseline"> <div class="grid grid-cols-[auto,minmax(0,1fr)] gap-4 items-baseline">
<label class="label-text" for="veinte_mil">$20.000</label> <x-label>$20.000</x-label>
<input class="input input-bordered" type="number" id="veinte_mil" wire:model.blur="veinte_mil"/> <x-input type="number" wire:model.blur="veinte_mil"/>
<x-label>$10.000</x-label>
<label class="label-text" for="diez_mil">$10.000</label> <x-input type="number" wire:model.blur="diez_mil"/>
<input class="input input-bordered" type="number" id="diez_mil" wire:model.blur="diez_mil"/> <x-label>$5.000</x-label>
<x-input type="number" wire:model.blur="cinco_mil"/>
<label class="label-text" for="cinco_mil">$5.000</label> <x-label>$2.000</x-label>
<input class="input input-bordered" type="number" id="cinco_mil" wire:model.blur="cinco_mil"/> <x-input type="number" wire:model.blur="dos_mil"/>
<x-label>$1.000</x-label>
<label class="label-text" for="dos_mil">$2.000</label> <x-input type="number" wire:model.blur="mil"/>
<input class="input input-bordered" type="number" id="dos_mil" wire:model.blur="dos_mil"/> <x-label>$500</x-label>
<x-input type="number" wire:model.blur="quinientos"/>
<label class="label-text" for="mil">$1.000</label> <x-label>$100</x-label>
<input class="input input-bordered" type="number" id="mil" wire:model.blur="mil"/> <x-input type="number" wire:model.blur="cien"/>
<x-label>$50</x-label>
<label class="label-text" for="quinientos">$500</label> <x-input type="number" wire:model.blur="cincuenta"/>
<input class="input input-bordered" type="number" id="quinientos" wire:model.blur="quinientos"/> <x-label>$10</x-label>
<x-input type="number" wire:model.blur="diez"/>
<label class="label-text" for="cien">$100</label> <hr class="border-b my-4 col-span-full"/>
<input class="input input-bordered" type="number" id="cien" wire:model.blur="cien"/> <x-label>Total</x-label>
<x-input value="{{Number::currency($this->totalEfectivo)}}" readonly/>
<label class="label-text" for="cincuenta">$50</label>
<input class="input input-bordered" type="number" id="cincuenta" wire:model.blur="cincuenta"/>
<label class="label-text" for="diez">$10</label>
<input class="input input-bordered" type="number" id="diez" wire:model.blur="diez"/>
<div class="divider col-span-full"></div>
<label class="label-text">Total</label>
<input class="input input-bordered bg-neutral-content" value="{{Number::currency($this->totalEfectivo)}}"
readonly/>
</div> </div>
</div> </div>

View File

@@ -1,44 +1,20 @@
@use(Illuminate\Support\Number) @use(Illuminate\Support\Number)
<div> <div>
<form wire:submit.prevent="save" class="grid lg:grid-cols-[repeat(4,minmax(0,2fr))_1fr] gap-2 mb-4 items-end"> <form wire:submit.prevent="save" class="grid lg:grid-cols-[repeat(4,minmax(0,2fr))_1fr] gap-2 mb-4 items-end">
<label class="form-control"> <x-select.styled label="Tipo Documento" :options="$this->tipos" wire:model="tipo" id="tipo" required
<div class="label"> searchable invalidate/>
<span class="label-text">Tipo Documento</span> <x-input label="Nº Documento" wire:model="numero" invalidate/>
</div> <x-input label="Descripción" wire:model="descripcion" invalidate/>
<select class="select select-bordered" required wire:model="tipo"> <x-input label="Total" wire:model="valor" invalidate/>
@foreach($this->tipos as $tipo)
<option>{{$tipo}}</option>
@endforeach
</select>
</label>
<label class="form-control">
<div class="label">
<span class="label-text"> Documento</span>
</div>
<input class="input input-bordered" wire:model="numero"/>
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Descripción</span>
</div>
<input class="input input-bordered" wire:model="descripcion"/>
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Total</span>
</div>
<input type="number" class="input input-bordered" wire:model="valor"/>
</label>
<button class="btn" type="submit"> <x-button type="submit" icon="{{$this->currentEgreso ? 'device-floppy' : 'plus'}}">
@if($this->currentEgreso) @if($this->currentEgreso)
<x-icons.device-floppy/>
Guardar Guardar
@else @else
<x-icons.plus/>
Agregar Agregar
@endif @endif
</button> </x-button>
<p class="text-sm font-medium text-red-500"> <p class="text-sm font-medium text-red-500">
@error('tipo'){{$message}}@enderror @error('tipo'){{$message}}@enderror
@@ -54,38 +30,19 @@
</p> </p>
</form> </form>
<x-table striped :headers="$this->headers" :rows="$this->rows">
<div class="overflox-x-auto"> @interact('column_valor', $row)
<table class="table"> {{Number::currency($row->valor)}}
<thead> @endinteract
<tr> @interact('column_action', $row)
<th>Tipo Egreso</th> <x-button sm wire:click="edit('{{$row->id}}')" :key="uniqid()">
<th>Número Documento</th> Editar
<th>Descripción</th> </x-button>
<th>Total</th> <x-button sm color="red" wire:click="confirmDelete('{{$row->id}}')" :key="uniqid()">
<th class="text-end">Acciones</th> Eliminar
</tr> </x-button>
</thead> @endinteract
<tbody> </x-table>
@foreach($this->rows as $row)
<tr>
<td>{{$row->tipo_egreso}}</td>
<td>{{$row->numero}}</td>
<td>{{$row->descripcion}}</td>
<td>{{Number::currency($row->valor)}}</td>
<td class="w-0 whitespace-nowrap">
<button class="btn btn-circle btn-sm" wire:click="edit('{{$row->id}}')">
<x-icons.edit class="w-5 h-5"/>
</button>
<button class="btn btn-circle btn-error btn-sm" wire:click="confirmDelete('{{$row->id}}')">
<x-icons.trash class="w-5 h-5"/>
</button>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="mt-4"> <div class="mt-4">
<p class="text-xl">Egresos Totales: <span class="font-bold">{{$this->totalEgresos}}</span></p> <p class="text-xl">Egresos Totales: <span class="font-bold">{{$this->totalEgresos}}</span></p>

View File

@@ -1,44 +1,19 @@
@use(Illuminate\Support\Number)
<div> <div>
<form wire:submit.prevent="save" class="grid lg:grid-cols-[repeat(4,minmax(0,2fr))_1fr] gap-2 mb-4 items-end"> <form wire:submit.prevent="save" class="grid lg:grid-cols-[repeat(4,minmax(0,2fr))_1fr] gap-2 mb-4 items-end">
<label class="form-control"> <x-select.styled label="Tipo Documento" :options="$this->tipos" wire:model="tipo" required searchable
<div class="label"> invalidate/>
<span class="label-text">Tipo Documento</span> <x-input type="number" label="Documento Inicial" wire:model="ingreso_inicial" min="0" invalidate/>
</div> <x-input type="number" label="Documento Final" wire:model="ingreso_final" min="0" invalidate/>
<select class="select select-bordered " required wire:model="tipo"> <x-input type="number" label="Total" wire:model="total" min="0" invalidate/>
@foreach($this->tipos as $tipo)
<option>{{$tipo}}</option>
@endforeach
</select>
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Documento Inicial</span>
</div>
<input type="number" class="input input-bordered" wire:model="ingreso_inicial" min="0"/>
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Documento Final</span>
</div>
<input type="number" class="input input-bordered" wire:model="ingreso_final" min="0"/>
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Total</span>
</div>
<input type="number" class="input input-bordered" wire:model="total" min="0"/>
</label>
<button class="btn " type="submit"> <x-button type="submit" icon="{{$this->currentIngreso ? 'device-floppy' : 'plus'}}">
@if($this->currentIngreso) @if($this->currentIngreso)
<x-icons.device-floppy/>
Guardar Guardar
@else @else
<x-icons.plus/>
Agregar Agregar
@endif @endif
</button> </x-button>
<p class="text-sm font-medium text-red-500"> <p class="text-sm font-medium text-red-500">
@error('tipo'){{$message}}@enderror @error('tipo'){{$message}}@enderror
@@ -54,38 +29,25 @@
</p> </p>
</form> </form>
<x-table striped :headers="$this->headers" :rows="$this->rows">
<div class="overflox-x-auto"> @interact('column_ingreso_inicial', $row)
<table class="table"> {{\Illuminate\Support\Number::format($row->ingreso_inicial)}}
<thead> @endinteract
<tr> @interact('column_ingreso_final', $row)
<th>Tipo Documento</th> {{\Illuminate\Support\Number::format($row->ingreso_final)}}
<th>Documento Inicial</th> @endinteract
<th>Documento Final</th> @interact('column_total', $row)
<th>Total</th> {{\Illuminate\Support\Number::currency($row->total)}}
<th class="text-end">Acciones</th> @endinteract
</tr> @interact('column_action', $row)
</thead> <x-button sm wire:click="edit('{{$row->id}}')" :key="uniqid()">
<tbody> Editar
@foreach($this->rows as $row) </x-button>
<tr> <x-button sm color="red" wire:click="confirmDelete('{{$row->id}}')" :key="uniqid()">
<td>{{$row->tipo_ingreso}}</td> Eliminar
<td>{{Number::format($row->ingreso_inicial)}}</td> </x-button>
<td>{{Number::format($row->ingreso_final)}}</td> @endinteract
<td>{{Number::currency($row->total)}}</td> </x-table>
<td class="w-0 whitespace-nowrap">
<button class="btn btn-circle btn-sm" wire:click="edit('{{$row->id}}')">
<x-icons.edit class="w-5 h-5"/>
</button>
<button class="btn btn-circle btn-error btn-sm" wire:click="confirmDelete('{{$row->id}}')">
<x-icons.trash class="w-5 h-5"/>
</button>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="mt-4"> <div class="mt-4">
<p class="text-xl">Ingresos Totales: <span class="font-bold">{{$this->totalIngresos}}</span></p> <p class="text-xl">Ingresos Totales: <span class="font-bold">{{$this->totalIngresos}}</span></p>

View File

@@ -5,132 +5,69 @@
{{$this->turno ? "Editar caja" : "Registrar Caja"}} {{$this->turno ? "Editar caja" : "Registrar Caja"}}
</x-title> </x-title>
<button class="btn" wire:navigate href="{{route('cajas.index')}}"> <x-button icon="arrow-left" color="secondary" wire:navigate href="{{route('cajas.index')}}">
<x-icons.arrow-left/>
Volver Volver
</button> </x-button>
</div> </div>
<div class="flex gap-8 mb-4"> <div class="flex gap-8 mb-4">
<div> <div>
<p>Fecha</p> <x-label>Fecha</x-label>
<p class="font-bold">{{$turno->fecha->format('d-m-Y')}}</p> <p class="font-bold text-secondary">{{$turno->fecha->format('d-m-Y')}}</p>
</div> </div>
<div> <div>
<p>Caja</p> <x-label>Caja</x-label>
<p class="font-bold">{{$turno->numero_caja}}</p> <p class="font-bold text-secondary">{{$turno->numero_caja}}</p>
</div> </div>
<div> <div>
<p>Turno</p> <x-label>Turno</x-label>
<p class="font-bold">{{$turno->numero_turno}}</p> <p class="font-bold text-secondary">{{$turno->numero_turno}}</p>
</div> </div>
</div> </div>
<div class="grid grid-cols-[minmax(0,4fr)_minmax(0,1fr)] gap-4 items-start"> <div class="grid grid-cols-[minmax(0,4fr)_minmax(0,1fr)] gap-4 items-start">
<div x-data="{tab: @entangle('tab').live}"> <x-tab wire:model="tab">
<div role="tablist" class="tabs tabs-lifted"> <x-tab.items tab="Ingresos">
<button role="tab" class="tab gap-2" <x-slot:left>
:class="tab === 'Ingresos' ? 'tab-active' : ''" <x-icon name="plus" class="w-4 h-4"/>
@click="tab = 'Ingresos'"> </x-slot:left>
<x-icons.plus class="w-5 h-5"/> <livewire:cajas.components.ingresos-component :turno="$turno"/>
Ingresos </x-tab.items>
</button> <x-tab.items tab="Egresos">
<button role="tab" class="tab gap-2" <x-slot:left>
:class="tab === 'Egresos' ? 'tab-active' : ''" <x-icon name="minus" class="w-4 h-4"/>
@click="tab = 'Egresos'"> </x-slot:left>
<x-icons.minus class="w-5 h-5"/> <livewire:cajas.components.egresos-component :turno="$turno"/>
Egresos </x-tab.items>
</button> <x-tab.items tab="Documentos">
<button role="tab" class="tab gap-2" <x-slot:left>
:class="tab === 'Documentos' ? 'tab-active' : ''" <x-icon name="credit-card" class="w-4 h-4"/>
@click="tab = 'Documentos'"> </x-slot:left>
<x-icons.credit-card class="w-5 h-5"/> <livewire:cajas.components.documentos-component :turno="$turno"/>
Documentos </x-tab.items>
</button> <x-tab.items tab="Calculo de Fondo">
<button role="tab" class="tab gap-2" <x-slot:left>
:class="tab === 'Calculo de Fondo' ? 'tab-active' : ''" <x-icon name="plus-minus" class="w-4 h-4"/>
@click="tab = 'Calculo de Fondo'"> </x-slot:left>
<x-icons.plus-minus class="w-5 h-5"/> <livewire:cajas.components.calculo-fondo-component :turno="$turno"/>
Calculo de Fondo </x-tab.items>
</button> <x-tab.items tab="Efectivo">
<button role="tab" class="tab gap-2" <x-slot:left>
:class="tab === 'Efectivo' ? 'tab-active' : ''" <x-icon name="currency-dollar" class="w-4 h-4"/>
@click="tab = 'Efectivo'"> </x-slot:left>
<x-icons.currency-dollar class="w-5 h-5"/> <livewire:cajas.components.efectivo-component :turno="$turno"/>
Efectivo </x-tab.items>
</button> </x-tab>
</div>
<div class="border border-base-300 border-t-0">
<div x-show="tab === 'Ingresos'" x-cloak class="p-4">
<livewire:cajas.components.ingresos-component :turno="$turno"/>
</div>
<div x-show="tab === 'Egresos'" x-cloak class="p-4">
<livewire:cajas.components.egresos-component :turno="$turno"/>
</div>
<div x-show="tab === 'Documentos'" x-cloak class="p-4">
<livewire:cajas.components.documentos-component :turno="$turno"/>
</div>
<div x-show="tab === 'Calculo de Fondo'" x-cloak class="p-4">
<livewire:cajas.components.calculo-fondo-component :turno="$turno"/>
</div>
<div x-show="tab === 'Efectivo'" x-cloak class="p-4">
<livewire:cajas.components.efectivo-component :turno="$turno"/>
</div>
</div>
</div>
<div class="space-y-4"> <x-card class="space-y-4">
<label class="form-control"> <x-input label="Total Efectivo" value="{{Number::currency($this->totalEfectivo)}}" readonly/>
<div class="label"> <x-input label="Total Egresos" value="{{Number::currency($this->totalEgresos)}}" readonly/>
<span class="label-text">Total Efectivo</span> <x-input label="Total Documento" value="{{Number::currency($this->totalDocumentos)}}" readonly/>
</div> <hr class="border-b-1 my-4"/>
<input type="text" class="input input-bordered bg-neutral-content" <x-input label="Rendido" value="{{Number::currency($this->rendido)}}" readonly/>
value="{{Number::currency($this->totalEfectivo)}}" <x-input label="Debe Rendir" value="{{Number::currency($this->debeRendir)}}" readonly/>
readonly> <x-input label="Diferencia" class="font-bold {{$this->diferencia < 0 ? 'text-red-500' : 'text-green-500'}}"
</label> value="{{Number::currency($this->diferencia)}}" readonly/>
<label class="form-control"> </x-card>
<div class="label">
<span class="label-text">Total Egresos</span>
</div>
<input type="text" class="input input-bordered bg-neutral-content"
value="{{Number::currency($this->totalEgresos)}}"
readonly>
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Total Documentos</span>
</div>
<input type="text" class="input input-bordered bg-neutral-content"
value="{{Number::currency($this->totalDocumentos)}}"
readonly>
</label>
<div class="divider"></div>
<label class="form-control">
<div class="label">
<span class="label-text">Rendido</span>
</div>
<input type="text" class="input input-bordered bg-neutral-content"
value="{{Number::currency($this->rendido)}}"
readonly>
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Debe Rendir</span>
</div>
<input type="text" class="input input-bordered bg-neutral-content"
value="{{Number::currency($this->debeRendir)}}"
readonly>
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Diferencia</span>
</div>
<input type="text"
class="input input-bordered bg-neutral-content {{$this->diferencia < 0 ? 'text-red-500' : 'text-green-500'}}"
value="{{Number::currency($this->diferencia)}}"
readonly>
</label>
</div>
</div> </div>
</div> </div>

View File

@@ -1,100 +1,51 @@
@use(Illuminate\Support\Number) @use(Illuminate\Support\Number)
<div> <div>
<div class="flex flex-col sm:flex-row gap-2 justify-between items-baseline mb-4"> <div class="flex flex-col sm:flex-row gap-2 justify-between items-baseline mb-4">
<x-title>Cajas</x-title> <x-title>Cajas</x-title>
<button class="btn" wire:click="createTurno"> <x-button wire:click="createTurno" icon="plus">Registrar Caja</x-button>
<x-icons.plus/>
Registrar Caja
</button>
</div> </div>
<div class="flex mb-4"> <div class="flex">
<label class="form-control"> <x-date label="Fecha" wire:model.live="searchFecha" helpers/>
<div class="label">
<span class="label-text">Fecha</span>
</div>
<input type="date" class="input input-bordered" wire:model.live="searchFecha"/>
@error('fecha')
<p class="text-sm text-error">{{ $message }}</p>
@enderror
</label>
</div> </div>
<div class="overflox-x-auto"> <div class="mt-4">
<table class="table"> <x-table striped :headers="$this->headers" :rows="$this->rows" paginate>
<thead> @interact('column_fecha', $row)
<tr> {{$row->fecha->format('d-m-Y')}}
<th>Fecha</th> @endinteract
<th>Caja</th> @interact('column_ingresos', $row)
<th>Turno</th> {{Number::currency($row->ingresos()->sum('total'))}}
<th>Ingresos</th> @endinteract
<th>Egresos</th> @interact('column_egresos', $row)
<th>Arqueo</th> {{Number::currency($row->egresos()->sum('valor'))}}
<th class="text-end">Acciones</th> @endinteract
</tr> @interact('column_arqueo', $row)
</thead> <span class="font-bold {{$row->arqueo >= 0 ? 'text-green-500' : 'text-red-500'}}">
<tbody> {{Number::currency($row->arqueo)}}
@foreach($this->rows as $row) </span>
<tr> @endinteract
<td>{{$row->fecha->format('d-m-Y')}}</td> @interact('column_action', $row)
<td>{{$row->numero_caja}}</td> <x-button sm :href="route('cajas.edit', $row->id)" wire:navigate :key="uniqid()">
<td>{{$row->numero_turno}}</td> Editar
<td>{{Number::currency($row->ingresos()->sum('total'))}}</td> </x-button>
<td>{{Number::currency($row->egresos()->sum('valor'))}}</td> <x-button sm color="red" wire:click="confirmDelete('{{$row->id}}')" :key="uniqid()">
<td class="{{$row->arqueo >= 0 ? 'text-green-500' : 'text-red-500'}}">{{Number::currency($row->arqueo)}}</td> Eliminar
<td class="w-0 whitespace-nowrap"> </x-button>
<a class="btn btn-circle btn-sm" wire:navigate href="{{route('cajas.edit', $row->id)}}"> @endinteract
<x-icons.edit class="w-5 h-5"/> </x-table>
</a>
<button class="btn btn-circle btn-error btn-sm" wire:click="confirmDelete('{{$row->id}}')">
<x-icons.trash class="w-5 h-5"/>
</button>
</td>
</tr>
@endforeach
</tbody>
</table>
</div> </div>
<x-my-modal name="turno" title="Registrar Caja"> <x-modal title="Registrar Caja" wire center blur>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
<label class="form-control"> <x-date label="Fecha" wire:model="fecha" format="DD-MM-YYYY"/>
<div class="label"> <x-input type="number" label="Caja" wire:model="caja"/>
<span class="label-text">Fecha</span> <x-input type="number" label="Turno" wire:model="turno"/>
</div>
<input type="date" class="input input-bordered" wire:model.live="fecha"/>
@error('fecha')
<p class="text-sm text-error">{{ $message }}</p>
@enderror
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Caja</span>
</div>
<input type="number" class="input input-bordered" wire:model="caja"/>
@error('caja')
<p class="text-sm text-error">{{ $message }}</p>
@enderror
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Turno</span>
</div>
<input type="number" class="input input-bordered" wire:model="turno"/>
@error('turno')
<p class="text-sm text-error">{{ $message }}</p>
@enderror
</label>
</div> </div>
<x-slot:footer> <x-slot:footer>
<button class="btn" wire:click="closeTurnoModal"> <x-button color="secondary" icon="arrow-left" wire:click="closeTurnoModal">Volver</x-button>
<x-icons.arrow-left/> <x-button icon="plus" wire:click="storeTurno">Registrar Caja</x-button>
Volver
</button>
<button class="btn btn-primary" wire:click="storeTurno">
<x-icons.device-floppy/>
Registrar Caja
</button>
</x-slot:footer> </x-slot:footer>
</x-my-modal> </x-modal>
</div> </div>

View File

@@ -7,66 +7,32 @@
@endif @endif
</div> </div>
<form wire:submit.prevent="save"> <form wire:submit.prevent="save">
<label class="form-control"> <x-card class="space-y-4">
<div class="label"> <x-input label="Nombre" wire:model="name"/>
<span class="label-text">Nombre</span> <x-input label="Correo Electrónico" wire:model="email"/>
</div> <x-select.styled label="Roles" :options="$this->availableRoles" select="label:title|value:id" multiple
<input class="input input-bordered" wire:model="name"/> wire:model="roles"/>
</label>
<label class="form-control">
<div class="label">
<span class="label-text">Correo Electrónico</span>
</div>
<input type="email" class="input input-bordered" wire:model="email"/>
</label>
<label class="form-control"> @if($this->user)
<div class="label"> <x-checkbox label="Cambiar contraseña" wire:model.live="change_password"/>
<span class="label-text">Roles</span> @endif
</div>
<select class="select select-bordered" required wire:model="roles" multiple>
@foreach($this->availableRoles as $role)
<option value="{{$role->id}}">{{$role->title}}</option>
@endforeach
</select>
</label>
@if($this->user) @if(!$this->user || $change_password)
<div class="form-control"> <x-password label="Contraseña" wire:model="password"/>
<label class="label cursor-pointer w-0 whitespace-nowrap space-x-4"> <x-password label="Confirmación de la contraseña" wire:model="password_confirmation"/>
<span class="label-text">Cambiar contraseña</span> @endif
<input type="checkbox" class="toggle" wire:model.live="change_password"/>
</label>
</div>
@endif
@if(!$this->user || $change_password) <x-slot:footer>
<label class="form-control"> <x-button wire:navigate :href="route('usuarios.index')" icon="arrow-left" color="secondary">
<div class="label"> Volver
<span class="label-text">Contraseña</span> </x-button>
</div> <x-button type="submit" icon="plus">
<input type="password" class="input input-bordered" wire:model="password"/> Guardar
</label> </x-button>
<label class="form-control"> </x-slot:footer>
<div class="label"> </x-card>
<span class="label-text">Confirmación de la contraseña</span>
</div>
<input type="password" class="input input-bordered" wire:model="password_confirmation"/>
</label>
@endif
<div class="flex justify-end gap-2 mt-4">
<a wire:navigate href="{{route('usuarios.index')}}" class="btn">
<x-icons.arrow-left/>
Volver
</a>
<button type="submit" class="btn btn-primary">
<x-icons.plus/>
Guardar
</button>
</div>
</form> </form>
</div> </div>

View File

@@ -1,43 +1,29 @@
@use(App\Models\User) @php use App\Models\User; @endphp
<div> <div>
<div class="flex flex-col sm:flex-row gap-2 justify-between items-baseline mb-4"> <div class="flex flex-col sm:flex-row gap-2 justify-between items-baseline mb-4">
<x-title>Usuarios</x-title> <x-title>Usuarios</x-title>
@can('create', User::class) @can('create', User::class)
<button class="btn" href="{{route('usuarios.create')}}" wire:navigate> <x-button :href="route('usuarios.create')" wire:navigate icon="plus">Registrar Usuario</x-button>
<x-icons.plus/>
Registrar Usuario
</button>
@endcan @endcan
</div> </div>
<div class="mt-4">
<div class="overflox-x-auto"> <x-table striped :headers="$this->headers" :rows="$this->rows" paginate>
<table class="table"> @interact('column_roles', $row)
<thead> {{$row->roles->pluck('title')->join(', ')}}
<tr> @endinteract
<th>Nombre</th> @interact('column_action', $row)
<th>Email</th> @can('update', $row)
<th class="text-end">Acciones</th> <x-button sm :href="route('usuarios.edit', $row->id)" wire:navigate :key="uniqid()">
</tr> Editar
</thead> </x-button>
<tbody> @endcan
@foreach($this->rows as $row) @can('delete', $row)
<tr> <x-button sm color="red" wire:click="confirmDelete('{{$row->id}}')" :key="uniqid()">
<td>{{$row->name}}</td> Eliminar
<td>{{$row->email}}</td> </x-button>
<td class="w-0 whitespace-nowrap"> @endcan
<a class="btn btn-circle btn-sm" wire:navigate href="{{route('usuarios.edit', $row->id)}}"> @endinteract
<x-icons.edit class="w-5 h-5"/> </x-table>
</a>
<button class="btn btn-circle btn-error btn-sm" wire:click="confirmDelete('{{$row->id}}')">
<x-icons.trash class="w-5 h-5"/>
</button>
</td>
</tr>
@endforeach
</tbody>
</table>
</div> </div>
</div> </div>

View File

@@ -1,4 +1,6 @@
import defaultTheme from 'tailwindcss/defaultTheme'; import defaultTheme from 'tailwindcss/defaultTheme';
import colors from 'tailwindcss/colors';
import forms from '@tailwindcss/forms';
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
export default { export default {
@@ -18,47 +20,22 @@ export default {
sans: ['Inter', ...defaultTheme.fontFamily.sans], sans: ['Inter', ...defaultTheme.fontFamily.sans],
serif: ['Domine', ...defaultTheme.fontFamily.serif], serif: ['Domine', ...defaultTheme.fontFamily.serif],
}, },
colors: {
'primary': {
DEFAULT: colors.blue['500'],
...colors.blue,
},
'secondary': {
DEFAULT: colors.slate['500'],
...colors.slate,
},
'dark': {
DEFAULT: colors.slate['700'],
...colors.slate
}
}
}, },
}, },
daisyui: { plugins: [forms],
themes: [
"light",
"dark",
"cupcake",
"bumblebee",
"emerald",
"corporate",
"synthwave",
"retro",
"cyberpunk",
"valentine",
"halloween",
"garden",
"forest",
"aqua",
"lofi",
"pastel",
"fantasy",
"wireframe",
"black",
"luxury",
"dracula",
"cmyk",
"autumn",
"business",
"acid",
"lemonade",
"night",
"coffee",
"winter",
"dim",
"nord",
"sunset",
],
},
plugins: [
require('@tailwindcss/typography'),
require('daisyui'),
],
}; };