Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
b4544cd
PartnerGroup and PartnerGroupMembership models
albertchae Dec 30, 2020
bc90be3
Basic CRUD for PartnerGroups
albertchae Dec 31, 2020
e433eeb
Add partner to group via modal with dropdown
albertchae Dec 31, 2020
cb18458
Implement tagging items with partner groups
albertchae Jan 16, 2021
6f72ace
Implement PartnerRequestableItemsService
albertchae Jan 17, 2021
1e4abe0
Merge branch 'main' into 2059-partner-groups
edwinthinks Jul 27, 2021
7a2f9f3
Merge branch 'main' of https://github.com/rubyforgood/human-essential…
edwinthinks Jul 29, 2021
07354ab
Update migrations to utilize different data structure
edwinthinks Jul 29, 2021
fc68ff7
Add associations and specs to verify them
edwinthinks Jul 30, 2021
d97bb89
Update controller actions to fetch requestable items on partner frontend
edwinthinks Jul 31, 2021
492cc23
Be able to associate Partner to PartnerGroup
edwinthinks Aug 11, 2021
c5929db
Get the tabs to render properly based on URL
edwinthinks Aug 13, 2021
c0158d5
WIP
edwinthinks Aug 13, 2021
f02f074
Got the functionality to work
edwinthinks Aug 18, 2021
462b727
Add basic CRUD for partner group system specs
edwinthinks Aug 18, 2021
0f1194d
Add partner association to group spec
edwinthinks Aug 19, 2021
52ef4bd
Update with main
edwinthinks Aug 21, 2021
200da94
Remove unused code
edwinthinks Aug 22, 2021
7726fff
Fix broken specs
edwinthinks Aug 22, 2021
e12f0ef
Fix rubocop complaints
edwinthinks Aug 22, 2021
a582437
Fix rubocop errors
edwinthinks Aug 25, 2021
4dec95f
Fix broken spec
edwinthinks Aug 25, 2021
5a73dbd
Update
edwinthinks Aug 28, 2021
b9c3574
Merge branch 'main' into 2059-partner-groups
edwinthinks Sep 7, 2021
902e51c
Merge branch 'main' of https://github.com/rubyforgood/human-essential…
edwinthinks Sep 19, 2021
88566c8
Update items association on partners to indicate purpose
edwinthinks Sep 19, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/controllers/api/v1/partner_requests_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ def create
def show
return head :forbidden unless api_key_valid?

organization = Organization.find(params[:id])
render json: organization.valid_items, status: :ok
items = PartnerRequestableItemsService.new(organization_id: params[:id], partner_id: params[:partner_id]).call
render json: items, status: :ok
rescue ActiveRecord::RecordNotFound => e
render json: { error: e.message }, status: :bad_request
end
Expand Down
18 changes: 18 additions & 0 deletions app/controllers/partner_group_items_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
class PartnerGroupItemsController < ApplicationController
def create
@partner_group = current_organization.partner_groups.find(params[:partner_group_id])
@item = current_organization.items.find(params[:item_id])
if @partner_group.partner_group_items.create(item: @item)
redirect_to partner_group_path(@partner_group), notice: "Item #{@item.name} added to group!"
else
flash[:error] = "Something didn't work quite right -- try again?"
redirect_to partner_group_path(@partner_group)
end
end

def destroy
@partner_group = current_organization.partner_groups.find(params[:partner_group_id])
@partner_group.partner_group_items.find(params[:id]).destroy
redirect_to partner_group_path(@partner_group)
end
end
18 changes: 18 additions & 0 deletions app/controllers/partner_group_memberships_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
class PartnerGroupMembershipsController < ApplicationController
def create
@partner_group = current_organization.partner_groups.find(params[:partner_group_id])
@partner = current_organization.partners.find(params[:partner_id])
if @partner_group.partner_group_memberships.create(partner: @partner)
redirect_to partner_group_path(@partner_group), notice: "Partner #{@partner.name} added to group!"
else
flash[:error] = "Something didn't work quite right -- try again?"
redirect_to partner_group_path(@partner_group)
end
end

def destroy
@partner_group = current_organization.partner_groups.find(params[:partner_group_id])
@partner_group.partner_group_memberships.find(params[:id]).destroy
redirect_to partner_group_path(@partner_group)
end
end
59 changes: 59 additions & 0 deletions app/controllers/partner_groups_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
class PartnerGroupsController < ApplicationController
def index
@partner_groups = current_organization.partner_groups

respond_to do |format|
format.html
end
end

def show
@partner_group = current_organization.partner_groups.find(params[:id])

@partners_not_in_group = current_organization.partners.alphabetized - @partner_group.partners
@items_not_in_group = current_organization.items.alphabetized - @partner_group.items

respond_to do |format|
format.html
end
end

def new
@partner_group = current_organization.partner_groups.new
end

def create
@partner_group = current_organization.partner_groups.new(partner_group_params)
if @partner_group.save
redirect_to partner_groups_path, notice: "Partner group added!"
else
flash[:error] = "Something didn't work quite right -- try again?"
render action: :new
end
end

def edit
@partner_group = current_organization.partner_groups.find(params[:id])
end

def update
@partner_group = current_organization.partner_groups.find(params[:id])
if @partner_group.update(partner_group_params)
redirect_to partner_group_path(@partner_group), notice: "#{@partner_group.name} updated!"
else
flash[:error] = "Something didn't work quite right -- try again?"
render action: :edit
end
end

def destroy
current_organization.partner_groups.find(params[:id]).destroy
redirect_to partner_groups_path
end

private

def partner_group_params
params.require(:partner_group).permit(:name)
end
end
1 change: 1 addition & 0 deletions app/models/organization.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class Organization < ApplicationRecord
has_many :donations
has_many :manufacturers
has_many :partners
has_many :partner_groups
has_many :purchases
has_many :requests
has_many :storage_locations
Expand Down
4 changes: 4 additions & 0 deletions app/models/partner.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ class Partner < ApplicationRecord

has_many :requests, dependent: :destroy

has_many :partner_group_memberships, dependent: :destroy
has_many :partner_groups, through: :partner_group_memberships
has_many :requestable_items, through: :partner_groups, source: :items

has_many_attached :documents

validates :organization, presence: true
Expand Down
21 changes: 21 additions & 0 deletions app/models/partner_group.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# == Schema Information
#
# Table name: partner_groups
#
# id :bigint not null, primary key
# name :string
# created_at :datetime not null
# updated_at :datetime not null
# organization_id :bigint
#
class PartnerGroup < ApplicationRecord
belongs_to :organization
has_many :partner_group_memberships, dependent: :destroy
has_many :partners, through: :partner_group_memberships

has_many :partner_group_items, dependent: :destroy
has_many :items, through: :partner_group_items

validates :organization, presence: true
validates :name, presence: true, uniqueness: { scope: :organization }
end
14 changes: 14 additions & 0 deletions app/models/partner_group_item.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# == Schema Information
#
# Table name: partner_group_items
#
# id :bigint not null, primary key
# created_at :datetime not null
# updated_at :datetime not null
# item_id :bigint not null
# partner_group_id :bigint not null
#
class PartnerGroupItem < ApplicationRecord
belongs_to :partner_group
belongs_to :item
end
30 changes: 30 additions & 0 deletions app/models/partner_group_membership.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# == Schema Information
#
# Table name: partner_group_memberships
#
# id :bigint not null, primary key
# created_at :datetime not null
# updated_at :datetime not null
# partner_group_id :bigint
# partner_id :bigint
#
class PartnerGroupMembership < ApplicationRecord
belongs_to :partner_group
belongs_to :partner
has_one :organization, through: :partner_group

validates :partner_group, presence: true
validates :partner, presence: true, uniqueness: { scope: :partner_group }

validate :partner_belongs_to_partner_group_organization

private

def partner_belongs_to_partner_group_organization
return if organization.nil?

unless organization == partner.organization
errors.add :partner, "partner must belong to same organization as partner_group"
end
end
end
30 changes: 30 additions & 0 deletions app/services/partner_requestable_items_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
class PartnerRequestableItemsService
def initialize(organization_id:, partner_id:)
@organization_id = organization_id
@partner_id = partner_id
end

def call
return organization.valid_items if partner.partner_groups.empty?

partner.requestable_items.active.visible.map do |item|
{
id: item.id,
partner_key: item.partner_key,
name: item.name
}
end
end

private

attr_reader :organization_id, :partner_id

def organization
@organization ||= Organization.find(organization_id)
end

def partner
@partner ||= Partner.find(partner_id)
end
end
6 changes: 6 additions & 0 deletions app/views/layouts/_lte_sidebar.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,12 @@
<p>Partner Agencies</p>
<% end %>
</li>
<li class="nav-item <%= 'active' if current_page?(partner_groups_path) %>">
<%= link_to(partner_groups_path, class: "nav-link #{"active" if current_page?(partner_groups_path)}") do %>
<i class="nav-icon fas fa-group"></i>
<p>Partner Groups</p>
<% end %>
</li>
<li class="nav-item has-treeview <%= menu_open?(['items', 'kits', 'barcode_items', 'storage_locations', 'adjustments', 'transfers']) %>">
<a href="#" class="nav-link <%= active_class(['items', 'kits', 'barcode_items', 'storage_locations', 'adjustments', 'transfers']) %>">
<i class="nav-icon fa fa-pie-chart"></i>
Expand Down
29 changes: 29 additions & 0 deletions app/views/partner_groups/_form.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<%= simple_form_for @partner_group, html: {class: 'form-horizontal'} do |f| %>
<section class="content">
<div class="container-fluid">
<div class="row">
<!-- left column -->
<div class="col-md-12">
<!-- jquery validation -->
<div class="card card-primary">
<!-- /.card-header -->
<!-- form start -->
<div class="card-body">
<%= f.input :name, label: "Name", wrapper: :input_group do %>
<span class="input-group-text"><i class="fa fa-user"></i></span>
<%= f.input_field :name, class: "form-control" %>
<% end %>
</div>
<!-- /.card-body -->
<div class="card-footer">
<%= submit_button(submit_btn_options) %>
</div>
</div>
<!-- /.card -->
</div>

</div>
<!-- /.row -->
</div><!-- /.container-fluid -->
</section>
<% end %>
25 changes: 25 additions & 0 deletions app/views/partner_groups/edit.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<section class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<% content_for :title, "Edit - Partner Groups - #{@partner_group.name} - #{current_organization.name}" %>
<h1>
Updating Partner Group
<small>for <%= current_organization.name %></small>
</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><%= link_to(dashboard_path) do %>
<i class="fa fa-dashboard"></i> Home
<% end %>
</li>
<li class="breadcrumb-item"><%= link_to "All Partner Groups", (partner_groups_path) %></li>
<li class="breadcrumb-item"><a href="#">Updating <%= @partner_group.name %></a></li>
</ol>
</div>
</div>
</div><!-- /.container-fluid -->
</section>

<%= render partial: "form", object: @partner_group, locals: { submit_btn_options: { text: "Update Partner Group" } } %>
67 changes: 67 additions & 0 deletions app/views/partner_groups/index.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<section class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<% content_for :title, "Partner Groups - #{current_organization.name}" %>
<h1>
Partner Groups
<small>for <%= current_organization.name %></small>
</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><%= link_to(dashboard_path) do %>
<i class="fa fa-dashboard"></i> Home
<% end %>
</li>
<li class="breadcrumb-item"><a href="#">Partner Groups</a></li>
</ol>
</div>
</div>
</div><!-- /.container-fluid -->
</section>

<section class="content">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="card card-primary card-outline">
<div class="card-body">
<div class="card-footer">
<%= new_button_to new_partner_group_path(organization_id: current_organization), {text: "New Partner Group"} %>
</div>
</div>
</div>
<!-- /.card -->
</div>
</div>
<!-- /.row -->
</div><!-- /.container-fluid -->

<div class="container-fluid">
<div class="row">
<div class="col-12">
<!-- Default box -->
<div class="card">
<div class="card-body p-0">
<table class="table">
<thead>
<tr>
<th>Partner Group Name</th>
<th>Number of partners in group</th>
</tr>
</thead>
<tbody>
<% @partner_groups.each do |partner_group| %>
<tr>
<td><%= link_to partner_group.name, partner_group_path(partner_group) %></td>
<td><%= partner_group.partners.count %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>
</div>
</div>
</section>
25 changes: 25 additions & 0 deletions app/views/partner_groups/new.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<section class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<% content_for :title, "New - Partner Groups - #{current_organization.name}" %>
<h1>
New Partner Group
<small>for <%= current_organization.name %></small>
</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><%= link_to(dashboard_path) do %>
<i class="fa fa-dashboard"></i> Home
<% end %>
</li>
<li class="breadcrumb-item"><%= link_to "All Partners", (partners_path) %></li>
<li class="breadcrumb-item"><a href="#">New Partner</a></li>
</ol>
</div>
</div>
</div><!-- /.container-fluid -->
</section>

<%= render partial: "form", object: @partner_group, locals: { submit_btn_options: { text: "Add Partner Group" } } %>
Loading