Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 4 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@

/config/database.yml

# rspec failures
examples.txt

# Ignore the default SQLite database.
/db/*.sqlite3
/db/*.sqlite3-journal
Expand All @@ -27,20 +30,18 @@ dragonfly.log
/dragonfly
public/system/dragonfly/development

.DS_Store

tags
*.swp
*.swo
latest.prod.dump
cleansed.prod.dump

.DS_Store
~*.xlsx

# IntelliJ
/.idea
/localorbit.iml

node_modules/

*.sublime-project
Expand Down
2 changes: 2 additions & 0 deletions .rspec
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
--color
--format doc
--require spec_helper

1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ group :development do
end

group :development, :test do
gem 'active_record_query_trace'
gem 'rspec-rails', '~> 3.0'
gem 'rspec-collection_matchers'
gem 'rspec_junit_formatter', :git => 'https://github.com/circleci/rspec_junit_formatter.git'
Expand Down
2 changes: 2 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ GEM
erubis (~> 2.7.0)
active_model_serializers (0.9.0)
activemodel (>= 3.2)
active_record_query_trace (1.5.4)
active_record_union (1.0.1)
activerecord (>= 4.0)
activemodel (4.1.16)
Expand Down Expand Up @@ -759,6 +760,7 @@ PLATFORMS
DEPENDENCIES
accountingjs-rails
active_model_serializers
active_record_query_trace
active_record_union
activerecord-import
acts_as_geocodable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
propTypes: {
cartUrl: React.PropTypes.string,
baseUrl: React.PropTypes.string.isRequired,
resourcesPath: React.PropTypes.string.isRequired,
deliveryDate: React.PropTypes.string.isRequired,
selectedType: React.PropTypes.string,
orderCutoff: React.PropTypes.string.isRequired,
Expand Down Expand Up @@ -84,15 +85,15 @@
limit={30}
filter={null}
cartUrl={this.props.cartUrl}
url={this.props.baseUrl + '/products'}
url={this.props.baseUrl + this.props.resourcesPath}
supplierOnly={this.props.supplierId > 0}
orderId={this.props.orderId}
purchaseOrder={this.props.purchaseOrder}
salesOrder={this.props.salesOrder}
consignmentMarket={this.props.consignmentMarket}
supplierView={this.props.supplierView}
/>);

return (
<div id='supplierCatalog' className={divClass} style={divStyle}>
{orderTemplates}
Expand Down
10 changes: 5 additions & 5 deletions app/assets/javascripts/product_catalog/product_store.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
products: [],
hasMore: true
};
this.url = window.location.protocol + "//" + window.location.host + "/api/v1/products";
// this.url = window.location.protocol + "//" + window.location.host + "/api/v1/products";
this.orderId = null;
this.parameters = {
offset: 0,
Expand All @@ -45,24 +45,24 @@
ProductActions.loadProducts();
},

loadProducts: function() {
loadProducts: function(url) {
this.loading = true;
this.parameters.offset = 0;
this.parameters.order_id = this.orderId;
$.getJSON(this.url, this.parameters, this.onLoad, this.onLoadError);
$.getJSON(url, this.parameters, this.onLoad, this.onLoadError);
},

onLoad: function(res) {
this.catalog.products = [];
this.onLoadMore(res);
},

loadMoreProducts: function() {
loadMoreProducts: function(url) {
if(this.loading || !this.catalog.hasMore) return;
this.loading = true;
this.parameters.offset = this.catalog.products.length;
this.parameters.order_id = this.orderId;
$.getJSON(this.url, this.parameters, this.onLoadMore, this.onLoadError);
$.getJSON(url, this.parameters, this.onLoadMore, this.onLoadError);
},

onLoadMore: function(res) {
Expand Down
201 changes: 102 additions & 99 deletions app/controllers/api/v1/products_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class ProductsController < ApplicationController
def index
@offset = (params[:offset] || 0).to_i
@limit = (params[:limit] || 30).to_i
@query = (params[:query] || '').gsub(/\W+/, '+') || ''
@query = (params[:query] || '').gsub(/\W+/, '+')
@category_ids = (params[:category_ids] || [])
@seller_ids = (params[:seller_ids] || [])
@sort_by = (params[:sort_by] || "top_level_category.lft, second_level_category.lft, general_products.name")
Expand All @@ -26,28 +26,31 @@ def index
featured_promotion = current_market.featured_promotion(current_organization, current_delivery)
end

if current_market.try(:is_consignment_market?) && (order_type == 'purchase' || (!order.nil? && order.purchase_order?))
products = filtered_available_po_consignment_products(@query, @category_ids, @seller_ids, @order)
elsif current_market.try(:is_consignment_market?) && (order_type == 'sales' || (!order.nil? && order.sales_order?))
products = filtered_available_so_consignment_products(@query, @category_ids, @seller_ids, @order)
else
products = filtered_available_products(@query, @category_ids, @seller_ids, @order)
end
# products = if current_market.try(:is_consignment_market?) && (order_type == 'purchase' || (!order.nil? && order.purchase_order?))
# filtered_available_po_consignment_products(@query, @category_ids, @seller_ids, @order)
# elsif current_market.try(:is_consignment_market?) && (order_type == 'sales' || (!order.nil? && order.sales_order?))
# filtered_available_so_consignment_products(@query, @category_ids, @seller_ids, @order)
# else
# filtered_available_products(@query, @category_ids, @seller_ids, @order)
# end
products = filtered_available_products(@query, @category_ids, @seller_ids, @order)

sellers = {}
# page_of_products = products
page_of_products = products
.offset(@offset)
.limit(@limit)
.map { |p| format_general_product_for_catalog(p, sellers, @order) }
render :json => {
product_total: products.count(:all),
featured_promotion: {
:details => featured_promotion,
:image_url => get_image_url(featured_promotion),
:product => featured_promotion ? format_general_product_for_catalog(featured_promotion.product.general_product, sellers, @order) : nil
},
products: page_of_products,
sellers: sellers
.includes(:organization)
.offset(@offset)
.limit(@limit)
.map { |p| format_general_product_for_catalog(p, sellers, @order) }
render json: {
product_total: products.count(:all),
featured_promotion: {
:details => featured_promotion,
:image_url => get_image_url(featured_promotion),
:product => featured_promotion ? format_general_product_for_catalog(featured_promotion.product.general_product, sellers, @order) : nil
},
products: page_of_products,
sellers: sellers
}
end

Expand Down Expand Up @@ -93,85 +96,85 @@ def filtered_available_products(query, category_ids, seller_ids, order)
.uniq
end

def filtered_available_po_consignment_products(query, category_ids, seller_ids, order)
catalog_products = cross_sold_products = Product.connection.unprepared_statement do
Product.joins(organization: [market_organizations: [:market]])
.where("markets.id = ?", current_market.id)
.visible
.select(:id, :general_product_id)
.to_sql
end

# KXM GC: Disable cross selling products for now.
# Once re-enabled you can delete the double assignment in catalog_products above...

# cross_sold_products = Product.
# cross_selling_list_items(current_market.id).
# visible.
# with_available_inventory(current_delivery.deliver_on).
# priced_for_market_and_buyer(current_market, current_organization).
# with_visible_pricing.
# select(:id, :general_product_id).
# to_sql

gp = GeneralProduct.joins("JOIN (#{catalog_products}) p_child
ON general_products.id=p_child.general_product_id
JOIN categories top_level_category ON general_products.top_level_category_id = top_level_category.id
JOIN categories second_level_category ON general_products.second_level_category_id = second_level_category.id
JOIN organizations supplier ON general_products.organization_id=supplier.id")
.filter_by_current_order(order)
.filter_by_name_or_category_or_supplier(query)
.filter_by_categories(category_ids)
.filter_by_suppliers(seller_ids)
.select("top_level_category.lft, top_level_category.name, second_level_category.lft, second_level_category.name, general_products.*")
.order("general_products.name")
.uniq
end

def filtered_available_so_consignment_products(query, category_ids, seller_ids, order)
catalog_products = cross_sold_products = Product.connection.unprepared_statement do
Product.joins(organization: [market_organizations: [:market]])
.where("markets.id = ?", current_market.id)
.with_available_so_inventory(current_delivery.deliver_on)
.visible
.select(:id, :general_product_id)
.to_sql
end

catalog_products2 = cross_sold_products2 = Product.connection.unprepared_statement do
Product.joins(organization: [market_organizations: [:market]])
.where("markets.id = ?", current_market.id)
.with_pending_so_inventory(current_delivery.deliver_on)
.visible
.select(:id, :general_product_id)
.to_sql
end

cp = "#{catalog_products} UNION #{catalog_products2} UNION
SELECT products.id, products.general_product_id
FROM products
INNER JOIN organizations ON organizations.id = products.organization_id
INNER JOIN market_organizations ON market_organizations.organization_id = organizations.id
INNER JOIN markets ON markets.id = market_organizations.market_id
INNER JOIN consignment_transactions ON consignment_transactions.product_id = products.id AND consignment_transactions.market_id = markets.id AND consignment_transactions.transaction_type = 'PO' AND consignment_transactions.lot_id IS NULL AND consignment_transactions.deleted_at IS NULL
INNER JOIN orders ON consignment_transactions.order_id = orders.id AND orders.delivery_status in ('pending','partially delivered')
WHERE markets.id = #{current_market.id} AND products.deleted_at IS NULL"

gp = GeneralProduct.joins("JOIN (#{cp}) p_child
ON general_products.id=p_child.general_product_id
JOIN categories top_level_category ON general_products.top_level_category_id = top_level_category.id
JOIN categories second_level_category ON general_products.second_level_category_id = second_level_category.id
JOIN organizations supplier ON general_products.organization_id=supplier.id
LEFT JOIN market_organizations ON general_products.organization_id = market_organizations.organization_id
AND market_organizations.market_id = #{current_market.id}")
.filter_by_name_or_category_or_supplier(query)
.filter_by_categories(category_ids)
.filter_by_suppliers(seller_ids)
.filter_by_active_org
.select("top_level_category.lft, top_level_category.name, second_level_category.lft, second_level_category.name, general_products.*")
.order("general_products.name")
.uniq
end
# def filtered_available_po_consignment_products(query, category_ids, seller_ids, order)
# catalog_products = cross_sold_products = Product.connection.unprepared_statement do
# Product.joins(organization: [market_organizations: [:market]])
# .where("markets.id = ?", current_market.id)
# .visible
# .select(:id, :general_product_id)
# .to_sql
# end

# # KXM GC: Disable cross selling products for now.
# # Once re-enabled you can delete the double assignment in catalog_products above...

# # cross_sold_products = Product.
# # cross_selling_list_items(current_market.id).
# # visible.
# # with_available_inventory(current_delivery.deliver_on).
# # priced_for_market_and_buyer(current_market, current_organization).
# # with_visible_pricing.
# # select(:id, :general_product_id).
# # to_sql

# gp = GeneralProduct.joins("JOIN (#{catalog_products}) p_child
# ON general_products.id=p_child.general_product_id
# JOIN categories top_level_category ON general_products.top_level_category_id = top_level_category.id
# JOIN categories second_level_category ON general_products.second_level_category_id = second_level_category.id
# JOIN organizations supplier ON general_products.organization_id=supplier.id")
# .filter_by_current_order(order)
# .filter_by_name_or_category_or_supplier(query)
# .filter_by_categories(category_ids)
# .filter_by_suppliers(seller_ids)
# .select("top_level_category.lft, top_level_category.name, second_level_category.lft, second_level_category.name, general_products.*")
# .order("general_products.name")
# .uniq
# end

# def filtered_available_so_consignment_products(query, category_ids, seller_ids, order)
# catalog_products = cross_sold_products = Product.connection.unprepared_statement do
# Product.joins(organization: [market_organizations: [:market]])
# .where("markets.id = ?", current_market.id)
# .with_available_so_inventory(current_delivery.deliver_on)
# .visible
# .select(:id, :general_product_id)
# .to_sql
# end

# catalog_products2 = cross_sold_products2 = Product.connection.unprepared_statement do
# Product.joins(organization: [market_organizations: [:market]])
# .where("markets.id = ?", current_market.id)
# .with_pending_so_inventory(current_delivery.deliver_on)
# .visible
# .select(:id, :general_product_id)
# .to_sql
# end

# cp = "#{catalog_products} UNION #{catalog_products2} UNION
# SELECT products.id, products.general_product_id
# FROM products
# INNER JOIN organizations ON organizations.id = products.organization_id
# INNER JOIN market_organizations ON market_organizations.organization_id = organizations.id
# INNER JOIN markets ON markets.id = market_organizations.market_id
# INNER JOIN consignment_transactions ON consignment_transactions.product_id = products.id AND consignment_transactions.market_id = markets.id AND consignment_transactions.transaction_type = 'PO' AND consignment_transactions.lot_id IS NULL AND consignment_transactions.deleted_at IS NULL
# INNER JOIN orders ON consignment_transactions.order_id = orders.id AND orders.delivery_status in ('pending','partially delivered')
# WHERE markets.id = #{current_market.id} AND products.deleted_at IS NULL"

# gp = GeneralProduct.joins("JOIN (#{cp}) p_child
# ON general_products.id=p_child.general_product_id
# JOIN categories top_level_category ON general_products.top_level_category_id = top_level_category.id
# JOIN categories second_level_category ON general_products.second_level_category_id = second_level_category.id
# JOIN organizations supplier ON general_products.organization_id=supplier.id
# LEFT JOIN market_organizations ON general_products.organization_id = market_organizations.organization_id
# AND market_organizations.market_id = #{current_market.id}")
# .filter_by_name_or_category_or_supplier(query)
# .filter_by_categories(category_ids)
# .filter_by_suppliers(seller_ids)
# .filter_by_active_org
# .select("top_level_category.lft, top_level_category.name, second_level_category.lft, second_level_category.name, general_products.*")
# .order("general_products.name")
# .uniq
# end

def format_general_product_for_catalog(general_product, sellers, order)
general_product = general_product.decorate
Expand Down
45 changes: 45 additions & 0 deletions app/controllers/api/v1/purchaseable_products_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
module Api
module V1
class PurchaseableProductsController < ProductsController

private

def filtered_available_products(query, category_ids, seller_ids, order)
catalog_products = cross_sold_products = Product.connection.unprepared_statement do
Product.joins(organization: [market_organizations: [:market]])
.where("markets.id = ?", current_market.id)
.visible
.select(:id, :general_product_id)
.to_sql
end

# KXM GC: Disable cross selling products for now.
# Once re-enabled you can delete the double assignment in catalog_products above...

# cross_sold_products = Product.
# cross_selling_list_items(current_market.id).
# visible.
# with_available_inventory(current_delivery.deliver_on).
# priced_for_market_and_buyer(current_market, current_organization).
# with_visible_pricing.
# select(:id, :general_product_id).
# to_sql

gp = GeneralProduct.joins("JOIN (#{catalog_products}) p_child
ON general_products.id=p_child.general_product_id
JOIN categories top_level_category ON general_products.top_level_category_id = top_level_category.id
JOIN categories second_level_category ON general_products.second_level_category_id = second_level_category.id
JOIN organizations supplier ON general_products.organization_id=supplier.id")
.filter_by_current_order(order)
.filter_by_name_or_category_or_supplier(query)
.filter_by_categories(category_ids)
.filter_by_suppliers(seller_ids)
.select("top_level_category.lft, top_level_category.name, second_level_category.lft, second_level_category.name, general_products.*")
.order("general_products.name")
.uniq
end


end
end
end
Loading