Commercial Real Estate Lease Administration Software Lease Accounting
142k lines (Aug 2023) 213 controllers 116 models 18 mailers 60k lines of Javascript
Accounting
Double Entry Bookkeping (Every Entry to an account requires a corresponding opposite to another account) (credit & debit)
Assets(company owns) = Liabilities(company owes) + Equity(company net worth)
Ensure compilance with lease accounting standards ASC842 and IFRS16
Calculating lease payments: Autogenerating lease transactions by Measuring leases
Automatic Recording of books’ entries: Journal Entries
Chart of accounts: List Accounts used to track transactions are classified (have type of transaction asset liability revenue expense) and have its own balance.
Preparing financial statements: Journal Entries, Accounts(credits&debits) to explain how money flows
Provide analysis and insights: Trail Balance & Disclosures Reports to help strategic decision making
Lease Admin
Maintain Accurate Lease Data (lease terms, asset, rent, additiona rent, incentives, clauses, custom data)
Rent Rules
Percentage Rent is when tenant is to obligated to pay a percentage of their sales revenue, but only when passign a threshold.
Free Rent: Months that not need to be payed
Escalations: Increases over time (usually due to inflation adjustment) e.g 5% yearly
Additional Rent: Rent is divided into Base + Additional. Additional involves electricity, insurance, utilities and other charges that tenant must pay
Incentives: when landlord provides some discount as incentive for the tenant to sign the contract
Broker Lease
Broker can help to find a lease and negotiate its price along with compare them and track their lease status.
Admin support
Someone from occupier customer support that helps onboarding new customers
Fixing data when customers
Ensure the team plans, design and executes effectively.
React: …Redux,Redux Middleware,Redux Thunk,Redux Api Middleware,React Router,Material UI,Formik,Lodash,Webpack,Jest + Cypress,Typescript
Rails: …Fast JSON API,Pundit Auth,Administrate (Admin Dashboard)
Postgres, Redis, Heroku
Problem
A customer mentioned that in order to integrate with their system they could receive their data every month on a csv format over SFTP.
Our current scheduled exports only deliver via email so Occupier decided to support other delivery methods.
In particular FTP/SFTP/S3
Solution
Erik started coding a POC in order to assess feasibility.
Then assigned the feature to Marcos who reviewed the code and validated the architecture with Krishan before start coding.
Marcos did some adjustments to the code and coded a solution.
Including dummy docker servers, updated the documentation, test and missing features such us send-it-now
.
tech difficulties:
Carlos took the time to thorough review and QA all the code and helped elevate its overall quality.
Krishan did a final review
Results
business impact: cuando viene un nuevo usuario tenemos que tomar todos sus datos en papel y pasarlos a occupier, luego interactua con gente de customer success que se fija si los datos tienen errores y se comunica con el usuario. Todo esto es un proceso muy manual que puede ser hecho como parte de la aplicacion. CS-team marca los problemas en los datos en la plataforma el usuario los puede ver claramente y sabe que tiene que hacer. Esto agilita el proceso ahorrando tiempo a los usuarios y a cs-team.
Para esto decidimos mejorar las tasks ya que notamos que era una feature muy utilizada y amada por los clientes.
TODO: continue…..
problem: rent-roll is the monthly process of identifying the correct rent and expenses that need to be paid to landlord and other vendors In practice, this means reviewing the lease administration data for a given time period to identify estimated expenses, and reconciling that data with invoices or other sources of payment information in order to produce a final report of all the expenses that need to be paid. Today is a manual, expensive and time-consuming process.
business impact:
technical challenges:
Automate data extraction for our customers, so they can create scripts to integrate with their own tools.
Allow users to schedule exports to be sent out on a regular basis. So they can receive the data on their emails and process it from there.
Until now Nov 7 we were able to plan and implement a phase 1 of the project. We expect to gain feedback from it in order to determine if it worth investing more time on improvements.
pending
Today, the Variance Report contains the sum total of Base Rent and every Additional Expense. We call this Total Rent. However, users don’t want to see the difference in Total Rent between January and February, they want to see any differences in Base Rent, CAM, Utilities, etc… Therefore, we should include every expense type in the variance report.
Show variances by expense type
Project was released to production, some bugs were detected and fixed after that.
Customers weren’t able to filter the report to met their expectations, making this feature not very usable for them since it was producing docens of columns (one per month).
Enhance report to support filter by many attributes, in particular the filtering for expense type was a special case.
Filtering by expense type and period ranges were where the difficulty relied since it wasn’t standard code.
The project was investigated, designed, released to production, got feedback and issues were solved.
We didn’t release behind feature flag so at some point we offered functionality that wasn’t worked as expected.
Portfolio digest was providing not very useful information for the user, and missing other important information.
Critical dates weren’t much useful because it lacks of customization
Highlight important information on portfolio digest.
Make portfolio digest content customizable (which content should include and when should be included).
Make critical dates notification customizable (when start sending and frequency).
Notifications was delivered after initially estimated.
People is using it?
No major issues were found after the release.
Other problems were solved on its way. We detected that alerts recreation were not working properly in the past and we fixed it.
QA process was good.
Problem:
Exports consuming too much memory from our main server node.
Large exports were taking long time to process and giving timeouts errors for some big customers.
Solution:
Tansition all existing exports to background exports.
Export runs in background
File is uploaded to S3 and a temporary link is created.
An email is sent to the requester user with that link.
File is not attached to avoid emails from being spammed.
Result:
The transition of each export should be easy to implement.
Only one Graphql endpoint receiving the name of the export as parameter
Problem:
Accounting needed to support leases with incentives.
Incentives are a payment from the landlord to the tenant.
And as such impact the financial statements
Solution:
challenge: Requirements were very vague described.
Took initiative and reach out people with questions.
Wrote down example scenarios and share for feedback.
Found several important problems that were missed at that point.
Meet several times with team members in order to ensure my understanding was correct.
Modeled a solution and planned the work, splitting down into stories.
Executed the plan (programmed) splitting into small PR explaining how things work and why.
challenge: Enabling the feature only for certain accounts
I had to define a place for user setting enablig or disabling the feature.
Dealing with two different logics in multiple places depending on the feature-flag enabled or not.
challenge: existing data had to be adapted.
(data migration needs to run right before the deployment otherwise we could have wrong records)
Result:
Took a few weeks to accomplish.
Presented my work on weekly meetings.
Monitor production release and check for bugs
Challenges
Mistakes/Failures
Enjoyed
Leadership
Conflicts
What You’d Do Differently
Backend
FrontEnd
▾ features/
▾ leaseAccounting/
▾ components/
▸ journalEntries/
▾ measurement/
amortize.test.ts
amortize.ts
decorator.ts
fiscalAttributes.ts
generateSchedule.ts
util.test.ts
util.ts
▸ remeasurement/
▾ pages/
▾ measurementForm/
▸ edit/
▸ new/
calculateTI.test.ts
calculateTI.ts
Form.tsx
Page.tsx
util.test.ts
util.ts
validationSchema.test.ts
validationSchema.ts
util.test.ts
util.ts
paths.ts
Routes.tsx
Write URL SPA is served by backend React Router parses url render component (home page) Home page Container initiates the data-fetching process Redux api middleware manages the request When api returns it will call the appropiate transform with the result. Transform will take a json object and return a javascript object Middleware will save that object in the redux store After container has components read using a selector from the store and render data and attach action callbacks to UI events (onChange)