Compare commits

..

44 Commits

Author SHA1 Message Date
75be0410ad addres qoshish da api o'zgartirildi 2026-04-23 16:57:00 +05:00
18b652902f addres qoshish da api o'zgartirildi 2026-04-23 16:23:34 +05:00
73bacb864f addres qoshish da api o'zgartirildi 2026-04-23 16:20:43 +05:00
ca5b6402ea addres qoshish da api o'zgartirildi 2026-04-23 16:09:50 +05:00
5deccec8ba addres qoshish da api o'zgartirildi 2026-04-23 12:08:47 +05:00
1f2327c2d9 login va registerda sms eskizga otgkazildi 2026-04-09 11:04:24 +05:00
9d348f3e3a uppercese category qoshildi 2026-04-07 12:36:14 +05:00
48d96f32c1 uppercese category qoshildi 2026-04-07 12:15:16 +05:00
ea2f24f0a4 generatePdf: serve uploaded conclusion file instead of system-generated PDF
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 11:07:10 +05:00
5423f80fe6 Add estate.generate_pdf route and generatePdf method to EstateController
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 10:58:50 +05:00
41f29177b5 Remove tech_passport fields from estate_orders insert (column does not exist in DB)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 10:56:32 +05:00
0c38b4a8c9 Fix estate/auto create: remove show.js, loosen validation rules
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 10:53:14 +05:00
3b10c41c36 uppercese category qoshildi 2026-04-07 02:23:32 +05:00
48f7f784b9 uppercese category qoshildi 2026-04-06 21:55:50 +05:00
4d0f9b6309 uppercese category qoshildi 2026-04-06 20:23:17 +05:00
551dcb390c Implement OrderMembersController: invite appraisers, change status to started
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 17:37:24 +05:00
987f498ec9 Remove invalid umask from php-fpm pool config (not supported)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 17:23:18 +05:00
a464a13ebd Add .dockerignore to exclude storage and vendor from build context
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 17:16:48 +05:00
fe248c0994 Fix file permissions: set umask 0022 so created files are world-readable
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 17:15:27 +05:00
16f44e3a45 Fix nginx alias: remove try_files that breaks alias directive
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 17:11:36 +05:00
d360a45e91 Fix nginx: serve /storage/ directly from storage/app/public with alias
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 17:09:00 +05:00
855b6d542b Fix storage: use bind mount instead of named volume so nginx serves files
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 16:58:22 +05:00
9aeb9a7b8a Fix storage volume: mount directly to app/public so nginx can serve files
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 16:53:53 +05:00
d706eb9a87 Add storage symlink to git; fix entrypoint to recreate if broken
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 16:44:06 +05:00
bdb49281b8 Implement ConclusionController: PDF upload with QR watermark, debit creation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 16:42:05 +05:00
50e0f1b8ef Generate QR code on order create; implement reGenerate route
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 16:30:55 +05:00
3d8edf0b39 Implement file upload, download, and delete in FileStoreController
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 16:27:14 +05:00
2d8e1f95ff Add client-side required validation to create/edit order forms
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 16:24:27 +05:00
4d5098a921 Add File model with getFileSizeInMB; pass sizeInStorage to show-documents
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 16:23:16 +05:00
fee24d1bce Implement store and update for auto and estate orders
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 16:18:53 +05:00
edf15ae285 Force HTTPS scheme in production via AppServiceProvider
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 15:21:33 +05:00
ecaf8790dc Fix multiple undefined variable errors across pages
- show-documents: add $type, $countDocs, $countMediaFiles, $otherFiles, paginate files
- show-team + show: JOIN users to order_members for name/avatar/phone
- BonusController: load appraiser and order per bonus row
- ProfileController: fix wrong view names (index→profile, show-*→activities/projects/documents)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 15:11:24 +05:00
c363c76f31 Add conclusions variable to auto and estate show pages
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 06:59:21 +05:00
c2265a155d Fix entrypoint: remove set -e so php-fpm always starts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 06:39:16 +05:00
e68efae28a Fix create/edit pages missing vars; add storage:link entrypoint
- AutoController create/edit: add purposeCases, dillers
- EstateController create/edit: add purposeCases, districts, dillers
- Add entrypoint.sh to run storage:link on container start

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 06:32:13 +05:00
8c381ba1ee Fix show pages: add diller, regions, districts to order object
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 06:11:38 +05:00
6c985c1b29 Fix DB schema mismatches from backup import
- purpose/concern/region/district tables use uz/ru/cr instead of name
- auto_orders/estate_orders use purpose_id not purpose
- Add ownerName/owner computed fields from owner_first/last_name
- Fix appraiserChart to use order_members instead of appraiser_id
- Fix DebitController to join appraiser and order relations
- Fix role queries to be case-insensitive (DB has mixed case)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 06:05:09 +05:00
b5b58987fb Fix TrackingActionTypeEnum case names to match view usage
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 05:54:33 +05:00
e84299153f Fix car_mark error: recent-orders component is auto-only
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 05:52:42 +05:00
446736202c Fix customer property: add ordered_customer as customer alias in queries
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 05:50:13 +05:00
73b0041643 Fix all page controllers and missing enums
- Update all controllers to pass required variables to views
- Add MediaTypeEnum, OrderTypeEnum, TrackingActionTypeEnum enums
- Fix RoleEnum, OrderStatusEnum completeness

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 05:48:11 +05:00
ee6e7fa86d Fix missing enums and dashboard variables
- Add RoleEnum::MANAGER case
- Add OrderStatusEnum with all statuses and getLabel() method
- Fix HomeController::index() to pass all required view variables

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 05:36:24 +05:00
4d5b65a98a uppercese category qoshildi 2026-04-06 05:23:20 +05:00
eaadf86ea1 Fix storage permissions: use named volume to avoid bind mount chown errors
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 05:22:58 +05:00
112 changed files with 1520 additions and 311 deletions

View File

@@ -0,0 +1,4 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by fontconfig.
# For information about cache directory tags, see:
# http://www.brynosaurus.com/cachedir/

View File

@@ -5,7 +5,8 @@
"Bash(docker exec:*)",
"Bash(curl -s -o /dev/null -w \"%{http_code}\" http://localhost:8005/)",
"Bash(curl -v http://localhost:8005/)",
"Bash(curl -s -o /dev/null -w \"%{http_code}\" http://localhost:8005/login)"
"Bash(curl -s -o /dev/null -w \"%{http_code}\" http://localhost:8005/login)",
"Bash(git add:*)"
]
}
}

7
.dockerignore Normal file
View File

@@ -0,0 +1,7 @@
storage/app/public/
storage/logs/
storage/framework/
node_modules/
vendor/
.git/
postgres/

4
.gitignore vendored
View File

@@ -8,7 +8,6 @@ bootstrap/compiled.php
app/storage/
# Laravel 5 & Lumen specific
public/storage
public/hot
# Laravel 5 & Lumen specific with changed public path
@@ -24,8 +23,9 @@ Homestead.json
composer.lock
package-lock.json
/.idea
/storage/
/storage/logs/
/storage/framework/
/storage/app/private/
/.vscode/
/public/images/
/postgres/

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

View File

@@ -9,6 +9,7 @@ RUN apt-get update && apt-get install -y \
libzip-dev \
zip unzip \
git \
ghostscript \
libmagickwand-dev --no-install-recommends && \
docker-php-ext-install bcmath gd zip && \
docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql && \
@@ -19,6 +20,7 @@ RUN apt-get update && apt-get install -y \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY _docker/app/php.ini /usr/local/etc/php/conf.d/php.ini
COPY _docker/app/www.conf /usr/local/etc/php-fpm.d/www.conf
COPY app /var/www/app
COPY bootstrap /var/www/bootstrap
@@ -52,9 +54,19 @@ RUN composer install \
--no-autoloader \
--prefer-dist
RUN composer dump-autoload --no-scripts --optimize --classmap-authoritative && \
RUN mkdir -p /var/www/storage/app/public \
/var/www/storage/framework/cache \
/var/www/storage/framework/sessions \
/var/www/storage/framework/views \
/var/www/storage/logs && \
composer dump-autoload --no-scripts --optimize --classmap-authoritative && \
chown -R root:www-data /var/www && \
chmod 755 -R /var/www && \
chmod -R 775 /var/www/bootstrap/cache
chmod -R 775 /var/www/storage /var/www/bootstrap/cache
COPY _docker/app/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
WORKDIR /var/www
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

16
_docker/app/entrypoint.sh Normal file
View File

@@ -0,0 +1,16 @@
#!/bin/sh
umask 022
cd /var/www
# Ensure storage symlink exists (recreate if missing or broken)
if [ ! -L /var/www/public/storage ] || [ ! -e /var/www/public/storage ]; then
rm -rf /var/www/public/storage
ln -sfn /var/www/storage/app/public /var/www/public/storage
fi
# Cache config (ignore errors)
php artisan config:cache --no-ansi 2>/dev/null || true
exec php-fpm

9
_docker/app/www.conf Normal file
View File

@@ -0,0 +1,9 @@
[www]
user = www-data
group = www-data
listen = 9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

View File

@@ -4,7 +4,13 @@ server {
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
client_max_body_size 1024M;
disable_symlinks off;
location /storage/ {
alias /var/www/storage/app/public/;
}
location / {
try_files $uri /index.php?$query_string;
}

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Enums;
enum MediaTypeEnum: string
{
case ALL = 'all';
case PASSPORT_CUSTOMER = 'passport_customer';
case OBJECT_PHOTO = 'object_photo';
case OBJECT_FILES = 'object_files';
case CERTIFICATE = 'certificate';
case APPRAISER_CERTIFICATE = 'appraiser_certificate';
case INSURANCE_POLICY = 'insurance_policy';
case COMPARES = 'compares';
case PARTICIPATE_CERTIFICATE = 'participate_certificate';
case ADDITIONAL = 'additional';
public static function getLabel(string $type): string
{
return match($type) {
'passport_customer' => 'translation.passport-customer',
'object_photo' => 'translation.object-photo',
'object_files' => 'translation.object-files',
'certificate' => 'translation.certificate',
'appraiser_certificate' => 'translation.appraiser-certificate',
'insurance_policy' => 'translation.insurance-policy',
'compares' => 'translation.compares',
'participate_certificate'=> 'translation.participate-certificate',
'additional' => 'translation.additional',
default => $type,
};
}
}

View File

@@ -0,0 +1,26 @@
<?php
namespace App\Enums;
enum OrderStatusEnum: string
{
case DRAFT = 'draft';
case STARTED = 'started';
case FINISHED = 'finished';
case MODERATED = 'moderated';
case APPROVED = 'approved';
case REJECTED = 'rejected';
public static function getLabel(string $status): string
{
return match($status) {
'draft' => 'translation.draft',
'started' => 'translation.started',
'finished' => 'translation.finished',
'moderated' => 'translation.moderated',
'approved' => 'translation.approved',
'rejected' => 'translation.rejected',
default => $status,
};
}
}

View File

@@ -0,0 +1,9 @@
<?php
namespace App\Enums;
enum OrderTypeEnum: string
{
case AUTO = 'auto_';
case ESTATE = 'estate_';
}

View File

@@ -5,6 +5,7 @@ namespace App\Enums;
enum RoleEnum: string
{
case ADMIN = 'admin';
case MANAGER = 'manager';
case USER = 'user';
case APPRAISER = 'appraiser';
case DILLER = 'diller';

View File

@@ -0,0 +1,13 @@
<?php
namespace App\Enums;
enum TrackingActionTypeEnum: string
{
case ORDER_CREATED = 'order_created';
case ORDER_UPDATED = 'order_updated';
case MEMBERS_ADDED = 'members_added';
case ATTACHMENTS = 'attachments';
case COMPLETED = 'completed';
case REJECTED = 'rejected';
}

View File

@@ -3,56 +3,318 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\QrController;
use setasign\Fpdi\Fpdi;
use Carbon\Carbon;
class AutoController extends Controller
{
public function index()
private function parseDate(?string $date): ?string
{
return view('auto.index');
if (!$date) return null;
try {
return Carbon::createFromFormat('d.m.Y', $date)->format('Y-m-d');
} catch (\Exception $e) {
return $date;
}
}
private function ordersQuery()
{
return DB::table('auto_orders as o')
->leftJoin('purposes as p', 'p.id', '=', 'o.purpose_id')
->leftJoin('concerns as c', 'c.id', '=', 'o.car_category')
->selectRaw('o.*, o.ordered_customer as customer, p as "purposeOne"')
->selectRaw('o.*, o.ordered_customer as customer')
->addSelect([
'purpose_uz' => DB::table('purposes')->select('uz')->whereColumn('id', 'o.purpose_id'),
'purpose_ru' => DB::table('purposes')->select('ru')->whereColumn('id', 'o.purpose_id'),
'purpose_cr' => DB::table('purposes')->select('cr')->whereColumn('id', 'o.purpose_id'),
'concern_name' => DB::table('concerns')->select('name')->whereColumn('id', 'o.car_category'),
]);
}
public function index(Request $request)
{
$filters = $request->only(['search', 'period', 'status', 'appraiser', 'purpose_id', 'car_category']);
$size = $request->get('size', 20);
$query = DB::table('auto_orders as o')
->selectRaw('o.*, o.ordered_customer as customer, CONCAT_WS(\' \', o.owner_last_name, o.owner_first_name, o.owner_patronymic) as "ownerName"')
->addSelect([
'purpose_uz' => DB::table('purposes')->select('uz')->whereColumn('id', 'o.purpose_id'),
'purpose_ru' => DB::table('purposes')->select('ru')->whereColumn('id', 'o.purpose_id'),
'purpose_cr' => DB::table('purposes')->select('cr')->whereColumn('id', 'o.purpose_id'),
'concern_uz' => DB::table('concerns')->select('uz')->whereColumn('id', 'o.car_category'),
'concern_ru' => DB::table('concerns')->select('ru')->whereColumn('id', 'o.car_category'),
'concern_cr' => DB::table('concerns')->select('cr')->whereColumn('id', 'o.car_category'),
])
->orderByDesc('o.id');
if (!empty($filters['search'])) {
$s = '%' . $filters['search'] . '%';
$query->where(function ($q) use ($s) {
$q->where('o.number', 'like', $s)->orWhere('o.ordered_customer', 'like', $s);
});
}
if (!empty($filters['status'])) $query->where('o.status', $filters['status']);
if (!empty($filters['purpose_id'])) $query->where('o.purpose_id', $filters['purpose_id']);
if (!empty($filters['car_category'])) $query->where('o.car_category', $filters['car_category']);
$rawOrders = $query->paginate($size)->withQueryString();
$orders = $rawOrders->through(function ($o) {
$o->purposeOne = (object)['uz' => $o->purpose_uz, 'ru' => $o->purpose_ru, 'cr' => $o->purpose_cr];
$o->concernOne = (object)['uz' => $o->concern_uz, 'ru' => $o->concern_ru, 'cr' => $o->concern_cr];
return $o;
});
$stats = DB::table('auto_orders')->selectRaw('status, count(*) as cnt')->groupBy('status')->pluck('cnt', 'status');
$purposeCases = DB::table('purposes')->get();
$concerns = DB::table('concerns')->get();
return view('auto.index', compact('orders', 'stats', 'filters', 'size', 'purposeCases', 'concerns'));
}
public function create()
{
return view('auto.create');
$concerns = DB::table('concerns')->get();
$purposeCases = DB::table('purposes')->get();
$regions = DB::table('regions')->get();
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->where('status', 'active')->get();
$dillers = DB::table('users')->whereRaw('LOWER(role) = ?', ['diller'])->where('status', 'active')->get();
return view('auto.create', compact('concerns', 'purposeCases', 'regions', 'appraisers', 'dillers'));
}
public function store(Request $request)
{
return redirect()->route('auto.index');
// Sanitize cost before validation
if ($request->has('cost')) {
$request->merge([
'cost' => str_replace(',', '', $request->cost)
]);
}
$request->validate([
'number' => 'required',
'purpose_id' => 'required',
'ordered_customer' => 'required',
'customer_type' => 'required|in:physical,juridical',
'owner_type' => 'required|in:physical,juridical',
'car_category' => 'required',
'car_mark' => 'required',
'cost' => 'required|numeric',
]);
$id = DB::table('auto_orders')->insertGetId([
'number' => $request->number,
'status' => $request->status ?? 'draft',
'purpose_id' => $request->purpose_id,
'diller_id' => $request->diller_id ?: null,
'ordered_customer' => $request->ordered_customer,
'ordered_customer_phone' => $request->ordered_customer_phone,
'customer_type' => $request->customer_type,
'customer_last_name' => $request->customer_last_name,
'customer_first_name' => $request->customer_first_name,
'customer_patronymic' => $request->customer_patronymic,
'customer_company' => $request->customer_company,
'owner_type' => $request->owner_type,
'owner_last_name' => $request->owner_last_name,
'owner_first_name' => $request->owner_first_name,
'owner_patronymic' => $request->owner_patronymic,
'owner_company' => $request->owner_company,
'car_category' => $request->car_category,
'car_mark' => $request->car_mark,
'color' => $request->color,
'made_date' => $this->parseDate($request->made_date),
'body' => $request->body,
'engine' => $request->engine,
'car_number' => $request->car_number,
'type' => $request->type,
'shassi' => $request->shassi,
'tech_passport' => $request->tech_passport,
'tech_given_date' => $this->parseDate($request->tech_given_date),
'tech_given_whom' => $request->tech_given_whom,
'cost' => (int)str_replace(',', '', $request->cost ?? 0),
'note' => $request->note,
'created_at' => $this->parseDate($request->created_at) ?? now(),
'updated_at' => now(),
]);
QrController::generateQr($id, 'auto_');
return redirect()->route('auto.show', $id);
}
public function edit($id)
{
return view('auto.edit', compact('id'));
$order = DB::table('auto_orders')->find($id);
$concerns = DB::table('concerns')->get();
$purposeCases = DB::table('purposes')->get();
$regions = DB::table('regions')->get();
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->where('status', 'active')->get();
$dillers = DB::table('users')->whereRaw('LOWER(role) = ?', ['diller'])->where('status', 'active')->get();
return view('auto.edit', compact('order', 'concerns', 'purposeCases', 'regions', 'appraisers', 'dillers'));
}
public function update(Request $request, $id)
{
return redirect()->route('auto.index');
// Sanitize cost before validation
if ($request->has('cost')) {
$request->merge([
'cost' => str_replace(',', '', $request->cost)
]);
}
$request->validate([
'number' => 'required',
'purpose_id' => 'required',
'ordered_customer' => 'required',
'customer_type' => 'required|in:physical,juridical',
'owner_type' => 'required|in:physical,juridical',
'car_category' => 'required',
'car_mark' => 'required',
'cost' => 'required|numeric',
]);
DB::table('auto_orders')->where('id', $id)->update([
'number' => $request->number,
'status' => $request->status,
'purpose_id' => $request->purpose_id,
'diller_id' => $request->diller_id ?: null,
'ordered_customer' => $request->ordered_customer,
'ordered_customer_phone' => $request->ordered_customer_phone,
'customer_type' => $request->customer_type,
'customer_last_name' => $request->customer_last_name,
'customer_first_name' => $request->customer_first_name,
'customer_patronymic' => $request->customer_patronymic,
'customer_company' => $request->customer_company,
'owner_type' => $request->owner_type,
'owner_last_name' => $request->owner_last_name,
'owner_first_name' => $request->owner_first_name,
'owner_patronymic' => $request->owner_patronymic,
'owner_company' => $request->owner_company,
'car_category' => $request->car_category,
'car_mark' => $request->car_mark,
'color' => $request->color,
'made_date' => $this->parseDate($request->made_date),
'body' => $request->body,
'engine' => $request->engine,
'car_number' => $request->car_number,
'type' => $request->type,
'shassi' => $request->shassi,
'tech_passport' => $request->tech_passport,
'tech_given_date' => $this->parseDate($request->tech_given_date),
'tech_given_whom' => $request->tech_given_whom,
'cost' => (int)str_replace(',', '', $request->cost ?? 0),
'note' => $request->note,
'created_at' => $this->parseDate($request->created_at) ?? now(),
'updated_at' => now(),
]);
return redirect()->route('auto.show', $id);
}
public function show($order)
{
return view('auto.show', compact('order'));
$order = DB::table('auto_orders as o')
->selectRaw('o.*, o.ordered_customer as customer, CONCAT_WS(\' \', o.owner_last_name, o.owner_first_name, o.owner_patronymic) as "ownerName"')
->addSelect([
'purpose_uz' => DB::table('purposes')->select('uz')->whereColumn('id', 'o.purpose_id'),
'purpose_ru' => DB::table('purposes')->select('ru')->whereColumn('id', 'o.purpose_id'),
'purpose_cr' => DB::table('purposes')->select('cr')->whereColumn('id', 'o.purpose_id'),
'concern_uz' => DB::table('concerns')->select('uz')->whereColumn('id', 'o.car_category'),
'concern_ru' => DB::table('concerns')->select('ru')->whereColumn('id', 'o.car_category'),
'concern_cr' => DB::table('concerns')->select('cr')->whereColumn('id', 'o.car_category'),
])
->where('o.id', $order)->first();
if ($order) {
$order->purposeOne = (object)['uz' => $order->purpose_uz, 'ru' => $order->purpose_ru, 'cr' => $order->purpose_cr];
$order->concernOne = (object)['uz' => $order->concern_uz, 'ru' => $order->concern_ru, 'cr' => $order->concern_cr];
}
if ($order) {
$dillerUser = $order->diller_id ? DB::table('users')->find($order->diller_id) : null;
$order->diller = $dillerUser->name ?? '';
$order->dillerUser = $dillerUser;
}
$members = DB::table('order_members as om')
->leftJoin('users as u', 'u.id', '=', 'om.user_id')
->select('om.*', 'u.name', 'u.avatar', 'u.phone', 'u.role')
->where('om.order_id', $order->id ?? 0)->where('om.order_type', 'auto_')->get();
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->where('status', 'active')->get();
$isAppraisers = $members->where('user_id', auth()->id())->count() > 0;
$files = DB::table('files')->where('order_id', $order->id ?? 0)->where('order_type', 'auto_')->get();
$conclusions = DB::table('files')->where('order_id', $order->id ?? 0)->where('order_type', 'conclusion_')->get();
return view('auto.show', compact('order', 'members', 'appraisers', 'isAppraisers', 'files', 'conclusions'));
}
public function showActivities($order)
{
return view('auto.show-activities', compact('order'));
$order = DB::table('auto_orders')->find($order);
$actions = DB::table('tracking_actions')->where('order_id', $order->id ?? 0)->latest()->get();
return view('auto.show-activities', compact('order', 'actions'));
}
public function showTeam($order)
{
return view('auto.show-team', compact('order'));
$order = DB::table('auto_orders')->find($order);
$members = DB::table('order_members as om')
->leftJoin('users as u', 'u.id', '=', 'om.user_id')
->select('om.*', 'u.name', 'u.avatar', 'u.phone', 'u.role')
->where('om.order_id', $order->id ?? 0)->where('om.order_type', 'auto_')->get()
->map(function ($member) {
$member->started = DB::table('order_members')->where('user_id', $member->user_id)->count();
$member->finished = 0; // Defaulting for now
$member->approved = 0;
$member->rejected = 0;
return $member;
});
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->where('status', 'active')->get();
return view('auto.show-team', compact('order', 'members', 'appraisers'));
}
public function showDocuments($order)
public function showDocuments($order, Request $request)
{
return view('auto.show-documents', compact('order'));
$order = DB::table('auto_orders')->find($order);
$type = $request->get('type', 'ALL');
$filesQuery = DB::table('files')->where('order_id', $order->id ?? 0)->where('order_type', 'auto_');
if ($type !== 'ALL') {
$filesQuery->where('type', $type);
}
$files = $filesQuery->paginate(20)->withQueryString();
$allFiles = DB::table('files')->where('order_id', $order->id ?? 0)->where('order_type', 'auto_')->get();
$countDocs = $allFiles->whereIn('type', ['passport_customer', 'certificate', 'appraiser_certificate', 'insurance_policy', 'participate_certificate'])->count();
$countMediaFiles = $allFiles->whereIn('type', ['object_photo', 'object_files', 'compares'])->count();
$otherFiles = $allFiles->where('type', 'additional')->count();
$sizeInStorage = $allFiles->sum('size_in_bytes');
return view('auto.show-documents', compact('order', 'files', 'type', 'countDocs', 'countMediaFiles', 'otherFiles', 'sizeInStorage'));
}
public function orderClone($id)
{
return redirect()->route('auto.index');
}
public function generatePdf($id)
{
// If uploaded conclusion exists — serve it directly
$conclusionFile = DB::table('files')
->where('order_id', $id)
->where('order_type', 'conclusion_')
->orderByDesc('created_at')
->first();
if ($conclusionFile) {
$path = storage_path('app/public' . str_replace('/storage', '', $conclusionFile->path));
if (file_exists($path)) {
return response()->file($path, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="' . $conclusionFile->name . '.pdf"',
]);
}
}
abort(404, 'Xulosa fayli topilmadi');
}
}

View File

@@ -3,12 +3,23 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\DB;
class BonusController extends Controller
{
public function index()
public function index(Request $request)
{
return view('bonus.index');
$size = $request->get('size', 20);
$rawBonuses = DB::table('bonuses')->orderByDesc('id')->paginate($size)->withQueryString();
$bonuses = $rawBonuses->through(function ($b) {
$b->appraiser = $b->appraiser_id ? DB::table('users')->select('id', 'name', 'phone')->find($b->appraiser_id) : null;
$table = ($b->order_type ?? '') === 'auto_' ? 'auto_orders' : 'estate_orders';
$b->order = $b->order_id ? DB::table($table)->select('id', 'number')->find($b->order_id) : null;
return $b;
});
$bonus = null;
return view('bonus.index', compact('bonuses', 'bonus', 'size'));
}
public function create()
@@ -23,12 +34,14 @@ class BonusController extends Controller
public function show($id)
{
return view('bonus.show', compact('id'));
$bonus = DB::table('bonuses')->find($id);
return view('bonus.show', compact('bonus'));
}
public function edit($id)
{
return view('bonus.edit', compact('id'));
$bonus = DB::table('bonuses')->find($id);
return view('bonus.edit', compact('bonus'));
}
public function update(Request $request, $id)

View File

@@ -3,12 +3,17 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CertificateController extends Controller
{
public function index()
public function index(Request $request)
{
return view('certificate.index');
$size = $request->get('size', 20);
$certificates = DB::table('certificates')->orderByDesc('id')->paginate($size);
$certificate = null;
$message = session('message');
return view('certificate.index', compact('certificates', 'certificate', 'message', 'size'));
}
public function create()
@@ -23,12 +28,14 @@ class CertificateController extends Controller
public function show($id)
{
return view('certificate.show', compact('id'));
$certificate = DB::table('certificates')->find($id);
return view('certificate.show', compact('certificate'));
}
public function edit($id)
{
return view('certificate.edit', compact('id'));
$certificate = DB::table('certificates')->find($id);
return view('certificate.edit', compact('certificate'));
}
public function update(Request $request, $id)

View File

@@ -3,41 +3,46 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ConcernController extends Controller
{
public function index()
{
return view('concerns.index');
$concerns = DB::table('concerns')->get();
$concern = null;
return view('concerns.index', compact('concerns', 'concern'));
}
public function create()
{
return view('concerns.create');
}
public function create() { return view('concerns.create'); }
public function store(Request $request)
{
DB::table('concerns')->insert(['uz' => $request->uz ?? $request->name, 'ru' => $request->ru ?? $request->name, 'cr' => $request->cr ?? $request->name, 'created_at' => now(), 'updated_at' => now()]);
return redirect()->route('concerns.index');
}
public function show($id)
{
return view('concerns.show', compact('id'));
$concern = DB::table('concerns')->find($id);
return view('concerns.show', compact('concern'));
}
public function edit($id)
{
return view('concerns.edit', compact('id'));
$concern = DB::table('concerns')->find($id);
return view('concerns.edit', compact('concern'));
}
public function update(Request $request, $id)
{
DB::table('concerns')->where('id', $id)->update(['uz' => $request->uz ?? $request->name, 'ru' => $request->ru ?? $request->name, 'cr' => $request->cr ?? $request->name, 'updated_at' => now()]);
return redirect()->route('concerns.index');
}
public function destroy($id)
{
DB::table('concerns')->delete($id);
return redirect()->route('concerns.index');
}
}

View File

@@ -3,21 +3,202 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use setasign\Fpdi\Fpdi;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
class ConclusionController extends Controller
{
public function create($id, $type)
{
return view('conclusion.create', compact('id', 'type'));
// type is enum name: 'AUTO' or 'ESTATE'
$orderType = $type === 'AUTO' ? 'auto_' : 'estate_';
$table = $type === 'AUTO' ? 'auto_orders' : 'estate_orders';
$order = DB::table($table . ' as o')
->selectRaw('o.*, o.ordered_customer as customer, CONCAT_WS(\' \', o.owner_last_name, o.owner_first_name, o.owner_patronymic) as owner')
->where('o.id', $id)->first();
if ($order) {
$dillerUser = $order->diller_id ? DB::table('users')->find($order->diller_id) : null;
$order->diller = $dillerUser->name ?? '';
}
return view('conclusion.add', compact('id', 'type', 'order'));
}
public function store(Request $request)
{
return redirect()->back();
$orderId = $request->input('order_id');
$orderType = $request->input('order_type'); // 'AUTO' or 'ESTATE'
$dbType = $orderType === 'AUTO' ? 'auto_' : 'estate_';
$table = $orderType === 'AUTO' ? 'auto_orders' : 'estate_orders';
// Update order prices
$updateData = ['updated_at' => now()];
if ($request->filled('object_price')) {
$updateData['object_price'] = preg_replace('/\D/', '', $request->object_price);
}
if ($request->filled('price')) {
$updateData['price'] = preg_replace('/\D/', '', $request->price);
}
DB::table($table)->where('id', $orderId)->update($updateData);
// Create debit if is_diller = yes
if ($request->input('is_diller') === 'yes') {
$order = DB::table($table)->find($orderId);
DB::table('debits')->insert([
'order_id' => $orderId,
'order_type' => $dbType,
'appraiser_id' => auth()->id(),
'cost' => $order->cost ?? 0,
'status' => 'nopaid',
'expired' => $request->input('expired'),
'customer' => $order->ordered_customer ?? '',
'created_at' => now(),
'updated_at' => now(),
]);
}
// Handle PDF file upload with QR watermark
if ($request->hasFile('file')) {
$file = $request->file('file');
$ext = strtolower($file->getClientOriginalExtension());
$name = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
$size = $file->getSize();
$dir = 'public/attachments/' . $dbType . $orderId;
Storage::makeDirectory($dir);
$tmpPath = $file->getPathname();
$outputName = Str::uuid() . '.pdf';
$outputPath = storage_path('app/' . $dir . '/' . $outputName);
if ($ext === 'pdf') {
// Add QR watermark to PDF
try {
$qrPath = storage_path('app/public/attachments/' . $dbType . $orderId . '/qr.png');
if (!file_exists($qrPath)) {
Storage::makeDirectory('public/attachments/' . $dbType . $orderId);
$cleanType = strtolower($orderType);
$qrContent = route('qr.verify', ['type' => $cleanType, 'id' => $orderId]);
$qrImage = QrCode::format('png')->size(150)->generate($qrContent);
file_put_contents($qrPath, $qrImage);
chmod($qrPath, 0644);
}
// Convert PDF to 1.4 compatible format so FPDI can parse any PDF version
$gsTmp = tempnam(sys_get_temp_dir(), 'gs_') . '.pdf';
exec('gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -sOutputFile=' . escapeshellarg($gsTmp) . ' ' . escapeshellarg($tmpPath) . ' 2>/dev/null', $gsOut, $gsCode);
if ($gsCode === 0 && file_exists($gsTmp) && filesize($gsTmp) > 0) {
$tmpPath = $gsTmp;
}
$pdf = new Fpdi();
$pageCount = $pdf->setSourceFile($tmpPath);
$qrSize = 30; // mm
for ($i = 1; $i <= $pageCount; $i++) {
$tpl = $pdf->importPage($i);
$size2 = $pdf->getTemplateSize($tpl);
$pdf->AddPage($size2['orientation'], [$size2['width'], $size2['height']]);
$pdf->useTemplate($tpl);
if ($i === 1) {
// First page: right side, in the blank area below header separator lines
$sz = 35;
$qrX = $size2['width'] - $sz - 18;
$qrY = 15;
} else {
// Other pages: bottom-right
$sz = 22;
$qrX = $size2['width'] - $sz - 8;
$qrY = $size2['height'] - $sz - 6;
}
$pdf->SetFillColor(255, 255, 255);
$pdf->Rect($qrX - 1, $qrY - 1, $sz + 2, $sz + 2, 'F');
$pdf->Image($qrPath, $qrX, $qrY, $sz, $sz);
}
// Append certificates from the database
$certificates = DB::table('certificates')->orderBy('sort')->get();
foreach ($certificates as $certificate) {
$certPath = storage_path('app/' . $certificate->path);
if (file_exists($certPath)) {
$extCert = strtolower(pathinfo($certPath, PATHINFO_EXTENSION));
if ($extCert === 'pdf') {
$certPageCount = $pdf->setSourceFile($certPath);
for ($j = 1; $j <= $certPageCount; $j++) {
$tplCert = $pdf->importPage($j);
$sizeCert = $pdf->getTemplateSize($tplCert);
$pdf->AddPage($sizeCert['orientation'], [$sizeCert['width'], $sizeCert['height']]);
$pdf->useTemplate($tplCert);
$cqX = $sizeCert['width'] - 22 - 8;
$cqY = $sizeCert['height'] - 22 - 6;
$pdf->SetFillColor(255, 255, 255);
$pdf->Rect($cqX - 1, $cqY - 1, 24, 24, 'F');
$pdf->Image($qrPath, $cqX, $cqY, 22, 22);
}
} elseif (in_array($extCert, ['jpg', 'jpeg', 'png'])) {
$pdf->AddPage('P', 'A4');
$pdf->Image($certPath, 0, 0, 210, 297);
$pdf->SetFillColor(255, 255, 255);
$pdf->Rect(210 - 22 - 8 - 1, 297 - 22 - 6 - 1, 24, 24, 'F');
$pdf->Image($qrPath, 210 - 22 - 8, 297 - 22 - 6, 22, 22);
}
}
}
$pdf->Output('F', $outputPath);
} catch (\Exception $e) {
\Illuminate\Support\Facades\Log::error('ConclusionController PDF/QR failed: ' . $e->getMessage(), [
'order_id' => $orderId, 'type' => $orderType, 'file' => $e->getFile(), 'line' => $e->getLine(),
]);
copy($tmpPath, $outputPath);
}
} else {
$file->move(storage_path('app/' . $dir), $outputName);
}
$storagePath = '/storage/attachments/' . $dbType . $orderId . '/' . $outputName;
DB::table('files')->insert([
'id' => (string) Str::uuid(),
'path' => $storagePath,
'extension' => $ext,
'order_id' => $orderId,
'order_type' => 'conclusion_',
'type' => 'conclusion',
'name' => $name,
'size' => round($size / 1024 / 1024, 2),
'size_in_bytes' => $size,
'created_at' => now(),
'updated_at' => now(),
]);
DB::table($table)->where('id', $orderId)->update([
'status' => \App\Enums\OrderStatusEnum::FINISHED->name,
'updated_at' => now(),
]);
}
$route = $orderType === 'AUTO' ? 'auto.show' : 'estate.show';
return redirect()->route($route, $orderId);
}
public function reject(Request $request)
{
$orderId = $request->input('order_id');
$orderType = $request->input('order_type'); // 'AUTO' or 'ESTATE'
$table = $orderType === 'AUTO' ? 'auto_orders' : 'estate_orders';
DB::table($table)->where('id', $orderId)->update([
'status' => 'rejected',
'updated_at' => now(),
]);
return redirect()->back();
}

View File

@@ -3,17 +3,50 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class DebitController extends Controller
{
public function index()
public function index(Request $request)
{
return view('debit.index');
$filters = $request->only(['search', 'status', 'appraiser']);
$size = $request->get('size', 20);
$query = DB::table('debits as d')
->leftJoin('users as u', 'u.id', '=', 'd.appraiser_id')
->select('d.*')
->selectRaw('u.name as appraiser_name, u.id as appraiser_user_id')
->orderByDesc('d.id');
if (!empty($filters['appraiser'])) $query->where('d.appraiser_id', $filters['appraiser']);
if (!empty($filters['status'])) $query->where('d.status', $filters['status']);
$rawDebits = $query->paginate($size)->withQueryString();
$debits = $rawDebits->through(function ($d) {
$d->appraiser = (object)['id' => $d->appraiser_user_id, 'name' => $d->appraiser_name];
// get order number
if ($d->order_id && $d->order_type) {
$table = $d->order_type === 'auto_' ? 'auto_orders' : 'estate_orders';
$ord = DB::table($table)->select('id', 'number')->find($d->order_id);
$d->order = $ord;
} else {
$d->order = null;
}
return $d;
});
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->get();
$debit = null;
$appraiser = null;
return view('debit.index', compact('debits', 'appraisers', 'filters', 'debit', 'appraiser', 'size'));
}
public function create()
{
return view('debit.create');
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->get();
return view('debit.create', compact('appraisers'));
}
public function store(Request $request)
@@ -23,12 +56,15 @@ class DebitController extends Controller
public function show($id)
{
return view('debit.show', compact('id'));
$debit = DB::table('debits')->find($id);
return view('debit.show', compact('debit'));
}
public function edit($id)
{
return view('debit.edit', compact('id'));
$debit = DB::table('debits')->find($id);
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->get();
return view('debit.edit', compact('debit', 'appraisers'));
}
public function update(Request $request, $id)

View File

@@ -3,11 +3,15 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class DillerController extends Controller
{
public function __invoke(Request $request)
{
return view('diller.index');
$size = $request->get('size', 20);
$dillers = DB::table('users')->whereRaw('LOWER(role) = ?', ['diller'])->paginate($size);
$user = auth()->user();
return view('diller.index', compact('dillers', 'user', 'size'));
}
}

View File

@@ -3,41 +3,46 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class DistrictController extends Controller
{
public function index()
{
return view('districts.index');
$districts = DB::table('districts')->get();
$district = null;
return view('districts.index', compact('districts', 'district'));
}
public function create()
{
return view('districts.create');
}
public function create() { return view('districts.create'); }
public function store(Request $request)
{
DB::table('districts')->insert(['uz' => $request->uz ?? $request->name, 'ru' => $request->ru ?? $request->name, 'cr' => $request->cr ?? $request->name, 'region_id' => $request->region_id, 'created_at' => now(), 'updated_at' => now()]);
return redirect()->route('districts.index');
}
public function show($id)
{
return view('districts.show', compact('id'));
$district = DB::table('districts')->find($id);
return view('districts.show', compact('district'));
}
public function edit($id)
{
return view('districts.edit', compact('id'));
$district = DB::table('districts')->find($id);
return view('districts.edit', compact('district'));
}
public function update(Request $request, $id)
{
DB::table('districts')->where('id', $id)->update(['uz' => $request->uz ?? $request->name, 'ru' => $request->ru ?? $request->name, 'cr' => $request->cr ?? $request->name, 'updated_at' => now()]);
return redirect()->route('districts.index');
}
public function destroy($id)
{
DB::table('districts')->delete($id);
return redirect()->route('districts.index');
}
}

View File

@@ -3,52 +3,287 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\QrController;
use Carbon\Carbon;
class EstateController extends Controller
{
public function index()
private function parseDate(?string $date): ?string
{
return view('estate.index');
if (!$date) return null;
try {
return Carbon::createFromFormat('d.m.Y', $date)->format('Y-m-d');
} catch (\Exception $e) {
return $date; // already in Y-m-d or null
}
}
public function index(Request $request)
{
$filters = $request->only(['search', 'period', 'status', 'appraiser', 'purpose_id']);
$size = $request->get('size', 20);
$query = DB::table('estate_orders as o')
->selectRaw('o.*, o.ordered_customer as customer, CONCAT_WS(\' \', o.owner_last_name, o.owner_first_name, o.owner_patronymic) as owner')
->addSelect([
'purpose_uz' => DB::table('purposes')->select('uz')->whereColumn('id', 'o.purpose_id'),
'purpose_ru' => DB::table('purposes')->select('ru')->whereColumn('id', 'o.purpose_id'),
'purpose_cr' => DB::table('purposes')->select('cr')->whereColumn('id', 'o.purpose_id'),
'region_uz' => DB::table('regions')->select('uz')->whereColumn('id', 'o.region'),
'district_uz' => DB::table('districts')->select('uz')->whereColumn('id', 'o.district'),
])
->orderByDesc('o.id');
if (!empty($filters['search'])) {
$s = '%' . $filters['search'] . '%';
$query->where(function ($q) use ($s) {
$q->where('o.number', 'like', $s)->orWhere('o.ordered_customer', 'like', $s);
});
}
if (!empty($filters['status'])) $query->where('o.status', $filters['status']);
if (!empty($filters['purpose_id'])) $query->where('o.purpose_id', $filters['purpose_id']);
$rawOrders = $query->paginate($size)->withQueryString();
$orders = $rawOrders->through(function ($o) {
$o->purposeOne = (object)['uz' => $o->purpose_uz, 'ru' => $o->purpose_ru, 'cr' => $o->purpose_cr];
return $o;
});
$stats = DB::table('estate_orders')->selectRaw('status, count(*) as cnt')->groupBy('status')->pluck('cnt', 'status');
$purposeCases = DB::table('purposes')->get();
return view('estate.index', compact('orders', 'stats', 'filters', 'size', 'purposeCases'));
}
public function create()
{
return view('estate.create');
$purposeCases = DB::table('purposes')->get();
$regions = DB::table('regions')->get();
$districts = DB::table('districts')->get();
$concerns = DB::table('concerns')->get();
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->where('status', 'active')->get();
$dillers = DB::table('users')->whereRaw('LOWER(role) = ?', ['diller'])->where('status', 'active')->get();
return view('estate.create', compact('purposeCases', 'regions', 'districts', 'concerns', 'appraisers', 'dillers'));
}
public function store(Request $request)
{
return redirect()->route('estate.index');
if ($request->has('cost')) {
$request->merge(['cost' => preg_replace('/\D/', '', $request->cost)]);
}
$request->validate([
'number' => 'required',
'purpose_id' => 'required',
'ordered_customer' => 'required',
'customer_type' => 'required|in:physical,juridical',
'owner_type' => 'required|in:physical,juridical',
'name_of_object' => 'required',
'region' => 'required',
'district' => 'required',
'address' => 'required',
'cost' => 'required|numeric',
]);
$id = DB::table('estate_orders')->insertGetId([
'number' => $request->number,
'status' => $request->status ?? 'draft',
'purpose_id' => $request->purpose_id,
'diller_id' => $request->diller_id ?: null,
'ordered_customer' => $request->ordered_customer,
'ordered_customer_phone' => $request->ordered_customer_phone,
'customer_type' => $request->customer_type,
'customer_last_name' => $request->customer_last_name,
'customer_first_name' => $request->customer_first_name,
'customer_patronymic' => $request->customer_patronymic,
'customer_company' => $request->customer_company,
'owner_type' => $request->owner_type,
'owner_last_name' => $request->owner_last_name,
'owner_first_name' => $request->owner_first_name,
'owner_patronymic' => $request->owner_patronymic,
'owner_company' => $request->owner_company,
'contract_date' => $this->parseDate($request->contract_date),
'name_of_object' => $request->name_of_object,
'region' => $request->region,
'district' => $request->district,
'address' => $request->address,
'home' => $request->home,
'area' => $request->area,
'overall_area' => $request->overall_area,
'usefull_area' => $request->usefull_area,
'live_area' => $request->live_area,
'cost' => (int)str_replace(',', '', $request->cost ?? 0),
'note' => $request->note,
'created_at' => $this->parseDate($request->created_at) ?? now(),
'updated_at' => now(),
]);
QrController::generateQr($id, 'estate_');
return redirect()->route('estate.show', $id);
}
public function edit($id)
{
return view('estate.edit', compact('id'));
$order = DB::table('estate_orders')->find($id);
$purposeCases = DB::table('purposes')->get();
$regions = DB::table('regions')->get();
$districts = DB::table('districts')->get();
$concerns = DB::table('concerns')->get();
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->where('status', 'active')->get();
$dillers = DB::table('users')->whereRaw('LOWER(role) = ?', ['diller'])->where('status', 'active')->get();
return view('estate.edit', compact('order', 'purposeCases', 'regions', 'districts', 'concerns', 'appraisers', 'dillers'));
}
public function update(Request $request, $id)
{
return redirect()->route('estate.index');
if ($request->has('cost')) {
$request->merge(['cost' => preg_replace('/\D/', '', $request->cost)]);
}
$request->validate([
'number' => 'required',
'purpose_id' => 'required',
'ordered_customer' => 'required',
'customer_type' => 'required|in:physical,juridical',
'owner_type' => 'required|in:physical,juridical',
'name_of_object' => 'required',
'region' => 'required',
'district' => 'required',
'address' => 'required',
'cost' => 'required|numeric',
]);
DB::table('estate_orders')->where('id', $id)->update([
'number' => $request->number,
'status' => $request->status,
'purpose_id' => $request->purpose_id,
'diller_id' => $request->diller_id ?: null,
'ordered_customer' => $request->ordered_customer,
'ordered_customer_phone' => $request->ordered_customer_phone,
'customer_type' => $request->customer_type,
'customer_last_name' => $request->customer_last_name,
'customer_first_name' => $request->customer_first_name,
'customer_patronymic' => $request->customer_patronymic,
'customer_company' => $request->customer_company,
'owner_type' => $request->owner_type,
'owner_last_name' => $request->owner_last_name,
'owner_first_name' => $request->owner_first_name,
'owner_patronymic' => $request->owner_patronymic,
'owner_company' => $request->owner_company,
'contract_date' => $this->parseDate($request->contract_date),
'name_of_object' => $request->name_of_object,
'region' => $request->region,
'district' => $request->district,
'address' => $request->address,
'home' => $request->home,
'area' => $request->area,
'overall_area' => $request->overall_area,
'usefull_area' => $request->usefull_area,
'live_area' => $request->live_area,
'cost' => (int)str_replace(',', '', $request->cost ?? 0),
'note' => $request->note,
'created_at' => $this->parseDate($request->created_at) ?? now(),
'updated_at' => now(),
]);
return redirect()->route('estate.show', $id);
}
public function show($order)
{
return view('estate.show', compact('order'));
$order = DB::table('estate_orders as o')
->selectRaw('o.*, o.ordered_customer as customer, CONCAT_WS(\' \', o.owner_last_name, o.owner_first_name, o.owner_patronymic) as owner')
->addSelect([
'purpose_uz' => DB::table('purposes')->select('uz')->whereColumn('id', 'o.purpose_id'),
'purpose_ru' => DB::table('purposes')->select('ru')->whereColumn('id', 'o.purpose_id'),
'purpose_cr' => DB::table('purposes')->select('cr')->whereColumn('id', 'o.purpose_id'),
'region_uz' => DB::table('regions')->select('uz')->whereColumn('id', 'o.region'),
'district_uz' => DB::table('districts')->select('uz')->whereColumn('id', 'o.district'),
])
->where('o.id', $order)->first();
if ($order) {
$order->purposeOne = (object)['uz' => $order->purpose_uz, 'ru' => $order->purpose_ru, 'cr' => $order->purpose_cr];
$order->regions = DB::table('regions')->find($order->region);
$order->districts = DB::table('districts')->find($order->district);
$dillerUser = $order->diller_id ? DB::table('users')->find($order->diller_id) : null;
$order->diller = $dillerUser->name ?? '';
$order->dillerUser = $dillerUser;
}
$members = DB::table('order_members as om')
->leftJoin('users as u', 'u.id', '=', 'om.user_id')
->select('om.*', 'u.name', 'u.avatar', 'u.phone', 'u.role')
->where('om.order_id', $order->id ?? 0)->where('om.order_type', 'estate_')->get();
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->where('status', 'active')->get();
$isAppraisers = $members->where('user_id', auth()->id())->count() > 0;
$files = DB::table('files')->where('order_id', $order->id ?? 0)->where('order_type', 'estate_')->get();
$conclusions = DB::table('files')->where('order_id', $order->id ?? 0)->where('order_type', 'conclusion_')->get();
return view('estate.show', compact('order', 'members', 'appraisers', 'isAppraisers', 'files', 'conclusions'));
}
public function showActivities($order)
{
return view('estate.show-activities', compact('order'));
$order = DB::table('estate_orders')->find($order);
$actions = DB::table('tracking_actions')->where('order_id', $order->id ?? 0)->latest()->get();
return view('estate.show-activities', compact('order', 'actions'));
}
public function showTeam($order)
{
return view('estate.show-team', compact('order'));
$order = DB::table('estate_orders')->find($order);
$members = DB::table('order_members as om')
->leftJoin('users as u', 'u.id', '=', 'om.user_id')
->select('om.*', 'u.name', 'u.avatar', 'u.phone', 'u.role')
->where('om.order_id', $order->id ?? 0)->where('om.order_type', 'estate_')->get()
->map(function ($member) {
$member->started = DB::table('order_members')->where('user_id', $member->user_id)->count();
$member->finished = 0;
$member->approved = 0;
$member->rejected = 0;
return $member;
});
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->where('status', 'active')->get();
return view('estate.show-team', compact('order', 'members', 'appraisers'));
}
public function showDocuments($order)
public function generatePdf($id)
{
return view('estate.show-documents', compact('order'));
// If uploaded conclusion exists — serve it directly
$conclusionFile = DB::table('files')
->where('order_id', $id)
->where('order_type', 'conclusion_')
->orderByDesc('created_at')
->first();
if ($conclusionFile) {
$path = storage_path('app/public' . str_replace('/storage', '', $conclusionFile->path));
if (file_exists($path)) {
return response()->file($path, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="' . $conclusionFile->name . '.pdf"',
]);
}
}
abort(404, 'Xulosa fayli topilmadi');
}
public function showDocuments($order, Request $request)
{
$order = DB::table('estate_orders')->find($order);
$type = $request->get('type', 'ALL');
$filesQuery = DB::table('files')->where('order_id', $order->id ?? 0)->where('order_type', 'estate_');
if ($type !== 'ALL') {
$filesQuery->where('type', $type);
}
$files = $filesQuery->paginate(20)->withQueryString();
$allFiles = DB::table('files')->where('order_id', $order->id ?? 0)->where('order_type', 'estate_')->get();
$countDocs = $allFiles->whereIn('type', ['passport_customer', 'certificate', 'appraiser_certificate', 'insurance_policy', 'participate_certificate'])->count();
$countMediaFiles = $allFiles->whereIn('type', ['object_photo', 'object_files', 'compares'])->count();
$otherFiles = $allFiles->where('type', 'additional')->count();
$sizeInStorage = $allFiles->sum('size_in_bytes');
return view('estate.show-documents', compact('order', 'files', 'type', 'countDocs', 'countMediaFiles', 'otherFiles', 'sizeInStorage'));
}
public function orderClone($id)

View File

@@ -3,26 +3,79 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
class FileStoreController extends Controller
{
public function attachFiles(Request $request)
{
return redirect()->back();
if (!$request->hasFile('file')) {
return response()->json(['error' => 'No file'], 400);
}
$file = $request->file('file');
$orderId = $request->input('order_id');
$orderType = $request->input('order_type', 'auto_');
$fileType = $request->input('file_type', 'additional');
$ext = strtolower($file->getClientOriginalExtension());
$name = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
$filename = Str::uuid() . '.' . $ext;
$path = $file->storeAs('public/files/' . $orderType . $orderId, $filename);
$size = $file->getSize();
DB::table('files')->insert([
'id' => (string) Str::uuid(),
'path' => Storage::url($path),
'extension' => $ext,
'order_id' => $orderId,
'order_type' => $orderType,
'type' => $fileType,
'name' => $name,
'size' => round($size / 1024 / 1024, 2),
'size_in_bytes' => $size,
'created_at' => now(),
'updated_at' => now(),
]);
return response()->json(['success' => true, 'name' => $name]);
}
public function attachProfileFiles(Request $request)
{
return redirect()->back();
if (!$request->hasFile('file')) {
return response()->json(['error' => 'No file'], 400);
}
$file = $request->file('file');
$ext = strtolower($file->getClientOriginalExtension());
$filename = Str::uuid() . '.' . $ext;
$path = $file->storeAs('public/files/profile', $filename);
return response()->json(['success' => true, 'url' => Storage::url($path)]);
}
public function downloadFile($file)
{
abort(404);
$record = DB::table('files')->where('id', $file)->first();
if (!$record) abort(404);
$path = str_replace('/storage/', 'public/', $record->path);
if (!Storage::exists($path)) abort(404);
return Storage::download($path, $record->name . '.' . $record->extension);
}
public function delete($file)
{
$record = DB::table('files')->where('id', $file)->first();
if ($record) {
$path = str_replace('/storage/', 'public/', $record->path);
Storage::delete($path);
DB::table('files')->where('id', $file)->delete();
}
return redirect()->back();
}
}

View File

@@ -3,6 +3,7 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class HomeController extends Controller
{
@@ -13,7 +14,46 @@ class HomeController extends Controller
public function index()
{
return view('index');
$summaryPrice = DB::table('auto_orders')
->whereNotNull('cost')
->sum('cost')
+ DB::table('estate_orders')
->whereNotNull('cost')
->sum('cost');
$autoOrders = DB::table('auto_orders')->count();
$estateOrders = DB::table('estate_orders')->count();
$recentOrders = DB::table('auto_orders')
->selectRaw('*, ordered_customer as customer')
->latest()->limit(10)->get()
->map(fn($o) => (object)array_merge((array)$o, ['type' => 'auto_']));
$forModerate = collect(
DB::table('auto_orders')->selectRaw('*, ordered_customer as customer')->where('status', 'moderated')->latest()->limit(10)->get()->map(fn($o) => (object)array_merge((array)$o, ['type' => 'auto_']))
)->merge(
DB::table('estate_orders')->selectRaw('*, ordered_customer as customer')->where('status', 'moderated')->latest()->limit(10)->get()->map(fn($o) => (object)array_merge((array)$o, ['type' => 'estate_']))
)->sortByDesc('updated_at')->take(10)->values();
$actions = DB::table('tracking_actions')->latest()->limit(20)->get();
$appraiserChart = [[], []];
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->get();
foreach ($appraisers as $appraiser) {
$appraiserChart[0][] = $appraiser->name;
$count = DB::table('order_members')->where('user_id', $appraiser->id)->count();
$appraiserChart[1][] = $count;
}
return view('index', compact(
'summaryPrice',
'autoOrders',
'estateOrders',
'recentOrders',
'forModerate',
'actions',
'appraiserChart'
));
}
public function lang($locale)

View File

@@ -3,16 +3,68 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class OrderMembersController extends Controller
{
public function remove(Request $request)
public function invite(Request $request)
{
$orderId = $request->input('order_id');
$orderType = $request->input('order_type'); // 'AUTO' or 'ESTATE'
$dbType = $orderType === 'AUTO' ? 'auto_' : 'estate_';
$table = $orderType === 'AUTO' ? 'auto_orders' : 'estate_orders';
// Collect checked appraiser IDs (checkboxes named by appraiser->id)
$appraiserIds = [];
foreach ($request->all() as $key => $value) {
if (is_numeric($key) && $value === 'on') {
$appraiserIds[] = (int)$key;
}
}
foreach ($appraiserIds as $userId) {
// Avoid duplicate
$exists = DB::table('order_members')
->where('order_id', $orderId)
->where('order_type', $dbType)
->where('user_id', $userId)
->exists();
if (!$exists) {
DB::table('order_members')->insert([
'order_id' => $orderId,
'order_type' => $dbType,
'user_id' => $userId,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
// Change status to started if members added
if (count($appraiserIds) > 0) {
DB::table($table)->where('id', $orderId)->update([
'status' => 'started',
'updated_at' => now(),
]);
}
return redirect()->back();
}
public function invite(Request $request)
public function remove(Request $request)
{
$memberId = $request->input('id');
$orderId = $request->input('order_id');
$orderType = $request->input('order_type'); // 'AUTO' or 'ESTATE'
$dbType = $orderType === 'AUTO' ? 'auto_' : 'estate_';
DB::table('order_members')
->where('id', $memberId)
->where('order_id', $orderId)
->where('order_type', $dbType)
->delete();
return redirect()->back();
}
}

View File

@@ -18,21 +18,21 @@ class ProfileController extends Controller
public function profile()
{
return view('profile.index');
return view('profile.profile');
}
public function showActivities()
{
return view('profile.show-activities');
return view('profile.activities');
}
public function showProjects()
{
return view('profile.show-projects');
return view('profile.projects');
}
public function showDocuments()
{
return view('profile.show-documents');
return view('profile.documents');
}
}

View File

@@ -3,41 +3,46 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class PurposeController extends Controller
{
public function index()
{
return view('purposes.index');
$purposes = DB::table('purposes')->get();
$purpose = null;
return view('purposes.index', compact('purposes', 'purpose'));
}
public function create()
{
return view('purposes.create');
}
public function create() { return view('purposes.create'); }
public function store(Request $request)
{
DB::table('purposes')->insert(['uz' => $request->uz ?? $request->name, 'ru' => $request->ru ?? $request->name, 'cr' => $request->cr ?? $request->name, 'created_at' => now(), 'updated_at' => now()]);
return redirect()->route('purposes.index');
}
public function show($id)
{
return view('purposes.show', compact('id'));
$purpose = DB::table('purposes')->find($id);
return view('purposes.show', compact('purpose'));
}
public function edit($id)
{
return view('purposes.edit', compact('id'));
$purpose = DB::table('purposes')->find($id);
return view('purposes.edit', compact('purpose'));
}
public function update(Request $request, $id)
{
DB::table('purposes')->where('id', $id)->update(['uz' => $request->uz ?? $request->name, 'ru' => $request->ru ?? $request->name, 'cr' => $request->cr ?? $request->name, 'updated_at' => now()]);
return redirect()->route('purposes.index');
}
public function destroy($id)
{
DB::table('purposes')->delete($id);
return redirect()->route('purposes.index');
}
}

View File

@@ -3,6 +3,8 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
class QrController extends Controller
{
@@ -11,8 +13,82 @@ class QrController extends Controller
return view('qr.show', compact('content'));
}
public function verify($type, $id)
{
$table = $type === 'auto' ? 'auto_orders' : 'estate_orders';
$order = \Illuminate\Support\Facades\DB::table($table)->where('id', $id)->first();
if (!$order) {
abort(404);
}
// Add display relations and formatting
$order->customer = $order->ordered_customer;
$order->purposeOne = \Illuminate\Support\Facades\DB::table('purposes')->where('id', $order->purpose_id)->first();
if ($type === 'auto') {
$order->concernOne = \Illuminate\Support\Facades\DB::table('concerns')->where('id', $order->car_category)->first();
$order->ownerName = trim($order->owner_last_name . ' ' . $order->owner_first_name . ' ' . $order->owner_patronymic);
$order->name = $order->car_mark;
} else {
$order->regions = \Illuminate\Support\Facades\DB::table('regions')->where('id', $order->region)->first();
$order->districts = \Illuminate\Support\Facades\DB::table('districts')->where('id', $order->district)->first();
$order->owner = trim($order->owner_last_name . ' ' . $order->owner_first_name . ' ' . $order->owner_patronymic);
$order->name = $order->name_of_object;
}
$conclusion = \Illuminate\Support\Facades\DB::table('files')
->where('order_id', $id)
->where('order_type', 'conclusion_')
->first();
return view('qr.' . $type, compact('order', 'conclusion'));
}
public function reGenerate($id, $type)
{
self::generateQr($id, $type);
return redirect()->back();
}
public static function generateQr($id, $type)
{
try {
$cleanType = str_replace('_', '', $type);
$url = route('qr.verify', ['type' => $cleanType, 'id' => $id]);
$dir = 'public/attachments/' . $type . $id;
$absDir = storage_path('app/' . $dir);
if (!is_dir($absDir)) {
mkdir($absDir, 0755, true);
} else {
chmod($absDir, 0755);
}
$qr = QrCode::format('png')->size(200)->generate($url);
$qrPath = $absDir . '/qr.png';
file_put_contents($qrPath, $qr);
chmod($qrPath, 0644);
} catch (\Exception $e) {
\Illuminate\Support\Facades\Log::error('QR generate failed: ' . $e->getMessage(), [
'id' => $id, 'type' => $type,
]);
}
}
public function qrImage($type, $id)
{
$dbType = $type === 'auto' ? 'auto_' : 'estate_';
$path = storage_path('app/public/attachments/' . $dbType . $id . '/qr.png');
if (!file_exists($path)) {
self::generateQr($id, $dbType);
}
if (!file_exists($path)) {
abort(404);
}
return response()->file($path);
}
}

View File

@@ -3,46 +3,52 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class RegionController extends Controller
{
public function index()
{
return view('regions.index');
$regions = DB::table('regions')->get();
$region = null;
return view('regions.index', compact('regions', 'region'));
}
public function create()
{
return view('regions.create');
}
public function create() { return view('regions.create'); }
public function store(Request $request)
{
DB::table('regions')->insert(['uz' => $request->uz ?? $request->name, 'ru' => $request->ru ?? $request->name, 'cr' => $request->cr ?? $request->name, 'created_at' => now(), 'updated_at' => now()]);
return redirect()->route('regions.index');
}
public function show($id)
{
return view('regions.show', compact('id'));
$region = DB::table('regions')->find($id);
return view('regions.show', compact('region'));
}
public function edit($id)
{
return view('regions.edit', compact('id'));
$region = DB::table('regions')->find($id);
return view('regions.edit', compact('region'));
}
public function update(Request $request, $id)
{
DB::table('regions')->where('id', $id)->update(['uz' => $request->uz ?? $request->name, 'ru' => $request->ru ?? $request->name, 'cr' => $request->cr ?? $request->name, 'updated_at' => now()]);
return redirect()->route('regions.index');
}
public function destroy($id)
{
DB::table('regions')->delete($id);
return redirect()->route('regions.index');
}
public function districts($id)
{
return response()->json([]);
$districts = DB::table('districts')->where('region_id', $id)->get();
return response()->json($districts);
}
}

View File

@@ -3,16 +3,30 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class RoleController extends Controller
{
public function index()
public function index(Request $request)
{
return view('role.index');
$role = $request->get('role', 'user');
$size = $request->get('size', 20);
$users = DB::table('users')->whereRaw('LOWER(role) = LOWER(?)', [$role])->paginate($size)->withQueryString();
$roleStats = DB::table('users')->selectRaw('role, count(*) as cnt')->groupBy('role')->pluck('cnt', 'role');
$statusStats = DB::table('users')->selectRaw('status, count(*) as cnt')->groupBy('status')->pluck('cnt', 'status');
$user = auth()->user();
return view('role.index', compact('users', 'role', 'roleStats', 'statusStats', 'user', 'size'));
}
public function permit(Request $request)
{
$userId = $request->get('user_id');
$role = $request->get('role');
if ($userId && $role) {
DB::table('users')->where('id', $userId)->update(['role' => $role]);
}
return redirect()->back();
}
}

View File

@@ -3,27 +3,59 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
class UserController extends Controller
{
public function index()
public function index(Request $request)
{
return view('user.index');
$size = $request->get('size', 20);
$role = $request->get('role');
$status = $request->get('status');
$search = $request->get('search');
$query = DB::table('users')->orderByDesc('id');
if ($role) $query->whereRaw('LOWER(role) = LOWER(?)', [$role]);
if ($status) $query->where('status', $status);
if ($search) $query->where('name', 'like', "%$search%")->orWhere('phone', 'like', "%$search%");
$users = $query->paginate($size)->withQueryString();
$roleStats = DB::table('users')->selectRaw('role, count(*) as cnt')->groupBy('role')->pluck('cnt', 'role');
$statusStats = DB::table('users')->selectRaw('status, count(*) as cnt')->groupBy('status')->pluck('cnt', 'status');
$user = auth()->user();
$message = session('message');
return view('user.index', compact('users', 'roleStats', 'statusStats', 'user', 'message', 'size'));
}
public function create(Request $request)
{
return redirect()->route('user.index');
DB::table('users')->insert([
'name' => $request->name,
'phone' => $request->phone,
'password' => Hash::make($request->password ?? '12345678'),
'avatar' => '/assets/images/users/avatar-5.jpg',
'status' => 'active',
'role' => $request->role ?? 'user',
'balance' => 0,
'created_at' => now(),
'updated_at' => now(),
]);
return redirect()->route('user.index')->with('message', 'User created');
}
public function show($id)
{
return view('user.show', compact('id'));
$user = DB::table('users')->find($id);
return view('user.show', compact('user'));
}
public function edit()
{
return view('user.edit');
$user = auth()->user();
return view('user.edit', compact('user'));
}
public function update(Request $request)
@@ -43,22 +75,30 @@ class UserController extends Controller
public function activate($id)
{
DB::table('users')->where('id', $id)->update(['status' => 'active']);
return redirect()->back();
}
public function block($id)
{
DB::table('users')->where('id', $id)->update(['status' => 'inactive']);
return redirect()->back();
}
public function appraisers()
public function appraisers(Request $request)
{
return view('user.appraisers');
$size = $request->get('size', 20);
$users = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->paginate($size);
$roleStats = DB::table('users')->selectRaw('role, count(*) as cnt')->groupBy('role')->pluck('cnt', 'role');
$statusStats = DB::table('users')->selectRaw('status, count(*) as cnt')->groupBy('status')->pluck('cnt', 'status');
$user = auth()->user();
return view('user.appraisers', compact('users', 'roleStats', 'statusStats', 'user', 'size'));
}
public function appraisersBonus()
{
return view('user.appraisers-bonus');
$users = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->get();
return view('user.appraisers-bonus', compact('users'));
}
public function destroy($id)

13
app/Models/File.php Normal file
View File

@@ -0,0 +1,13 @@
<?php
namespace App\Models;
class File
{
public static function getFileSizeInMB(int $bytes): string
{
if ($bytes <= 0) return '0';
$mb = $bytes / 1024 / 1024;
return number_format($mb, 2);
}
}

View File

@@ -2,6 +2,7 @@
namespace App\Providers;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
@@ -13,6 +14,8 @@ class AppServiceProvider extends ServiceProvider
public function boot()
{
//
if (config('app.env') === 'production') {
URL::forceScheme('https');
}
}
}

18
dummy.pdf Normal file
View File

@@ -0,0 +1,18 @@
%PDF-1.4
1 0 obj <</Type /Catalog /Pages 2 0 R>> endobj
2 0 obj <</Type /Pages /Kids [3 0 R] /Count 1>> endobj
3 0 obj <</Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R>> endobj
4 0 obj <</Length 22>> stream
BT /F1 24 Tf 100 700 Td (Hello World) Tj ET
endstream endobj
xref
0 5
0000000000 65535 f
0000000009 00000 n
0000000056 00000 n
0000000111 00000 n
0000000212 00000 n
trailer <</Size 5 /Root 1 0 R>>
startxref
284
%%EOF

View File

@@ -1 +1,37 @@
let handleCustomerClick=function(e){var n=document.getElementById("customer-block"),o=document.getElementById("customer-company-block");"physical"===e?(n.classList.remove("d-none"),o.classList.add("d-none")):(n.classList.add("d-none"),o.classList.remove("d-none"))},handleOwnerClick=function(e){var n=document.getElementById("owner-block"),o=document.getElementById("owner-company-block");"physical"===e?(n.classList.remove("d-none"),o.classList.add("d-none")):(n.classList.add("d-none"),o.classList.remove("d-none"))};
// Bootstrap needs-validation
(function () {
'use strict';
var forms = document.querySelectorAll('.needs-validation');
Array.prototype.slice.call(forms).forEach(function (form) {
// Common required fields for both auto and estate
var requiredNames = [
'number', 'created_at', 'purpose_id',
'customer_type', 'owner_type',
'ordered_customer', 'cost',
// auto specific
'car_mark', 'car_number', 'body', 'engine', 'shassi', 'made_date', 'type',
// estate specific
'name_of_object', 'region', 'district', 'address', 'home', 'contract_date',
];
requiredNames.forEach(function(name) {
var el = form.querySelector('[name="' + name + '"]');
if (el) el.setAttribute('required', '');
});
form.addEventListener('submit', function (event) {
if (!form.checkValidity()) {
event.preventDefault();
event.stopPropagation();
// Scroll to first invalid field
var firstInvalid = form.querySelector(':invalid');
if (firstInvalid) {
firstInvalid.scrollIntoView({ behavior: 'smooth', block: 'center' });
firstInvalid.focus();
}
}
form.classList.add('was-validated');
}, false);
});
})();

1
public/storage Symbolic link
View File

@@ -0,0 +1 @@
../storage/app/public

View File

@@ -17,7 +17,7 @@
validate>
@csrf
@method('put')
<input type="hidden" name="status" value="{{ App\Enums\OrderStatusEnum::DRAFT->name }}">
<input type="hidden" name="status" value="{{ $order->status }}">
<div class="row">
<div class="col-lg-8">
<div class="card">
@@ -33,7 +33,7 @@
<input type="text"
class="form-control text-uppercase @error('number') is-invalid @enderror"
name="number" placeholder="@lang('translation.write-number')"
id="order-number-input" value="{{ $order->number }}"
id="order-number-input" value="{{ old('number', $order->number) }}"
tabindex="1">
@error('number')
<span class="invalid-feedback" role="alert">
@@ -47,7 +47,7 @@
<input type="text"
class="form-control flatpickr-input @error('created_at') is-invalid @enderror"
id="auto-created_date-input"
name="created_at" value="{{ $order->created_at }}"
name="created_at" value="{{ old('created_at', $order->created_at ? \Carbon\Carbon::parse($order->created_at)->format('d.m.Y') : '') }}"
data-provider="flatpickr" data-date-format="d.m.Y"
data-maxDate="{{ Carbon\Carbon::now('Asia/Tashkent')->format('d.m.Y') }}"
data-deafult-date="{{ Carbon\Carbon::now('Asia/Tashkent')->format('d.m.Y') }}"
@@ -67,7 +67,7 @@
id="choices-purpose-input" tabindex="3">
@foreach($purposeCases as $purposeItem)
<option value="{{ $purposeItem->id }}"
@if(old('purpose_id') == $purposeItem->id)selected @endif>
@if((old('purpose_id') ?? $order->purpose_id) == $purposeItem->id)selected @endif>
{{ $purposeItem->{str_replace('_', '-', app()->getLocale())} }}
</option>
@endforeach
@@ -92,7 +92,7 @@
<!-- Inline Checkbox -->
<div class="form-check form-check-inline mb-2">
<input class="form-check-input" type="radio"
@if($order->customer_type=='physical') checked @endif
@if(old('customer_type', $order->customer_type)=='physical') checked @endif
name="customer_type"
onclick="handleCustomerClick(this.value);" value="physical"
id="flexRadioDefault2">
@@ -102,7 +102,7 @@
</div>
<div class="form-check form-check-inline mb-2">
<input class="form-check-input is " type="radio"
@if($order->customer_type=='juridical') checked
@if(old('customer_type', $order->customer_type)=='juridical') checked
@endif name="customer_type"
onclick="handleCustomerClick(this.value);" value="juridical"
id="flexRadioDefault1">
@@ -111,7 +111,7 @@
</label>
</div>
</div>
<div class="row gy-4 @if($order->customer_type=='juridical') d-none @endif" id="customer-block">
<div class="row gy-4 @if(old('customer_type', $order->customer_type)=='juridical') d-none @endif" id="customer-block">
<div class="mb-3 col-xxl-4 col-md-6">
<label class="form-label" for="order-customer_last_name-input">
@@ -120,7 +120,7 @@
<input type="text"
class="form-control text-uppercase @error('customer_last_name') is-invalid @enderror"
name="customer_last_name" id="order-customer_last_name-input"
value="{{ $order->customer_last_name }}"
value="{{ old('customer_last_name', $order->customer_last_name) }}"
placeholder="@lang('translation.write-customer-last-name')" tabindex="4">
@error('customer_last_name')
<span class="invalid-feedback" role="alert">
@@ -135,7 +135,7 @@
<input type="text"
class="form-control text-uppercase @error('customer_first_name') is-invalid @enderror"
name="customer_first_name" id="order-customer_first_name-input"
value="{{ $order->customer_first_name }}"
value="{{ old('customer_first_name', $order->customer_first_name) }}"
placeholder="@lang('translation.write-customer-first-name')" tabindex="5">
@error('customer_first_name')
<span class="invalid-feedback" role="alert">
@@ -150,7 +150,7 @@
<input type="text"
class="form-control text-uppercase @error('customer_patronymic') is-invalid @enderror"
name="customer_patronymic" id="order-customer_patronymic-input"
value="{{ $order->customer_patronymic }}"
value="{{ old('customer_patronymic', $order->customer_patronymic) }}"
placeholder="@lang('translation.write-customer-patronymic')" tabindex="6">
@error('customer_patronymic')
<span class="invalid-feedback" role="alert">
@@ -159,14 +159,14 @@
@enderror
</div>
</div>
<div class="row gy-4 @if($order->customer_type=='physical') d-none @endif"
<div class="row gy-4 @if(old('customer_type', $order->customer_type)=='physical') d-none @endif"
id="customer-company-block">
<div class="mb-3">
<label class="form-label" for="order-customer_company-input">
@lang('translation.customer-juridical-name')
</label>
<input type="text" class="form-control text-uppercase" name="customer_company"
id="order-customer_company-input" value="{{ $order->customer_company }}"
<input type="text" class="form-control text-uppercase @error('customer_company') is-invalid @enderror" name="customer_company"
id="order-customer_company-input" value="{{ old('customer_company', $order->customer_company) }}"
placeholder="@lang('translation.write-customer-juridical-name')" tabindex="3">
@error('customer_company')
<span class="invalid-feedback" role="alert">
@@ -188,7 +188,7 @@
<div class="mb-3">
<!-- Inline Checkbox -->
<div class="form-check form-check-inline mb-2">
<input class="form-check-input" type="radio" @if($order->owner_type=='physical') checked
<input class="form-check-input" type="radio" @if(old('owner_type', $order->owner_type)=='physical') checked
@endif name="owner_type"
onclick="handleOwnerClick(this.value);" value="physical"
id="flexRadioDefault3">
@@ -198,7 +198,7 @@
</div>
<div class="form-check form-check-inline mb-2">
<input class="form-check-input is " type="radio"
@if($order->owner_type=='juridical') checked
@if(old('owner_type', $order->owner_type)=='juridical') checked
@endif name="owner_type"
onclick="handleOwnerClick(this.value);" value="juridical"
id="flexRadioDefault4">
@@ -207,13 +207,13 @@
</label>
</div>
</div>
<div class="row gy-4 @if($order->owner_type=='juridical')d-none @endif" id="owner-block">
<div class="row gy-4 @if(old('owner_type', $order->owner_type)=='juridical')d-none @endif" id="owner-block">
<div class="mb-3 col-xxl-4 col-md-6">
<label class="form-label" for="order-owner_last_name-input">
@lang('translation.owner-last-name')
</label>
<input type="text" value="{{ $order->owner_last_name }}"
<input type="text" value="{{ old('owner_last_name', $order->owner_last_name) }}"
class="form-control text-uppercase @error('owner_last_name') is-invalid @enderror"
name="owner_last_name" id="order-owner_last_name-input"
placeholder="@lang('translation.write-owner-last-name')" tabindex="7">
@@ -229,7 +229,7 @@
</label>
<input type="text"
class="form-control text-uppercase @error('owner_first_name') is-invalid @enderror"
name="owner_first_name" value="{{ $order->owner_first_name }}"
name="owner_first_name" value="{{ old('owner_first_name', $order->owner_first_name) }}"
id="order-owner_first_name-input"
placeholder="@lang('translation.write-owner-first-name')" tabindex="8">
@error('owner_first_name')
@@ -242,7 +242,7 @@
<label class="form-label" for="order-owner_patronymic-input">
@lang('translation.owner-patronymic')
</label>
<input type="text" value="{{ $order->owner_patronymic }}"
<input type="text" value="{{ old('owner_patronymic', $order->owner_patronymic) }}"
class="form-control text-uppercase @error('owner_patronymic') is-invalid @enderror"
name="owner_patronymic" id="order-owner_patronymic-input"
placeholder="@lang('translation.write-owner-patronymic')" tabindex="9">
@@ -253,7 +253,7 @@
@enderror
</div>
</div>
<div class="row gy-4 @if($order->owner_type=='physical')d-none @endif"
<div class="row gy-4 @if(old('owner_type', $order->owner_type)=='physical')d-none @endif"
id="owner-company-block">
<div class="mb-3">
<label class="form-label" for="order-owner_company-input">
@@ -261,7 +261,7 @@
</label>
<input type="text"
class="form-control text-uppercase @error('owner_company') is-invalid @enderror"
name="owner_company" value="{{ $order->owner_company }}"
name="owner_company" value="{{ old('owner_company', $order->owner_company) }}"
id="order-owner_company-input"
placeholder="@lang('translation.write-owner-juridical-name')" tabindex="">
@error('owner_company')
@@ -290,7 +290,7 @@
id="choose-order-car-category" name="car_category" tabindex="10">
@foreach ($concerns as $concern)
<option value="{{ $concern->id }}"
{{ $concern->car_category == $concern->id ? 'selected' : '' }}>
{{ (old('car_category') ?? $order->car_category) == $concern->id ? 'selected' : '' }}>
@lang($concern->{str_replace('_', '-', app()->getLocale())})
</option>
@endforeach
@@ -307,7 +307,7 @@
</label>
<input type="text"
class="form-control text-uppercase @error('car_mark') is-invalid @enderror"
id="auto-car_mark-input" name="car_mark" value="{{ $order->car_mark }}"
id="auto-car_mark-input" name="car_mark" value="{{ old('car_mark', $order->car_mark) }}"
placeholder="@lang('translation.write-car-mark')" tabindex="12">
@error('car_mark')
<span class="invalid-feedback" role="alert">
@@ -321,7 +321,7 @@
</label>
<input type="text"
class="form-control text-uppercase @error('color') is-invalid @enderror"
id="auto-color-input" name="color" value="{{ $order->color }}"
id="auto-color-input" name="color" value="{{ old('color', $order->color) }}"
placeholder="@lang('translation.write-car-color')" tabindex="22">
@error('color')
<span class="invalid-feedback" role="alert">
@@ -339,7 +339,7 @@
class="form-control text-uppercase @error('made_date') is-invalid @enderror"
id="auto-made_date-input" name="made_date"
data-provider="flatpickr" data-date-format="d.m.Y"
value="{{ $order->made_date }}"
value="{{ old('made_date', $order->made_date ? \Carbon\Carbon::parse($order->made_date)->format('d.m.Y') : '') }}"
data-deafult-date="{{ Carbon\Carbon::now('Asia/Tashkent')->format('d.m.Y') }}"
placeholder="@lang('translation.write-car-made-date')"
tabindex="13">
@@ -355,7 +355,7 @@
</label>
<input type="text"
class="form-control text-uppercase @error('body') is-invalid @enderror"
id="auto-body-input" name="body" value="{{ $order->body }}"
id="auto-body-input" name="body" value="{{ old('body', $order->body) }}"
placeholder="@lang('translation.write-car-body')" tabindex="14">
@error('body')
<span class="invalid-feedback" role="alert">
@@ -369,7 +369,7 @@
</label>
<input type="text"
class="form-control text-uppercase @error('engine') is-invalid @enderror"
id="auto-engine-input" name="engine" value="{{ $order->engine }}"
id="auto-engine-input" name="engine" value="{{ old('engine', $order->engine) }}"
placeholder="@lang('translation.write-car-engine')" tabindex="15">
@error('engine')
<span class="invalid-feedback" role="alert">
@@ -385,7 +385,7 @@
</label>
<input type="text"
class="form-control text-uppercase @error('car_number') is-invalid @enderror"
id="auto-car_number-input" name="car_number" value="{{ $order->car_number }}"
id="auto-car_number-input" name="car_number" value="{{ old('car_number', $order->car_number) }}"
placeholder="@lang('translation.write-car-number')" tabindex="16">
@error('car_number')
<span class="invalid-feedback" role="alert">
@@ -399,7 +399,7 @@
</label>
<input type="text"
class="form-control text-uppercase @error('type') is-invalid @enderror"
id="auto-type-input" name="type" value="{{ $order->type }}"
id="auto-type-input" name="type" value="{{ old('type', $order->type) }}"
placeholder="@lang('translation.write-car-type')" tabindex="17">
@error('type')
<span class="invalid-feedback" role="alert">
@@ -413,7 +413,7 @@
</label>
<input type="text"
class="form-control text-uppercase @error('shassi') is-invalid @enderror"
id="auto-shassi-input" name="shassi" value="{{ $order->shassi }}"
id="auto-shassi-input" name="shassi" value="{{ old('shassi', $order->shassi) }}"
placeholder="@lang('translation.write-car-shassi')" tabindex="18">
@error('shassi')
<span class="invalid-feedback" role="alert">
@@ -430,7 +430,7 @@
<input type="text"
class="form-control text-uppercase @error('tech_passport') is-invalid @enderror"
id="auto-tech_passport-input"
name="tech_passport" value="{{ $order->tech_passport }}"
name="tech_passport" value="{{ old('tech_passport', $order->tech_passport) }}"
placeholder="@lang('translation.write-car-technical-passport')" tabindex="19">
@error('tech_passport')
<span class="invalid-feedback" role="alert">
@@ -447,7 +447,7 @@
class="form-control flatpickr-input @error('tech_given_date') is-invalid @enderror"
id="auto-tech_given_date-input"
name="tech_given_date"
value="{{ $order->tech_given_date }}"
value="{{ old('tech_given_date', $order->tech_given_date ? \Carbon\Carbon::parse($order->tech_given_date)->format('d.m.Y') : '') }}"
data-provider="flatpickr" data-date-format="d.m.Y"
data-default="{{ Carbon\Carbon::now('Asia/Tashkent')->format('d.m.Y') }}"
placeholder="@lang('translation.write-car-technical-passport-given-date')"
@@ -466,7 +466,7 @@
<input type="text"
class="form-control text-uppercase @error('tech_given_whom') is-invalid @enderror"
id="auto-tech_given_whom-input"
name="tech_given_whom" value="{{ $order->tech_given_whom }}"
name="tech_given_whom" value="{{ old('tech_given_whom', $order->tech_given_whom) }}"
placeholder="@lang('translation.write-technical-passport-given-by-whom')"
tabindex="21">
@error('tech_given_whom')
@@ -500,16 +500,16 @@
@lang('translation.select-diller')
</label>
<select data-choices data-choices-search-false data-choices-multiple-groups="false"
name="diller" class="form-select @error('diller') is-invalid @enderror"
name="diller_id" class="form-select @error('diller_id') is-invalid @enderror"
id="choices-diller-input"
tabindex="23">
@foreach($dillers as $diller)
<option value="{{ $diller->id}}" @if($order->diller== $diller->id) selected @endif>
<option value="{{ $diller->id}}" @if((old('diller_id') ?? $order->diller_id) == $diller->id) selected @endif>
{{ $diller->name }}
</option>
@endforeach
</select>
@error('diller')
@error('diller_id')
<span class="invalid-feedback" role="alert">
<strong>@lang($message,['attribute'=>trans('translation.diller')])</strong>
</span>
@@ -531,7 +531,7 @@
<input type="text"
class="form-control text-uppercase @error('ordered_customer') is-invalid @enderror"
id="auto-ordered_customer-input"
name="ordered_customer" value="{{ $order->ordered_customer }}"
name="ordered_customer" value="{{ old('ordered_customer', $order->ordered_customer) }}"
placeholder="@lang('translation.write-car-ordered-customer')" tabindex="24">
@error('ordered_customer')
<span class="invalid-feedback" role="alert">
@@ -546,7 +546,7 @@
<input type="text"
class="form-control text-uppercase @error('ordered_customer_phone') is-invalid @enderror"
name="ordered_customer_phone" id="cleave-phone-init"
value="{{ $order->ordered_customer_phone }}"
value="{{ old('ordered_customer_phone', $order->ordered_customer_phone) }}"
placeholder="@lang('translation.write-car-ordered-customer-phone')" tabindex="25">
@error('ordered_customer_phone')
<span class="invalid-feedback" role="alert">
@@ -573,7 +573,7 @@
<input type="text"
class="form-control text-uppercase @error('cost') is-invalid @enderror"
name="cost"
id="cleave-numeral" value="{{ $order->cost }}"
id="cleave-numeral" value="{{ old('cost', $order->cost) }}"
placeholder="123,450" aria-label="Price"
aria-describedby="product-price-addon"
tabindex="26">
@@ -600,7 +600,7 @@
<textarea class="form-control text-uppercase @error('note') is-invalid @enderror" name="note"
id="auto-note-input"
placeholder="@lang('translation.write-cost-note')"
rows="3" tabindex="27">{{ $order->note }}</textarea>
rows="3" tabindex="27">{{ old('note', $order->note) }}</textarea>
@error('note')
<span class="invalid-feedback" role="alert">
<strong>@lang($message,['attribute'=>trans('translation.note')])</strong>

View File

@@ -121,14 +121,22 @@
{{ __('translation.conclusions') }}
</h4>
<div class="flex-shrink-0">
@if(in_array($order->status,[\App\Enums\OrderStatusEnum::STARTED->name,\App\Enums\OrderStatusEnum::REJECTED->name])&& $isAppraisers)
<a href="{{ route('conclusion.add', ['id' => $order->id,'type'=>\App\Enums\OrderTypeEnum::AUTO->name]) }}"
@if($conclusions->count() > 0)
<a href="{{ route('auto.generate_pdf', $order->id) }}"
target="_blank"
class="btn btn-soft-success btn-sm me-1">
<i class="ri-download-2-line me-1 align-bottom"></i>
Tayyor xulosani yuklab olish
</a>
@endif
@if(!in_array($order->status, [\App\Enums\OrderStatusEnum::APPROVED->value, \App\Enums\OrderStatusEnum::MODERATED->value]) && (in_array(Auth::user()?->role, ['admin', 'manager']) || $isAppraisers))
<a href="{{ route('conclusion.add', ['id' => $order->id, 'type' => \App\Enums\OrderTypeEnum::AUTO->name]) }}"
type="button" class="btn btn-soft-info btn-sm">
<i class="ri-upload-2-fill me-1 align-bottom"></i>
{{ __('translation.upload') }}
</a>
@endif
@if($order->status == \App\Enums\OrderStatusEnum::FINISHED->name && in_array(Auth::user()->role,['admin',\App\Enums\RoleEnum::MANAGER->name]))
@if($order->status == \App\Enums\OrderStatusEnum::FINISHED->value && in_array(Auth::user()?->role, ['admin', 'manager']))
<button type="button" class="btn btn-soft-info btn-sm"
data-bs-toggle="modal"
data-bs-target="#givingBonusModal">
@@ -311,7 +319,7 @@
<div class="card">
<div class="card-header align-items-center d-flex border-bottom-dashed">
<h4 class="card-title mb-0 flex-grow-1"> @lang('translation.member-appraisers')</h4>
@if(in_array(Auth::user()->role,['admin',\App\Enums\RoleEnum::MANAGER->name]))
@if(in_array(Auth::user()?->role,['admin',\App\Enums\RoleEnum::MANAGER->name]))
<div class="flex-shrink-0">
<button type="button" class="btn btn-soft-danger btn-sm"
data-bs-toggle="modal"
@@ -343,7 +351,7 @@
</div>
<div class="flex-shrink-0">
<div class="d-flex align-items-center gap-1">
@if(in_array(Auth::user()->role,['admin',\App\Enums\RoleEnum::MANAGER->name]))
@if(in_array(Auth::user()?->role,['admin',\App\Enums\RoleEnum::MANAGER->name]))
<form name="order-member{{ $member->id }}"
action="{{ route('member.remove') }}"
method="post"
@@ -505,7 +513,7 @@
</div>
<!-- Page content end row -->
@if(Auth::user()->role!=\App\Enums\RoleEnum::USER->name)
@if(Auth::user()?->role!=\App\Enums\RoleEnum::USER->name)
<!-- Attachment adding Modal -->
<div class="modal fade" id="attachModal" tabindex="-1" aria-labelledby="attachModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
@@ -590,7 +598,7 @@
</div>
<!-- Attachment adding end modal -->
@endif
@if(in_array(Auth::user()->role,['admin',\App\Enums\RoleEnum::MANAGER->name]))
@if(in_array(Auth::user()?->role,['admin',\App\Enums\RoleEnum::MANAGER->name]))
<!-- Invite members Modal -->
<div class="modal fade" id="inviteMembersModal" tabindex="-1" aria-labelledby="inviteMembersModalLabel"
aria-hidden="true">

View File

@@ -83,7 +83,7 @@
</div>
<div class="card-body">
<p class="text-muted mb-2"> @lang('translation.conclusion-file-pdf') </p>
<input type="file" class="form-control @error('file') is-invalid @enderror" name="file">
<input type="file" class="form-control @error('file') is-invalid @enderror" name="file" required accept="application/pdf">
@error('file')
<span class="invalid-feedback" role="alert">
<strong>@lang($message,['attribute'=>trans('translation.file')])</strong>

View File

@@ -576,6 +576,5 @@
@section('script')
<script src="{{ URL::asset('assets/libs/cleave.js/cleave.js.min.js') }}"></script>
<script src="{{ URL::asset('/assets/js/app.min.js') }}"></script>
<script src="{{ URL::asset('/assets/js/pages/orders/show.js') }}"></script>
<script src="{{ URL::asset('/assets/js/pages/orders/create.js') }}"></script>
@endsection

View File

@@ -33,7 +33,7 @@
<input type="text"
class="form-control text-uppercase @error('number') is-invalid @enderror"
name="number" placeholder="@lang('translation.write-number')"
id="order-number-input" value="{{ $order->number }}"
id="order-number-input" value="{{ old('number', $order->number) }}"
tabindex="1">
@error('number')
<span class="invalid-feedback" role="alert">
@@ -47,7 +47,7 @@
<input type="text"
class="form-control flatpickr-input @error('created_at') is-invalid @enderror"
id="auto-created_date-input"
name="created_at" value="{{ $order->created_at }}"
name="created_at" value="{{ old('created_at', $order->created_at ? \Carbon\Carbon::parse($order->created_at)->format('d.m.Y') : '') }}"
data-provider="flatpickr" data-date-format="d.m.Y"
data-maxDate="{{ Carbon\Carbon::now('Asia/Tashkent')->format('d.m.Y') }}"
data-deafult-date="{{ Carbon\Carbon::now('Asia/Tashkent')->format('d.m.Y') }}"
@@ -67,7 +67,7 @@
id="choices-purpose-input" tabindex="3">
@foreach($purposeCases as $purposeItem)
<option value="{{ $purposeItem->id }}"
@if(old('purpose_id') == $purposeItem->id)selected @endif>
@if(old('purpose_id', $order->purpose_id) == $purposeItem->id)selected @endif>
{{ $purposeItem->{str_replace('_', '-', app()->getLocale())} }}
</option>
@endforeach
@@ -92,7 +92,7 @@
<!-- Inline Checkbox -->
<div class="form-check form-check-inline mb-2">
<input class="form-check-input" type="radio"
@if($order->customer_type=='physical') checked @endif
@if(old('customer_type', $order->customer_type)=='physical') checked @endif
name="customer_type"
onclick="handleCustomerClick(this.value);" value="physical"
id="flexRadioDefault2">
@@ -102,7 +102,7 @@
</div>
<div class="form-check form-check-inline mb-2">
<input class="form-check-input is " type="radio"
@if($order->customer_type=='juridical') checked
@if(old('customer_type', $order->customer_type)=='juridical') checked
@endif name="customer_type"
onclick="handleCustomerClick(this.value);" value="juridical"
id="flexRadioDefault1">
@@ -120,7 +120,7 @@
<input type="text"
class="form-control text-uppercase @error('customer_last_name') is-invalid @enderror"
name="customer_last_name" id="order-customer_last_name-input"
value="{{ $order->customer_last_name }}"
value="{{ old('customer_last_name', $order->customer_last_name) }}"
placeholder="@lang('translation.write-customer-last-name')" tabindex="4">
@error('customer_last_name')
<span class="invalid-feedback" role="alert">
@@ -135,7 +135,7 @@
<input type="text"
class="form-control text-uppercase @error('customer_first_name') is-invalid @enderror"
name="customer_first_name" id="order-customer_first_name-input"
value="{{ $order->customer_first_name }}"
value="{{ old('customer_first_name', $order->customer_first_name) }}"
placeholder="@lang('translation.write-customer-first-name')" tabindex="5">
@error('customer_first_name')
<span class="invalid-feedback" role="alert">
@@ -150,7 +150,7 @@
<input type="text"
class="form-control text-uppercase @error('customer_patronymic') is-invalid @enderror"
name="customer_patronymic" id="order-customer_patronymic-input"
value="{{ $order->customer_patronymic }}"
value="{{ old('customer_patronymic', $order->customer_patronymic) }}"
placeholder="@lang('translation.write-customer-patronymic')" tabindex="6">
@error('customer_patronymic')
<span class="invalid-feedback" role="alert">
@@ -166,7 +166,7 @@
@lang('translation.customer-juridical-name')
</label>
<input type="text" class="form-control text-uppercase" name="customer_company"
id="order-customer_company-input" value="{{ $order->customer_company }}"
id="order-customer_company-input" value="{{ old('customer_company', $order->customer_company) }}"
placeholder="@lang('translation.write-customer-juridical-name')" tabindex="3">
@error('customer_company')
<span class="invalid-feedback" role="alert">
@@ -188,7 +188,7 @@
<div class="mb-3">
<!-- Inline Checkbox -->
<div class="form-check form-check-inline mb-2">
<input class="form-check-input" type="radio" @if($order->owner_type=='physical') checked
<input class="form-check-input" type="radio" @if(old('owner_type', $order->owner_type)=='physical') checked
@endif name="owner_type"
onclick="handleOwnerClick(this.value);" value="physical"
id="flexRadioDefault3">
@@ -198,7 +198,7 @@
</div>
<div class="form-check form-check-inline mb-2">
<input class="form-check-input is " type="radio"
@if($order->owner_type=='juridical') checked
@if(old('owner_type', $order->owner_type)=='juridical') checked
@endif name="owner_type"
onclick="handleOwnerClick(this.value);" value="juridical"
id="flexRadioDefault4">
@@ -213,7 +213,7 @@
<label class="form-label" for="order-owner_last_name-input">
@lang('translation.owner-last-name')
</label>
<input type="text" value="{{ $order->owner_last_name }}"
<input type="text" value="{{ old('owner_last_name', $order->owner_last_name) }}"
class="form-control text-uppercase @error('owner_last_name') is-invalid @enderror"
name="owner_last_name" id="order-owner_last_name-input"
placeholder="@lang('translation.write-owner-last-name')" tabindex="7">
@@ -229,7 +229,7 @@
</label>
<input type="text"
class="form-control text-uppercase @error('owner_first_name') is-invalid @enderror"
name="owner_first_name" value="{{ $order->owner_first_name }}"
name="owner_first_name" value="{{ old('owner_first_name', $order->owner_first_name) }}"
id="order-owner_first_name-input"
placeholder="@lang('translation.write-owner-first-name')" tabindex="8">
@error('owner_first_name')
@@ -242,7 +242,7 @@
<label class="form-label" for="order-owner_patronymic-input">
@lang('translation.owner-patronymic')
</label>
<input type="text" value="{{ $order->owner_patronymic }}"
<input type="text" value="{{ old('owner_patronymic', $order->owner_patronymic) }}"
class="form-control text-uppercase @error('owner_patronymic') is-invalid @enderror"
name="owner_patronymic" id="order-owner_patronymic-input"
placeholder="@lang('translation.write-owner-patronymic')" tabindex="9">
@@ -261,7 +261,7 @@
</label>
<input type="text"
class="form-control text-uppercase @error('owner_company') is-invalid @enderror"
name="owner_company" value="{{ $order->owner_company }}"
name="owner_company" value="{{ old('owner_company', $order->owner_company) }}"
id="order-owner_company-input"
placeholder="@lang('translation.write-owner-juridical-name')" tabindex="">
@error('owner_company')
@@ -290,7 +290,7 @@
class="form-control text-uppercase @error('contract_date') is-invalid @enderror"
id="estate-contract-date-input" name="contract_date"
data-provider="flatpickr" data-date-format="d.m.Y"
value="{{ $order->contract_date }}"
value="{{ old('contract_date', $order->contract_date ? \Carbon\Carbon::parse($order->contract_date)->format('d.m.Y') : '') }}"
placeholder="@lang('translation.write-estate-contract-date')"
tabindex="13">
@error('contract_date')
@@ -307,7 +307,7 @@
<input type="text"
class="form-control text-uppercase @error('name_of_object') is-invalid @enderror"
id="estate-name-of-object-input" name="name_of_object"
value="{{ $order->name_of_object }}"
value="{{ old('name_of_object', $order->name_of_object) }}"
placeholder="@lang('translation.write-estate-name-of-object')" tabindex="14">
@error('name_of_object')
<span class="invalid-feedback" role="alert">
@@ -325,7 +325,7 @@
id="choices-region-input" tabindex="3">
@foreach($regions as $region)
<option value="{{ $region->id }}"
@if($order->region == $region->id)selected @endif>
@if(old('region', $order->region) == $region->id)selected @endif>
{{ $region->{str_replace('_', '-', app()->getLocale())} }}
</option>
@endforeach
@@ -348,7 +348,7 @@
id="choices-district-input" tabindex="3">
@foreach($districts as $district)
<option value="{{ $district->id }}"
@if($order->district == $district->id)selected @endif>
@if(old('district', $order->district) == $district->id)selected @endif>
{{ $district->{str_replace('_', '-', app()->getLocale())} }}
</option>
@endforeach
@@ -366,7 +366,7 @@
<input type="text"
class="form-control text-uppercase @error('address') is-invalid @enderror"
id="estate-address-input" name="address"
value="{{ $order->address }}"
value="{{ old('address', $order->address) }}"
placeholder="@lang('translation.select-estate-address')" tabindex="11">
@error('address')
<span class="invalid-feedback" role="alert">
@@ -380,7 +380,7 @@
</label>
<input type="text"
class="form-control text-uppercase @error('home') is-invalid @enderror"
id="estate-home-input" name="home" value="{{ $order->home }}"
id="estate-home-input" name="home" value="{{ old('home', $order->home) }}"
placeholder="@lang('translation.write-home')" tabindex="12">
@error('home')
<span class="invalid-feedback" role="alert">
@@ -395,7 +395,7 @@
@lang('translation.area')
</label>
<input type="text" class="form-control text-uppercase @error('area') is-invalid @enderror"
id="estate-area-input" name="area" value="{{ $order->area }}"
id="estate-area-input" name="area" value="{{ old('area', $order->area) }}"
placeholder="@lang('translation.write-estate-area')" tabindex="16">
@error('area')
<span class="invalid-feedback" role="alert">
@@ -408,7 +408,7 @@
@lang('translation.overall-area')
</label>
<input type="text" class="form-control text-uppercase @error('overall_area') is-invalid @enderror"
id="estate-overall-area-input" name="overall_area" value="{{ $order->overall_area }}"
id="estate-overall-area-input" name="overall_area" value="{{ old('overall_area', $order->overall_area) }}"
placeholder="@lang('translation.write-overall-area')" tabindex="17">
@error('overall_area')
<span class="invalid-feedback" role="alert">
@@ -421,7 +421,7 @@
@lang('translation.usefull-area')
</label>
<input type="text" class="form-control text-uppercase @error('usefull_area') is-invalid @enderror"
id="estate-usefull-area-input" name="usefull_area" value="{{ $order->usefull_area }}"
id="estate-usefull-area-input" name="usefull_area" value="{{ old('usefull_area', $order->usefull_area) }}"
placeholder="@lang('translation.write-estate-usefull-area')" tabindex="18">
@error('usefull_area')
<span class="invalid-feedback" role="alert">
@@ -434,7 +434,7 @@
@lang('translation.live-area')
</label>
<input type="text" class="form-control text-uppercase @error('live_area') is-invalid @enderror"
id="estate-live-area-input" name="live_area" value="{{ $order->live_area }}"
id="estate-live_area-input" name="live_area" value="{{ old('live_area', $order->live_area) }}"
placeholder="@lang('translation.write-estate-live-area')" tabindex="18">
@error('live_area')
<span class="invalid-feedback" role="alert">
@@ -443,57 +443,6 @@
@enderror
</div>
</div>
{{--<div class="row gy-4">
<div class="mb-3 col-xxl-4 col-md-6">
<label class="form-label" for="estate-tech-passport-input">
@lang('translation.estate-technical-passport')
</label>
<input type="text" class="form-control text-uppercase @error('tech_passport') is-invalid @enderror"
id="estate-tech-passport-input"
name="tech_passport" value="{{ $order->tech_passport }}"
placeholder="@lang('translation.write-estate-technical-passport')" tabindex="19">
@error('tech_passport')
<span class="invalid-feedback" role="alert">
<strong>@lang($message,['attribute'=>trans('translation.estate-technical-passport')])</strong>
</span>
@enderror
</div>
<div class="mb-3 col-xxl-4 col-md-6">
<label class="form-label"
for="estate-tech-given-date-input">
@lang('translation.estate-technical-passport-given-date')
</label>
<input type="text"
class="form-control flatpickr-input text-uppercase @error('tech_given_date') is-invalid @enderror"
id="estate-tech-given-date-input"
name="tech_given_date"
value="{{ $order->tech_given_date }}"
data-provider="flatpickr" data-date-format="d.m.Y"
placeholder="@lang('translation.write-car-technical-passport-given-date')"
tabindex="20">
@error('tech_given_date')
<span class="invalid-feedback" role="alert">
<strong>@lang($message,['attribute'=>trans('translation.technical-passport-given-date')])</strong>
</span>
@enderror
</div>
<div class="mb-3 col-xxl-4 col-md-6">
<label class="form-label"
for="estate-given-by-whom-input">
@lang('translation.technical-passport-given-by-whom')
</label>
<input type="text" class="form-control text-uppercase @error('tech_given_whom') is-invalid @enderror"
id="estate-given-by-whom-input"
name="tech_given_whom" value="{{ $order->tech_given_whom }}"
placeholder="@lang('translation.write-technical-passport-given-by-whom')"
tabindex="21">
@error('tech_given_whom')
<span class="invalid-feedback" role="alert">
<strong>@lang($message,['attribute'=>trans('translation.technical-passport-given-by-whom')])</strong>
</span>
@enderror
</div>
</div>--}}
</div>
</div>
<!-- end card -->
@@ -517,11 +466,11 @@
@lang('translation.select-diller')
</label>
<select data-choices data-choices-search-false data-choices-multiple-groups="false"
name="diller" class="form-select @error('diller') is-invalid @enderror"
name="diller_id" class="form-select @error('diller_id') is-invalid @enderror"
id="choices-diller-input"
tabindex="23">
@foreach($dillers as $diller)
<option value="{{ $diller->id}}" @if($order->diller== $diller->id) selected @endif>
<option value="{{ $diller->id}}" @if(old('diller_id', $order->diller_id)== $diller->id) selected @endif>
{{ $diller->name }}
</option>
@endforeach
@@ -548,7 +497,7 @@
<input type="text"
class="form-control text-uppercase @error('ordered_customer') is-invalid @enderror"
id="auto-ordered_customer-input"
name="ordered_customer" value="{{ $order->ordered_customer }}"
name="ordered_customer" value="{{ old('ordered_customer', $order->ordered_customer) }}"
placeholder="@lang('translation.write-car-ordered-customer')" tabindex="24">
@error('ordered_customer')
<span class="invalid-feedback" role="alert">
@@ -563,7 +512,7 @@
<input type="text"
class="form-control text-uppercase @error('ordered_customer_phone') is-invalid @enderror"
name="ordered_customer_phone" id="cleave-phone-init"
value="{{ $order->ordered_customer_phone }}"
value="{{ old('ordered_customer_phone', $order->ordered_customer_phone) }}"
placeholder="@lang('translation.write-car-ordered-customer-phone')" tabindex="25">
@error('ordered_customer_phone')
<span class="invalid-feedback" role="alert">
@@ -590,7 +539,7 @@
<input type="text"
class="form-control text-uppercase @error('cost') is-invalid @enderror"
name="cost"
id="cleave-numeral" value="{{ $order->cost }}"
id="cleave-numeral" value="{{ old('cost', $order->cost) }}"
placeholder="123,450" aria-label="Price"
aria-describedby="product-price-addon"
tabindex="26">
@@ -617,7 +566,7 @@
<textarea class="form-control text-uppercase @error('note') is-invalid @enderror" name="note"
id="auto-note-input"
placeholder="@lang('translation.write-cost-note')"
rows="3" tabindex="27">{{ $order->note }}</textarea>
rows="3" tabindex="27">{{ old('note', $order->note) }}</textarea>
@error('note')
<span class="invalid-feedback" role="alert">
<strong>@lang($message,['attribute'=>trans('translation.note')])</strong>

View File

@@ -116,15 +116,22 @@
<h4 class="card-title mb-0 flex-grow-1">
{{ __('translation.conclusions') }}
</h4>
<div class="flex-shrink-0">
@if(in_array($order->status,[\App\Enums\OrderStatusEnum::STARTED->name,\App\Enums\OrderStatusEnum::REJECTED->name]) && $isAppraisers)
<a href="{{ route('conclusion.add', ['id' => $order->id,'type'=>\App\Enums\OrderTypeEnum::ESTATE->name]) }}"
@if($conclusions->count() > 0)
<a href="{{ route('estate.generate_pdf', $order->id) }}"
target="_blank"
class="btn btn-soft-success btn-sm me-1">
<i class="ri-download-2-line me-1 align-bottom"></i>
Tayyor xulosani yuklab olish
</a>
@endif
@if(!in_array($order->status, [\App\Enums\OrderStatusEnum::APPROVED->value, \App\Enums\OrderStatusEnum::MODERATED->value]) && (in_array(Auth::user()?->role, ['admin', 'manager']) || $isAppraisers))
<a href="{{ route('conclusion.add', ['id' => $order->id, 'type' => \App\Enums\OrderTypeEnum::ESTATE->name]) }}"
type="button" class="btn btn-soft-info btn-sm">
<i class="ri-upload-2-fill me-1 align-bottom"></i>
{{ __('translation.upload') }}
</a>
@endif
@if($order->status == \App\Enums\OrderStatusEnum::FINISHED->name && in_array(Auth::user()->role,['admin',\App\Enums\RoleEnum::MANAGER->name]))
@if($order->status == \App\Enums\OrderStatusEnum::FINISHED->value && in_array(Auth::user()?->role, ['admin', 'manager']))
<button type="button" class="btn btn-soft-info btn-sm"
data-bs-toggle="modal"
data-bs-target="#givingBonusModal">

View File

@@ -51,7 +51,7 @@
<div class="card mt-4">
<div class="card-body p-4">
<div class="text-center mt-2">
<img width="100" src="{{ URL::asset('storage/attachments/auto_'.$order->id.'/qr.png') }}"
<img width="100" src="{{ route('qr.image', ['type' => 'auto', 'id' => $order->id]) }}"
alt="Order qr code image">
</div>
<div class="p-2 mt-4">

View File

@@ -51,7 +51,7 @@
<div class="card mt-4">
<div class="card-body p-4">
<div class="text-center mt-2">
<img width="100" src="{{ URL::asset('storage/attachments/estate_'.$order->id.'/qr.png') }}"
<img width="100" src="{{ route('qr.image', ['type' => 'estate', 'id' => $order->id]) }}"
alt="Order qr code image">
</div>
<div class="p-2 mt-4">

View File

@@ -42,86 +42,90 @@ Route::get('index/{locale}', [HomeController::class, 'lang']);
Route::get('/', [HomeController::class, 'index'])->name('root');
Route::get('index', [HomeController::class, 'index'])->name('index');
//Update User Details
Route::post('/update-profile/{id}', [ProfileController::class, 'updateProfile'])->name('updateProfile');
Route::post('/update-password/{id}', [ProfileController::class, 'updatePassword'])->name('updatePassword');
Route::get('qr/show/{content}', [QrController::class, 'show'])->name('qr.show');
Route::get('qr/re-generate/{id}/{type}', [QrController::class, 'reGenerate'])->name('qr.generate');
Route::get('conclusion/test-water-mark', [ConclusionController::class, 'testWaterMark'])->name('wm.show');
Route::post('/member/remove', [OrderMembersController::class, 'remove'])->name('member.remove');
Route::post('/members/invite', [OrderMembersController::class, 'invite'])->name('members.invite');
Route::get('/estate', [EstateController::class, 'index'])->name('estate.index');
Route::get('/estate/create', [EstateController::class, 'create'])->name('estate.create');
Route::post('/estate/store', [EstateController::class, 'store'])->name('estate.store');
Route::get('/estate/edit/{id}', [EstateController::class, 'edit'])->name('estate.edit');
Route::put('/estate/update/{id}', [EstateController::class, 'update'])->name('estate.update');
Route::get('/estate/show/{order}', [EstateController::class, 'show'])->name('estate.show');
Route::get('/estate/show-activities/{order}', [EstateController::class, 'showActivities'])->name('estate.show-activities');
Route::get('/estate/show-team/{order}', [EstateController::class, 'showTeam'])->name('estate.show-team');
Route::get('/estate/show-documents/{order}', [EstateController::class, 'showDocuments'])->name('estate.show-documents');
Route::put('/estate/order-clone/{id}', [EstateController::class, 'orderClone'])->name('estate.clone');
Route::get('/auto', [AutoController::class, 'index'])->name('auto.index');
Route::get('/auto/create', [AutoController::class, 'create'])->name('auto.create');
Route::post('/auto/store', [AutoController::class, 'store'])->name('auto.store');
Route::get('/auto/edit/{id}', [AutoController::class, 'edit'])->name('auto.edit');
Route::put('/auto/update/{id}', [AutoController::class, 'update'])->name('auto.update');
Route::get('/auto/show/{order}', [AutoController::class, 'show'])->name('auto.show');
Route::get('/auto/show-activities/{order}', [AutoController::class, 'showActivities'])->name('auto.show-activities');
Route::get('/auto/show-team/{order}', [AutoController::class, 'showTeam'])->name('auto.show-team');
Route::get('/auto/show-documents/{order}', [AutoController::class, 'showDocuments'])->name('auto.show-documents');
Route::put('/auto/order-clone/{id}', [AutoController::class, 'orderClone'])->name('auto.clone');
Route::get('/conclusion/add/{id}/{type}', [ConclusionController::class, 'create'])->name('conclusion.add');
Route::post('/conclusion/store', [ConclusionController::class, 'store'])->name('conclusion.store');
Route::put('/conclusion/reject', [ConclusionController::class, 'reject'])->name('conclusion.reject');
Route::get('/tools', [ToolsController::class, 'index'])->name('tools.index');
Route::get('/user', [UserController::class, 'index'])->name('user.index');
Route::post('/user/store', [UserController::class, 'create'])->name('user.store');
Route::get('/user/show/{id}', [UserController::class, 'show'])->name('user.show');
Route::put('/user/update', [UserController::class, 'update'])->name('user.update');
Route::post('/user/favourite/{id}', [UserController::class, 'favourite'])->name('user.favourite');
Route::put('/user/password/change', [UserController::class, 'updatePassword'])->name('password.change');
Route::get('/user/info/edit', [UserInfoController::class, 'edit'])->name('profile.info.edit');
Route::put('/user/info/store', [UserInfoController::class, 'update'])->name('profile.info.update');
Route::get('/profile/edit', [UserController::class, 'edit'])->name('profile.edit');
Route::put('/profile/update', [UserController::class, 'update'])->name('profile.update');
Route::get('/profile/show-activities', [ProfileController::class, 'showActivities'])->name('profile.show-activities');
Route::get('/profile/show-projects', [ProfileController::class, 'showProjects'])->name('profile.show-projects');
Route::get('/profile/show-documents', [ProfileController::class, 'showDocuments'])->name('profile.show-documents');
Route::get('/user/profile', [ProfileController::class, 'profile'], 'profile')->name('profile');
Route::put('/user/activate/{id}', [UserController::class, 'activate'])->name('user.activate');
Route::put('/user/block/{id}', [UserController::class, 'block'])->name('user.block');
Route::get('/user/appraisers', [UserController::class, 'appraisers'])->name('user.appraisers');
Route::get('/appraisers/bonus', [UserController::class, 'appraisersBonus'])->name('appraisers.bonus');
Route::delete('/diller/{id}', [UserController::class, 'destroy'])->name('diller.destroy');
Route::get('/diller', DillerController::class)->name('diller.index');
Route::get('/role', [RoleController::class, 'index'])->name('role.index');
Route::put('/role/permit', [RoleController::class, 'permit'])->name('role.permit');
Route::get('/notification/type', NotificationTypeController::class)->name('notification.type.index');
Route::get('/notification/template', [NotificationTemplateController::class, 'index'])->name('notification.template.index');
//Route::post('/store/my/file', [FileStoreController::class, 'storeMyFile'])->name('store.my.file');
Route::post('/attach/file', [FileStoreController::class, 'attachFiles'])->name('attach.files');
Route::post('/attach/profile-file', [FileStoreController::class, 'attachProfileFiles'])->name('profile.files');
Route::get('v/{type}/{id}', [QrController::class, 'verify'])->name('qr.verify');
Route::get('qr-image/{type}/{id}', [QrController::class, 'qrImage'])->name('qr.image');
Route::get('/download/{file}', [FileStoreController::class, 'downloadFile'])->name('download');
Route::delete('file/delete/{file}', [FileStoreController::class, 'delete'])->name('file.delete');
Route::put('debit/credit', [BonusController::class, 'storeCredit'])->name('credit.store');
Route::resource('/debit', DebitController::class);
Route::resource('bonus', BonusController::class);
Route::resource('certificates', CertificateController::class);
Route::resource('purposes', PurposeController::class);
Route::resource('regions', RegionController::class);
Route::get('/regions/districts/{id}', [RegionController::class, 'districts'])->name('regions.districts');
Route::resource('districts', DistrictController::class);
Route::resource('concerns', ConcernController::class);
Route::group(['middleware' => ['auth']], function () {
//Update User Details
Route::post('/update-profile/{id}', [ProfileController::class, 'updateProfile'])->name('updateProfile');
Route::post('/update-password/{id}', [ProfileController::class, 'updatePassword'])->name('updatePassword');
Route::get('qr/show/{content}', [QrController::class, 'show'])->name('qr.show');
Route::get('qr/re-generate/{id}/{type}', [QrController::class, 'reGenerate'])->name('qr.generate');
Route::get('conclusion/test-water-mark', [ConclusionController::class, 'testWaterMark'])->name('wm.show');
Route::post('/member/remove', [OrderMembersController::class, 'remove'])->name('member.remove');
Route::post('/members/invite', [OrderMembersController::class, 'invite'])->name('members.invite');
Route::get('/estate', [EstateController::class, 'index'])->name('estate.index');
Route::get('/estate/create', [EstateController::class, 'create'])->name('estate.create');
Route::post('/estate/store', [EstateController::class, 'store'])->name('estate.store');
Route::get('/estate/edit/{id}', [EstateController::class, 'edit'])->name('estate.edit');
Route::put('/estate/update/{id}', [EstateController::class, 'update'])->name('estate.update');
Route::get('/estate/show/{order}', [EstateController::class, 'show'])->name('estate.show');
Route::get('/estate/show-activities/{order}', [EstateController::class, 'showActivities'])->name('estate.show-activities');
Route::get('/estate/show-team/{order}', [EstateController::class, 'showTeam'])->name('estate.show-team');
Route::get('/estate/show-documents/{order}', [EstateController::class, 'showDocuments'])->name('estate.show-documents');
Route::get('/estate/generate-pdf/{order}', [EstateController::class, 'generatePdf'])->name('estate.generate_pdf');
Route::put('/estate/order-clone/{id}', [EstateController::class, 'orderClone'])->name('estate.clone');
Route::get('/auto', [AutoController::class, 'index'])->name('auto.index');
Route::get('/auto/create', [AutoController::class, 'create'])->name('auto.create');
Route::post('/auto/store', [AutoController::class, 'store'])->name('auto.store');
Route::get('/auto/edit/{id}', [AutoController::class, 'edit'])->name('auto.edit');
Route::put('/auto/update/{id}', [AutoController::class, 'update'])->name('auto.update');
Route::get('/auto/show/{order}', [AutoController::class, 'show'])->name('auto.show');
Route::get('/auto/show-activities/{order}', [AutoController::class, 'showActivities'])->name('auto.show-activities');
Route::get('/auto/show-team/{order}', [AutoController::class, 'showTeam'])->name('auto.show-team');
Route::get('/auto/show-documents/{order}', [AutoController::class, 'showDocuments'])->name('auto.show-documents');
Route::get('/auto/generate-pdf/{order}', [AutoController::class, 'generatePdf'])->name('auto.generate_pdf');
Route::put('/auto/order-clone/{id}', [AutoController::class, 'orderClone'])->name('auto.clone');
Route::get('/conclusion/add/{id}/{type}', [ConclusionController::class, 'create'])->name('conclusion.add');
Route::post('/conclusion/store', [ConclusionController::class, 'store'])->name('conclusion.store');
Route::put('/conclusion/reject', [ConclusionController::class, 'reject'])->name('conclusion.reject');
Route::get('/tools', [ToolsController::class, 'index'])->name('tools.index');
Route::get('/user', [UserController::class, 'index'])->name('user.index');
Route::post('/user/store', [UserController::class, 'create'])->name('user.store');
Route::get('/user/show/{id}', [UserController::class, 'show'])->name('user.show');
Route::put('/user/update', [UserController::class, 'update'])->name('user.update');
Route::post('/user/favourite/{id}', [UserController::class, 'favourite'])->name('user.favourite');
Route::put('/user/password/change', [UserController::class, 'updatePassword'])->name('password.change');
Route::get('/user/info/edit', [UserInfoController::class, 'edit'])->name('profile.info.edit');
Route::put('/user/info/store', [UserInfoController::class, 'update'])->name('profile.info.update');
Route::get('/profile/edit', [UserController::class, 'edit'])->name('profile.edit');
Route::put('/profile/update', [UserController::class, 'update'])->name('profile.update');
Route::get('/profile/show-activities', [ProfileController::class, 'showActivities'])->name('profile.show-activities');
Route::get('/profile/show-projects', [ProfileController::class, 'showProjects'])->name('profile.show-projects');
Route::get('/profile/show-documents', [ProfileController::class, 'showDocuments'])->name('profile.show-documents');
Route::get('/user/profile', [ProfileController::class, 'profile'])->name('profile');
Route::put('/user/activate/{id}', [UserController::class, 'activate'])->name('user.activate');
Route::put('/user/block/{id}', [UserController::class, 'block'])->name('user.block');
Route::get('/user/appraisers', [UserController::class, 'appraisers'])->name('user.appraisers');
Route::get('/appraisers/bonus', [UserController::class, 'appraisersBonus'])->name('appraisers.bonus');
Route::delete('/diller/{id}', [UserController::class, 'destroy'])->name('diller.destroy');
Route::get('/diller', DillerController::class)->name('diller.index');
Route::get('/role', [RoleController::class, 'index'])->name('role.index');
Route::put('/role/permit', [RoleController::class, 'permit'])->name('role.permit');
Route::get('/notification/type', NotificationTypeController::class)->name('notification.type.index');
Route::get('/notification/template', [NotificationTemplateController::class, 'index'])->name('notification.template.index');
Route::post('/attach/file', [FileStoreController::class, 'attachFiles'])->name('attach.files');
Route::post('/attach/profile-file', [FileStoreController::class, 'attachProfileFiles'])->name('profile.files');
Route::delete('file/delete/{file}', [FileStoreController::class, 'delete'])->name('file.delete');
Route::put('debit/credit', [BonusController::class, 'storeCredit'])->name('credit.store');
Route::resource('/debit', DebitController::class);
Route::resource('bonus', BonusController::class);
Route::resource('certificates', CertificateController::class);
Route::resource('purposes', PurposeController::class);
Route::resource('regions', RegionController::class);
Route::get('/regions/districts/{id}', [RegionController::class, 'districts'])->name('regions.districts');
Route::resource('districts', DistrictController::class);
Route::resource('concerns', ConcernController::class);
});
Route::get('{any}', [HomeController::class, 'pages'])->name('pages');

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Some files were not shown because too many files have changed in this diff Show More