feat(ui): implement phase 3.8 branding and UX improvements
- Integrate SweetAlert2 into WordPress bridge for enhanced error reporting - Add professional favicon set (SVG, ICO, PWA, Apple Touch) and manifest - Replace default Laravel welcome page with branded landing page - Compact Filament login card dimensions and padding for better UI - Update documentation (AGENT.md, CLIENT_DELIVERY.md) to reflect phase 3.8 - Refactor wallet transaction migration for SQLite compatibility
@ -1043,4 +1043,31 @@
|
||||
.ifnex-total-spent strong {
|
||||
color: #f9fafb;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* ══════════════════════════════════════════════════════════════
|
||||
SweetAlert2 — هماهنگسازی با هویت بصری IFNEX (فاز ۳.۸)
|
||||
پاپآپ خطاهای فرم سفارش: فونت وزیرمتن + RTL + دکمهٔ کهربایی
|
||||
══════════════════════════════════════════════════════════════ */
|
||||
.ifnex-swal {
|
||||
direction: rtl;
|
||||
font-family: 'Vazirmatn', 'IranYekan', Tahoma, sans-serif;
|
||||
border-radius: 16px;
|
||||
}
|
||||
.ifnex-swal .swal2-title {
|
||||
font-family: 'Vazirmatn', 'IranYekan', Tahoma, sans-serif;
|
||||
font-size: 18px;
|
||||
font-weight: 700;
|
||||
color: #1f2937;
|
||||
}
|
||||
.ifnex-swal .swal2-html-container {
|
||||
font-family: 'Vazirmatn', 'IranYekan', Tahoma, sans-serif;
|
||||
font-size: 14px;
|
||||
color: #6b7280;
|
||||
line-height: 1.8;
|
||||
}
|
||||
.ifnex-swal .swal2-confirm {
|
||||
font-family: 'Vazirmatn', 'IranYekan', Tahoma, sans-serif;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
@ -383,7 +383,7 @@ jQuery(document).ready(function($) {
|
||||
// حذف یه بسته
|
||||
function removePackage(pkgId) {
|
||||
if (packages.length <= 1) {
|
||||
alert('حداقل باید یک بسته وجود داشته باشد.');
|
||||
swalError('امکان حذف نیست', 'حداقل باید یک بسته وجود داشته باشد.');
|
||||
return;
|
||||
}
|
||||
packages = packages.filter(function(p) { return p.id !== pkgId; });
|
||||
@ -544,7 +544,7 @@ jQuery(document).ready(function($) {
|
||||
// افزودن یه قلم جدید
|
||||
function addInvoiceItem() {
|
||||
if (invoiceItems.length >= MAX_ITEMS) {
|
||||
alert('حداکثر ' + MAX_ITEMS + ' قلم میتوانید اضافه کنید.');
|
||||
swalError('سقف اقلام پر است', 'حداکثر ' + MAX_ITEMS + ' قلم میتوانید اضافه کنید.');
|
||||
return;
|
||||
}
|
||||
var itemNumber = invoiceItems.length + 1;
|
||||
@ -564,7 +564,7 @@ jQuery(document).ready(function($) {
|
||||
// حذف یه قلم
|
||||
function removeInvoiceItem(itemId) {
|
||||
if (invoiceItems.length <= 1) {
|
||||
alert('حداقل باید یک قلم وجود داشته باشد.');
|
||||
swalError('امکان حذف نیست', 'حداقل باید یک قلم وجود داشته باشد.');
|
||||
return;
|
||||
}
|
||||
invoiceItems = invoiceItems.filter(function(i) { return i.id !== itemId; });
|
||||
@ -987,12 +987,31 @@ jQuery(document).ready(function($) {
|
||||
function showFormError(msg) {
|
||||
$('#ifnex-form-error').text(msg).show();
|
||||
setTimeout(function() { $('#ifnex-form-error').fadeOut(); }, 4000);
|
||||
// پاپآپ مرکزی خطا (فاز ۳.۸ — SweetAlert2)
|
||||
swalError('خطا در فرم سفارش', msg);
|
||||
}
|
||||
|
||||
function showCalcError(msg) {
|
||||
$('#ifnex-calc-error').text(msg).show();
|
||||
}
|
||||
|
||||
// ─── SweetAlert2 helpers (فاز ۳.۸) ───
|
||||
// پاپآپ خطا در مرکز صفحه؛ اگه Swal لود نشده بود به alert برمیگرده
|
||||
function swalError(title, text) {
|
||||
if (window.Swal && typeof window.Swal.fire === 'function') {
|
||||
window.Swal.fire({
|
||||
icon: 'error',
|
||||
title: title,
|
||||
text: text || '',
|
||||
confirmButtonText: 'متوجه شدم',
|
||||
confirmButtonColor: '#f59e0b',
|
||||
customClass: { popup: 'ifnex-swal' }
|
||||
});
|
||||
} else {
|
||||
alert((title ? title + '\n' : '') + (text || ''));
|
||||
}
|
||||
}
|
||||
|
||||
// ─── Submit Order ───
|
||||
$('#ifnex-submit-order').on('click', function() {
|
||||
|
||||
@ -1077,10 +1096,15 @@ jQuery(document).ready(function($) {
|
||||
: '✅ تأیید و ثبت سفارش'
|
||||
);
|
||||
|
||||
var submitErrMsg = (res && res.data) ? res.data : 'خطا در ثبت سفارش';
|
||||
|
||||
$('#ifnex-submit-error')
|
||||
.text(res.data || 'خطا در ثبت سفارش')
|
||||
.text(submitErrMsg)
|
||||
.show();
|
||||
|
||||
// پاپآپ مرکزی خطای ثبت (فاز ۳.۸ — SweetAlert2)
|
||||
swalError('ثبت سفارش انجام نشد', submitErrMsg);
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
@ -1103,6 +1127,9 @@ jQuery(document).ready(function($) {
|
||||
.text('خطا در ارتباط با سرور')
|
||||
.show();
|
||||
|
||||
// پاپآپ مرکزی خطای ارتباط (فاز ۳.۸ — SweetAlert2)
|
||||
swalError('خطا در ارتباط با سرور', 'لطفاً اتصال اینترنت را بررسی کنید و دوباره تلاش کنید.');
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
6
03_WordPress/wp-content/plugins/ifnex-bridge/assets/js/sweetalert2.all.min.js
vendored
Normal file
@ -35,7 +35,9 @@ function ifnex_enqueue_scripts() {
|
||||
has_shortcode($post->post_content, 'ifnex_order_payment') ||
|
||||
has_shortcode($post->post_content, 'ifnex_customer_dashboard'))) {
|
||||
wp_enqueue_style('ifnex-bridge-css', plugin_dir_url(__FILE__) . 'assets/css/ifnex-bridge.css', array('ifnex-main'), '2.0.0-' . time());
|
||||
wp_enqueue_script('ifnex-order-form-js', plugin_dir_url(__FILE__) . 'assets/js/ifnex-order-form.js', array('jquery'), '2.0.0-' . time(), true);
|
||||
// SweetAlert2 — پاپآپ خطاها (فاز ۳.۸) — باندل محلی، بدون وابستگی به CDN
|
||||
wp_enqueue_script('sweetalert2', plugin_dir_url(__FILE__) . 'assets/js/sweetalert2.all.min.js', array(), '11.14.5', true);
|
||||
wp_enqueue_script('ifnex-order-form-js', plugin_dir_url(__FILE__) . 'assets/js/ifnex-order-form.js', array('jquery', 'sweetalert2'), '2.0.0-' . time(), true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -652,10 +652,18 @@ function ifnex_enqueue_order_assets() {
|
||||
|
||||
// لود jQuery & JS
|
||||
wp_enqueue_script('jquery');
|
||||
// SweetAlert2 — پاپآپ خطاهای فرم سفارش (فاز ۳.۸) — باندل محلی، بدون وابستگی به CDN
|
||||
wp_enqueue_script(
|
||||
'sweetalert2',
|
||||
$plugin_url . 'assets/js/sweetalert2.all.min.js',
|
||||
array(),
|
||||
'11.14.5',
|
||||
true
|
||||
);
|
||||
wp_enqueue_script(
|
||||
'ifnex-order-form-js',
|
||||
$plugin_url . 'assets/js/ifnex-order-form.js',
|
||||
array('jquery'),
|
||||
array('jquery', 'sweetalert2'),
|
||||
'2.0.0-' . time(),
|
||||
true
|
||||
);
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
APP_NAME=Laravel
|
||||
APP_NAME="IFNEX Logistics"
|
||||
APP_ENV=local
|
||||
APP_KEY=
|
||||
APP_DEBUG=true
|
||||
|
||||
@ -5,17 +5,30 @@
|
||||
*
|
||||
* برای پشتیبانی از فاکتورهای دستی مدیر، یک نوع تراکنش جدید اضافه میکنیم:
|
||||
* 'invoice_payment' — کسر مبلغ فاکتور از کیف پول مشتری.
|
||||
*
|
||||
* سازگار با MySQL و SQLite (تستها طبق AGENT.md با SQLite اجرا میشوند):
|
||||
* - MySQL: ALTER TABLE ... MODIFY COLUMN ... ENUM
|
||||
* - SQLite: enum فقط در سطح اپلیکیشن اعمال میشود (cast روی مدل WalletTransaction)
|
||||
* پس روی SQLite نیازی به تغییر اسکیما نیست.
|
||||
*/
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
if (! Schema::hasTable('wallet_transactions')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// SQLite از MODIFY COLUMN پشتیبانی نمیکند و enum در آن معنا ندارد — skip
|
||||
if (DB::getDriverName() === 'sqlite') {
|
||||
return;
|
||||
}
|
||||
|
||||
// MySQL: ALTER COLUMN بهروزرسانی enum
|
||||
// مقادیر جدید شامل همه موارد قبلی + 'invoice_payment'
|
||||
DB::statement("
|
||||
@ -34,6 +47,15 @@ return new class extends Migration
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
if (! Schema::hasTable('wallet_transactions')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// SQLite: هیچ تغییری در اسکیما داده نشده — skip
|
||||
if (DB::getDriverName() === 'sqlite') {
|
||||
return;
|
||||
}
|
||||
|
||||
// بازگشت به حالت قبلی — فقط اگه هیچ رکورد با type='invoice_payment' نباشد
|
||||
$count = DB::table('wallet_transactions')
|
||||
->where('type', 'invoice_payment')
|
||||
|
||||
|
Before Width: | Height: | Size: 0 B After Width: | Height: | Size: 9.3 KiB |
BIN
04_Laravel/public/images/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
@ -1,4 +1,28 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
||||
<rect width="32" height="32" fill="#f59e0b" rx="6"/>
|
||||
<text x="16" y="22" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="white" text-anchor="middle">I</text>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<defs>
|
||||
<!-- Navy brand gradient — matches login page & Filament sidebar -->
|
||||
<linearGradient id="ifnexNavy" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0" stop-color="#1b2143"/>
|
||||
<stop offset="1" stop-color="#12182d"/>
|
||||
</linearGradient>
|
||||
<!-- Amber brand gradient — matches CTAs & accents -->
|
||||
<linearGradient id="ifnexAmber" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0" stop-color="#FDB913"/>
|
||||
<stop offset="1" stop-color="#f59e0b"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Rounded-square background (22% radius) -->
|
||||
<rect width="24" height="24" rx="5.3" fill="url(#ifnexNavy)"/>
|
||||
<!-- Subtle inner light border -->
|
||||
<rect x="0.14" y="0.14" width="23.72" height="23.72" rx="5.16"
|
||||
fill="none" stroke="#ffffff" stroke-opacity="0.10" stroke-width="0.42"/>
|
||||
|
||||
<!-- Soft amber glow behind the mark -->
|
||||
<circle cx="12" cy="11" r="7.8" fill="#FDB913" opacity="0.10"/>
|
||||
|
||||
<!-- Paper-plane mark (Material "flight" path) centered at 62% of tile -->
|
||||
<path transform="translate(12,12) scale(0.78) translate(-11.5,-12)"
|
||||
fill="url(#ifnexAmber)"
|
||||
d="M21,16v-2l-8-5V3.5C13,2.67 12.33,2 11.5,2S10,2.67 10,3.5V9l-8,5v2l8-2.5V19l-2,1.5V22l3.5-1l3.5,1v-1.5L13,19v-5.5L21,16z"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 254 B After Width: | Height: | Size: 1.3 KiB |
BIN
04_Laravel/public/images/icon-192.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
04_Laravel/public/images/icon-512.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
19
04_Laravel/public/images/site.webmanifest
Normal file
@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "IFNEX Logistics",
|
||||
"short_name": "IFNEX",
|
||||
"icons": [
|
||||
{
|
||||
"src": "icon-192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "icon-512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
}
|
||||
],
|
||||
"theme_color": "#1b2143",
|
||||
"background_color": "#12182d",
|
||||
"display": "standalone"
|
||||
}
|
||||
@ -1,3 +1,9 @@
|
||||
<!-- IFNEX Favicon set (ico fallback + svg modern + iOS/PWA) -->
|
||||
<link rel="icon" href="{{ asset('favicon.ico') }}" sizes="any">
|
||||
<link rel="icon" type="image/svg+xml" href="{{ asset('images/favicon.svg') }}">
|
||||
<link rel="apple-touch-icon" href="{{ asset('images/apple-touch-icon.png') }}">
|
||||
<link rel="manifest" href="{{ asset('images/site.webmanifest') }}">
|
||||
|
||||
<!-- فونت وزیرمتن برای فارسی -->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
@ -86,15 +86,15 @@
|
||||
transform: rotate(-18deg);
|
||||
}
|
||||
|
||||
/* ---- Centered login card ---- */
|
||||
/* ---- Centered login card — compact (فاز ۳.۸: جمعشدن فرم لاگین) ---- */
|
||||
.ifnex-login-card {
|
||||
position: relative;
|
||||
z-index: 10;
|
||||
width: 100%;
|
||||
max-width: 440px;
|
||||
max-width: 380px;
|
||||
background: #FAF9F6;
|
||||
border-radius: 16px;
|
||||
padding: 2.5rem 2.25rem 1.75rem;
|
||||
padding: 1.75rem 1.75rem 1.25rem;
|
||||
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25),
|
||||
0 0 0 1px rgba(255, 255, 255, 0.05);
|
||||
animation: ifnexFadeInUp 0.6s ease-out;
|
||||
@ -108,8 +108,8 @@
|
||||
/* ---- Logo ---- */
|
||||
.ifnex-login-logo {
|
||||
display: block;
|
||||
margin: 0 auto 1.5rem;
|
||||
width: 120px;
|
||||
margin: 0 auto 1rem;
|
||||
width: 84px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
@ -117,10 +117,10 @@
|
||||
.ifnex-login-title {
|
||||
font-family: 'Vazirmatn', sans-serif;
|
||||
font-weight: 700;
|
||||
font-size: 22px;
|
||||
font-size: 19px;
|
||||
color: #1f2937;
|
||||
text-align: center;
|
||||
margin: 0 0 0.5rem;
|
||||
margin: 0 0 0.25rem;
|
||||
letter-spacing: -0.01em;
|
||||
line-height: 1.3;
|
||||
}
|
||||
@ -128,16 +128,16 @@
|
||||
.ifnex-login-subtitle {
|
||||
font-family: 'Vazirmatn', sans-serif;
|
||||
font-weight: 500;
|
||||
font-size: 13px;
|
||||
font-size: 12px;
|
||||
color: #6b7280;
|
||||
text-align: center;
|
||||
margin: 0 0 2rem;
|
||||
margin: 0 0 1.25rem;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
/* ---- Form wrapper ---- */
|
||||
.ifnex-login-form {
|
||||
margin-bottom: 1.5rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
/* === Filament form overrides (scoped to card) === */
|
||||
@ -178,8 +178,8 @@
|
||||
.ifnex-login-card input[type="email"],
|
||||
.ifnex-login-card input[type="password"],
|
||||
.ifnex-login-card input[type="text"] {
|
||||
padding: 0.75rem 1rem !important;
|
||||
font-size: 14px !important;
|
||||
padding: 0.6rem 0.85rem !important;
|
||||
font-size: 13.5px !important;
|
||||
color: #1f2937 !important;
|
||||
background: transparent !important;
|
||||
font-family: 'Vazirmatn', sans-serif !important;
|
||||
@ -213,7 +213,7 @@
|
||||
.ifnex-login-card .fi-field + .fi-field,
|
||||
.ifnex-login-card .fi-form-field + .fi-form-field,
|
||||
.ifnex-login-card .fi-fo-wrp + .fi-fo-wrp {
|
||||
margin-top: 1rem !important;
|
||||
margin-top: 0.75rem !important;
|
||||
}
|
||||
|
||||
/* Checkbox "مرا به خاطر بسپار" — amber accent */
|
||||
@ -249,13 +249,13 @@
|
||||
font-weight: 700 !important;
|
||||
font-family: 'Vazirmatn', sans-serif !important;
|
||||
border-radius: 8px !important;
|
||||
padding: 0.75rem 1rem !important;
|
||||
padding: 0.6rem 1rem !important;
|
||||
width: 100% !important;
|
||||
border: none !important;
|
||||
box-shadow: 0 4px 14px rgba(245, 158, 11, 0.35) !important;
|
||||
transition: transform 0.2s, box-shadow 0.2s, background 0.2s !important;
|
||||
cursor: pointer !important;
|
||||
font-size: 15px !important;
|
||||
font-size: 14px !important;
|
||||
display: block !important;
|
||||
text-align: center !important;
|
||||
letter-spacing: 0;
|
||||
@ -281,7 +281,7 @@
|
||||
.ifnex-login-card .ifnex-login-submit {
|
||||
display: block !important;
|
||||
width: 100% !important;
|
||||
margin-top: 1.25rem !important;
|
||||
margin-top: 1rem !important;
|
||||
}
|
||||
|
||||
.ifnex-login-card .fi-form-actions-action,
|
||||
@ -302,11 +302,11 @@
|
||||
/* Footer text */
|
||||
.ifnex-login-footer {
|
||||
font-family: 'Vazirmatn', sans-serif;
|
||||
font-size: 11px;
|
||||
font-size: 10.5px;
|
||||
color: #9ca3af;
|
||||
text-align: center;
|
||||
margin: 1.25rem 0 0;
|
||||
padding-top: 1rem;
|
||||
margin: 1rem 0 0;
|
||||
padding-top: 0.75rem;
|
||||
border-top: 1px solid #f3f4f6;
|
||||
direction: ltr;
|
||||
line-height: 1.5;
|
||||
@ -319,18 +319,18 @@
|
||||
}
|
||||
.ifnex-login-card {
|
||||
max-width: 100%;
|
||||
padding: 2rem 1.5rem 1.5rem;
|
||||
padding: 1.5rem 1.25rem 1.125rem;
|
||||
border-radius: 14px;
|
||||
}
|
||||
.ifnex-login-logo {
|
||||
width: 100px;
|
||||
width: 76px;
|
||||
}
|
||||
.ifnex-login-title {
|
||||
font-size: 20px;
|
||||
font-size: 17px;
|
||||
}
|
||||
.ifnex-login-subtitle {
|
||||
font-size: 12px;
|
||||
margin-bottom: 1.75rem;
|
||||
font-size: 11.5px;
|
||||
margin-bottom: 1.125rem;
|
||||
}
|
||||
.ifnex-decor-globe,
|
||||
.ifnex-decor-plane {
|
||||
|
||||
27
AGENT.md
@ -1,7 +1,7 @@
|
||||
# راهنمای ایجنت — پروژهٔ IFNEX Logistics
|
||||
|
||||
> **تاریخ:** ۲۰۲۶-۱۰-۳۰
|
||||
> **نسخه:** ۱.۴
|
||||
> **تاریخ:** ۲۰۲۶-۱۰-۳۱
|
||||
> **نسخه:** ۱.۵
|
||||
> **تهیهکننده:** VernaSoft Group — Kazem Alghasi
|
||||
|
||||
---
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
### وضعیت فعلی
|
||||
|
||||
فازهای ۰، ۱، ۲، ۳، ۳.۵ و ۳.۶ تکمیل شدهاند. فاز ۳.۷ (اصلاحات ارزی و فاکتور دستی) تکمیل شد:
|
||||
فازهای ۰، ۱، ۲، ۳، ۳.۵، ۳.۶ و ۳.۷ تکمیل شدهاند. فاز ۳.۷ (اصلاحات ارزی و فاکتور دستی) تکمیل شد:
|
||||
|
||||
- [x] فلوی کامل سفارش (ثبت ← تأیید ← تعهدنامه ← پرداخت) — تست End-to-End
|
||||
- [x] بازطراحی داشبورد و Login پنل Filament (هویت بصری navy + amber)
|
||||
@ -29,6 +29,13 @@
|
||||
- [x] **معماری IRR-only** — ارز مبنا = ریال ایران؛ تبدیل ارز در زمان ایمپورت
|
||||
- [x] **فاکتورهای دستی مدیر** — صدور، پرداخت از کیف پول، اعلان خودکار به مشتری
|
||||
|
||||
فاز ۳.۸ (کارهای سریع ظاهری / برندینگ) نیز تکمیل شد:
|
||||
|
||||
- [x] **Favicon حرفهای IFNEX** — ico چندسایزی + svg وکتور + apple-touch-icon + PWA icons + webmanifest + لینک در head پنل
|
||||
- [x] **صفحهٔ `/` برندشده** — جایگزین welcome پیشفرض لاراول
|
||||
- [x] **جمعشدن کارت لاگین فیلمنت** — ۳۸۰px، فشردهتر
|
||||
- [x] **SweetAlert2** برای خطاهای فرم سفارش وردپرس (باندل محلی)
|
||||
|
||||
چندزبانه (i18n) همچنان به زمان دیپلوی موکول است.
|
||||
|
||||
### معماری ارزی (Currency Architecture)
|
||||
@ -471,7 +478,17 @@ WALLET_AUTO_CREATE=true
|
||||
| ۷ | **اضافه شدن فاکتورها به وضعیت مالی و داشبورد مشتری** | ✅ |
|
||||
| ۸ | **فرمت هزارگان در فیلدهای عددی فرم فاکتور ادمین** | ✅ |
|
||||
|
||||
### فاز ۳.۸ (موکول به آینده)
|
||||
### فاز ۳.۸ (کارهای سریع ظاهری) — ✅ تکمیل (۲۰۲۶-۱۰-۳۱)
|
||||
|
||||
| # | کار | وضعیت |
|
||||
|---|-----|--------|
|
||||
| ۱ | Favicon IFNEX (هواپیمای کاغذی کهربایی روی سرمهای — هماهنگ با هویت لاگین) در `public/favicon.ico` + `public/images/favicon.svg` + apple-touch-icon + icon-192/512 + `site.webmanifest` + لینک در `filament/hooks/head` | ✅ |
|
||||
| ۲ | صفحهٔ `/` برندشده (RTL، وزیرمتن، کارتهای «پنل مدیریت / استعلام نرخ / ثبت سفارش»، چیپهای وضعیت سیستم) جایگزین welcome پیشفرض | ✅ |
|
||||
| ۳ | جمعکردن کارت لاگین فیلمنت (max-width ۴۴۰←۳۸۰px، padding ۲.۵rem←۱.۷۵rem، فاصلههای فشرده) | ✅ |
|
||||
| ۴ | SweetAlert2 (v11.14.5 باندل محلی در پلاگین bridge) برای خطاهای فرم سفارش: اعتبارسنجی مراحل، خطای ثبت، خطای ارتباط + جایگزینی هر ۳ `alert()` بومی با پاپآپ برند | ✅ |
|
||||
| ۵ | سازگارسازی migration فاکتور دستی با SQLite (تستها طبق همین سند با SQLite اجرا میشوند) | ✅ |
|
||||
|
||||
### فاز ۳.۹ (موکول به آینده)
|
||||
|
||||
| # | کار | وضعیت | اولویت |
|
||||
|---|-----|--------|---------|
|
||||
@ -482,8 +499,6 @@ WALLET_AUTO_CREATE=true
|
||||
| ۵ | دفترچه آدرس (Address Book) مشتری | 📋 مطرحشده | متوسط |
|
||||
| ۶ | **ارز مرجع قابل تنظیم** (نسخه Pro) | 📋 مطرحشده — `01_Documents/IFNEX_Pro_Backlog.md` | پایین (نسخه Pro) |
|
||||
| ۷ | سیستم بروزرسانی + لایسنس (Domain Lock) | 📋 مطرحشده — `01_Documents/IFNEX_Pro_Backlog.md` | پایین (نسخه Pro) |
|
||||
| ۸ | favicon و صفحه `/` سفارشی لاراول | 📋 | پایین |
|
||||
| ۹ | بازطراحی صفحه لاگین لاراول | 📋 | پایین |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@ -501,9 +501,9 @@ Create Import Order
|
||||
|
||||
# ۱۵. خلاصهٔ وضعیت تحویل
|
||||
|
||||
**وضعیت فعلی:** آماده برای دیپلوی (فاز ۳.۷ تکمیل شد)
|
||||
**وضعیت فعلی:** آماده برای دیپلوی (فاز ۳.۷ و ۳.۸ تکمیل شد)
|
||||
|
||||
**آخرین کامیت بازبینیشده:** ۲۰۲۶-۱۰-۳۰ — شامل سیستم ۴-رُبعی نرخها، معماری IRR-only، و فیچر فاکتورهای دستی مدیر.
|
||||
**آخرین کامیت بازبینیشده:** ۲۰۲۶-۱۰-۳۱ — شامل فاز ۳.۸ (برندینگ: favicon، صفحهٔ برندشدهٔ `/`، جمعشدن کارت لاگین، SweetAlert2 خطاهای فرم سفارش).
|
||||
|
||||
## ۱۵.۱ تکمیلشده در فاز ۳.۶ (۲۰۲۶-۱۰-۰۴)
|
||||
|
||||
@ -533,7 +533,14 @@ Create Import Order
|
||||
- [x] **فرمت هزارگان** در فیلدهای عددی فرم فاکتور ادمین
|
||||
- [x] آپدیت خط قرمزها برای معماری ارزی
|
||||
|
||||
## ۱۵.۳ باقیمانده
|
||||
## ۱۵.۳ تکمیلشده در فاز ۳.۸ (۲۰۲۶-۱۰-۳۱)
|
||||
|
||||
- [x] **Favicon حرفهای IFNEX** — طراحی هواپیمای کاغذی کهربایی روی پسزمینهٔ سرمهای (`favicon.ico` چندسایزی + `favicon.svg` وکتور + apple-touch-icon + icon-192/512 + `site.webmanifest`) + لینکها در head پنل فیلمنت
|
||||
- [x] **صفحهٔ `/` برندشده** — جایگزین welcome پیشفرض لاراول (RTL، وزیرمتن، کارتهای پنل مدیریت / استعلام نرخ / ثبت سفارش)
|
||||
- [x] **جمعشدن کارت لاگین فیلمنت** — عرض ۴۴۰←۳۸۰px، padding و فاصلههای فشردهتر، موبایل-فرندلی
|
||||
- [x] **SweetAlert2 برای خطاهای فرم سفارش وردپرس** — باندل محلی (بدون CDN)، پاپآپ مرکزی برای خطاهای اعتبارسنجی/ثبت/ارتباط با fallback به alert
|
||||
|
||||
## ۱۵.۴ باقیمانده
|
||||
|
||||
- [ ] i18n (موکول به زمان دیپلوی)
|
||||
- [ ] تست نهایی UAT کارفرما
|
||||
@ -541,8 +548,6 @@ Create Import Order
|
||||
- [ ] سند پیشنهادی سیستم مالی (درخواست ۱۳ کارفرما — موکول به آینده)
|
||||
- [ ] پلاگین SMS (منتظر تحویل پنل SMS مشتری)
|
||||
- [ ] دفترچه آدرس (Address Book) مشتری — مطرحشده، آینده
|
||||
- [ ] favicon و صفحه `/` سفارشی لاراول — اولویت پایین
|
||||
- [ ] بازطراحی صفحه لاگین لاراول — اولویت پایین
|
||||
|
||||
### باقیمانده برای نسخه Pro (آینده)
|
||||
|
||||
|
||||