feat: add penalty tier fields to rental plans and update settings configuration UI

This commit is contained in:
sazzadulalambd
2026-05-10 00:23:50 +06:00
parent af2c86d919
commit d7db85595c

View File

@@ -97,9 +97,18 @@ interface CompanySettings {
name: string; name: string;
contractMonths: number[]; contractMonths: number[];
dailyRent: number; dailyRent: number;
dailyRentPenalty1: number;
dailyRentPenalty2: number;
dailyRentPenalty3: number;
deposit: number; deposit: number;
weeklySubscription: number; weeklySubscription: number;
weeklyPenalty1: number;
weeklyPenalty2: number;
weeklyPenalty3: number;
monthlySubscription: number; monthlySubscription: number;
monthlyPenalty1: number;
monthlyPenalty2: number;
monthlyPenalty3: number;
ficoSharePercent: number; ficoSharePercent: number;
description: string; description: string;
}[]; }[];
@@ -108,9 +117,18 @@ interface CompanySettings {
name: string; name: string;
contractMonths: number[]; contractMonths: number[];
dailyRent: number; dailyRent: number;
dailyRentPenalty1: number;
dailyRentPenalty2: number;
dailyRentPenalty3: number;
deposit: number; deposit: number;
weeklySubscription: number; weeklySubscription: number;
weeklyPenalty1: number;
weeklyPenalty2: number;
weeklyPenalty3: number;
monthlySubscription: number; monthlySubscription: number;
monthlyPenalty1: number;
monthlyPenalty2: number;
monthlyPenalty3: number;
durationMonths: number; durationMonths: number;
evPrice: number; evPrice: number;
totalPayment: number; totalPayment: number;
@@ -124,12 +142,24 @@ interface CompanySettings {
name: string; name: string;
contractMonths: number[]; contractMonths: number[];
dailyRentEach: number; dailyRentEach: number;
dailyRentPenalty1: number;
dailyRentPenalty2: number;
dailyRentPenalty3: number;
totalDailyRent: number; totalDailyRent: number;
depositEach: number; depositEach: number;
depositPenalty1: number;
depositPenalty2: number;
depositPenalty3: number;
totalDeposit: number; totalDeposit: number;
weeklySubscriptionEach: number; weeklySubscriptionEach: number;
weeklyPenalty1: number;
weeklyPenalty2: number;
weeklyPenalty3: number;
totalWeeklySubscription: number; totalWeeklySubscription: number;
monthlySubscriptionEach: number; monthlySubscriptionEach: number;
monthlyPenalty1: number;
monthlyPenalty2: number;
monthlyPenalty3: number;
totalMonthlySubscription: number; totalMonthlySubscription: number;
ficoSharePercent: number; ficoSharePercent: number;
description: string; description: string;
@@ -419,9 +449,18 @@ const initialSettings: CompanySettings = {
name: 'Single Rent - Premium', name: 'Single Rent - Premium',
contractMonths: [1, 3, 6, 12], contractMonths: [1, 3, 6, 12],
dailyRent: 400, dailyRent: 400,
dailyRentPenalty1: 500,
dailyRentPenalty2: 1000,
dailyRentPenalty3: 5000,
deposit: 25000, deposit: 25000,
weeklySubscription: 2800, weeklySubscription: 2800,
weeklyPenalty1: 3500,
weeklyPenalty2: 7000,
weeklyPenalty3: 15000,
monthlySubscription: 12000, monthlySubscription: 12000,
monthlyPenalty1: 15000,
monthlyPenalty2: 30000,
monthlyPenalty3: 50000,
ficoSharePercent: 50, ficoSharePercent: 50,
description: 'Premium single person rental plan with extra benefits', description: 'Premium single person rental plan with extra benefits',
}, },
@@ -430,9 +469,18 @@ const initialSettings: CompanySettings = {
name: 'Single Rent - Standard', name: 'Single Rent - Standard',
contractMonths: [1, 3, 6, 12], contractMonths: [1, 3, 6, 12],
dailyRent: 300, dailyRent: 300,
dailyRentPenalty1: 400,
dailyRentPenalty2: 800,
dailyRentPenalty3: 4000,
deposit: 20000, deposit: 20000,
weeklySubscription: 2100, weeklySubscription: 2100,
weeklyPenalty1: 2600,
weeklyPenalty2: 5200,
weeklyPenalty3: 12000,
monthlySubscription: 9000, monthlySubscription: 9000,
monthlyPenalty1: 11000,
monthlyPenalty2: 22000,
monthlyPenalty3: 40000,
ficoSharePercent: 45, ficoSharePercent: 45,
description: 'Standard single person rental plan', description: 'Standard single person rental plan',
}, },
@@ -441,9 +489,18 @@ const initialSettings: CompanySettings = {
name: 'Single Rent - Economy', name: 'Single Rent - Economy',
contractMonths: [1, 3, 6, 12], contractMonths: [1, 3, 6, 12],
dailyRent: 250, dailyRent: 250,
dailyRentPenalty1: 300,
dailyRentPenalty2: 600,
dailyRentPenalty3: 3000,
deposit: 15000, deposit: 15000,
weeklySubscription: 1750, weeklySubscription: 1750,
weeklyPenalty1: 2200,
weeklyPenalty2: 4000,
weeklyPenalty3: 8000,
monthlySubscription: 7500, monthlySubscription: 7500,
monthlyPenalty1: 9000,
monthlyPenalty2: 18000,
monthlyPenalty3: 30000,
ficoSharePercent: 40, ficoSharePercent: 40,
description: 'Economy single person rental plan', description: 'Economy single person rental plan',
} }
@@ -454,9 +511,18 @@ const initialSettings: CompanySettings = {
name: 'Rent to Own - Premium', name: 'Rent to Own - Premium',
contractMonths: [12, 18, 24, 36], contractMonths: [12, 18, 24, 36],
dailyRent: 350, dailyRent: 350,
dailyRentPenalty1: 450,
dailyRentPenalty2: 900,
dailyRentPenalty3: 4500,
deposit: 25000, deposit: 25000,
weeklySubscription: 2450, weeklySubscription: 2450,
weeklyPenalty1: 3000,
weeklyPenalty2: 6000,
weeklyPenalty3: 15000,
monthlySubscription: 10500, monthlySubscription: 10500,
monthlyPenalty1: 13000,
monthlyPenalty2: 26000,
monthlyPenalty3: 45000,
durationMonths: 18, durationMonths: 18,
evPrice: 150000, evPrice: 150000,
totalPayment: 170000, totalPayment: 170000,
@@ -470,9 +536,18 @@ const initialSettings: CompanySettings = {
name: 'Rent to Own - Standard', name: 'Rent to Own - Standard',
contractMonths: [12, 18, 24, 36], contractMonths: [12, 18, 24, 36],
dailyRent: 250, dailyRent: 250,
dailyRentPenalty1: 350,
dailyRentPenalty2: 700,
dailyRentPenalty3: 3500,
deposit: 18000, deposit: 18000,
weeklySubscription: 1750, weeklySubscription: 1750,
weeklyPenalty1: 2200,
weeklyPenalty2: 4400,
weeklyPenalty3: 10000,
monthlySubscription: 7000, monthlySubscription: 7000,
monthlyPenalty1: 9000,
monthlyPenalty2: 18000,
monthlyPenalty3: 30000,
durationMonths: 18, durationMonths: 18,
evPrice: 120000, evPrice: 120000,
totalPayment: 135000, totalPayment: 135000,
@@ -486,9 +561,18 @@ const initialSettings: CompanySettings = {
name: 'Rent to Own - Economy', name: 'Rent to Own - Economy',
contractMonths: [12, 18, 24, 36], contractMonths: [12, 18, 24, 36],
dailyRent: 200, dailyRent: 200,
dailyRentPenalty1: 250,
dailyRentPenalty2: 500,
dailyRentPenalty3: 2500,
deposit: 15000, deposit: 15000,
weeklySubscription: 1400, weeklySubscription: 1400,
weeklyPenalty1: 1800,
weeklyPenalty2: 3500,
weeklyPenalty3: 8000,
monthlySubscription: 6000, monthlySubscription: 6000,
monthlyPenalty1: 7500,
monthlyPenalty2: 15000,
monthlyPenalty3: 25000,
durationMonths: 18, durationMonths: 18,
evPrice: 100000, evPrice: 100000,
totalPayment: 115000, totalPayment: 115000,
@@ -504,12 +588,24 @@ const initialSettings: CompanySettings = {
name: 'Share an EV - Premium', name: 'Share an EV - Premium',
contractMonths: [1, 3, 6, 12], contractMonths: [1, 3, 6, 12],
dailyRentEach: 300, dailyRentEach: 300,
dailyRentPenalty1: 400,
dailyRentPenalty2: 800,
dailyRentPenalty3: 4000,
totalDailyRent: 600, totalDailyRent: 600,
depositEach: 20000, depositEach: 20000,
depositPenalty1: 25000,
depositPenalty2: 35000,
depositPenalty3: 50000,
totalDeposit: 40000, totalDeposit: 40000,
weeklySubscriptionEach: 2100, weeklySubscriptionEach: 2100,
weeklyPenalty1: 2600,
weeklyPenalty2: 5200,
weeklyPenalty3: 12000,
totalWeeklySubscription: 4200, totalWeeklySubscription: 4200,
monthlySubscriptionEach: 8400, monthlySubscriptionEach: 8400,
monthlyPenalty1: 10500,
monthlyPenalty2: 21000,
monthlyPenalty3: 35000,
totalMonthlySubscription: 16800, totalMonthlySubscription: 16800,
ficoSharePercent: 50, ficoSharePercent: 50,
description: 'Premium shared EV with premium bikes', description: 'Premium shared EV with premium bikes',
@@ -519,12 +615,24 @@ const initialSettings: CompanySettings = {
name: 'Share an EV - Standard', name: 'Share an EV - Standard',
contractMonths: [1, 3, 6, 12], contractMonths: [1, 3, 6, 12],
dailyRentEach: 200, dailyRentEach: 200,
dailyRentPenalty1: 250,
dailyRentPenalty2: 500,
dailyRentPenalty3: 2500,
totalDailyRent: 400, totalDailyRent: 400,
depositEach: 15000, depositEach: 15000,
depositPenalty1: 18000,
depositPenalty2: 25000,
depositPenalty3: 40000,
totalDeposit: 30000, totalDeposit: 30000,
weeklySubscriptionEach: 1400, weeklySubscriptionEach: 1400,
weeklyPenalty1: 1800,
weeklyPenalty2: 3500,
weeklyPenalty3: 8000,
totalWeeklySubscription: 2800, totalWeeklySubscription: 2800,
monthlySubscriptionEach: 5600, monthlySubscriptionEach: 5600,
monthlyPenalty1: 7000,
monthlyPenalty2: 14000,
monthlyPenalty3: 25000,
totalMonthlySubscription: 11200, totalMonthlySubscription: 11200,
ficoSharePercent: 45, ficoSharePercent: 45,
description: 'Standard shared EV plan', description: 'Standard shared EV plan',
@@ -534,12 +642,24 @@ const initialSettings: CompanySettings = {
name: 'Share an EV - Economy', name: 'Share an EV - Economy',
contractMonths: [1, 3, 6, 12], contractMonths: [1, 3, 6, 12],
dailyRentEach: 150, dailyRentEach: 150,
dailyRentPenalty1: 200,
dailyRentPenalty2: 400,
dailyRentPenalty3: 2000,
totalDailyRent: 300, totalDailyRent: 300,
depositEach: 12000, depositEach: 12000,
depositPenalty1: 15000,
depositPenalty2: 20000,
depositPenalty3: 30000,
totalDeposit: 24000, totalDeposit: 24000,
weeklySubscriptionEach: 1050, weeklySubscriptionEach: 1050,
weeklyPenalty1: 1300,
weeklyPenalty2: 2600,
weeklyPenalty3: 6000,
totalWeeklySubscription: 2100, totalWeeklySubscription: 2100,
monthlySubscriptionEach: 4200, monthlySubscriptionEach: 4200,
monthlyPenalty1: 5500,
monthlyPenalty2: 11000,
monthlyPenalty3: 20000,
totalMonthlySubscription: 8400, totalMonthlySubscription: 8400,
ficoSharePercent: 40, ficoSharePercent: 40,
description: 'Economy shared EV plan', description: 'Economy shared EV plan',
@@ -2238,25 +2358,73 @@ export default function CompanySettingsPage() {
</button> </button>
</div> </div>
<div className="p-4 space-y-4"> <div className="p-4 space-y-4">
<div className="grid lg:grid-cols-3 gap-4"> <div className="bg-slate-50 rounded-xl p-4 space-y-3">
<label className="text-sm font-semibold text-slate-700">Daily Rent</label>
<div className="grid grid-cols-4 gap-3">
<div> <div>
<label className="text-sm text-slate-600">Daily Rent (৳)</label> <label className="text-xs text-slate-500">Base (৳)</label>
<input type="number" value={plan.dailyRent} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].dailyRent = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.dailyRent} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].dailyRent = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div> </div>
<div> <div>
<label className="text-sm text-slate-600">Weekly Subscription (৳)</label> <label className="text-xs text-slate-500">1st Day (৳)</label>
<input type="number" value={plan.weeklySubscription} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].weeklySubscription = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.dailyRentPenalty1} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].dailyRentPenalty1 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div> </div>
<div> <div>
<label className="text-sm text-slate-600">Monthly Subscription (৳)</label> <label className="text-xs text-slate-500">2nd Day (৳)</label>
<input type="number" value={plan.monthlySubscription} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].monthlySubscription = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.dailyRentPenalty2} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].dailyRentPenalty2 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">3rd Day + Bike Lock (৳)</label>
<input type="number" value={plan.dailyRentPenalty3} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].dailyRentPenalty3 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
</div>
</div>
<div className="bg-slate-50 rounded-xl p-4 space-y-3">
<label className="text-sm font-semibold text-slate-700">Weekly Subscription</label>
<div className="grid grid-cols-4 gap-3">
<div>
<label className="text-xs text-slate-500">Base (৳)</label>
<input type="number" value={plan.weeklySubscription} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].weeklySubscription = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">1st Day (৳)</label>
<input type="number" value={plan.weeklyPenalty1} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].weeklyPenalty1 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">2nd Day (৳)</label>
<input type="number" value={plan.weeklyPenalty2} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].weeklyPenalty2 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">3rd Day + Bike Lock (৳)</label>
<input type="number" value={plan.weeklyPenalty3} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].weeklyPenalty3 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
</div>
</div>
<div className="bg-slate-50 rounded-xl p-4 space-y-3">
<label className="text-sm font-semibold text-slate-700">Monthly Subscription</label>
<div className="grid grid-cols-4 gap-3">
<div>
<label className="text-xs text-slate-500">Base (৳)</label>
<input type="number" value={plan.monthlySubscription} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].monthlySubscription = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">1st Day (৳)</label>
<input type="number" value={plan.monthlyPenalty1} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].monthlyPenalty1 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">2nd Day (৳)</label>
<input type="number" value={plan.monthlyPenalty2} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].monthlyPenalty2 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">3rd Day + Bike Lock (৳)</label>
<input type="number" value={plan.monthlyPenalty3} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].monthlyPenalty3 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
</div>
</div> </div>
<div> <div>
<label className="text-sm text-slate-600">Deposit (৳)</label> <label className="text-sm text-slate-600">Deposit (৳)</label>
<input type="number" value={plan.deposit} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].deposit = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.deposit} onChange={(e) => { const updated = [...settings.plans.singleRent]; updated[idx].deposit = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, singleRent: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" />
</div> </div>
</div>
<div className="bg-slate-50 rounded-lg p-3"> <div className="bg-slate-50 rounded-lg p-3">
<label className="text-sm font-semibold text-slate-700 block mb-2">Contract Duration (Months)</label> <label className="text-sm font-semibold text-slate-700 block mb-2">Contract Duration (Months)</label>
<div className="flex flex-wrap gap-2"> <div className="flex flex-wrap gap-2">
@@ -2337,25 +2505,73 @@ export default function CompanySettingsPage() {
</button> </button>
</div> </div>
<div className="p-4 space-y-4"> <div className="p-4 space-y-4">
<div className="grid lg:grid-cols-3 gap-4"> <div className="bg-slate-50 rounded-xl p-4 space-y-3">
<label className="text-sm font-semibold text-slate-700">Daily Rent</label>
<div className="grid grid-cols-4 gap-3">
<div> <div>
<label className="text-sm text-slate-600">Daily Rent (৳)</label> <label className="text-xs text-slate-500">Base (৳)</label>
<input type="number" value={plan.dailyRent} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].dailyRent = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.dailyRent} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].dailyRent = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div> </div>
<div> <div>
<label className="text-sm text-slate-600">Weekly Subscription (৳)</label> <label className="text-xs text-slate-500">1st Day (৳)</label>
<input type="number" value={plan.weeklySubscription} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].weeklySubscription = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.dailyRentPenalty1} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].dailyRentPenalty1 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div> </div>
<div> <div>
<label className="text-sm text-slate-600">Monthly Subscription (৳)</label> <label className="text-xs text-slate-500">2nd Day (৳)</label>
<input type="number" value={plan.monthlySubscription} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].monthlySubscription = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.dailyRentPenalty2} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].dailyRentPenalty2 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">3rd Day + Bike Lock (৳)</label>
<input type="number" value={plan.dailyRentPenalty3} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].dailyRentPenalty3 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
</div>
</div>
<div className="bg-slate-50 rounded-xl p-4 space-y-3">
<label className="text-sm font-semibold text-slate-700">Weekly Subscription</label>
<div className="grid grid-cols-4 gap-3">
<div>
<label className="text-xs text-slate-500">Base (৳)</label>
<input type="number" value={plan.weeklySubscription} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].weeklySubscription = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">1st Day (৳)</label>
<input type="number" value={plan.weeklyPenalty1} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].weeklyPenalty1 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">2nd Day (৳)</label>
<input type="number" value={plan.weeklyPenalty2} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].weeklyPenalty2 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">3rd Day + Bike Lock (৳)</label>
<input type="number" value={plan.weeklyPenalty3} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].weeklyPenalty3 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
</div>
</div>
<div className="bg-slate-50 rounded-xl p-4 space-y-3">
<label className="text-sm font-semibold text-slate-700">Monthly Subscription</label>
<div className="grid grid-cols-4 gap-3">
<div>
<label className="text-xs text-slate-500">Base (৳)</label>
<input type="number" value={plan.monthlySubscription} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].monthlySubscription = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">1st Day (৳)</label>
<input type="number" value={plan.monthlyPenalty1} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].monthlyPenalty1 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">2nd Day (৳)</label>
<input type="number" value={plan.monthlyPenalty2} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].monthlyPenalty2 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">3rd Day + Bike Lock (৳)</label>
<input type="number" value={plan.monthlyPenalty3} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].monthlyPenalty3 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
</div>
</div> </div>
<div> <div>
<label className="text-sm text-slate-600">Deposit (৳)</label> <label className="text-sm text-slate-600">Deposit (৳)</label>
<input type="number" value={plan.deposit} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].deposit = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.deposit} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].deposit = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" />
</div> </div>
</div>
<div className="bg-slate-50 rounded-lg p-3"> <div className="bg-slate-50 rounded-lg p-3">
<label className="text-sm font-semibold text-slate-700 block mb-2">Contract Duration (Months)</label> <label className="text-sm font-semibold text-slate-700 block mb-2">Contract Duration (Months)</label>
<div className="flex flex-wrap gap-2"> <div className="flex flex-wrap gap-2">
@@ -2417,6 +2633,7 @@ export default function CompanySettingsPage() {
<textarea value={plan.description} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].description = e.target.value; setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" rows={2} /> <textarea value={plan.description} onChange={(e) => { const updated = [...settings.plans.rentToOwn]; updated[idx].description = e.target.value; setSettings({ ...settings, plans: { ...settings.plans, rentToOwn: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" rows={2} />
</div> </div>
</div> </div>
</div> </div>
))} ))}
</div> </div>
@@ -2436,42 +2653,90 @@ export default function CompanySettingsPage() {
</button> </button>
</div> </div>
<div className="p-4 space-y-4"> <div className="p-4 space-y-4">
<div className="grid lg:grid-cols-3 gap-4"> <div className="bg-slate-50 rounded-xl p-4 space-y-3">
<label className="text-sm font-semibold text-slate-700">Daily Rent (Each)</label>
<div className="grid grid-cols-4 gap-3">
<div> <div>
<label className="text-sm text-slate-600">Daily Rent Each (৳)</label> <label className="text-xs text-slate-500">Base (৳)</label>
<input type="number" value={plan.dailyRentEach} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].dailyRentEach = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.dailyRentEach} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].dailyRentEach = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div> </div>
<div> <div>
<label className="text-sm text-slate-600">Total Daily Rent (৳)</label> <label className="text-xs text-slate-500">1st Day (৳)</label>
<input type="number" value={plan.totalDailyRent} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].totalDailyRent = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.dailyRentPenalty1} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].dailyRentPenalty1 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div> </div>
<div> <div>
<label className="text-sm text-slate-600">Weekly Subscription Each (৳)</label> <label className="text-xs text-slate-500">2nd Day (৳)</label>
<input type="number" value={plan.weeklySubscriptionEach} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].weeklySubscriptionEach = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.dailyRentPenalty2} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].dailyRentPenalty2 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div> </div>
<div> <div>
<label className="text-sm text-slate-600">Total Weekly Subscription (৳)</label> <label className="text-xs text-slate-500">3rd Day + Bike Lock (৳)</label>
<input type="number" value={plan.totalWeeklySubscription} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].totalWeeklySubscription = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.dailyRentPenalty3} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].dailyRentPenalty3 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
</div>
</div>
<div className="bg-slate-50 rounded-xl p-4 space-y-3">
<label className="text-sm font-semibold text-slate-700">Weekly Subscription (Each)</label>
<div className="grid grid-cols-4 gap-3">
<div>
<label className="text-xs text-slate-500">Base (৳)</label>
<input type="number" value={plan.weeklySubscriptionEach} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].weeklySubscriptionEach = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div> </div>
<div> <div>
<label className="text-sm text-slate-600">Monthly Subscription Each (৳)</label> <label className="text-xs text-slate-500">1st Day (৳)</label>
<input type="number" value={plan.monthlySubscriptionEach} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].monthlySubscriptionEach = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.weeklyPenalty1} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].weeklyPenalty1 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div> </div>
<div> <div>
<label className="text-sm text-slate-600">Total Monthly Subscription (৳)</label> <label className="text-xs text-slate-500">2nd Day (৳)</label>
<input type="number" value={plan.totalMonthlySubscription} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].totalMonthlySubscription = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.weeklyPenalty2} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].weeklyPenalty2 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div> </div>
<div> <div>
<label className="text-sm text-slate-600">Deposit Each (৳)</label> <label className="text-xs text-slate-500">3rd Day + Bike Lock (৳)</label>
<input type="number" value={plan.depositEach} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].depositEach = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.weeklyPenalty3} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].weeklyPenalty3 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
</div>
</div>
<div className="bg-slate-50 rounded-xl p-4 space-y-3">
<label className="text-sm font-semibold text-slate-700">Monthly Subscription (Each)</label>
<div className="grid grid-cols-4 gap-3">
<div>
<label className="text-xs text-slate-500">Base (৳)</label>
<input type="number" value={plan.monthlySubscriptionEach} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].monthlySubscriptionEach = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div> </div>
<div> <div>
<label className="text-sm text-slate-600">Total Deposit (৳)</label> <label className="text-xs text-slate-500">1st Day (৳)</label>
<input type="number" value={plan.totalDeposit} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].totalDeposit = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" /> <input type="number" value={plan.monthlyPenalty1} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].monthlyPenalty1 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">2nd Day (৳)</label>
<input type="number" value={plan.monthlyPenalty2} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].monthlyPenalty2 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">3rd Day + Bike Lock (৳)</label>
<input type="number" value={plan.monthlyPenalty3} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].monthlyPenalty3 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
</div>
</div>
<div className="bg-slate-50 rounded-xl p-4 space-y-3">
<label className="text-sm font-semibold text-slate-700">Deposit (Each)</label>
<div className="grid grid-cols-4 gap-3">
<div>
<label className="text-xs text-slate-500">Base (৳)</label>
<input type="number" value={plan.depositEach} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].depositEach = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">1st Day (৳)</label>
<input type="number" value={plan.depositPenalty1} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].depositPenalty1 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">2nd Day (৳)</label>
<input type="number" value={plan.depositPenalty2} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].depositPenalty2 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
<div>
<label className="text-xs text-slate-500">3rd Day + Bike Lock (৳)</label>
<input type="number" value={plan.depositPenalty3} onChange={(e) => { const updated = [...settings.plans.shareEv]; updated[idx].depositPenalty3 = parseInt(e.target.value); setSettings({ ...settings, plans: { ...settings.plans, shareEv: updated } }); }} className="w-full px-2 py-1.5 border border-slate-200 rounded-lg text-sm" />
</div>
</div> </div>
</div> </div>
<div className="bg-slate-50 rounded-lg p-3"> <div className="bg-slate-50 rounded-lg p-3">
<label className="text-sm font-semibold text-slate-700 block mb-2">Contract Duration (Months)</label> <label className="text-sm font-semibold text-slate-700 block mb-2">Contract Duration (Months)</label>
<div className="flex flex-wrap gap-2"> <div className="flex flex-wrap gap-2">