Foodclub:Documentation:FAQ

From Foodclub
Jump to: navigation, search

The Foodclub FAQ currently serves as the documentation for the Foodclub software. If you have a question about the software which is not answered here, please add a new question to the relevant section below. This wiki page is monitored for any modifications, so new questions will be answered in a timely manner.

Contents

NAME

foodclub.org FAQ - frequently asked questions

DESCRIPTION

These are frequently asked questions about foodclub.org. Please read this before sending me e-mail.


GENERAL QUESTIONS

What is foodclub.org?

It is a site designed to facilitate running an organic food-buying club.

What is a food-buying club?

A group of people who order food directly from wholesale distributor(s) or local farm(s).

Who should use foodclub.org?

It is designed to accommodate new or existing food-buying clubs who order from one or more distributors or directly from farms. The software supports any distributor since the order form is intentionally generic. The only thing it requires is that products you order have unique item codes.

If you already have an operating buying club (i.e. an account with a distributor, a group of people ordering food periodically, product catalogs from the company, an existing system to get orders placed, food distributed to people, and a way of figuring out how much everyone owes) then this site is for you, especially if your existing system is paper or spreadsheet based.

What does it do?

It is a collaborative forum for posting food orders, requesting splits, combining everyone's order into one to be sent to the distributor, and calculating how much everyone owes once the order comes in.

Does it cost anything?

Foodclub was free for over 14 years, but starting in 2015 a small percent fee was added to keep the site sustainable, and enable continual software improvements.  See the current pricing policy here:

http://foodclub.org/pricing.shtml

How long has it been up?

I originally wrote the foodclub software for my buying club in Alsea in the Fall of 1999. It was up just for our club from late 1999 until Fall 2000. In the Fall of 2000 I rewrote the software for use by multiple buying-clubs simultaneously, and more suitable for open source development. I bought the foodclub.org domain sometime around Sept, 2000 and the site has been up ever since.

What is the motivation behind this site?

I was once in a food-buying club and I loved it. I think more people should get their food this way. I hope this site will make food-buying clubs more widespread and organic foods more affordable and accessible to more people.

Can I start a new food-buying club here?

No. You need to get a group of people together who are interested in ordering quality inexpensive, organic bulk food, or from local farm fresh suppliers, and then contact your desired suppliers to open an account with them.

Once you have a group of interested people and accounts open with your suppliers, Foodclub will make starting your food-buying club easy.

How do I join a food-buying club?

You need to find people around where you live who have one running, and join them. If you tell them about this site I'm sure they'll like you enough to let you join!

If anyone knows of a list of food-buying clubs around the country and/or world, please pass it along and I will add it here.

TECHNICAL QUESTIONS

BASIC SETUP / USER LOGINS

How do I start?

First you need to create a new buying-club account. Go to:

 http://foodclub.org/account_wizard

and complete the few pages of the wizard.  Once you complete this, you will have your own URL (e.g. foodclub.org/my-club/) that you can give out as your world headquarters!  You need to give people login accounts before they can access it though.  See next question.

How do I create user accounts for people in my club?

The easiest way is to and have your members register themselves, via the Register as a new user page which is linked from the login page.  After they register, their user login will wait in a pending state until you or another admin user approves them.  You can enable the user registration feature on your Global settings page, in the top Global settings section (if it wasn't enabled by default by your choices on the "New account wizard").

Pending users will show up on your User maintenance page, where you can approve them.  You (and all admin users) will also see a "new users waiting for approval" message on all pages when there are any pending users, and you can configure an e-mail notification whenever a new user registers by setting the "Member coordinator e-mail(s)" on Global Admin → Notifications.

The other way to create new user accounts is to manually create them for your members on the User maintenance page.

What if people don't want to remember a username/password?

Sorry, they need to. You don't want just anybody going in and futzing with your orders, do you?

How do I change someone's password? (they forgot it)

As an admin user, you can change any normal user's password from the User maintenance page.  The user can get their password reset by themselves from the Forgot username/password page, which they can get to via a link at the bottom of the login page.

I forgot the administrator username/password! Help!!

You can use the Forgot username/password feature (on login page) to get it reset, just like any other user.  We also recommend that you have more than one administrator login, in case one gets lost.  If you are truly locked out of your account, you'll have to send us an e-mail.

What is the purpose of the "user suspend" and "unsuspend" options?

The user suspend feature is meant for disabling an account temporarily without altering their password or other user information. So unsuspending it brings it back with all the same information it had, unlike deleting it (where you'd have to add it back again with a new password).

This feature is not necessarily very often used by buying clubs. But maybe you'd have a situation where one of your members is "on vacation" or "out-of-the-country" for an extended period of time, and you wanted to increase security by making sure nobody else used their account while they were gone. When they get back their password and everything would be the same. Not deleting their account also preserves their username so other people can't take it, which is an issue on foodclub.org, because there are new clubs signing up all the time to test out the system.

What is a treasurer user, and what can it access?

You can create a treasurer user by promoting a normal user to treasurer, from the User maintenance page.  Treasurers are like limited admin users, only having access to the features that they need to do their job.  Specifically, treasurers can access:

  • User maintenance - to freeze/unfreeze or e-mail users, and view their carts and balances, but not add or delete users
  • Combined invoices - to view all users invoices
  • Member balances and Club balance - to enter payments and other entries in the accounting system (when enabled)

Notably, treasurer users cannot edit any other user's order or splits, process invoices, or archive an order.  Those are reserved for source-admin users (or full admins).

BASIC ORDERING

How do I enter my order?

Go to your Order page.  It saves everything when you submit, so you can go back and change it later.  Note that the Order page is for full case orders, or single items which are small enough to order by yourself, as opposed to splitting with others. (see next question)

How do I request a split?

Go to the Splits page.  You can post requests for partial orders and if enough other people order it will be added to the Final order that will be sent to the distributor.

How do I delete a split I've requested?

Only admin users can delete an entire split.  You can just remove yourself from a split by editing the split with the change link.  Recently a feature was added that highlights the entire split row on mouseover.  You can now just click anywhere on the highlighted row to take you to the Edit split item page.

How do I order some of a split someone else requested?

Click order and then enter the amount that you want. You can now just click anywhere on the highlighted row to get here.

ORDER PROCESSING, E.G. SUBMITTING TO VENDOR

It is time to send in the final merged order to the distributor, but there are errors in the splits page that I need to fix. How?

Only an administrator user can change splits. Login as an admin user and go to the Splits page. You should see a change link next to every split request. Click this and then make the necessary changes. You can now just click anywhere on the highlighted row to get here.

How do I merge everyone's order together to send to the distributor?

The Final order page does this for you.  It merges every individual's order plus all the splits that were filled.  It shows your group addresses at the top of the page, and no individual identifying information, perfect for faxing or e-mail'ing to the distributor.

Does Foodclub automatically transfer the Final order to the distributor?

Yes, but only for certain supported distributors.  If the distributor you order from has an online ordering site which Foodclub has integrated with, the Submit order page will show a dialog where you enter you username and password to the vendor's ordering site, and then transfer your entire Final order over.  Any information or necessary actions specific to the distributor will be displayed.

If the vendor does not have a supported online ordering site, the Submit order page will allow you to send your Final order via e-mail to your sales rep at the vendor.  You can always do this yourself by copy/pasting Final order, but the Submit order process will preserve all past submitted orders, and also the vendor can do things like export the order to excel, or print it from the Foodclub site.

Can I prevent users from modifying or adding items to their orders when I'm sending the merged order to the distributor?

Yes.   You can "lock" the order which temporarily prevents modification of orders or splits by non-admin users.  Click the "Lock Order" button on any page as an admin user.

How does order merging work? AKA, Foodclub ordered too many of an item and we had to return some...

On occasion, users report that the Final order they sent to the distributor had an incorrect quantity for one or more items - usually that it is too high - resulting in some of the order needing to be returned to the distributor.

This is usually a result of not understanding how orders get merged together. The single most important thing to understand is that orders are merged together based on the single, uniquely identifying code value for each item.

Other fields are ignored when merging, so two items with the same code should be the same product - otherwise you will get an undesired result.

A specific example of this is that the Associated Buyers distributor allows ordering "repack" items. Repacks are not the same as normal items, so they should not have the same code value. Buying clubs ordering from Associated Buyers should append an 'R' to the item code for repacks (e.g. 01234R).

Can the administrator go in and edit any user's information once they have been created?

Yes. Admin users can edit any user's Order or Splits, and any personal info that a user sets on their User settings page.

To edit a user's individual order, use the Edit order drop-down as an admin, or click on their name on the right side of the Group order page. Editing splits can be done using the change link for the item on the Splits page. Changing a user's User settings can be done via the link to the right of their user record on the User maintenance page.

Can you close an order earlier or later than the "close date" or will it mess the cycle up?

Yes, you can manually lock or unlock anytime you want. What the order cycle and recurring action settings do (the "Date/time to auto-lock") is merely to automatically lock on the appropriate date and time.

You can manually override this by either locking the order early, in which case the auto-lock will have no effect, or unlocking the order after it has been auto-locked, in which case it would not get auto-locked until the next order cycle.

How to order "repack" items?

Some vendors, like Associated Buyers, allow clubs to order items of a custom-requested size, smaller than the standard item size.  These are called repacks.  To order them in Foodclub, you can do it with the following steps:

  1. add the standard size item to your Order or open a split on Splits
  2. edit the item code, size, and price values to indicate the smaller size and price.  The item code has to be changed (e.g. append an "R" to it) so the repack item doesn't get lumped together with the standard size in the system, in case someone else orders the standard size item.
  3. note: editing a split can only be done by an admin user for the source; editing an item on your individual Order can be done yourself, but only if manual entry is allowed for the source, in Product database settings - otherwise it requires an admin for the source.
  4. also note: splits which are unfilled for the normal size of the case will automatically become filled when you reduce size to the repack size, if enough people are ordering it to fill the repack

INVOICING

How do I figure out how much everyone owes after the order comes in?

Go to the Invoice processing page.  It lists every item that was ordered and an input field for you to enter the product's actual cost.   Go through the distributor's shipping invoice and enter the price they charged you for each item.  Note: if you are using a product database (see below), especially an official database which contains accurate prices, then some or all of these prices will be automatically filled in for you.

When you save, it will generate Invoices for all users who placed an order: detailed itemized price totals for each person, and an overall order total which you can use to match against the distributor's invoice total. You can keep making changes until the Foodclub total equals the distributor invoice total.

Can we calculate how much everyone owes before we send the order to the distributor?

Yes, but only if you are using a product database (see below) with accurate prices for all the items you order. Foodclub provides several "official" product databases, which come directly from distributors and would allow you to do this.

If you are using such a database, all you need to do is go to the Invoice processing page and calculate totals using all the prices pre-filled from the database.  However, keep in mind that it will not always be accurate due to items being out-of-stock at delivery time, and price changes between the publishing of a database and placing the order.  Also, all users can see their "rough estimate" order total on their Shopping cart page, so sending out an invoice pre-delivery is probably not too useful.

A change was made on someone's order.  Why isn't the change showing up in Invoices?

Certain changes made to individual user orders or to splits after Invoices have been generated require the invoices to be re-generated.  The main change that requires re-generation of invoices is adding a new item to someone's order or splits. The new item will not have a price, so will show as 0.00 until you go to the Invoice processing page, enter a price, and save.

Most changes, such as changes in qty for existing items and removal of items, will show up automatically in the Invoices page even if they have already been generated.  But if something doesn't look right on invoices after you know you made changes to orders or splits, you may want to just re-generate invoices (via Invoice processing) just to be safe, i.e. before spending a bunch of time trying to reconcile and figure out where the discrepancy is.

What do the out-of-stock and returned-for-refund checkboxes in Invoice processing do? Can I use them if multiple people ordered an item but only half of the items were delivered?

The returned-for-refund feature in Invoice processing will add a separate line item (Refunds) for every person who ordered this item. The invoice totals will not change, but they will have a new refund line, and their overall total will decrease by the refund.

The out-of-stock feature is similar. Everyone who ordered the item gets charged zero (shows as Out-of-stock), but there is not a separate line item for it. It also subtracts the item cost before calculating the invoice total, not after.

The main difference between the two is out-of-stock is meant for items the distributor knew about, and deducted from your invoice total. The refund feature is for items you returned to them for some reason, but where you want to still have the foodclub invoice total match the invoice total from the distributor.

If multiple people ordered an item and only half the items came in, you will need to use the Separate by item checkbox to flag some users as out-of-stock. Note that Separate by item will not work for splits. If a split is partially out-of-stock or returned, then you need to go back and adjust the split (on the Split edit page for the item) to reflect which users got the items that arrived.

How can I assign the shipping cost of an order to members based on item weight?

Go to Source settings -> Source settings and enable the setting labeled: "Enable invoice fees based on shipping weight: ..."  This feature will import data from the case_weight field in your private database (settable in phpMyAdmin) into Invoice processing for each item. (see the case_weight documentation)  If you don't have data in the case_weight field, you will be able to manually enter it on Invoice processing.  You can then enter a shipping rate on Invoice processing so when you generate invoices, shipping will be determined per item on each member's invoice and totaled at the bottom.

How do I archive all the data and start over for next month/week/etc?

Only the administrator can do this; login as admin and click Archive order.  It will ask you whether you want to unlock the order so non-admins can enter new orders (the default), or to keep the order locked, possibly because you need to update the product database.

ADMINISTRATIVE SETUP

Does the software support multiple vendors / distributors?

Yes.  You have to create several Foodclub accounts and use the Account linking page to link them.

To create new accounts, either use the new account wizard (http://foodclub.org/account_wizard), or the quick-account creation page (http://foodclub.org/admin).

The whole process of adding and removing sources will get easier and more intuitive at some point. There will be an Add/remove source page that will allow you to easily add sources from within your account.

How can I remove a source (unlink an account)?  If we drop or change a vendor, can we delete that account so it's no longer on our source drop down menu?

You can hide sources which you no longer order from on the Source dashboard page.

If you really want one deleted permanently, so it's not even visible on Source dashboard to admin users, you can e-mail support.

Are there different levels of administrators or can I assign an administrator to just one of the sources?

Yes, there is a "source-admin" user type. Admin users can create them on User maintenace by selecting one or more (non-admin) users, choosing a source from the drop-down, then clicking the "Grant selected source-admin access to selected user(s)" button.

Can we have more than one full administrator user?

Yes, existing admin users can create new admin users at the bottom of User maintenance.  But admin users cannot edit other admin users, or change normal users to admins once they exist.  For that, you need a superadmin user, which can edit admin users or promote normal to admin.  Foodclub admins can create a superadmin for you: just e-mail support to request that.

User Interface themes... what are they and why would I use them?

Foodclub now supports themes, which are just a predefined set of CSS styles which determine a coherent and attractive appearance of your site.   All you need to do is choose one of the provided themes to change your Foodclub site's appearance.  If you do not like any of the provided themes, or you want your Foodclub site to match your public-facing home page, you can design your own theme.  Here are some tips for designing your own Foodclub UI theme:

  1. Install the "Firebug" plugin for Firefox, and use it on a page in your Foodclub site
    • right click anywhere on the page, and choose Firebug's "Inspect element"
    • this will show you the HTML element, and all CSS styles currently applying to it
  2. You can make changes to your CSS settings via Source settings, and see the changes in real-time to test and debug
    • CSS settings in Source settings are applied after any themes, so you can override styles in a theme selectively (per the cascading feature of CSS)
    • or design a theme from scratch by not using any theme to begin with
  3. You may not be able to do everything you need to without some HTML changes (i.e. adding some class or id attributes). Feel free to e-mail support as you are working on it.

CSS styles... what are they and how do I use them?

Cascading Style Sheets (CSS) can be used to change the appearance of your Foodclub site.  Various HTML elements that are rendered by the application have attributes which allow you to set a "style" for them.  There is no comprehensive list of elements and/or pages which can be "styled" but you can use your browser's "View page source" to see the HTML and find the class attributes of the elements on the page.  The Firefox "Firebug" plugin is also very helpful if doing any serious design work.

If you want to re-style your Foodclub site, we recommend first learning CSS (many resources are available for free on the internet).  Also, not all HTML elements in Foodclub have class or id attributes, so if you find some that you want to style but cannot, e-mail us and we can add necessary element attributes for you.

CSS Bag o' tricks

This is a collection of useful things you can do with CSS to make your Foodclub site more useful and/or customized to your specific needs.

  • enable item comments feature: show editable comment field for each item on all users' Order page (whole/case items), and splits on the Split edit page; also show (read-only) comment column on all invoices, and if comment is set for an item, it shows up next to user's name on main Splits page and Group order
/* enable comments feature */
table.searchResultsTable .CommentCol,
table#orderItemsTable .CommentCol, table.splitEditTable .CommentCol,
table.invoiceUserTable .CommentCol, table.invoiceUserReceipts .CommentCol {
  display: table-cell;
}
  • same as above, but only show the new (comment) columns for admin users
/* enable comments feature for admins only */
body.isAdminUser table.searchResultsTable .CommentCol,
body.isAdminUser table#orderItemsTable .CommentCol, body.isAdminUser table.splitEditTable .CommentCol,
body.isAdminUser table.invoiceUserTable .CommentCol, body.isAdminUser table.invoiceUserReceipts .CommentCol {
  display: table-cell;
}
  • show each user's e-mail address and phone number (if available), next to their name on Invoices, including printer-friendly and receipt-mode invoices
div.invoiceUserDiv span.userEmailPhone {
  display: inline;
}
  • same as above, but for Combined invoices
div.allSourceInvoiceUserDiv span.userEmailPhone {
  display: inline;
}
  • same as above two examples, but only show e-mail / phone for admin users
body.isAdminUser div.invoiceUserDiv h2 span.userEmailPhone {
  display: inline;
}
body.isAdminUser div.allSourceInvoiceUserDiv h2 span.userEmailPhone {
  display: inline;
}
  • show each user's street address, city, state and zip code (if available) below their name on Invoices and Combined invoices
div.invoiceUserDiv div.userStreetAddress {
  display: block;
}
div.allSourceInvoiceUserDiv div.userStreetAddress {
  display: block;
}
  • when built-in accounting system is enabled (prepaid / member balances feature), show each user's current balance below their grand total on Invoices - note: this is shown by default on Combined invoices, it is just hidden and requires the below CSS to unhide on regular Invoices
table.invoiceUserTotalsTable tr.userPrepaidBalanceRow {
  display: table-row;
}
  • show the date / time items were entered and last modified on all users' Order page (whole/case items); note: you can always see entered at and last modified times for all items on the Group order page, by doing a mouseover on a user's name next to an item
table#orderItemsTable .EnteredAtCol, table#orderItemsTable .LastUpdatedCol {
  display: table-cell;
}
  • same as above, but only show the new columns for admin users
body.isAdminUser table#orderItemsTable .EnteredAtCol,
body.isAdminUser table#orderItemsTable .LastUpdatedCol {
  display: table-cell;
}
  • rename navigation Source home link (in the navigation menu) to something else, e.g. the name of the vendor, in this example "Azure Standard"
/* rename Source home nav link */
#sourceLinks #indexLink a span#indexLinkText {
  display: none;
}
#sourceLinks #indexLink a::before {
  content: "Azure Standard";
}
  • rename a column heading in the Splits table (in this example, renames "Unit Price" to "Wholesale Price")
table#splitItemsTable th.UnitPriceCol a span {
  display: none;
}
table#splitItemsTable th.UnitPriceCol a::before {
  content: "Wholesale Price";
}
  • similar to previous example, but renames Manufacturer column for several pages where it shows up: Splits, the search at top of Order and Splits, Group order, and Invoices
table.searchResultsTable th.ManufacturerCol a span,
table#groupOrderTable th.ManufacturerCol a span,
table#splitItemsTable th.ManufacturerCol a span,
table.invoiceUserTable th.ManufacturerCol span {
  display: none;
}
table.searchResultsTable th.ManufacturerCol a::before,
table#groupOrderTable th.ManufacturerCol a::before,
table#splitItemsTable th.ManufacturerCol a::before,
table.invoiceUserTable th.ManufacturerCol::before {
  content: "Other info";
}
  • rename Manufacturer column on ALL pages except for global pages (that apply to all sources) such as Shopping cart - note that pretty much anything in Foodclub can be renamed in the manner shown here and the previous three examples
body:not(.globalPage) th.ManufacturerCol span {
  display: none;
}
body:not(.globalPage) table.searchResultsTable th.ManufacturerCol>a::before {
  content: "Other info";
}
body:not(.globalPage) table:not(.searchResultsTable) th.ManufacturerCol::before {
  content: "Other info";
}
  • make it very obvious to all users that the Order page is for FULL-CASE orders, by adding "FULL-CASE " in red before the "Order for <User name>..." header
body#order h2::before {
  content: "FULL-CASE ";
  color: red;
}
  • show a note above the item results for only certain categories, while browsing the product database (in Order or Splits): this shows the note at the "Top" level browse tree, at the "Bulk" category level, and at the "Bulk" category -> "Herbal Tea" sub_category
/* add product browse category headers */
div#categoryContentDiv-Top::after {
  content: "TOP CONTENT";
}
div#categoryContentDiv-Top__Bulk::after {
  content: "Special header for category Bulk";
}
div.categoryContentDiv[id^="categoryContentDiv-Top__Bulk__Herbal"]::after {
  content: "Special header for category Bulk -> sub_category Herbal";
}
  • hide the navigation links with full descriptions from the Source home page
.indexLinksTable { display: none; }
  • set the font of the customizable text on Source home page to Arial
.indexAccountNewsTable { font-family: Arial; }
  • show the "Filter by manufacturer" dropdown menu feature on the Final order page, where it is hidden by default
div#finalOrderFilterDiv {
  display: block;
}
  • when using the "prepaid balances" built-in Foodclub accounting system, show an Amount due for each user, next to their Prepaid balance on their nav bar and also on the User maintenance page for admins; amount is calculated as: [cart total] - [prepaid balance] + 20.00  (asks each user to pay 20.00 extra, to keep a buffer for price changes)
#larchives li#amountDueDisplay,
table#adminUserMaintenanceTable td.ActionCol div.amountDueDiv {
  display: inline;
}
  • hide the "E-mail all users in split" links in Splits from all non-admin users
body.nonAdminUser a.emailUsersInSplitLink {
  display: none;
}
  • make the "printer-friendly" version of Group order add a page break (for printers) after every item row, so every item prints on its own page
    • meant for division of labor when sorting the items
    • when using this, it is also recommended to print more than 1 page per sheet of paper (e.g. 4 or 6 pages per sheet), to avoid wasting a lot of paper with mostly blank sheets
body#group_order.printerFriendly table#groupOrderTable tbody tr {
  page-break-after: always;
}
  • (in the ncfc UI Theme only, and not on mobile devices) add payment due and pickup day notices below the "order closes" text in the upper right of every page; also add the name of coordinator below the page title; note: this one would be useful in Source settings CSS, but not so much in Global
/* ncfc theme + non-mobile: show payment due, pickup day, and source coordinator at top of page */
@media (min-device-width: 737px) {

div#extraDiv2, div#extraDiv4, div#extraDiv5 {
  position: absolute;
  font: bold 11px arial black, sans-serif;
  text-transform: uppercase;
}
div#extraDiv2 {
  top: 115px;
  left: 166px;
  margin: 4px;
  color: red;
}
div#extraDiv4, div#extraDiv5 {
  right: 0;
  margin-right: 10px;
}
div#extraDiv4 {
  top: 89px;
}
div#extraDiv5 {
  top: 103px;
}
div#extraDiv2::before {
  content: "Coordinator: Name Here";
}
div#extraDiv4::before {
  content: "Payment due 1st Tuesday after close.";
}
div#extraDiv5::before {
  content: "Pickup on 2nd Tuesday after close.";
}
body.printerFriendly div#extraDiv2, body.noNavBar div#extraDiv2,
body.printerFriendly div#extraDiv4, body.noNavBar div#extraDiv4,
body.printerFriendly div#extraDiv5, body.noNavBar div#extraDiv5 {
  display: none;
}

}
  • here is a complicated one which completely redesigns the Group order page, by:
  1. hiding several columns (Code, Price, Total, Size, Manufacturer) leaving only Qty, Description, and Person(s) ordering remaining, and
  2. reformatting the Persons(s) ordering column so that multiple people will fit in a single line, drastically reducing the overall length of the page
/* simplify and shorten the Group order page */
table#groupOrderTable .CodeCol,
table#groupOrderTable .PriceCol,
table#groupOrderTable .TotalCol,
table#groupOrderTable .SizeCol,
table#groupOrderTable .ManufacturerCol,
table#groupOrderTable .OrderersCol br {
  display: none;
}
table#groupOrderTable .OrderersCol {
  white-space: normal;
}
table#groupOrderTable .OrderersCol span.OrdererText,
table#groupOrderTable .OrderersCol span.OrdererText span.splitUser {
  display: inline-block;
  min-width: 200px;
  margin-right: 5px;
}
table#groupOrderTable .OrderersCol span.OrdererText a {
  white-space: nowrap;
}
  • another complicated one redesigning the Group order printer-friendly page to: (meant for the rare food vendor who will individually package items for members in a buying club)
  1. hide all user names and instead just show quantities ordered
  2. rename the column header from "Person(s) ordering" to "Individual quantities"
  3. append " unit(s)" after split item quantities, and " case(s)" after whole/case items from Order page
/* redesign printer-friendly Group order to be sent to vendors who will package items for members */
body.printerFriendly table#groupOrderTable th.OrderersCol span,
body.printerFriendly table#groupOrderTable td.OrderersCol span.orderUserName,
body.printerFriendly table#groupOrderTable td.OrderersCol span.splitUserName,
body.printerFriendly table#groupOrderTable td.OrderersCol span.redText,
body.printerFriendly table#groupOrderTable td.OrderersCol br {
  display: none;
}
body.printerFriendly table#groupOrderTable th.OrderersCol::after {
  content: "Individual quantities";
}
body.printerFriendly table#groupOrderTable td.OrderersCol span.splitUserQty::after {
  content: " unit(s)";
}
body.printerFriendly table#groupOrderTable td.OrderersCol span.orderUserQty::after {
  content: " case(s)";
}
  • another complicated one, also meant for vendors who will weigh/package items for each member (this one is used for Miller's Organic Farm); repurposes the printer-friendly Invoices page to hide several columns, and add two empty columns at the end for actual items weights and the actual total price of each item, to be written in by hand:
body.printerFriendly table.invoiceUserTable .CodeCol,
body.printerFriendly table.invoiceUserTable .SplitUnitsCol,
body.printerFriendly table.invoiceUserTable .ManufacturerCol,
body.printerFriendly table.invoiceUserTable .SizeCol,
body.printerFriendly table.invoiceUserTable .CommentCol,
body.printerFriendly table.invoiceUserTable .ActualPriceCol,
body.printerFriendly table.invoiceUserTable .ActualUnitPriceCol,
body.printerFriendly table.invoiceUserTable th.OrderPriceCol span,
body.printerFriendly table.invoiceUserTable th.TotalCol span,
body.printerFriendly table.invoiceUserTable .CurrentDateTimeCol span,
body.printerFriendly table.invoiceUserTable th.Extra1Col span
{
  display: none;
}
body.printerFriendly table.invoiceUserTable .CurrentDateTimeCol,
body.printerFriendly table.invoiceUserTable .Extra1Col {
  display: table-cell;
  width: 100px;
}
body.printerFriendly table.invoiceUserTable th.OrderPriceCol::after {
  content: "Price";
}
body.printerFriendly table.invoiceUserTable th.TotalCol:after {
  content: "Total";
}
body.printerFriendly table.invoiceUserTable th.CurrentDateTimeCol::after {
  content: "PLEASE ENTER WEIGHT HERE";
}
body.printerFriendly table.invoiceUserTable th.Extra1Col::after {
  content: "Total";
}
  • another complicated one which redesigns / repurposes the printer-friendly Invoices page into a page which can be used as a printout for sort / distribution time to see all items each user ordered, for that vendor (similar to Simple sorting sheet, only including all items, not just splits); NOTE: this will also remove the page-breaks (used by printers) after each member's invoice - if you don't want that, remove the entire line containing "hr.pagebreak" below:
/* redesign printer-friendly Invoices for sort printout, like Simple sorting sheet but not just splits */
body#invoice.normalPrintInvoices div#invoiceSummaryDiv,
body#invoice.normalPrintInvoices table.invoiceUserLineSummaryTable,
body#invoice.normalPrintInvoices table.invoiceUserTotalsAndCommentsTable,
body#invoice.normalPrintInvoices hr.pagebreak,
body#invoice.normalPrintInvoices table.invoiceUserTable th,
body#invoice.normalPrintInvoices table.invoiceUserTable td {
  display: none;
}
body#invoice.normalPrintInvoices table.invoiceUserTable .QtyCol,
body#invoice.normalPrintInvoices table.invoiceUserTable .SplitUnitsCol,
body#invoice.normalPrintInvoices table.invoiceUserTable .ManufacturerCol,
body#invoice.normalPrintInvoices table.invoiceUserTable .DescriptionCol {
  display: table-cell;
}
  • Redesigns / repurposes the printer-friendly Invoices page to be printable on 4"x1" item labels.  Each label has member name, product info, quantity, price, and date, for sticking on the items distributed to ordering members. Most office supply stores sell sticky label sheets that can be sent through a desktop printer. Each sheet has 20 labels arrayed in 2 columns of 10. This CSS repurposes the invoice to print those labels -- but only for admins -- ordinary users still see just invoices. Printer margins may have to be adjusted to position the labels correctly, and only the left column of labels will print out; but the remaining blank labels can be used simply by rotating the sheet, putting the right column on the left side.
/* redesign printer-friendly admin Invoices to be 4x1 label printout */
body.invoices.isAdminUser a#printInvoicesLink::after {
  content: "Print 4x1 Item Labels";
}
body.normalPrintInvoices.isAdminUser {
  width: 400px;
  font: 12px arial;
  text-overflow: clip;
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable thead th,
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.CategoryCol,
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.SubCategoryCol,
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.SubCategory2Col,
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.SizeCol,
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.CommentCol,
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.OrderPriceCol,
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.ActualPriceCol,
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.ActualUnitPriceCol,
body.normalPrintInvoices.isAdminUser table.invoiceUserTotalsAndCommentsTable,
body.normalPrintInvoices.isAdminUser div#intro,
body.normalPrintInvoices.isAdminUser div#explanation hr.pagebreak,
body.normalPrintInvoices.isAdminUser div#invoiceSummaryDiv,
body.normalPrintInvoices.isAdminUser div.invoiceUserDiv h2,
body.normalPrintInvoices.isAdminUser div.invoiceUserDiv table.invoiceUserLineSummaryTable,
body.invoices.isAdminUser a#printInvoicesLink span, body.invoices.isAdminUser span#printInvoicesLinkNote {
  display: none;
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable td {
  display: inline-block;
  border: none;
  min-width: 40px;
  text-align: left;
  white-space: nowrap;
  padding: 0;
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.FullNameCol {
  width: 230px;
  font-weight: bold;
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.CodeCol::before {
  content: "Item ID: ";
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.CodeCol {
  width: 150px;
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.QtyCol::before {
  content: "Qty: ";
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.QtyCol {
  width: 90px;
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.QtyCol span:not(.boldText) {
  display: none;
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.SplitUnitsCol {
  width: 90px;
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.ManufacturerCol {
  width: 200px;
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.DescriptionCol {
  width: 380px;
  font-weight: bold;
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.TotalCol::before {
  content: "Item Total: $";
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tbody td.TotalCol {
  width: 160px;
}
body.normalPrintInvoices.isAdminUser table.invoiceUserTable tr td:last-child {
  margin-bottom: 33px; /* adjust this number if labels print out too close or too far apart on your printer */
}
  • create an "admin-only" section of the content shown at top of Source home which is visible to only admin or source-admin user, but not visible to normal users (e.g. useful for storing current vendor info, such as payment address/terms, sales rep contact info, etc.)
  1. First, you need to wrap the HTML content that should be admin-only visible with: <div id="adminOnlyVendorInfo"> ... content here ...</div>.  To do this, you have to use the "HTML" button in the source home text editor.
  2. Next, add this CSS to your Source settings CSS (or Global settings CSS if you want to have these sections for all your sources):
body#account_home.isNonAdminUser div#adminOnlyVendorInfo {
  display: none;
}


See also next wiki section, which describes showing and hiding table columns generally. It contains examples of showing the category columns which are hidden by default.

How to change visibility of table columns? (e.g. show the item category columns, or hide columns for suppliers who don't have some data)

The column data that is visible in most tables throughout the Foodclub system can be configured for your specific vendor.  There are several columns which are hidden by default, and can be made visible, or alternatively columns which seem to always be empty for your food supplier can be hidden to take up less space.  It is done using CSS styles.

The columns which are hidden by default in all tables (except product database search results) are:

  • category
  • sub_category
  • sub_category2

The data for them is there, just hidden.  If you want to show them for one of your sources (perhaps the category or sub_category has some vital identifying information about the item in that supplier's data), you would add one or all of the following CSS directives to your CSS styles on the Source settings page.

table .CategoryCol { display: table-cell; }

table .SubCategoryCol { display: table-cell; }

table .SubCategory2Col { display: table-cell; }

Note that the above causes all pages where these columns are available to show the hidden column(s).  If you only want to show the hidden column(s) on a single page, you can specify the table ID attribute.  For example, to only show them on Splits, you would do this:

table#splitItemsTable .CategoryCol { display: table-cell; }

table#splitItemsTable .SubCategoryCol { display: table-cell; }

table#splitItemsTable .SubCategory2Col { display: table-cell; }

Also, showing the extra category columns allows you to sort by them on the pages where sorting is available (e.g. Splits, Group order, Final order, Shopping cart).  This would be necessary for sources where you need to separate your group order up by item category.

Alternatively, if you want to hide some columns which do not have data, you would add CSS directives like these to your CSS styles.

table .ManufacturerCol { display: none; }

table .SizeCol { display: none; }

table .SubCategoryCol,
table.searchResultsTable .SubCategoryCol,
table#orderItemsTable .SubCategoryCol,
table#splitItemsTable .SubCategoryCol {
  display: none;
}

If you want to find the correct CSS / HTML class names for other columns to hide, you can either just view the HTML source for the page, or better yet install the "Firebug" plugin for Firefox and then just right-click on the column and "Inspect element."

Note that all of the above can be made either to a single source via the CSS styles in Source settings, or to all your sources via the CSS styles in Global settings.

ACCOUNTING SYSTEM QUESTIONS

Does Foodclub have an accounting system, to track member (pre-)payments into a shared bank account?

Yes.  There is a simple built-in accounting system that allows you to keep track of payments made by members, and automatically debits their accounts for their final invoice total when an order archives.  When the feature is used properly, all users will have a real-time balance which should equal the actual amount they have in their prepaid account with the club.

To enable this feature, see: Global settings -> Accounting system settings.

How do I initially set up the accounting system after it is enabled, so members see their actual balance?

Once enabled on Global settings, you will see a new link under Global admin called Member balances. No users will see anything new until you enter some credits for them, or an order archives (with the feature enabled). Once they have some payments or debit history, they see a new link Prepaid balance next to their Shopping cart. (both links show a total next to them)

The first step is to enter a credit for each member for their balance at the current point in time, not including unarchived orders. (call this "initial balance" or something when you enter it in Member balances)

Debits will be made automatically when an order gets archived. So you just have to be sure the initial balance doesn't already include unarchived orders.

Going forward, you will only need to enter payments made by members on the Member balances page, since debits get charged automatically on archiving an order.

What if we already use an offline accounting system (e.g. Quickbooks)?

If you use an offline accounting system already, you can still use the Foodclub accounting system, it just means double-entry of payments made by members.  But there is still a big advantage of using this simultaneously, because if you do, all members will see a real-time prepaid account balance right next to their Shopping cart while they shop.  This should motivate members to prepay their accounts in a timely manner so they are not running a negative balance out of not knowing their actual, current balance.

What if we don't use prepaid accounts, but just want to keep track of over- or under-payments?

You can use the built-in accounting system simply to track over- and under-payments.  The goal will be to keep everyone's prepaid balance as close to zero as possible:

  • you will enter payments made by members on the Member balances page (possibly separate entries for each vendor, e.g. if you have multiple vendor coordinators which need to be paid separately)
  • when orders archive, each member's final invoice total will be debited from their prepaid account balance, bringing their balance close to zero again
  • at this point: if they under-paid, their prepaid account balance will show as slightly less than zero; or if they over-paid, it will show as slightly more than zero.
  • on the next order cycle, members would then subtract their prepaid balance from all their preliminary invoice totals when paying, to compensate for over- or under-payments from previous orders: this amount is easy for users to see at the bottom of their Combined invoice

ONLINE PAYMENT QUESTIONS

Can members pay for their orders directly on Foodclub?

Yes, once you configure online payment, on Global settings -> Online payment settings.

Where will the users see the online payment option?  (On their invoices?)  

After one or more payment processors is configured, users will see a new Make a payment button in an appropriate place depending on the UI Theme you are using.  If the accounting system is enabled, it will be right next to the Prepaid balance link.  Yes, it will also show at the bottom of Invoices and Combined invoice: as a button in a browser, and as a link in the e-mailed invoice.

How will the admin user(s) / treasurer know a payment has been made?

An e-mail will be sent to the treasurer e-mail (if one is set on Global Notifications) immediately after an online payment is made.  It will contain the name of the user who paid, the amount, and other info like the payment processor and a link to that user's payment history in the accounting system.

Is their payment automatically credited to their Foodclub account, or does the treasurer credit their account manually?

Yes, it is automatically credited in the Foodclub accounting system immediately after the payment is completed, assuming you have the accounting system enabled.  So no manual entry is necessary on payments made via online payment.

Questions about Stripe payment processor

How to enable it?

You need to login to your Stripe account on stripe.com, get these values from Developers -> API keys -> Standard keys:

  • Publishable key
  • Secret key

and copy them into the fields on Foodclub’s Global settings -> Online payment settings -> Stripe.  You will also want to set the percent fees down below the API Key fields, so that users who pay with them will be charged appropriate fees to cover your costs.

You will also have to activate your Stripe account, and enable ACH payments, if you have not already done so.  It will stay in test mode until you activate, which won’t work with real banks and cards.  Users will get errors when they try to add a bank if ACH payments are not enabled in the Stripe account.  You enable ACH payments on stripe.com in Payments -> Settings -> ACH Credit Transfer.

What should I set the percent fees to for Stripe?

The Stripe fees are currently (as of November 2018):

  • ACH: 0.8% with a $5 maximum, and a $4 fee for failed/disputed payments
  • Credit/debit cards: 2.9% + $0.30 per charge

The easiest is to simply choose the "Use the default Stripe fee structure" option in Global settings -> Online payment settings -> Stripe settings to match the exact fees that Stripe charges. If you choose to set your own fees, you won't be able to match them exactly since there is no support for a flat fee or maximum.  For ACH, you can set the fee to 0.008 to cover the 0.8% fee.  For credit/debit you should probably just set the fee to 0.035 (3.5%) or so, to cover the $0.30 flat fee for small payments.

The Foodclub payment page shows a message to the user about the $4 fee for failed ACH payments, but if that happens, you will have to manually charge their balance the $4 and also may have to reverse the payment credit.  The system currently only detects failed payments if it fails immediately, rather than a few days later, and even then it doesn’t auto-charge the $4 fee.

What is causing payments to fail with the following message?
Your account cannot currently make live charges. If you are the site owner, please activate your account at https://dashboard.stripe.com/account/details to remove this limitation. If you are a customer trying to make a purchase, please contact the owner of this site. Your transaction has not been processed.

If you think you already activated your Stripe account, this means there is something left undone in the activation process.  Most likely you need to send Stripe some piece of identification or documentation.  One club reported they had to send in a copy of their ID.
Do members / customers need to create their own account on stripe.com?

No.  You only set up a Stripe account for the club to receive payments.  Members who want to send money to the club can do so on the Foodclub Make a payment page, either by credit/debit card, or adding and verifying a bank account and then sending a payment via Bank ACH.

Questions about Dwolla payment processor

NOTE: Dwolla is no longer an option in Foodclub due to their uncompetitive pricing as of Dec. 2018 - this section kept for historical purposes
Once I enable it, will it sync any Dwolla payments already in process?  Or will it just sync new payments from that point forward?

No, it will not sync any payments in progress.  It won't do anything about payments made directly on dwolla.com, either before or after you enable it.  So any payments made on dwolla.com (before or after it's available on Foodclub) will still need to be manually entered as credits in the accounting system.

Will pending payments show up as a credit in the member's account, not only completed payments?

Yes, on successful transfer via the Dwolla API (what Foodclub uses), it immediately issues a credit in the built-in accounting system.  It doesn't care if it was made via Dwolla balance (available immediately) or by a linked bank account (3 business days).  They get the credit immediately in Foodclub.

Keep in mind that in the rare event of a failed Dwolla bank payment (i.e. it doesn't complete successfully after 3 days), the admin / treasurer user will need to manually reverse the credit in the Foodclub accounting system by adding a debit to that user for the same amount.  You will know about a failed payment by an e-mail from Dwolla. 

What is the link between the member's Dwolla account and their foodclub account?  Will each member need to enable Dwolla from their foodclub account in order for foodclub to make the link to who they are on Dwolla?

There isn't any permanent link between Dwolla and Foodclub accounts.  When they make a payment on Foodclub, they get a popup window with a simplified Dwolla login, and they just have to login and "Approve" sending a payment.  Then they get a confirmation page with the amount they are about to be charged, before they can send the payment.  Each time a user wants to make a payment, he/she needs to login to their Dwolla account in the popup window on the Make a payment page.

Dwolla doesn't actually know anything about the Foodclub user at all, except that a Dwolla user is logging in via their API from Foodclub.org. Likewise, Foodclub only obtains a temporary authorization to send money when the user logs in on the Make a payment page.

If we choose Dwolla, for example, am I correct to assume that payments can only be made through a bank account or major debit card?  In other words, paying by any method which charges a fee (like credit card) would not be an option for the users?  We do not want to set up any payment method that charges a fee.

Yes, Dwolla requires the user to link a bank account.  Debit cards are not even supported, they have to actually link their bank account via routing # and account #.  But the good thing is that it's not possible to pay a fee when you use Dwolla.  It is always free, so the recipient gets 100% of the money sent.

If Dwolla is the only payment option enabled on Global settings -> Online payment settings, then it will not be possible for a user to be charged a fee when they pay.

If we set up a Dwolla account, will the user be required to also set up a Dwolla account to be able to use that payment method?

Yes, users must set up a Dwolla account in order to pay with Dwolla via Foodclub online payment.  In the Make a payment page in Foodclub, it opens a popup window with the dwolla sign up / log in page, where they can create an account.  (they don't even need to leave your Foodclub site)

Or can a user send payment to our Dwolla account through their own “bill pay” bank account?

They cannot send payment to your Dwolla account using bill pay.  To use bill pay they'd just need to send it to you directly, and their bank would simply mail a check.  Dwolla is more high-tech than bill pay since it doesn't involve any writing/mailing/depositing checks.  It transfers the money directly from one person's account to another's.

PRODUCT DATABASE QUESTIONS

How does the product database work?

You can choose to store your product data in a database on the foodclub.org server. If you have a database set up, you can choose to add item data to it each time you archive your order. You can also add item data from all past orders.

Once you have item data in your database, you can quickly search the database from the Order and Splits pages (or the global Product search if you have multiple sources).  You can search on the item's description, manufacturer, code and various other properties. When you find the item you want, you can just click "Add" to add it to your order or split requests.

What data is stored in the product database?

Each product's item code, case size, manufacturer, description, price, and several other fields are stored. For a full description of all the database fields, see Description of product database fields.

Is any information about who ordered what stored in the database?

No. Only information about the products themselves is stored, not anything about who ordered it.   It keeps the date each product was last ordered, but not who ordered it then.

How do I set up the product database for my buying-club?

Login as an administrator user, and go to the Product database page.  Here you will see settings which control how your product database works.  If you enable private database mode, you will immediately have access to a Database editor page, via a link in the nav menu and also at the top of Order and Splits. (only an admin user for the source will see the Database editor links)

The Database editor allows you to add new items, edit existing items, and delete unwanted items.  It is an easy to use interface that mimics exactly how users shop for products on Order and Splits, but it allows you to edit the items themselves.  It even allows uploading images for each product, via a simple drag-and-drop feature.

Alternatively, you can enable access to phpMyAdmin to maintain your private database, which is a more powerful but also less user-friendly way of editing the database.  It allows for excel import/export, and other powerful things like SQL.

Another alternative is to import your past and future Foodclub orders into your private database: a list of your past orders appears below the database setup options, with a button allowing you to import them. Future orders can be imported on an ongoing basis on the Archive order page.

If you choose to use an official product database, you cannot add past orders to it since it already contains the entire product line that the distributor carries, with accurate prices.

What is an official database?

Foodclub provides several "official" product databases, which come directly from distributors that users of Foodclub commonly order from.  They contain up-to-date prices as of a specified date, and some even contain the current sale items for the month.  If you are ordering from a distributor with an official database available in Foodclub, this is by far the easiest way to use Foodclub.   You can disable manual entry of items by non-admin users to prevent any mistakes in your order.  Users will need to search or browse the database to find what they want, much like standard online shopping carts.

Can I directly maintain the items in my product database?

Yes. If you enable private database on the Product database page, you can use the Database editor which is right on the site (visible to admin users) and is very easy to use.

Or you can enable phpMyAdmin access, which will allow you to login via a separate web interface (outside the Foodclub system) to add, edit, or delete items in your product database.  The fields for enabling phpMyAdmin only appear after you have chosen to use a private database, on the Product database page.

Can I use an official database with prices marked up higher than wholesale?

Not directly, but you can copy the official database data into a private database to do whatever you want to it.

When using an official database, on your Product database page you will see a button labeled: "Copy all items from 'Some official database' into my private database"  Use this button to copy the current official data into your private database at the start of your order cycle.  Then use the steps below to mark up the prices from the official database, which are now in your private database:

  1. Login to phpMyAdmin
  2. Click on foodclub in the left-side frame
  3. Click on your private database table in the left-side frame, e.g. "private_<your-account-id>"
  4. Click the SQL tab at the top of the right-side frame
  5. For a 10% markup, enter the following command in the large text area input field. (first you should clear any default command in it, which is usually "SELECT * FROM ...")  Change the 1.1 to something else for a different markup amount, e.g. 1.15 for a 15% markup.  Replace the <your-account-id> with your account ID to get the actual private table name.
  6. UPDATE private_<your-account-id> SET price = price * 1.1 ;
  7. Click "Go" at the lower right

Notes:

  • make sure you only run this command once, or prices will be marked up too high
  • also note that you need to do this at the beginning of every order cycle, to get the current data from the official database, and then mark up prices in your private table
  • remember to switch your database from official back to private in Foodclub after you click the "Copy all items..." button - the database remains set to the official after you copy so you need to manually switch it; it doesn't matter if you do this immediately afterwards, or after you run the SQL in phpMyAdmin, as all this does is tell Foodclub which database to read from

Our price list is small enough to manually enter - how can I?

You can manually enter items into a private database one-by-one using the built-in Database editor.  The Database editor is by far the easiest way to add a small number of items: simply use the "Add new item" link at the top of the Database editor page for each item.

You can also use phpMyAdmin to do it: first enable your phpMyAdmin account as described above, then follow these steps:

  1. Login to your phpMyAdmin account (created on Foodclub Product database page as an admin user)
  2. Click on foodclub in the left-side frame
  3. Click on your private database table in the left-side frame, e.g. "private_<your-account-id>"
  4. Click the Insert tab at the top of the right-side frame
  5. Enter values (in the text input in the "Value" column) for the fields for which you have data. (leave the "Function" drop-down blank/unset)
    • The minimum required set of fields is: code, description, size (if item will be split), price
    • Other fields which are nice to have are: category (for browsing), manufacturer, sale_price (if currently on sale)
    • All other input fields on the Insert page can be left blank
  6. Click the "Go" button below the input fields.  This will create one new record in your private database, which you can immediately see on your Foodclub Order and Splits pages.

What if a product in the database has wrong information?

The solution to fixing data in the database depends on what database mode you are using:

  1. private database: item data can be changed either in Database editor or in phpMyAdmin; the Database editor by far the simplest, as it doesn't require logging into an external app, and it is just a single double-click, edit, hit return, and the item data will be updated
  2. official database: everything should be accurate - if not, it means either that the distributor had a mistake in their database or there was an error in the Foodclub import process.  E-mail us and we'll get to the bottom of it.

Brief step-by-step instructions for importing a pricelist from a distributor using phpMyAdmin

This process may vary depending on the format of your pricelist, but here is a simple step-by-step guide for importing a basic Excel pricelist.

  1. In Excel, OpenOffice/Calc, or Numbers, save the pricelist in CSV format (e.g. File -> Save as... then change File type to CSV)
  2. Login to your phpMyAdmin account, at http://foodclub.org/phpmyadmin
    • either auto-created in the new account wizard if you chose "Other" as the vendor (username and password are the same as your very first Foodclub admin user created by the wizard), or
    • created on Foodclub Product database page as an admin user
  3. Click on foodclub in the left-side frame
  4. Click on your private database table in the left-side frame, e.g. "private_<your-account-id>"
  5. Click the Import tab at the top of the large, main (right-side) frame
  6. Under the File to Import: section, Browse to select the file you exported in step 1, above
  7. Under Format:, select "CSV"
  8. In Format-Specific Options:-> Columns separated with, make sure it is set to "," (comma), which should be the default
  9. In Format-Specific Options:-> Column names, enter the comma-separated list of Foodclub database columns corresponding to the data in your pricelist file
    • See Description of product database fields for a full description of Foodclub database columns
    • Example: size,unit_size,description,code,price,unit_price,origin
    • Note that all column names are case-sensitive: they must be all lowercase
  10. Click the Go button

Troubleshooting tips:

  • the code field is required; the import will fail if it is blank for any item in your CSV file - actually, it will result in a partial import
  • the code field must be unique for each item; if there are duplicate codes (two or more items with the same code), the import will fail / result in partial import
  • beware of embedded double-quotes in your CSV file, e.g. this will cause your import to fail: "some item ""description"" ..."
    • the only quotes which should exist are the ones at the beginning and end of a field, right next to the commas
    • if you need to have double-quotes in a field, they should be escaped with backslash, e.g. \"
  • it is generally easier and less error prone to import just a subset of fields than the entire set of fields in the Foodclub database table
    • this means not to skip Step 9 in the above instructions
    • trim your Excel sheet (remove columns) to only those columns for which you have data, then export that as a CSV
    • fill in the Foodclub columns corresponding to the columns in your CSV in Step 9 above
  • if you get an item in your database with code: "code", category: "category", description: "description", etc.. then it just means you left your header row in the CSV file before importing; you need to remove that first row if it's not an actual item
  • more troubleshooting answers can be found on the Product database support forum: http://foodclub.org/phpbb/viewforum.php?f=1012

How do I clear out my private database in phpMyAdmin, before importing a new file?

You will want to clear out your database every time you get a new pricelist from your distributor, since it will be faster to upload a CSV file than manually updating items one by one, and less error prone than importing over an existing database in "replace" mode.  Here is the simplest way:

  1. Click on the table name in the left-side frame: private_<your-account-id>
  2. Click the Operations tab in the right-side main frame
  3. In the lower right of the page, under the "Delete data or table" section, click: Empty the table (TRUNCATE)
  4. You will get a warning popup - click OK and the table will be emptied


There are two other options (the old ways before the above worked):

Option 1: (techie way, but less steps)

  1. Click on the table name in the left-side frame: private_<your-account-id>
  2. Click the SQL tab in the right-side main frame
  3. Change the large textarea to contain just: DELETE FROM `private_<your-account-id>`;  (replacing with your actual private database table)
  4. Click the "Go" button

Option 2:

  1. Click on the table name in the left-side frame: private_<your-account-id>
  2. The Browse tab should open up on the right-side main frame
  3. In the "Show: __A__ row(s) starting from record # __B__" fields,
    • for A: enter a bigger number than the total number of items in your database, e.g. 1000
    • for B: enter 0
  4. Click the "Show:" button
  5. Now all your items should appear on a single page; scroll to the bottom and click Check All
  6. To the right of Check All you see a "With selected:" and a few icons
    • click the red X icon which will delete all items


How to support items which are priced by weight?

First, let's define what it means for an item to be priced by weight. In Foodclub, any item which is sold in individual quantities which are of varying weights should be set as priced-by-weight. Essentially, items where someone who orders a quantity 1 could receive a totally different weight than someone else who also orders 1 of that same item. Primarily the priced by weight feature is designed for meats and cheeses.

Contrast this with items which can be ordered by weight, e.g. by the pound, but any user who orders 1 pound of the item will get the same weight as another user who orders 1 pound. In this case, even though users are ordering the item by weight, it should not be set to priced-by-weight in Foodclub.

So, assuming you have an item which is actually priced-by-weight, here is how you enable it in your product database:

  1. set description to the item name, and it is useful to include the average weight of each quantity
    • e.g. whole turkey, average weight 15lb
  2. set size field to 1, or whatever the minimum purchase quantity of the item is
  3. set price to the average price based on average weight (this field is not actually used to determine the final price each user gets charged, but is used merely for estimate purposes in users' order and cart)
    • e.g. 45.00
  4. set price_per_weight to the price per unit weight (e.g. price/lb.) of the item
    • e.g. 3.00
  5. set is_priced_by_weight to 1

This will cause the Invoice processing page to show actual weight and price-per-weight fields for each quantity of this item. So if a user orders 3, and each of them is a slightly different weight, you will be able to enter the actual weight of each item for that user. Likewise for several different users who order one or more of this item.

Really, only the final is_priced_by_weight field is required to be set to 1 to enable the feature, but you will want the other fields to have sane values so users (both shoppers and admin users who generate invoices) are not confused.

WARNING: Do not change the value of is_priced_by_weight for an item (in phpMyAdmin) when Invoices already exist where that item has been ordered.  If you do, you will get strange issues with prices that don't calculate correctly for the item(s).  There is a bug which does not recognize a change in is_priced_by_weight in existing invoices.  The only fix for this problem is to "Clear invoices" (on Invoice processing) and generate them again.  This is usually a painless process, unless you have added a bunch of custom fees or credits to your invoices, in which case those would be lost and have to be re-added.

Can I add images to my product database?

Yes.  Simply drag-and-drop the actual image file (from Finder on a Mac, or Explorer on Windows) into place in the Database editor.  You also need the "Show product images, from images uploaded in Database editor" setting turned on, in Product database settings.

CONTACT AND SUPPORT QUESTIONS

Who maintains foodclub.org?

Various people help with the maintenance of the site.  For questions or problems you find, please e-mail <support at foodclub.org>.

Where can I get further technical support?

The General support forum is available for all users to post questions and get answers.  It is directed primarily at new users who are completely unfamiliar with the system, so the questions are very basic.  Anyone can read this forum, but only registered Foodclub users can post to it.

If you have been using Foodclub for a while and you have an advanced question, you should probably just e-mail <support at foodclub.org>, since you likely will be requesting a new feature (or possibly found a bug).  We don't want to confuse new users in the General support forum with advanced topics.

Where can I discuss the software with other users?

The Foodclub forums are set up to allow discussion between users.  At the moment these are mainly used by existing buying clubs to communicate amongst their own members.  But there is now a discussion forum with the specific purpose of facilitating discussion among Foodclub users.

You can also always just e-mail <support at foodclub.org> and we will put you in touch with other users who can help you.

I have an idea to improve the software. How do I submit a feature request?

Send e-mail to <support at foodclub.org>. We will evaluate the request, and add it to the to-do list if appropriate and useful to other users.  It will be implemented in a timely manner, especially small and easy requests.  If it's a large request it may not be done for a while.