Giter VIP home page Giter VIP logo

foodcoopshop's Introduction

FoodCoopShop

User-friendly open source software for food-coops and local shops.

Latest stable version Build status Coverage Status Software license

🤖 Self-hosting / developing

Open in Gitpod

  • Gitpod: When all containers are up and running (takes about 1 minute), open your Bash-terminal (not in the Docker-terminal) and run
  • bash ./devtools/init-dev-setup.sh
  • In your custom_config.php, change App.fullBaseUrl to your Gitpod-Domain (BE AWARE: NO TRAILING SLASH!).

✨ Features

  • user-friendly web shop optimized for selling food from different producers
  • many delivery rhythms for products (once a week, every first / last friday...)
  • admin area for both manufacturers and admins
  • the decentralized network plugin supports synchronizing products to different installations
  • a cashless payment system based on bank account transfers
  • order adaptions (cancellation, adapting weight / price...)
  • self-service mode for stock products (including optional barcode scanning)
  • the software is webbased and available in German and English

✔ Requirements

  • Server with shell access and cronjobs
  • Apache with mod_rewrite
  • PHP >= 8.2
  • PHP intl extension INTL_ICU_VERSION >= 50.1
  • PHP bzip2 lib (for automatic database backups)
  • MySQL >= 8.0
  • Node.js and npm >= v9 (installation) developer packages
  • Composer v2 (installation) developer packages
  • Basic understanding of Apache Webserver, MySQL Database and Linux Server administration

❗ Legal information

Before installing don't forget to read the legal information.

😎 Maintainer

Mario Rothauer started the project in 2014 and maintains it.

Star History

Star History Chart

foodcoopshop's People

Contributors

ch83 avatar confuset avatar dependabot[bot] avatar dpakach avatar firerain-tgz avatar hasslerf avatar k-pd avatar mrothauer avatar ocapito avatar paroga avatar robbinjanssen avatar swoichha avatar thefox avatar wintersim avatar

Stargazers

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

Watchers

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

foodcoopshop's Issues

fixes for php 7.1

foodcoopshop does not run on php 7.1

PHP 7.1 Fatal error: [] operator not supported for strings

customer.php constructor
$this->hasMany['PaidCashFreeOrders']['conditions'][] = 'PaidCashFreeOrders.current_state IN (' . ORDER_STATE_CASH_FREE . ', ' . ORDER_STATE_OPEN . ')';

maybe there are other problems too, please run all tests on php7.1

deactivate forgot password function for deactivated users

currently it is possible for deactivated users to retrieve a new password. they get it via email, but then they can't log in because they are deactivated.

url: www.example.com/neues-passwort-anfordern

task

  1. change flash message if email address of user (table fcs_customer) is in database but active is set to 0 to
    "Dein Mitgliedskonto ist nicht mehr aktiv. Falls du es wieder aktivieren möchtest, schreib uns bitte eine E-Mail."

  2. and do not send the email with the new password!

move documentation from wiki to /docs folder

the master branch can be configured to show content of /docs folder automatically on
http://foodcoopshop.github.io/foodcoopshop

how this works is described here:
https://help.github.com/articles/user-organization-and-project-pages/

reason for the change is that users need to be granted write permissions to be able to change wiki pages. if the documentation is moved to /docs, pull requests can be done by anyone by creating a pull request from a fork

another reason is the increased flexibility (eg. integration of new languages, make a dynamic table of contents...

tasks

question

  • as the master branch's /docs folder is taken for the build of the gh pages url, how to view changes on develop branch? maybe it's enough to view the code, but there will be no built version of the docs

Preis für bestellte Produkte ändern: mehrere auf einmal

wie beim stornieren soll auch beim preis ändern von bereits bestellten artikeln eine mehrfachauswahl der artikel möglich sein. das ist vor allem bei sammelbestellungen sinnvoll.

todos

  • info nachricht: bitte neuen preis für EIN stück angeben (eine bestell-zeile kann auch mehrere stück enthalten)
  • den eingegebenen preis mit der menge multiplizieren
  • unit test schreiben

Hersteller über Sofortbestellungen informieren

Produzent/innen sehen nicht, wenn eine Sofortbestellung gemacht wurde. Beispiel: Heute hat beim Fairteiler jemand einen Spargel storniert obwohl wir ihn geliefert haben. softwareempfehlung: spargel stornieren und dann via Sofortbestellung über den Vereinsaccount zu bestellen. Als Produzent/in muss ich dann im Herstelleraccount unter Bestellungen nachsehen ob die Artikel nachbestellt/sofortbestellt wurden, zur Kontrolle. super wäre wenn da auch eine mail kommt wie bei den nullpreisprodukten bzw. stornierungen wo die produzent/innen ja auch per mail informiert werden.
oder:
Wir haben einen Lagerbestand von 5 Hanfnudelpackungen. Jemand macht eine Sofortbestellung von 5 Packungen und der Produzent bekommt das nicht mit und weiß somit nicht, dass keine Artikel mehr im Lager sind.
So wie ich das verstehe, wird die Sofortbestellung mit dem Datum rückdatiert, daher bekommen die Produzent/innen keine Nachricht über die Bestellung. Wäre sehr wichtig, denn die Prouzent/innen sollten erfahren, wenn jemand ein Produkt von ihnen kauft.
Daher unsere Frage. Mit welchen Aufwand ist es möglich, dass die Produzent/innen eine Mail bekommen wenn jemand eine Sofortbestellung macht?

migrations: automatisches anpassen von datenbank-dumps

es wäre aber gut, wenn der structure-dump (Config/sql/_installation/clean-db-structure.sql) und auch Config/sql_installstions/clean-db-data.sql und Test/test_files/Config/sql/test-db-data.sql mitangepasst werden könnten, sodass sie immer das schema / die daten nach ausgeführter migration enthalten.

momentan mach ich das für die drei dateien bei jeder migration manuell über phpmyadmin => export (structure / daten) und das ist mühsam.

ein script , das auf Configure::read('app.mysqlDumpCommand') zugreift (gibts ja schon) und dann die dumps richtig anpasst, wär super! mit der migration / der migration range als parameter. kann gern manuell aufgerufen werden müssen, kein integration in pre-git-commit notwendig.

wichtig sind diese optionen beim export

  • drop table if exists hinzufügen
  • auto-increment wert weglassen
  • nur struktur für struktur-dump
  • nur daten für daten-dump
  • fcs_configurations: FCS_DB_VERSION und FCS_DB_UPDATE updaten

Besseres Symbol: Kontaktdaten Mitglieder

Adminbereich- Mitglieder - Kontaktdaten (Name)

Da bei einem Abholdienst die Telefonnummern öfters gebraucht werden wenn jemand vergisst seine Waren abzuholen, wäre es super wenn die Telefonnummer besser ersichtlich ist. Vorschlag: Telefonsymbol statt Buch.

Do not use referer

There are many places, where the HTTP referer is used for forwarding to the previous page (e.g. add article, logout...). This referer can be faked (e.g. by privacy settings). This can be very annoying if not prevent usage at all.

Solution: Internally track last page (e.g. in session) or provide destination URL in HTTP parameter (e.g. ?redirect=/artikel). Internal tracking may cause trouble when using multiple windows, HTTP parameters must be implemented in all link creation methods concerned.

tax status changes product price

if i price status is changed, associated products' price change. the price should never change, no matter if the associated tax is active or not.
it's not super urgent, because status of tax normally do not change, but should be fixed soon.
unit test would be good

AP03: Dependency-Manager mit Lock-File verwenden

frontend components should be included with npm and not bower any more

main reason for this issue

  • bower does not create lock files where the exact version of the components are saved. in order to be sure, that every "bower install" will fetch the exact same versions of the components, exact version numbers must be defined in the bower.json. it's more convenient to use wildcards like eg. "^1.4.*". npm's package.json can deal with that (maybe yarn is needed for that)
  • npm is much more used than bower

tasks

  • migrate bower.json to package.json
  • ensure that modules are downloaded into webroot folder (attention: webroot points to /webroot !) so that they are accessable from the browser
  • adapt the postinstall hook (defined in .bowerrc)
  • update README.md
  • update .travis.yml
  • use a dependency checking tool like https://greenkeeper.io/ or https://gemnasium.com
  • eventually switch from kcfinder to another upload tool for ckeditor (kind of obsolete)

package.json will be shown here
https://github.com/foodcoopshop/foodcoopshop/network/dependencies

npm supports lockfile

Maintainance mode

My thoughts for dicussion, this should be before Install and Update Simplification

TL;DR: Maintainance Mode als Grundlage für viele automatische Prozesse nötig (DB-Migration, Auto-Update, Install-Prozess). Am besten mit einem "Go-File" realisiert. Crons, Konsole und Remotes nicht vergessen, Benutzer informieren. Allerlei Einzelheiten für die Umsetzung im FoodCoopShop.

Maintainance Mode

Der Maintainance Mode ist ein Feature, das die ungestörte Ausführung bestimmter Programmfunktionen ermöglicht. Hierunter sind praktisch alle Prozesse zu verstehen, die nicht im laufenden Betrieb gefahrlos ausgeführt werden können. Darunter fallen regelmässige Prozesse wie das Datenbank-Backup ebenso wie einmalige Ereignisse wie die Erst-Installation (als absoluter Sonderfall).

Möglichkeiten zum Einschalten

Der Maintainance Mode muss durch Bediener leicht einschaltbar sein, aber auch programmatisch leicht und sicher umsetzbar. Für die Erstinstallation kommt eigentlich nur das Fehlen eines "Go"-Flags in Frage. Bewährt hat sich das Abprüfen der Existenz eines Files (z.B. go oder run) in einem für alle Programmaufrufwege zugänglichen Verzeichnis. Durch simples Umbenennen in z.B. maintain oder locked lässt sich schnell und sicher umschalten.

Gegen die Verwendung eines DB-Flags spricht neben der Erstinstallationsproblematik die Frage, wie ein DB-Update gesichert werden soll, wenn die DB abgefragt werden können muss.

Alle Programmaufrufwege

Neben dem Web-Interface müssen für nahezu alle Anwendungsfälle auch direkte Konsolenaufrufe, Cronjobs und andere Remote-Requests berücksichtigt werden. Cake hat mit seiner zentralen Architektur für den Regelbetrieb eine gute Ausgangslage. Installation und Auto-Update sind hierbei Sonderfälle, die prinzip-bedingt eigene Programmsysteme haben müssen.

Verriegelung

Es muss zuverlässig verhindert werden, dass 2 Prozesse gleichzeitig in den Maintainance-Mode schalten können. Auch hierfür ist die "atomare" Umbenennung einer Datei gut geeignet. Selbst wenn für beide Prozesse der Existenz-Check gleichzeitig positiv ausfällt, gelingt es auf Betriebssystem-Ebene immer nur einem der beiden Prozesse, die Datei erfolgreich umzubenennen. Der andere erhält eine Fehlermeldung wie "Datei nicht gefunden" und weiss, dass er nicht dran ist.

Warten oder Abbrechen

Prozesse, die mit Benutzer-Interaktion laufen (Web-Interface, Konsolenaufrufe), können fast immer ohne Warten die gewünschte Aktion abbrechen und den Benutzer auf später Vertrösten. Entsprechende Meldungen kennt fast jeder Benutzer. Cronjobs können, wenn das System es erlaubt, später wiederholt versucht werden. Andere Prozesse, bei denen Wiederholen nicht möglich ist, müssen evtl. solange Warten, bis der Maintainance Mode wieder beendet wurde und dann weiterlaufen. Solche Fälle sind aber selten und fast immer selbst ein Fall für den Maintainance-Mode.

Erstinstallation

Ein "kleines" Programmpaket, dass vom Bediener auf den Rechner geladen wird, wird über das Web-Interface gestartet. Dort wird der Bediener um die Eingabe der wichtigsten Installationsdaten gebeten (z.B. die Datenbank-Zugangsdaten). Diese Daten werden verifiziert und schliesslich in die Konfigurationsdatei geschrieben. Nach dem Import der Start-Datenbank und dem Eintragen der eingegebenen Daten erstellt das Installprogramm die go-Datei und beendet sich selbst. Das Install-Programm kann sich auch selbst löschen, wenn das sinnvoll ist.

DB-Updates, -Backups

Es reicht in der Regel aus, den Maintainance-Mode über die Sicherungsdatei einzuschalten. Eine kurze Sicherheitspause (damit laufende Prozesse fertig werden können) genügt, um den sicheren Ablauf zu gewährleisten.

Auto-Updates

Etwas komplexer ist der Ablauf bei einem Auto-Update. Hier muss zum einen wieder ein Extra-Programm, dass vollständig unabhängig vom Core ist, benutzt werden. Zum Anderen muss man verhindern, das von aussen teilgeänderte Programmpfade aufgerufen werden. Der Austausch der Eintrittsdateien (z.B. index.php, Console/cake) durch spezielle Maintainance-Versionen ist daher der erste Schritt nach dem Warten auf das Ende aller laufenden Prozesse. Dann erfolgt der Austausch der Projekt-Dateien mit Ausnahme der Eintrittsdateien. Sind alle Dateien fertig getauscht, können abschliessend die Eintrittsdateien selbst ausgetauscht werden. Zu guter Letzt erfolgt das Abschalten des Maintainance-Modes.

simplify installation process

  • move all file-based configurations to database configuration
  • automatically run migrations on first application call after updating => work already in progress
  • a notification "new version available - click here to update" would be really cool :-)
  • i am sure there are plenty of other important things to do to make installation and update easier

Automatisierter Urlaubsmodus für Hersteller

Funktion: Zeitraum festlegen können wann der Urlaub beginnt und endet, also wann der Hersteller bzw. die Produkte automatisch deaktiviert und nach dem Urlaub aktiviert werden sollen.

Die gleiche Logik auch für den gesamten Shop zum automatischen deaktivieren und aktivieren mit Zeitraumeinschänkung. Derzeit hier einstellbar: (Einstellungen/Bestellfunktion aktiviert)

AP05: Mehrsprachigkeit implementieren - Englische Version der Software erstellen

Ziel ist es, die gesamte Software in eine andere Sprache übersetzbar zu machen. Ziel ist es nicht, eine Installation in mehreren Sprachen anzuzeigen. Da Foodcoops lokal agieren, ist das nicht relevant. Es würde enormer Zusatzaufwand entstehen (doppelte Pflege von Produktnamen, Beschreibungen usw).

Es gilt also auch nach der Umsetung: Eine Installation - eine Sprache. Aber diese soll ausgewählt werden können.

Folgendes muss übersetzt / lokalisiert werden:

andere tools:

hide blog posts of private manufacturers for guests

currently blog posts that are related to manufacturers with the flag "is_private" are shown for logged out users (guests).

/View/BlogPosts/detail.ctp
/View/BlogPosts/index.ctp
/View/Pages/home.ctp

also adapt backend to inform the blog author about this. it might be hard to understand why the blog post does not appear.
/Plugin/Admin/View/BlogPosts/edit.ctp

please also consider the links to prev / next blog post on /View/BlogPosts/detail.ctp

Blog Artikel: Automatische Bilder-Zuordnung

Bei Neuerstellung eines Blogartikels. Wird ein Hersteller dem Artikel zugeordnet wäre es praktisch wenn automatisch das Logo des Herstellers als Bild ausgewählt ist und man nicht extra ein Bild hochladen muss.

make all unit tests run with one call

  • create a test suite which contains all tests of the project (it should include all existing AllTestsTest.php files), so far the one in /Test/Case and /Plugin/Admin/Test/Case

AP02: CakePHP Update to Version 3

collection of important information about a possible update of CakePHP to Version 3

  • refactor frontend

  • Enable PHP 7.2 in .travis (CakePHP2 needs php-mcrypt)

  • use built-in migrations (Phinx) https://book.cakephp.org/3.0/en/phinx.html

  • all unit tests ok

  • refactor backend

  • refactor network plugin

  • Up-to-date version of asset packer can be used

  • PHPUnit - Version 6 can be used and not the old PHPUnit 3.7

  • New ORM - Better performance

  • Better I18N - do update before #9

http://stackoverflow.com/questions/30579210/difference-of-cakephp2-and-cakephp3

Kommentarfunktion für Produkt

Kommentarfunktion für den Besteller

  • Kommentarfunktion beim Artikel z.b bei Jungpflanzen, Sortenwunsch
    oder Gemüsekiste, welches Gemüse nicht gewünscht ist
    oder bei Sammelbestellungen wenn es Mindestbestellmengen gibt um anzugeben wie viel ich nehmen würde wenn die Menge nicht erreicht wird um zu bestellen.

  • Diese Funktion im Herstellerbereich bzw. bei der Artikelverwaltung für die Hersteller zum aktivieren und deaktivieren.

  • Kommentar auch in den Bestellisten.

AP12: Automatisierte Bestellzeiträume für Produkte, die nicht wöchentlich verfügbar sind

bei unserer foodcoop haben wir gerade das umgekehrte problem. und zwar vergessen die hersteller mit eingeschränkten bestellzeiten oder sammelbestellungen immer wieder ihre produkte offline zu stellen.
das heißt es wäre gut wenn beim online stellen eines produktes gleich einzustellen ist wann es offline gehen soll.
dafür müssen bei aktiv genau die selben dinge auszuwählen sein wie bei urlaubsmodus. und zusätzlich ein hakerl mit immer aktiv. wenn hakerl an, dann keine datumsauswahl möglich. wenn bei immer aktiv kein hakerl, dann datumsauswahl.

AP09: Cronjobs mit Ausfallsicherheit

The existing cronjob system requires console access and is not very fail safe. My thoughts for discussion (in German again) will follow asap.

send order reminder emails only to customers

i had to activate the cronjob EmailOrderReminder for a foodcoop that did not use the feature before, so the flag if a customer wants to receive those emails was not questioned when they registered. therefore i simply changed the flag "newsletter" in the table "customer" to 1 for all customers.
manufacturers and Configure::read('app.hostingEmail') also received this email (and should not)

Lieferpause für gesamte Foodcoop eintragen

siehe kommentare in #75
vielleicht wie die lieferpause bei den herstellern implementieren (dropdown mit freitagen)

info von @veronimus
"Besser wäre das Ganze überhaupt über eine Lieferpause, die für alle ProduzentInnen auswählbar ist, abzuwickeln."

benachrichtungs-einstellungen für hersteller verbessern

für die umsetzung des issues #69 sind anpassungen für die hersteller-benachrichtigungen notwendig

todos

  • neue seite im hersteller-login: "einstellungen" (auch für admins änderbar)
  • die punkte aktiv, urlaubsmodus und nur für mitglieder sichtbar ziehen um von profil zu einstellungen
  • hersteller können diese einstellungen selbst bearbeiten
  • neue benachrichtigungs-einstellungen für den empfang von diversen automatisierten emails (unter anderem der empfang von emails bei sofort-bestellungen

Ansprechperson für Hersteller

Es wäre schön, wenn man jedem Hersteller ein Mitglied als "Ansprechperson" zuweisen kann. Name, E-Mail-Adresse und Telefonnummer sollen dann für den Hersteller ersichtlich sein. Kein Pflichtfeld.

simplify running unit tests

in database.php the $default config needs to be set to $test config before running unit tests - as most of them are integration tests with database access and only a few are real unit tests.

task
manage somehow that the db config is changed automatically as soon as unit tests are run - and change it back as well

hints
a lot of tests work with "simple browser" calls. simple browser is a php browser. changing the database always on simple test calls is not enough, because some cron jobs (order lists, invoicesd) also work with simple browser. maybe attaching a header in test context will be a solution worth trying

AP14: Mitgliedskonto löschen

Wird vorgezogen in Q2/2018 wegen DSGVO

members (table fcs_customer) can only be deactivated, not deleted so far.

idea 1 - used for implementation
delete members completely from db: the problem with this idea is, that associated records (eg. orders, adresses, payments, action logs) become orphaned and this should be avoided.

idea 2 - not used for implementation
using a delete-flag: the problem here is, the field email address then is still marked as "used" for cake's built in "unique" validator. the user could not register again with the same email address. and the record is still saved in the database (privacy problem). the validator could be exchanged by a custom validator which considers the delete flag, but the privacy problem would stay.

ps: do not forget to delete / mark as deleted the associated address record!

button in profil “Mitgliedskonto löschen”

Prüfungen

  • Guthaben 0, Stundenkonto 0?
  • keine nicht verrechneten Bestellungen
  • nicht zugeordnet als Ansprechperson
  • was ist mit als für pfand zurückgelegtes guthaben? (rote zahl bei mitglieder / summe guthaben)

AP07: Änderung des Preises eines bestellten Produktes durch Eingabe des gelieferten Gewichts

der preis für nullpreis-artikel kann geändert werden, in dem man den neuen preis einträgt. dies ist fehleranfällig, weil meistens die tatsächliche menge bekannt ist und der daraus resultierende preis selbst berechnet werden muss.

  • man soll also die neue menge eintragen können und der preis berechnet sich automatisch
  • zur umsetzung braucht man ein neues feld / "preis pro einheit"
  • der preis pro einheit soll automatisch bei der langen Beschreibung (Lebensmittelkennzeichnung) aufscheinen
  • auch für varianten umsetzen

Action Log needs additional features

While doing first work on something happening unattended I found the Action Log is not suitable for unattended processes and the existing user roles are not supported well.

At the moment the action log is a simple list to track user actions. This is true also for logged in Admins and Super Admins. There is a type definition in the Model Class, but no documentation about what it is designed for or how to use it.

I already added a feature to have entry types Info, Warning and Failure. This enables users that view the log to see import entries easier. But the way these are now implemented is not very nice, because the Action Log doesn't support really flexible Log usage. There is too many types, which do differ only in titles and a not-really-working user role support.

Action Log should be much more objectified. A Log Entry is an Event Object, with a set of basic properties like "Importance" (info, warning, failure, fatal errors), "Minimum User Role To View", "Date of event". If applicable there can be more Infos attached to it (Who caused the Event, Which object was concerned, Where happened the Event, What exactly happened, Why did it happen). The Event object should have methods attached to it: View-Method to transform its content into a table row, Log-Method to store it in the DB and perhaps send an Email to a Super Admin that such an Event happened, maybe a Delete-Method.

uploading a new slider image is buggy

the size is defined as 905px, but every uploaded image gets a max size of 800px. makes the images look blurry
i guess the problem is in Admin/Controller/ToolsController.php saveUploadedImage

create database migrations

https://phinx.org/ seems to be a good migration tool

integration should require the database credentials from cake's database.php

for updating from older versions, migrations should ideally be triggered by accessing a url (for users who host their fcs-installation and are not familiar with the console)
this url should be protected for superadmins. eg /admin/configurations/updateDatabase (ConfigurationsController is only allowed for superadmins)

currently we have manual "migration tool" :-) (Config/sql/migrations/v.x.x.x)

AP13: Reihenfolge der bestellten Produkte in Listen ändern

there are four lists that show the ordered products (table: order_details)

  1. admin / order details (Bestellte Artikel)
  2. order confirmation email (after placing an order)
  3. pdf that is created after clicking "Bestellungen als PDF generieren" on admin / orders ("Bestellungen")
  4. cart (Warenkorb) - after clicking on "Warenkorb anzeigen" (eventuelly also re-order the products in the cart that is shown while shopping

all those lists are ordered alphabetically by product.name, please change that to manufactuer.name (ASC) and then product.name (ASC). this will make it easier to collect the products in the shop, because usually they are sorted by manufacturer.

this won't be possible by cake's find function, because data is taken from order_details => product => manufacturer and sorting is only possible up to second level. maybe use Set::sort().

also add a configuration that allows sorting by "Product.name" and "Manufacturer.name" - maybe there are foodcoops who prefer the old way of sorting.

remove trailing whitespace from source code

the project's source code contains a lot of trailing whitespace which should be removed.

maybe there a git hooks that can be used - ideally integrated in github and not in the local git repository, so that it's guaranteed thet future commits do not add new trailing whitespace and everything is kept nice and clean :-)

AP04: Vergangene Bestellungen in Warenkorb laden

info von dax:

"Was wirklich helfen würde is a dauerbestellfunktion, also z.B i hob fix jede wochen mei brot, milch, gemüsekistl im warenkorb (außer i duas manuell außa) und bestell zusätzlich extraguzzis"

@gueterwege: vielleicht könnt ihr noch mehr infos dazuschreiben?

AP08: Lagerbestand für Lagerprodukte steuern

wir haben einige produkte im abhollager auf lager. der lagerbestand lässt sich derzeit nur schwer mithilfe der software managen. gut wäre eine neue Rubrik mit Lagerbestand. Weil: Wenn die rubrik Anzahl null ist, dann kann nicht mehr bestellt werden. Das ist für die Lagerbestandleute schlecht, weil sie würden ja eh rechtzeitig die fehlenden Produkte nachbringen. dass bei anzahl null nicht bestellt werden kann ist für Gemüse aber gut, weil wenn nicht mehr als 2 Kohlrabi da sind, dann sollen auch nicht mehr als zwei bestellt werden können. mit einer zweiten rubrik könnten wir beides haben.

super wäre auch ein warnmail an Produzent/innen wenn Lagerbestand leer ist.

Blog-Artikel an Mitglieder versenden

Hallo,
wir kommunizieren bei unserer Foodcoop über einen Mail Verteiler und über die Blog Einträge vom Foodcoopshop. Dieses zweigleisige System ist oftmals mühsam oder führt zu Missverständnissen.
Außerdem ist es kompliziert den Abholdienst vor Ort zu erreichen. zB für Hersteller, die spontan Lieferschwierigkeiten haben, oder für Mitglieder die ihre Produkte nicht abholen können.
Ein Kommunikationstool auf der Homepage wünschen wir uns daher.
was soll es können:

  • blog Einträge an Mitglieder versenden
  • "Chat" Seite für Mitglieder, dann wäre zum Beispiel Abholdienst vor Ort erreichbar.

add unit tests for payment actions

the payment actions "add" and "delete" are used by a lot of different payment types (paybacks, deposit, product, member_fee) and especially the add-function does a lot of different things.

task
create unit tests, so that in a next step, these functions can be implemented in a better way

Enforce coding standards as pre-push git hooks

In CONTRIBUTING.md PSR-2 coding standards are required. These shall be enforced using gits pre-push hook.

This can be acheived by:

  • Install PEAR CodeSniffer using composer
  • Add a (php) script to perform coding standard tests (on all files or selected ones)
  • Add a post-install and post-update script to composer.json to set pre-push hook to use the coding standard script

There could be an optional script to use CodeBeautifierFixer (included with CodeSniffer) to automatically correct violations and commit these changes. I personally prefer doing the changes manually, especially before pushing from local to origin.

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.