Compare commits
No commits in common. "5098bf86f4f67a0e2aac2ac318bfb16a5a5df576" and "35cfc409e268900c3e8261c9864bfe41b9852969" have entirely different histories.
5098bf86f4
...
35cfc409e2
2 changed files with 13 additions and 28 deletions
|
|
@ -683,13 +683,7 @@ export function InputsTab({ scenarioId, inputsJson, onSaved }: Props) {
|
||||||
const solarTotalCr = computeCostWithTax(costItems, "SolarOnly");
|
const solarTotalCr = computeCostWithTax(costItems, "SolarOnly");
|
||||||
const windTotalCr = computeCostWithTax(costItems, "WindOnly");
|
const windTotalCr = computeCostWithTax(costItems, "WindOnly");
|
||||||
const bessTotalCr = computeCostWithTax(costItems, "BESSOnly");
|
const bessTotalCr = computeCostWithTax(costItems, "BESSOnly");
|
||||||
|
const totalCostCr = solarTotalCr + windTotalCr + bessTotalCr;
|
||||||
// Calculate upfront lease cost based on user inputs (acres * rate * years)
|
|
||||||
const leaseRate = gv(inputs, "project", "land_lease_rate", 0.4);
|
|
||||||
const leaseYears = gv(inputs, "project", "land_lease_years", 5);
|
|
||||||
const upfrontLeaseCostCr = effectiveLandAcres * leaseRate * leaseYears;
|
|
||||||
|
|
||||||
const totalCostCr = solarTotalCr + windTotalCr + bessTotalCr + upfrontLeaseCostCr;
|
|
||||||
|
|
||||||
// COD sync helper
|
// COD sync helper
|
||||||
function handlePlantCodChange(v: string) {
|
function handlePlantCodChange(v: string) {
|
||||||
|
|
@ -973,7 +967,7 @@ export function InputsTab({ scenarioId, inputsJson, onSaved }: Props) {
|
||||||
</div>
|
</div>
|
||||||
</ToggleCard>
|
</ToggleCard>
|
||||||
|
|
||||||
{/* ── Land & Common ────────────────────────────────────── */}
|
{/* ── Land & Common ────────────────────────────────────── */}
|
||||||
<CollapsibleCard title="Land & Common Costs" cols={3}>
|
<CollapsibleCard title="Land & Common Costs" cols={3}>
|
||||||
<NumField
|
<NumField
|
||||||
label="Total Land Area"
|
label="Total Land Area"
|
||||||
|
|
@ -987,7 +981,7 @@ export function InputsTab({ scenarioId, inputsJson, onSaved }: Props) {
|
||||||
<NumField
|
<NumField
|
||||||
label="Lease Rate"
|
label="Lease Rate"
|
||||||
sub="Lakh/acre/year"
|
sub="Lakh/acre/year"
|
||||||
value={leaseRate}
|
value={gv(inputs, "project", "land_lease_rate", 0.4)}
|
||||||
onChange={(v) => upd("project", "land_lease_rate", v)}
|
onChange={(v) => upd("project", "land_lease_rate", v)}
|
||||||
step={0.05}
|
step={0.05}
|
||||||
min={0}
|
min={0}
|
||||||
|
|
@ -996,7 +990,7 @@ export function InputsTab({ scenarioId, inputsJson, onSaved }: Props) {
|
||||||
<NumField
|
<NumField
|
||||||
label="Lease Years"
|
label="Lease Years"
|
||||||
sub="3, 5, 10 or custom"
|
sub="3, 5, 10 or custom"
|
||||||
value={leaseYears}
|
value={gv(inputs, "project", "land_lease_years", 5)}
|
||||||
onChange={(v) => upd("project", "land_lease_years", v)}
|
onChange={(v) => upd("project", "land_lease_years", v)}
|
||||||
step={1}
|
step={1}
|
||||||
min={1}
|
min={1}
|
||||||
|
|
@ -1004,7 +998,7 @@ export function InputsTab({ scenarioId, inputsJson, onSaved }: Props) {
|
||||||
suffix="yr"
|
suffix="yr"
|
||||||
/>
|
/>
|
||||||
<div className="col-span-3 text-[10px] text-muted-foreground py-1">
|
<div className="col-span-3 text-[10px] text-muted-foreground py-1">
|
||||||
Upfront Lease Cost (included in Total Project Cost): <span className="font-medium text-foreground">{upfrontLeaseCostCr.toFixed(2)} Cr</span>
|
Upfront Lease Cost: <span className="font-medium text-foreground">{effectiveLandAcres * (gv(inputs, "project", "land_lease_rate", 0.4) || 0) * (gv(inputs, "project", "land_lease_years", 5) || 0)} Cr</span>
|
||||||
</div>
|
</div>
|
||||||
</CollapsibleCard>
|
</CollapsibleCard>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,6 @@ import { useState } from "react";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import type { ScenarioInputPayload } from "@/lib/api";
|
import type { ScenarioInputPayload } from "@/lib/api";
|
||||||
|
|
||||||
// Helper to convert decimal to percentage display
|
|
||||||
function pct(raw: number): number {
|
|
||||||
return parseFloat((raw * 100).toFixed(2));
|
|
||||||
}
|
|
||||||
|
|
||||||
const LOCATION_OPTIONS = [
|
const LOCATION_OPTIONS = [
|
||||||
{ value: "RJ", label: "Rajasthan (High Solar)" },
|
{ value: "RJ", label: "Rajasthan (High Solar)" },
|
||||||
{ value: "GJ", label: "Gujarat (High Solar)" },
|
{ value: "GJ", label: "Gujarat (High Solar)" },
|
||||||
|
|
@ -364,18 +359,14 @@ function StepSolver({
|
||||||
/>
|
/>
|
||||||
</Field>
|
</Field>
|
||||||
{state.solver_mode === "solve_tariff" ? (
|
{state.solver_mode === "solve_tariff" ? (
|
||||||
<Field label="Target Equity IRR">
|
<Field label="Target Equity IRR (e.g. 0.18 = 18%)">
|
||||||
<div className="flex items-center gap-1.5">
|
<Input
|
||||||
<Input
|
type="number"
|
||||||
type="number"
|
value={state.target_irr}
|
||||||
value={pct(state.target_irr)}
|
step={0.01}
|
||||||
step={1}
|
min={0.05}
|
||||||
min={5}
|
onChange={(v) => set("target_irr", Number(v))}
|
||||||
max={40}
|
/>
|
||||||
onChange={(v) => set("target_irr", Number(v) / 100)}
|
|
||||||
/>
|
|
||||||
<span className="text-sm text-muted-foreground">%</span>
|
|
||||||
</div>
|
|
||||||
</Field>
|
</Field>
|
||||||
) : (
|
) : (
|
||||||
<Field label="Fixed Tariff (INR/kWh)">
|
<Field label="Fixed Tariff (INR/kWh)">
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue