4.1.0 • Published 1 year ago

@cubedelement.com/realty-investor-timeline v4.1.0

Weekly downloads
-
License
ISC
Repository
github
Last release
1 year ago

realty-investor-timeline

CircleCI semantic-release Wallaby.js npm.io

A way to determine if and when your expenses would be covered through rental properties

Will be based on version 1

  1. https://bitbucket.org/kellyvernon/realty-generator-core (a private repo by me).
  2. version 1 live: http://cubedelement.com/realty/

Note: this above is buggy. I was racing to get the pieces together.

Inspiration

This was originally used as a discussion point between me and my SO. The idea is that we like our jobs, but we also want a way to ensure that if anything happens to us, we would be able to sustain our income.

For me, I was inspired by a game originally from early 2000's where you could quickly click on houses and flip them, but after this idea and speaking with mentors, the idea has become find an optimal way to ramp-up.

☝️Mentors are great! They do a great job at helping you discover how to get to the next point in your life. Also, a mentor is someone who has done the thing and is either where you've been or want to go. AKA, don't ask a someone how to become a CEO when that person has never been a CEO. (Hopefully that give you a good idea)

What this does

As mentioned prior, we want to find a way to ramp-up. This library will work through the scenarios of houses and provide a way to collect them. Once it completes, it'll provide feedback as to why you passed on a property.

For example, it could be that you didn't have enough cash. Another is that you may have wanted more cash flow per month. After you see the trends, and based on the time-line hand at play, you could realize that you might need to expand on your ideal finds.

The library loop simulates a per-month savings. In there it will take your money saved and determine if you have enough to acquire more properties. Equally, we run through selling of properties too, because it's a common practice.

Building

Node version

On linux, mac, etc... do: $ nvm install, referencing this manager: https://github.com/nvm-sh/nvm

on windows: $ nvs install, referencing this manager: https://github.com/jasongin/nvs

Getting the Repo up and running

Install libs

$ npm ci

Run tests

$ npm run tests

☝️This can run using Wallaby.js in automatic config, or you can use the config supplied here

CI/CD (Delivery)

This project sports a non gitflow workflow.

Branches

main and feature/*

The (CI/CD) Flow

Once a feature's PR is merged, the pipeline will run checks and publish.

Single family homes

Features

  • Mortgage calc (Single Family) ✔
  • Rent amount ✔
  • Cash flow ✔
  • Appreciation calculation ✔
  • Equity (simple) ✔
  • Monthly summaries ✔
  • Annual summaries ✔

Needed things (in no order)

  • TODO: Hard Money Loan calc ✋
    • What would the transition look like in code?
  • TODO: Cash flow ramp (0 - 3 months depending on rehab, conventional, or existing tenant)
    • Transition would be around Hard Money vs Conventional

Missing features

  1. delay 1st mortgage payment
  2. refactor loop

Future

  • Refine the build process to remove /dist/src from library drill down

calling

As this is still in progress, the current flow is as follows:

import {
  HasMetGoalOrMaxTime,
  ISimulateOptions,
  LedgerCollection,
  LoanSettings,
  HoldRuleTypes,
  PropertyType,
  RentalGenerator,
  RentalSingleFamily,
  RuleEvaluation,
  PurchaseRuleTypes,
  ValueCache,
  User,
  simulate,
} from "@cubedelement.com/realty-investor-timeline";

/**
 * Callout!
 * This example shows you all the options available, and most are defaulted if you don't supply the options object.
 * This only one that isn't supplied is the generatorOptionsPassiveApartment values.
 */
const options: ISimulateOptions = {
  amountInSavings: 100000,
  monthlyIncomeAmountGoal: 10000,
  monthlySavedAmount: 10000,
  holdRules: [
    {
      value: 5,
      type: HoldRuleTypes.MinSellIfHighEquityPercent,
      propertyType: PropertyType.SingleFamily,
    },
  ],
  purchaseRules: [
    {
      value: 50000,
      type: PurchaseRuleTypes.MaxEstimatedOutOfPocket,
      propertyType: PropertyType.SingleFamily,
    },
    {
      value: 7000,
      type: PurchaseRuleTypes.MinEstimatedCapitalGainsPercent,
      propertyType: PropertyType.SingleFamily,
    },
    {
      value: 200,
      type: PurchaseRuleTypes.MinEstimatedAnnualCashFlow,
      propertyType: PropertyType.SingleFamily,
    },
  ],
  loanSettings: [
    {
      propertyType: PropertyType.SingleFamily,
      name: LoanSettings.MinimumMonthlyReservesForRental,
      value: 6,
    },
    {
      name: LoanSettings.LoanRatePercent,
      value: 4,
      propertyType: PropertyType.SingleFamily,
    },
    {
      name: LoanSettings.LoanTermInYears,
      value: 30,
      propertyType: PropertyType.SingleFamily,
    },
  ],
  maxYears: 7,
  generatorOptionsSingleFamily: {
    lowestMinSellInYears: 1,
    highestMinSellInYears: 1,
    lowestPurchasePrice: 150000,
    highestPurchasePrice: 250000,
    lowestSellAppreciationPercent: 5,
    highestSellAppreciationPercent: 7,
    lowestCashFlow: 200,
    highestCashFlow: 550,
    lowestEquityCapturePercent: 7,
    highestEquityCapturePercent: 15,
    maxRentalOpportunities: 4,
  },
  generatorOptionsPassiveApartment: {
    lowestMinSellInYears: 1,
    highestMinSellInYears: 1,
    lowestPurchasePrice: 150000,
    highestPurchasePrice: 200000,
    lowestSellAppreciationPercent: 5,
    highestSellAppreciationPercent: 7,
    lowestCashFlow: 200,
    highestCashFlow: 500,
    lowestEquityCapturePercent: 7,
    highestEquityCapturePercent: 15,
    maxRentalOpportunities: 6,
  },
};

const timeline = simulate(options);

//Finally, to review your results, you can use the ledgerCollection's getSummariesAnnual.
const lastYear = timeline.user.ledgerCollection.getSummariesAnnual(
  timeline.endDate.getUTCFullYear()
);

The example result object models: Timeline:

{
  "startDate": "2021-11-01T00:00:00.000Z",
  "endDate": "2022-11-01T00:00:00.000Z",
  "rentals": [
    {
      "property": {
        "sellPriceAppreciationPercent": 6,
        "minSellYears": 1,
        "id": "7674c1ec-2fb6-4828-9490-271e9ab4a3c4",
        "purchasePrice": 162373,
        "address": "1791 Wama Extension",
        "monthlyCashFlow": 237,
        "availableStartDate": "2021-12-01T00:00:00.000Z",
        "availableEndDate": "2022-02-01T00:00:00.000Z",
        "cashDownPercent": 25,
        "monthlyPrincipalInterestTaxInterest": 949.57,
        "_purchaseDate": "2022-01-01T06:00:00.000Z",
        "_soldDate": "2022-02-01T06:00:00.000Z"
      },
      "reasons": []
    }
  ],
  "user": {
    "ledgerCollection": {
      "collection": {
        "source": [
          {
            "amount": 119603.25,
            "type": "Equity Capture",
            "created": "2022-11-01T00:00:00.000Z",
            "note": "for: 1791 Wama Extension, id: 7674c1ec-2fb6-4828-9490-271e9ab4a3c4"
          }
        ]
      }
    }
  }
}

In it you can get an estimate monthly cash flow by calling const estimated = timeline.getEstimatedMonthlyCashFlow();

4.1.0

1 year ago

4.0.1

2 years ago

2.3.0

2 years ago

2.2.0

2 years ago

3.2.0

2 years ago

3.1.0

2 years ago

3.0.0

2 years ago

4.0.0

2 years ago

1.8.1

2 years ago

1.7.2

2 years ago

1.8.0

2 years ago

1.7.1

2 years ago

1.7.0

2 years ago

1.6.0

2 years ago

1.5.0

2 years ago

1.4.0

2 years ago

1.3.0

3 years ago

2.1.0

2 years ago

2.0.1

2 years ago

2.0.0

2 years ago

1.2.0

3 years ago

1.1.0

3 years ago

1.0.2

3 years ago

1.0.1

3 years ago

1.0.0

3 years ago