Git Product home page Git Product logo

rubyforgood / human-essentials Goto Github PK

View Code? Open in Web Editor NEW
445.0 51.0 460.0 36.59 MB

Human Essentials is an inventory management system for diaper, incontinence, and period-supply banks. It supports them in distributing to partners, tracking inventory, and reporting stats and analytics.

Home Page: https://humanessentials.app

License: MIT License

Ruby 72.11% JavaScript 1.30% HTML 25.70% Shell 0.06% SCSS 0.81% Procfile 0.01% Dockerfile 0.02%
rails non-profit rubyforgood open-source hacktoberfest help-wanted sdg-3 sdg-1 sdg-10

human-essentials's Introduction

Human Essentials

DPG Approved

Mission πŸ’–

Human Essentials is an inventory management system built to address the needs of Diaper Banks as directly and explicitly as possible and adapted to meet the needs of other Essentials Banks. Essentials Banks maintain inventory, receive donations and other human essentials supplies (e.g. diapers, period supplies), and issue distributions to community partner organizations. Like any non-profit, they also need to perform reports on this data and have day-to-day operational information they need. This application aims to serve those needs and facilitate the general operations of the Diaper Banks (e.g., using barcode readers, scale weighing, inventory audits).

Impact 🌟

Human Essentials has over 200 registered banks across the United States at no cost to them. It is currently helping over 3 million children receive diapers and over 400k period supply recipients receive period supplies. Our team is in partnership with the National Diaper Bank Network (NDBN) and can be found in their annual conference that brings numerous of non-profit organizations that distribute essential products to people.

We are proud of our achievements up to date but there is much more to do! This is where you come in...

Ruby for Good

Human Essentials is one of many projects initiated and run by Ruby for Good. You can find out more about Ruby for Good at https://rubyforgood.org

Digital Public Good πŸŽ‰

The Digital Public Goods Alliance recognizes Human Essentials as a digital public good (DPG). This project supports the following Sustainable Development Goals:

  • SDG 1 - End poverty in all its forms everywhere
  • SDG 3 - Ensure healthy lives and promote well-being for all at all ages
  • SDG 10 - Reduce inequality within and among countries

Use as an Organization or Contribute as an Individual/Team to this Project:

Welcome Contributors! πŸ‘‹

Thanks for checking us out! Check out our Contributing Guidelines on how to contribute.

Deployment Process

The human-essentials & partner application should ideally be deployed on a weekly or bi-weekly schedule depending on the merged updates in the main branch. This is the process we take to deploy updates from our main branch to our servers.

Requirements

  • SSH access to our servers (usually granted to core maintainers)
  • Login credentials to our Mailchimp account

Steps

1. Merge main into production branch

All deploys deploy from the production branch, which keeps track of what is currently in production.

git checkout production
git merge main

2. Tag & Release

  1. Push a tag with the appropriate date versioning. Refer to the releases for the correct versioning. For example, if you are deploying on June 23, 2024:

    git tag 2024.06.23
    git push origin tag 2024.06.23
  2. Publish a release, associated to that tag pushed up in the previous step, here. Include details about the release's updates (we use this to notify our stakeholders on updates via email).

Running delayed jobs

Run delayed jobs locally with the rake jobs:work command. This is necessary to view any emails in your browser. Alternatively, you can run a specific delayed job by opening a Rails console and doing something like:

Delayed::Job.last.invoke_job

You can replace the last query with any other query (e.g. Delayed::Job.find(123)).

Acknowledgements

Thanks to Rachel (from PDX Diaperbank) for all of her insight, support, and assistance with this application, and Sarah ( http://www.sarahkasiske.com/ ) for her wonderful design and CSS work at Ruby For Good '17!

License

FOSSA Status

✨ Contributors ✨

Thanks goes to these wonderful people (emoji key):

Edwin Mak
Edwin Mak

πŸ’» πŸ“† πŸš‡ πŸ€” πŸ’¬ πŸ›‘οΈ
Sean Marcia
Sean Marcia

πŸ’» πŸ’Ό πŸ’΅ πŸ” πŸ“‹
Aaron H
Aaron H

πŸ“† πŸ’»
Dmitry
Dmitry

πŸ’»
Adam Bachman
Adam Bachman

πŸ’»
JC Avena
JC Avena

πŸ’»
mdworken
mdworken

πŸ’» πŸ“†
Marius Pop
Marius Pop

πŸ’»
Elayne
Elayne

πŸ’»
Amy Detwiler
Amy Detwiler

πŸ’»
Gia
Gia

πŸ’»
Amina Adewusi
Amina Adewusi

πŸ’»
albertchae
albertchae

πŸ’» πŸ€”
Keith Walters
Keith Walters

πŸ’»
Chase Southard
Chase Southard

πŸ’»
Brock Wilcox
Brock Wilcox

πŸ’»
danquill
danquill

πŸ’»
Keith Bennett
Keith Bennett

πŸ’»
Benjamin Reynolds
Benjamin Reynolds

πŸ’»
jtu0
jtu0

πŸ’»
Juarez Lustosa
Juarez Lustosa

πŸ’»
Julien A.
Julien A.

πŸ’»
Emerson Manabu Araki
Emerson Manabu Araki

πŸ’»
Ben Klang
Ben Klang

πŸ’»
karolina
karolina

πŸ’»
Josh Cano
Josh Cano

πŸ’»
Julian Macmang
Julian Macmang

πŸ’»
Philip DeFraties
Philip DeFraties

πŸ’»
GabrielRMuller
GabrielRMuller

πŸ’»
Lucas Hiago
Lucas Hiago

πŸ’»
Lanya Butler
Lanya Butler

πŸ’»
Eduardo Moreira
Eduardo Moreira

πŸ’»
Alicia Barrett
Alicia Barrett

πŸ’»
Bob Forcha
Bob Forcha

πŸ’»
William Murphy
William Murphy

πŸ’»
Kate Donaldson
Kate Donaldson

πŸ’»
Matthew Russell Dodds
Matthew Russell Dodds

πŸ’»
Allison McMillan
Allison McMillan

πŸ’»
Ashley Jean
Ashley Jean

πŸ’»
Eduardo Alencar
Eduardo Alencar

πŸ’»
Thomas Hart
Thomas Hart

πŸ’»
Bart Agapinan
Bart Agapinan

πŸ’»
Monique
Monique

πŸ’»
Valerie Woolard
Valerie Woolard

πŸ’»
zak-kay
zak-kay

πŸ’»
Jason LaHatte
Jason LaHatte

πŸ’»
Dave Tapley
Dave Tapley

πŸ’»
Meghan
Meghan

πŸ’»
Andy Thackray
Andy Thackray

πŸ’»
Felipe Lovato Flores
Felipe Lovato Flores

πŸ’»
Marcel Kooi
Marcel Kooi

πŸ’»
Lee Sharma
Lee Sharma

πŸ’»
Scott Steele
Scott Steele

πŸ’» πŸ€”
Sam Weerasinghe
Sam Weerasinghe

πŸ’»
Gerald Abrencillo
Gerald Abrencillo

πŸ’»
Rodolfo Santos
Rodolfo Santos

πŸ’»
Gabriel BaldΓ£o
Gabriel BaldΓ£o

πŸ’»
Melanie White
Melanie White

πŸ’»
Melissa Miller
Melissa Miller

πŸ’»
Marc Heiligers
Marc Heiligers

πŸ’»
Joe Hunt
Joe Hunt

πŸ’»
Meg Gutshall
Meg Gutshall

πŸ’»
Andrew H Schwartz
Andrew H Schwartz

πŸ’»
Joseph Glass
Joseph Glass

πŸ’»
Reese Williams
Reese Williams

πŸ’»
Santiago Perez
Santiago Perez

πŸ’»
Sirius Dely
Sirius Dely

πŸ’»
Heather Herrington
Heather Herrington

πŸ’»
Moacir Guedes
Moacir Guedes

πŸ’»
CraigJZ
CraigJZ

πŸ’»
Semih Arslanoğlu
Semih Arslanoğlu

πŸ’»
Mauricio de Lima
Mauricio de Lima

πŸ’»
David Curtis
David Curtis

πŸ’»
Natalia GalΓ‘n
Natalia GalΓ‘n

πŸ’»
Anderson Fernandes
Anderson Fernandes

πŸ’»
Gabriel Belgamo
Gabriel Belgamo

πŸ’»
Jorge David C.T Junior
Jorge David C.T Junior

πŸ’»
Seth Lieberman
Seth Lieberman

πŸ’»
Jorge Oliveira Santos
Jorge Oliveira Santos

πŸ’»
Drinks
Drinks

πŸ’»
Bruno Castro
Bruno Castro

πŸ’»
Carlos Palhares
Carlos Palhares

πŸ’»
Clifton McIntosh
Clifton McIntosh

πŸ’»
Daniel Beigelman
Daniel Beigelman

πŸ’»
Meg Viar
Meg Viar

πŸ’»
Svetlana Vileshina
Svetlana Vileshina

πŸ’»
Ben Reed
Ben Reed

πŸ’»
Emily Giurleo
Emily Giurleo

πŸ’»
Alem Getu
Alem Getu

πŸ’»
Dejan Bjeloglav
Dejan Bjeloglav

πŸ’»
Cassiano Blonski Sampaio
Cassiano Blonski Sampaio

πŸ’»
Greg
Greg

πŸ’»
finn
finn

πŸ’»
Jayson Mandani
Jayson Mandani

πŸ’»
Stanley Liu
Stanley Liu

πŸ’»
Curtis Bartell
Curtis Bartell

πŸ’»
Libby Rodriguez
Libby Rodriguez

πŸ’»
joshuacgraves
joshuacgraves

πŸ’¬ πŸ“†
Himanshu
Himanshu

πŸ’»
Mohamed Hegab
Mohamed Hegab

πŸ’»
Alejandro AR
Alejandro AR

πŸ’»
hatsu
hatsu

πŸ’»
Matt Glover
Matt Glover

πŸ’»
js-sapphire
js-sapphire

πŸ’»
lasitha
lasitha

πŸ’»
Patrick McClernan
Patrick McClernan

πŸ’»
Marc Bellingrath
Marc Bellingrath

πŸ’»
Daniel Orner
Daniel Orner

πŸ’»
Bob Mazanec
Bob Mazanec

πŸ’»
Mark Yen
Mark Yen

πŸ’»
Rachael Wright-Munn
Rachael Wright-Munn

πŸ’»
Ítalo Matos
Ítalo Matos

πŸ’»
Alvaro Sanchez Diaz
Alvaro Sanchez Diaz

πŸ’»
mbrundige
mbrundige

πŸ’»
Robert Greene
Robert Greene

πŸ’»

This project follows the all-contributors specification. Contributions of any kind welcome!

human-essentials's People

Contributors

abachman avatar albertchae avatar aliciawyse avatar armahillo avatar awwaiid avatar cancelei avatar cattywampus avatar chaserx avatar cielf avatar danquill avatar dependabot-preview[bot] avatar dependabot[bot] avatar dorner avatar edwinthinks avatar ejuten avatar elasticspoon avatar giacoelho avatar ilindmitry avatar jadekstewart3 avatar jcavena avatar jimmyli97 avatar kaylahrose avatar kev-kev avatar lokisk1155 avatar mdworken avatar mlpinit avatar nirvikalpa108 avatar scooter-dangle avatar sean-dickinson avatar seanmarcia avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

human-essentials's Issues

Fix Navbar Responsive

When the hamburger is clicked in mobile view the navbar links are displaying horizontally.
They should display in Vertical Menu list format.

When adding a donation with "Diaper Drive" as the source, it prompts for a Community Partner

From Rachel

Add β€œCommunity Partners”to address book. So we can make note of the businesses that are hosting the
diaper drives on the receipts we’re creating

This could possibly be integrated with #4 in creating a Source model. Inquire with Rachel further about how the "source" field is similar or different from a "community partner".

The model should be similar to "DropoffLocation" in terms of data, and maybe both of them could just be the same model with polymorphism?

Inventory should be immediately accessible for distribution after being entered

This was raised as an issue with the previous app. It may or may not affect this new app (since ActiveAdmin has been removed), but it was raised as a need by the Org, so let's make sure that it works as expected! :)

Issue from PDXDB, as written:

For example, I recently entered a bunch of size 6’s into the
database that were purchased. Then, when I went to create a ticket for distribution, it said that there wasn’t
enough size 6’s in inventory to create my ticket. Why?

DiaperDriveParticipant needs CRUD for management

The DiaperDriveParticipant model was created in #89 but does not have any management features (other than via rails c-fu)

Basic CRUD features should be added (maybe not "destroy"?) similar to the other community partner models. A menu item under "Community" would be a good place to put a link for it.

Model has validations already -- pretty much just the UI and Controllers needs to be created.

Site layout & basic navigation

The app is set up with the Foundation 6 framework and a very basic default layout. It needs to look a bit more well put-together and have a site navigation.

A tenant can put a custom logo in the masthead of the app

From Rachel:

Create a way for individual users to add logo to header of website (so it appears on every webpage). People in nonprofit take such pride in their organization. Having the logo there enriches this, and makes the tedious work of data entry more fun!

This will require the ability to upload images (and store them); Paperclip or similar should work?

User can track loose diapers for intake using a digital scale

A user should be able to add loose inventory via weighing the product on a scale. Here are the notes from the previous year:

  1. You click on the scale tab
  2. You click on the diaper type (ie- disposable inserts), size (NB, 1, 2, 3, etc) (*)
  3. You dump the diapers into a container on the scale
  4. It displays how many diapers are in the container (ie - 82 diapers)
  5. You then click "Add to Inventory" and it adds them to the inventory (ie- 82 disposable inserts to PDX Diaper Bank (Office))

[* Rachel also mentioned "count", though I'm not clear on what that's referring to]

Relevant links (from @seanmarcia )

Javascript undefined is not an object error on most pages

Looks like the JavaScript firing on every page includes a snippet from the distributions.coffee that is pulling an object from the DOM and trying to call other functions on that object. In particular, this section:

$(document).on "turbolinks:load", ->
  control = $("select#distribution_storage_location_id")
  $.ajax
    url: control.data("storage-location-inventory-path").replace(":id", control.val())

Is expecting a select#distribution_storage_location_id to exist and then calls data() on it. However that control only exists on the new or edit distributions pages. This JS should be updated to only execute on the page it applies to.

Validation for URL on Organization needs better error messages

If the user doesn't provide http:// at the beginning of the url for their organization the validation fails but doesn't explain why.

We should probably make the error message more clear, and I would also recommend removing the requirement to having http:// added by the user. Not everyone is going to thing to do this. Most people thing of websites as just the domain they know.

Fill Out CRUD Functionality for Donations

Currently users can create donations, but there's no good way to read/edit/delete them. This ticket is to add that functionality.

One caveat: Need to make sure that deleting/editing a donation doesn't necessarily delete the records, but rather adjusts the inventory quantities.

A user can print a finalized ticket (to PDF?)

The printed ticket should probably have a manifest of the contents, the inventory it's coming from, and the partner it's being distributed to, as well as the user that prepared it (and the date?)

I don't think this feature was completed on the previous app.

Printing to PDF may not be necessary if other means are better.

Adding additional fields for donations of certain types

Rachel would love it if the new donations form could include additional source information above and beyond simply the source type, i.e. if the source is a diaper drive, having an additional field to enter the specific diaper drive, or if the source is a purchase being able to enter where the purchase was made/who made it/the purchase date, etc.

This ticket will likely require some additional coordination with Rachel to get a solid grasp of all use cases.

Donation::SOURCES needs a refactor

Mentioned in #89 --

/app/models/donation.rb has a SOURCES array of strings that has the different options that can be used for the source field. Up til now this was mostly limited to the donations views.

With the changes in #89 though, the string literals are being referenced elsewhere. Changing the wording of the strings in SOURCES will thus have "OMGWTFBBQ" breakage. It's unlikely the types will change so this can probably be fixed by making SOURCES into a hash and referencing the hash-keys instead of the strings directly. (ie. Donation::SOURCES[:dropoff_location] instead of "Donation Pickup Location")

Rename `Inventory` to `StorageLocation`

The Inventory model actually represents where items are being stored, because it has a location and relates to the what (inventory items).

The actions that we would do to an inventory are really actions that would take place between facilities, or locations, such as a transfer. This enables us to treat inventory items as the inventory itself. Now a storage location can have multiple items in inventory.

User can edit/remove inventory count from any category

From Rachel:

Must have a way to remove/adjust inventory count from any category! Sometime items get entered
incorrectly, not caught until later, then needs to be removed from inventory.

The big concern, for data integrity, is that there is some kind of audit record for the change.

There are a few different ways this could be approached -- if it were possible to adjust the erroneous donation, (via Donation#Edit) then the existing audit trail is preserved, although I suspect that this will not address all possible cases (maybe they do an inventory count and notice discrepancies but don't know if it's inventory shrinkage or a typo in the intake).

Another possibility is to create an Adjustment model to track these inventory changes. The quantities are changed directly in the inventories themselves, but there is a record on file (with comment) indicating the change. This could then be included in reports so that the totals add up correctly.

ie, for Item X:
(Donation total: 110) + (Adjustment total: -10) - (Distribution total: 50) = (Inventory total: 50)

User can filter reports by multiple date presets

When browsing the reports (Dashboard aggregate reports, Donation / Ticket / Transfer reports, etc), the user should be able to constrain the view by date (probably created_at?). Rachel has suggested having some "preset" UI controls for this would be useful for her.

E.g. filter by β€œtoday”, β€œYesterday”, β€œlast week”, β€œlast month”, β€œlast year”, etc.

These can all use the same date-range scope (which does not yet exist, I think?) and just have pre-calculated values for those controls.

User can provide a quantity of boxes when scanning a barcode

When a user scans a barcode, and that barcode exists (or they have finished providing the details for that barcode item), they should be able to provide a quantity of instances for that barcode.

From the original issue:

As you know, I currently scan each package/box's barcode which I've assigned a diaper quantity to. But, let's say I happen to have 20 packs/boxes of the same product in the mix of incoming donations-- is it possible to add a function in which I can input the quantity of the packs/boxes I'd like to put into inventory? With the current setup, those items would need to be scanned 20 times (which take a lot more time and leaves room for scanner/human error).

Donation#new should allow "Misc Donation" to accept user input

The "source" field is currently a single drop-down list, populated from an array of Strings, found in /app/models/donation.rb

There is a "Misc Donation" option to choose from, but it does not currently allow for any override or comment from the user.

Notes from 2016:

This would need to probably refactor sources to be a separate model (so that "other" is an option) or it could add an additional "misc_comment" column to the donations table. Would probably want to override the accessor/mutator for the source field to accommodate the "Misc Donation" data? (like, when it's reading that field, if it says "Misc Donation" as the source, it concatenates the "misc_comment" field to the end, and when it's assigned, it splits that apart.)

Rachel would essentially like the ability to provide a comment for any given Donation (ie. "Diaper drive" but then specify "Portland Safeway" or similar)

All drop-down lists should be alphabetized

From Rachel:

Alphabetize all drop-down/select lists. Difficult to quickly find items in inventory drop-down lists.

This could ostensibly be addressed with a default_scope { order(:name) }, though test it thoroughly (w View specs, not just model scope specs) to be sure.

Receipts and distributions needs to support being filed on past date

Currently the Donation and Distribution models have a created_at date which is used to denote the date the object was received or issued. But in some cases the user needs to be able to file one of these events for a past date. For example, if a diaper drive happened in a past month, the staff may not have gotten to issuing it yet. So when the record is created in the system the user needs to be able to specify the past date they want the event to occur on.

This needs to be reflected in any reports used to aggregate donations or distributions by date.

New Donation create without selecting item breaks item dropdown

To generate this bug go to new_donations_path click Create Donation without setting quantity value. It will throw errors and the item dropdown will change to a number select field. The path also redirects the url to donations_path without refreshing.

User can export reports

from Rachel:

Downloadable graphs/statistics. All of those wonderful graphs would be an fantastic addition to presentations, meetings, and proposalsβ€” can we make is so I can create select a date range and download all of the graphs/statistics that upload to the dashboard?

A user should be able to export a report in Excel (CSV should be fine) format at a minimum, showing whatever the user is currently seeing. They can then create charts in Excel manually.

A stretch goal for this would be to make the charts themselves downloadable somehow.

Enforce Organization Logo Dimensions

Currently, we don't enforce any dimensions on the uploaded logos. Consequently, if a large strangely shaped logo is uploaded it will be outside the desired area on the pdf printing. The default image is 763 x 188 pixels and we should enforce something like that to ensure consistency.

This is a pretty easy fix in paperclip if someone wants to tackle it.

Here is an example of what I'm talking about.

example

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.