{
  "version": "1.0",
  "modules": [
    {
      "name": "SIP Calculation",
      "prefix": "/sip-calculation",
      "endpoints": [
        {
          "method": "POST",
          "path": "/calculation-inputs",
          "summary": "Create Calculation Input",
          "description": "Creates a new calculation input record with monthly investment, annual return rate, investment period, and period unit. Validates that all inputs meet the required constraints.",
          "request_body": {
            "schema_name": "CalculationinputCreate",
            "fields": [
              {
                "name": "monthly_investment",
                "type": "Decimal",
                "required": false
              },
              {
                "name": "annual_return_rate",
                "type": "Decimal",
                "required": false
              },
              {
                "name": "investment_period",
                "type": "int",
                "required": false
              },
              {
                "name": "period_unit",
                "type": "PeriodUnit",
                "required": true,
                "enum_values": [
                  "MONTHS",
                  "YEARS"
                ]
              }
            ]
          },
          "response": {
            "schema_name": "CalculationinputResponse",
            "fields": [
              {
                "name": "monthly_investment",
                "type": "Decimal",
                "required": false
              },
              {
                "name": "annual_return_rate",
                "type": "Decimal",
                "required": false
              },
              {
                "name": "investment_period",
                "type": "int",
                "required": false
              },
              {
                "name": "period_unit",
                "type": "PeriodUnit",
                "required": true,
                "enum_values": [
                  "MONTHS",
                  "YEARS"
                ]
              },
              {
                "name": "id",
                "type": "str",
                "required": true
              },
              {
                "name": "created_at",
                "type": "datetime",
                "required": true
              },
              {
                "name": "updated_at",
                "type": "datetime",
                "required": true
              }
            ],
            "is_list": false
          },
          "status_code": 201
        },
        {
          "method": "GET",
          "path": "/calculation-inputs/{entity_id}",
          "summary": "Get Calculation Input",
          "description": "Retrieves a single calculation input record by ID. Returns 404 if the calculation input does not exist.",
          "path_params": [
            {
              "name": "entity_id",
              "type": "str"
            }
          ],
          "response": {
            "schema_name": "CalculationinputResponse",
            "fields": [
              {
                "name": "monthly_investment",
                "type": "Decimal",
                "required": false
              },
              {
                "name": "annual_return_rate",
                "type": "Decimal",
                "required": false
              },
              {
                "name": "investment_period",
                "type": "int",
                "required": false
              },
              {
                "name": "period_unit",
                "type": "PeriodUnit",
                "required": true,
                "enum_values": [
                  "MONTHS",
                  "YEARS"
                ]
              },
              {
                "name": "id",
                "type": "str",
                "required": true
              },
              {
                "name": "created_at",
                "type": "datetime",
                "required": true
              },
              {
                "name": "updated_at",
                "type": "datetime",
                "required": true
              }
            ],
            "is_list": false
          },
          "status_code": 200
        },
        {
          "method": "GET",
          "path": "/calculation-inputs",
          "summary": "List Calculation Inputs",
          "description": "Returns a paginated list of calculation input records ordered by creation date descending.",
          "query_params": [
            {
              "name": "limit",
              "type": "int",
              "required": false,
              "default": 20
            },
            {
              "name": "offset",
              "type": "int",
              "required": false,
              "default": 0
            }
          ],
          "response": {
            "schema_name": "CalculationinputResponse",
            "fields": [
              {
                "name": "monthly_investment",
                "type": "Decimal",
                "required": false
              },
              {
                "name": "annual_return_rate",
                "type": "Decimal",
                "required": false
              },
              {
                "name": "investment_period",
                "type": "int",
                "required": false
              },
              {
                "name": "period_unit",
                "type": "PeriodUnit",
                "required": true,
                "enum_values": [
                  "MONTHS",
                  "YEARS"
                ]
              },
              {
                "name": "id",
                "type": "str",
                "required": true
              },
              {
                "name": "created_at",
                "type": "datetime",
                "required": true
              },
              {
                "name": "updated_at",
                "type": "datetime",
                "required": true
              }
            ],
            "is_list": true
          },
          "status_code": 200
        },
        {
          "method": "PUT",
          "path": "/calculation-inputs/{entity_id}",
          "summary": "Update Calculation Input",
          "description": "Updates an existing calculation input record. Only provided fields are updated. Returns 404 if the calculation input does not exist.",
          "path_params": [
            {
              "name": "entity_id",
              "type": "str"
            }
          ],
          "request_body": {
            "schema_name": "CalculationinputUpdate",
            "fields": [
              {
                "name": "monthly_investment",
                "type": "Decimal",
                "required": false,
                "nullable": true
              },
              {
                "name": "annual_return_rate",
                "type": "Decimal",
                "required": false,
                "nullable": true
              },
              {
                "name": "investment_period",
                "type": "int",
                "required": false,
                "nullable": true
              },
              {
                "name": "period_unit",
                "type": "PeriodUnit",
                "required": false,
                "nullable": true,
                "enum_values": [
                  "MONTHS",
                  "YEARS"
                ]
              }
            ]
          },
          "response": {
            "schema_name": "CalculationinputResponse",
            "fields": [
              {
                "name": "monthly_investment",
                "type": "Decimal",
                "required": false
              },
              {
                "name": "annual_return_rate",
                "type": "Decimal",
                "required": false
              },
              {
                "name": "investment_period",
                "type": "int",
                "required": false
              },
              {
                "name": "period_unit",
                "type": "PeriodUnit",
                "required": true,
                "enum_values": [
                  "MONTHS",
                  "YEARS"
                ]
              },
              {
                "name": "id",
                "type": "str",
                "required": true
              },
              {
                "name": "created_at",
                "type": "datetime",
                "required": true
              },
              {
                "name": "updated_at",
                "type": "datetime",
                "required": true
              }
            ],
            "is_list": false
          },
          "status_code": 200
        },
        {
          "method": "DELETE",
          "path": "/calculation-inputs/{entity_id}",
          "summary": "Delete Calculation Input",
          "description": "Deletes a calculation input record and all associated calculation results and chart data points. Returns 404 if the calculation input does not exist.",
          "path_params": [
            {
              "name": "entity_id",
              "type": "str"
            }
          ],
          "status_code": 200
        },
        {
          "method": "POST",
          "path": "/calculation-results",
          "summary": "Create Calculation Result",
          "description": "Creates a new calculation result record linked to a calculation input. Validates that the referenced calculation input exists. Returns 404 if the calculation input is not found.",
          "request_body": {
            "schema_name": "CalculationresultCreate",
            "fields": [
              {
                "name": "calculation_input_id",
                "type": "str",
                "required": true
              },
              {
                "name": "total_investment",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "estimated_returns",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "future_value",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "calculation_timestamp",
                "type": "datetime",
                "required": true
              }
            ]
          },
          "response": {
            "schema_name": "CalculationresultResponse",
            "fields": [
              {
                "name": "calculation_input_id",
                "type": "str",
                "required": true
              },
              {
                "name": "total_investment",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "estimated_returns",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "future_value",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "calculation_timestamp",
                "type": "datetime",
                "required": true
              },
              {
                "name": "id",
                "type": "str",
                "required": true
              },
              {
                "name": "created_at",
                "type": "datetime",
                "required": true
              },
              {
                "name": "updated_at",
                "type": "datetime",
                "required": true
              }
            ],
            "is_list": false
          },
          "status_code": 201
        },
        {
          "method": "GET",
          "path": "/calculation-results/{entity_id}",
          "summary": "Get Calculation Result",
          "description": "Retrieves a single calculation result record by ID. Returns 404 if the calculation result does not exist.",
          "path_params": [
            {
              "name": "entity_id",
              "type": "str"
            }
          ],
          "response": {
            "schema_name": "CalculationresultResponse",
            "fields": [
              {
                "name": "calculation_input_id",
                "type": "str",
                "required": true
              },
              {
                "name": "total_investment",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "estimated_returns",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "future_value",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "calculation_timestamp",
                "type": "datetime",
                "required": true
              },
              {
                "name": "id",
                "type": "str",
                "required": true
              },
              {
                "name": "created_at",
                "type": "datetime",
                "required": true
              },
              {
                "name": "updated_at",
                "type": "datetime",
                "required": true
              }
            ],
            "is_list": false
          },
          "status_code": 200
        },
        {
          "method": "GET",
          "path": "/calculation-results",
          "summary": "List Calculation Results",
          "description": "Returns a paginated list of calculation result records ordered by creation date descending.",
          "query_params": [
            {
              "name": "limit",
              "type": "int",
              "required": false,
              "default": 20
            },
            {
              "name": "offset",
              "type": "int",
              "required": false,
              "default": 0
            }
          ],
          "response": {
            "schema_name": "CalculationresultResponse",
            "fields": [
              {
                "name": "calculation_input_id",
                "type": "str",
                "required": true
              },
              {
                "name": "total_investment",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "estimated_returns",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "future_value",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "calculation_timestamp",
                "type": "datetime",
                "required": true
              },
              {
                "name": "id",
                "type": "str",
                "required": true
              },
              {
                "name": "created_at",
                "type": "datetime",
                "required": true
              },
              {
                "name": "updated_at",
                "type": "datetime",
                "required": true
              }
            ],
            "is_list": true
          },
          "status_code": 200
        },
        {
          "method": "PUT",
          "path": "/calculation-results/{entity_id}",
          "summary": "Update Calculation Result",
          "description": "Updates an existing calculation result record. Only provided fields are updated. Validates that any new calculation input ID exists. Returns 404 if the calculation result or referenced calculation input does not exist.",
          "path_params": [
            {
              "name": "entity_id",
              "type": "str"
            }
          ],
          "request_body": {
            "schema_name": "CalculationresultUpdate",
            "fields": [
              {
                "name": "calculation_input_id",
                "type": "str",
                "required": false,
                "nullable": true
              },
              {
                "name": "total_investment",
                "type": "Decimal",
                "required": false,
                "nullable": true
              },
              {
                "name": "estimated_returns",
                "type": "Decimal",
                "required": false,
                "nullable": true
              },
              {
                "name": "future_value",
                "type": "Decimal",
                "required": false,
                "nullable": true
              },
              {
                "name": "calculation_timestamp",
                "type": "datetime",
                "required": false,
                "nullable": true
              }
            ]
          },
          "response": {
            "schema_name": "CalculationresultResponse",
            "fields": [
              {
                "name": "calculation_input_id",
                "type": "str",
                "required": true
              },
              {
                "name": "total_investment",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "estimated_returns",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "future_value",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "calculation_timestamp",
                "type": "datetime",
                "required": true
              },
              {
                "name": "id",
                "type": "str",
                "required": true
              },
              {
                "name": "created_at",
                "type": "datetime",
                "required": true
              },
              {
                "name": "updated_at",
                "type": "datetime",
                "required": true
              }
            ],
            "is_list": false
          },
          "status_code": 200
        },
        {
          "method": "DELETE",
          "path": "/calculation-results/{entity_id}",
          "summary": "Delete Calculation Result",
          "description": "Deletes a calculation result record and all associated chart data points. Returns 404 if the calculation result does not exist.",
          "path_params": [
            {
              "name": "entity_id",
              "type": "str"
            }
          ],
          "status_code": 200
        },
        {
          "method": "GET",
          "path": "/calculation-results/{result_id}/details",
          "summary": "Get Calculation Result Details",
          "description": "Retrieves a calculation result with full details including the original input parameters and all chart data points for visualization. Returns 404 if the calculation result does not exist.",
          "path_params": [
            {
              "name": "result_id",
              "type": "str"
            }
          ],
          "response": {
            "schema_name": "CalculationResultDetailResponse",
            "fields": [
              {
                "name": "id",
                "type": "str",
                "required": true
              },
              {
                "name": "total_investment",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "estimated_returns",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "future_value",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "calculation_timestamp",
                "type": "datetime",
                "required": true
              },
              {
                "name": "calculation_input",
                "type": "CalculationInputDetail",
                "required": true,
                "fields": [
                  {
                    "name": "monthly_investment",
                    "type": "Decimal",
                    "required": true
                  },
                  {
                    "name": "annual_return_rate",
                    "type": "Decimal",
                    "required": true
                  },
                  {
                    "name": "investment_period",
                    "type": "int",
                    "required": true
                  },
                  {
                    "name": "period_unit",
                    "type": "str",
                    "required": true
                  }
                ]
              },
              {
                "name": "chart_data_points",
                "type": "List[ChartDataPointDetail]",
                "required": true,
                "is_list": true,
                "item_fields": [
                  {
                    "name": "period",
                    "type": "int",
                    "required": true
                  },
                  {
                    "name": "invested_amount",
                    "type": "Decimal",
                    "required": true
                  },
                  {
                    "name": "projected_value",
                    "type": "Decimal",
                    "required": true
                  }
                ]
              },
              {
                "name": "created_at",
                "type": "datetime",
                "required": true
              },
              {
                "name": "updated_at",
                "type": "datetime",
                "required": true
              }
            ],
            "is_list": false
          },
          "status_code": 200
        },
        {
          "method": "POST",
          "path": "/chart-data-points",
          "summary": "Create Chart Data Point",
          "description": "Creates a new chart data point record linked to a calculation result. Validates that the referenced calculation result exists. Returns 404 if the calculation result is not found.",
          "request_body": {
            "schema_name": "ChartdatapointCreate",
            "fields": [
              {
                "name": "calculation_result_id",
                "type": "str",
                "required": true
              },
              {
                "name": "period",
                "type": "int",
                "required": true
              },
              {
                "name": "invested_amount",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "projected_value",
                "type": "Decimal",
                "required": true
              }
            ]
          },
          "response": {
            "schema_name": "ChartdatapointResponse",
            "fields": [
              {
                "name": "calculation_result_id",
                "type": "str",
                "required": true
              },
              {
                "name": "period",
                "type": "int",
                "required": true
              },
              {
                "name": "invested_amount",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "projected_value",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "id",
                "type": "str",
                "required": true
              },
              {
                "name": "created_at",
                "type": "datetime",
                "required": true
              },
              {
                "name": "updated_at",
                "type": "datetime",
                "required": true
              }
            ],
            "is_list": false
          },
          "status_code": 201
        },
        {
          "method": "GET",
          "path": "/chart-data-points/{entity_id}",
          "summary": "Get Chart Data Point",
          "description": "Retrieves a single chart data point record by ID. Returns 404 if the chart data point does not exist.",
          "path_params": [
            {
              "name": "entity_id",
              "type": "str"
            }
          ],
          "response": {
            "schema_name": "ChartdatapointResponse",
            "fields": [
              {
                "name": "calculation_result_id",
                "type": "str",
                "required": true
              },
              {
                "name": "period",
                "type": "int",
                "required": true
              },
              {
                "name": "invested_amount",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "projected_value",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "id",
                "type": "str",
                "required": true
              },
              {
                "name": "created_at",
                "type": "datetime",
                "required": true
              },
              {
                "name": "updated_at",
                "type": "datetime",
                "required": true
              }
            ],
            "is_list": false
          },
          "status_code": 200
        },
        {
          "method": "GET",
          "path": "/chart-data-points",
          "summary": "List Chart Data Points",
          "description": "Returns a paginated list of chart data point records ordered by period. Supports optional filtering by calculation result ID.",
          "query_params": [
            {
              "name": "limit",
              "type": "int",
              "required": false,
              "default": 20
            },
            {
              "name": "offset",
              "type": "int",
              "required": false,
              "default": 0
            },
            {
              "name": "calculation_result_id",
              "type": "str",
              "required": false
            }
          ],
          "response": {
            "schema_name": "ChartdatapointResponse",
            "fields": [
              {
                "name": "calculation_result_id",
                "type": "str",
                "required": true
              },
              {
                "name": "period",
                "type": "int",
                "required": true
              },
              {
                "name": "invested_amount",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "projected_value",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "id",
                "type": "str",
                "required": true
              },
              {
                "name": "created_at",
                "type": "datetime",
                "required": true
              },
              {
                "name": "updated_at",
                "type": "datetime",
                "required": true
              }
            ],
            "is_list": true
          },
          "status_code": 200
        },
        {
          "method": "PUT",
          "path": "/chart-data-points/{entity_id}",
          "summary": "Update Chart Data Point",
          "description": "Updates an existing chart data point record. Only provided fields are updated. Validates that any new calculation result ID exists. Returns 404 if the chart data point or referenced calculation result does not exist.",
          "path_params": [
            {
              "name": "entity_id",
              "type": "str"
            }
          ],
          "request_body": {
            "schema_name": "ChartdatapointUpdate",
            "fields": [
              {
                "name": "calculation_result_id",
                "type": "str",
                "required": false,
                "nullable": true
              },
              {
                "name": "period",
                "type": "int",
                "required": false,
                "nullable": true
              },
              {
                "name": "invested_amount",
                "type": "Decimal",
                "required": false,
                "nullable": true
              },
              {
                "name": "projected_value",
                "type": "Decimal",
                "required": false,
                "nullable": true
              }
            ]
          },
          "response": {
            "schema_name": "ChartdatapointResponse",
            "fields": [
              {
                "name": "calculation_result_id",
                "type": "str",
                "required": true
              },
              {
                "name": "period",
                "type": "int",
                "required": true
              },
              {
                "name": "invested_amount",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "projected_value",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "id",
                "type": "str",
                "required": true
              },
              {
                "name": "created_at",
                "type": "datetime",
                "required": true
              },
              {
                "name": "updated_at",
                "type": "datetime",
                "required": true
              }
            ],
            "is_list": false
          },
          "status_code": 200
        },
        {
          "method": "DELETE",
          "path": "/chart-data-points/{entity_id}",
          "summary": "Delete Chart Data Point",
          "description": "Deletes a chart data point record. Returns 404 if the chart data point does not exist.",
          "path_params": [
            {
              "name": "entity_id",
              "type": "str"
            }
          ],
          "status_code": 200
        },
        {
          "method": "POST",
          "path": "/calculations/compute",
          "summary": "Calculate SIP Returns",
          "description": "Calculates the future value of a SIP investment using the provided parameters. Validates all inputs, computes total investment, estimated returns, and future value using the SIP compound interest formula, generates chart data points for each period, and persists the calculation input, result, and chart data. Returns 400 if inputs are invalid or period exceeds 480 months.",
          "request_body": {
            "schema_name": "ComputeSIPRequest",
            "fields": [
              {
                "name": "monthly_investment",
                "type": "Decimal",
                "required": false
              },
              {
                "name": "annual_return_rate",
                "type": "Decimal",
                "required": false
              },
              {
                "name": "investment_period",
                "type": "int",
                "required": false
              },
              {
                "name": "period_unit",
                "type": "PeriodUnit",
                "required": true,
                "enum_values": [
                  "MONTHS",
                  "YEARS"
                ]
              }
            ]
          },
          "response": {
            "schema_name": "ComputeSIPResponse",
            "fields": [
              {
                "name": "calculation_result_id",
                "type": "str",
                "required": true
              },
              {
                "name": "total_investment",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "estimated_returns",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "future_value",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "chart_data_points",
                "type": "List[ChartDataPointDetail]",
                "required": true,
                "is_list": true,
                "item_fields": [
                  {
                    "name": "period",
                    "type": "int",
                    "required": true
                  },
                  {
                    "name": "invested_amount",
                    "type": "Decimal",
                    "required": true
                  },
                  {
                    "name": "projected_value",
                    "type": "Decimal",
                    "required": true
                  }
                ]
              }
            ],
            "is_list": false
          },
          "status_code": 201
        },
        {
          "method": "POST",
          "path": "/calculations/reset",
          "summary": "Reset Calculator to Defaults",
          "description": "Resets the SIP calculator to default values (monthly investment: $500, annual return rate: 12%, investment period: 10 years), performs the calculation, and returns the result with chart data points.",
          "response": {
            "schema_name": "ComputeSIPResponse",
            "fields": [
              {
                "name": "calculation_result_id",
                "type": "str",
                "required": true
              },
              {
                "name": "total_investment",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "estimated_returns",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "future_value",
                "type": "Decimal",
                "required": true
              },
              {
                "name": "chart_data_points",
                "type": "List[ChartDataPointDetail]",
                "required": true,
                "is_list": true,
                "item_fields": [
                  {
                    "name": "period",
                    "type": "int",
                    "required": true
                  },
                  {
                    "name": "invested_amount",
                    "type": "Decimal",
                    "required": true
                  },
                  {
                    "name": "projected_value",
                    "type": "Decimal",
                    "required": true
                  }
                ]
              }
            ],
            "is_list": false
          },
          "status_code": 201
        }
      ]
    }
  ],
  "enums": {
    "PeriodUnit": [
      "MONTHS",
      "YEARS"
    ]
  }
}
