Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

fr:specs:point-of-sale [2016/08/26 21:06] (Version actuelle)
Ligne 1: Ligne 1:
 +====== Point de vente ======
 +{{tag>​spec sales}}
 +
 +Ekylibre utilise Pastèque comment logiciel de point de vente. Il implémente l'API serveur pour qu'il puisse être utilisé directement depuis une appli Pastèque cliente.
 +
 +Ekylibre doit pouvoir échanger avec les POS Pastèque. Pour cela il doit être compatible avec l'​[[http://​redmine.scil.coop/​projects/​pt-server/​wiki/​Api_doc5|API v5 de Pastèque]] et les [[http://​redmine.scil.coop/​projects/​pt-server/​wiki/​Api_generals|concepts généraux]].
 +
 +===== Méthodes =====
 +
 +==== Principe général ====
 +
 +Un middleware (rack) redirigera les requêtes Pastèque vers les bons contrôleurs.
 +Exemple de mise en place du //​middleware//​ :
 +<code ruby>
 +namespace :pasteque do
 +  namespace :v5 do
 +    pasteque_v5
 +  end
 +end
 +</​code>​
 +
 +Le //​middleware//​ permettra de convertir les « requêtes Pastèque » en « requêtes Rails ». Voir ''​rack-proxy''​ ou ''​rack-rewrite''​.
 +==== Authentification ====
 +
 +Pour s'​authentifier sur le serveur, il faut transmettre le nom d'​utilisateur et mot de passe à chaque requête via les paramètres ''​user''​ et ''​password''​.
 +
 +==== Correspondances API et ressources ====
 +Chaque API de pastèque correspond à un contrôleur REST d'​Ekylibre se trouvant dans ''/​pasteque/​v5/''​. Le nom du contrôleur sous Ekylibre est correspond au nom de l'API Pastèque en remplaçant le "​API"​ final par "​Controller"​. Exemple : ''​VersionAPI''​ => ''​VersionController'',​ ''​CurrenciesAPI''​ => ''​CurrenciesController'',​ ''​CashMvtsAPI''​ => ''​CashMvtsController''​.
 +
 +^ Ressource Pastèque ​  ​^ ​    ​Définition ​      ​^ ​  ​^ ​    ​Modèle Ekylibre ​     ^
 +| VersionAPI ​          | Version de l'​API ​    ​| ​  | -                        |
 +| CashRegistersAPI ​    | Caisse enregistreuse |   | Cash                     |
 +| UsersAPI ​            | Utilisateurs ​        ​| ​  | User                     |
 +| RolesAPI ​            | Rôles (avec droits) ​ |   | Role                     |
 +| PlacesAPI ​           | Places et tables dans un restaurant |   | Product (filtrés) |
 +| CurrenciesAPI ​       | Monnaies des types de vente disponibles |   | Nomenclature::​Currency définies par les types de ventes utilisables |
 +| TaxesAPI ​            | TVA et taux          |   | TaxCategory ~ Nomenclature::​TaxNature,​ Taxes ~ Taxes |
 +| TariffAreasAPI ​      | Zones tarifaires ​    ​| ​  | TariffArea ~ Catalog, Price ~ CatalogPrice |
 +| ResourcesAPI ​        | Image, texte... ​     | ≠ | ∅                        |
 +| CategoriesAPI ​       |Catégories d'​articles |   | ProductNatureCategory ​   |
 +| ProductsAPI ​         | Article à la vente   ​| ​  | ProductNatureVariant ​    |
 +| ImagesAPI ​           | Images ​              ​| ​  | Attaque différents modèles |
 +| CompositionsAPI ​     | Packs de produits ​   | ≠ | ∅                        |
 +| [[#​cashes|CashesAPI]] | Session ​            | ≠ | **CashSession** ​         |
 +| DiscountProfilesAPI ​ | Profils de remise ​   | ≠ | ∅                        |
 +| CustomersAPI ​        | Clients ​             |   | Entity.clients ​          |
 +| LocationsAPI ​        | Lieux de stockage ​   | ≠ | Product (filtrés) ​       |
 +| StocksAPI ​           | Niveaux de stock     ​| ​  | Product ​                 |
 +| AttributesAPI ​       | Attributs d'​options ​ | ≠ | ∅                        |
 +| [[#​tickets|TicketsAPI]] |                   ​| ​  | Affair ​                  |
 +| CashMvtsAPI ​         |                      | ≠ | CashTransfer ​            |
 +
 +=== CashRegisters ===
 +
 +Les ''​Cash''​ de nature "​cash_box"​ sous Ekylibre doivent disposer de 2 informations de plus :
 +  * ''​container_id''​ (facultatif) référençant un produit (comme une ''​BuildingDivision''​ par exemple) qui précise l'​endroit où se trouve la caisse.
 +  * ''​last_number''​ contenant le dernier numéro de ticket utilisé pour la caisse. (Même principe que dans ''​Sequence''​)
 +
 +
 +=== Users ===
 +
 +La notion de ''​card''​ sous Pastèque n'est pas encore défini et ne sera pas implémenté dans l'​immédiat.
 +
 +Pour la mise à jour du mot de passe, il suffit d'​utiliser la méthode ''​update''​ :
 +<code ruby>
 +user = User.find_for_authentication(email:​ email)
 +if user and user.valid_password?​(old_password)
 +  user.password = new_password
 +  user.password_confirmation = new_password
 +  user.save!
 +end
 +</​code>​
 +
 +=== Rôles ===
 +
 +Il existe la correspondance des tables/​modèles entre Pastèque et Ekylibre via un transcodage des droits.
 +
 +Les permissions sont attendues sous forme de liste de noms séparés par des espaces :
 +  fr.pasteque.pos.panels.JPanelCloseMoney fr.pasteque.pos.panels.JPanelPrinter
 +
 +== Liste des droits ==
 +^ ID                                                  ^ Nom                                                  ^ Droit Ekylibre ^
 +| ''​button.opendrawer'' ​                         | Ouvrir le tiroir caisse ​                             |
 +| ''​button.openmoney'' ​                          | Ouvrir la caisse ​                                    | ''​open-cash_sessions''​ |
 +| ''​button.print'' ​                              | Imprimer un aperçu de ticket ​                        |
 +| ''​fr.pasteque.pos.config.JPanelConfiguration''​ | Accéder à l'​écran de configuration ​                  |
 +| ''​fr.pasteque.pos.customers.CustomersPayment''​ | Accéder à l'​écran de règlement client ​               |
 +| ''​fr.pasteque.pos.panels.JPanelCloseMoney'' ​   | Clôturer la caisse ​                                  | ''​close-cash_sessions''​ |
 +| ''​fr.pasteque.pos.panels.JPanelPayments'' ​     | Effectuer des mouvements de caisse ​                  |
 +| ''​fr.pasteque.pos.panels.JPanelPrinter'' ​      | Accéder à l'​écran d'​afficheur client et d'​imprimante |
 +| ''​fr.pasteque.pos.panels.ReprintZTicket'' ​     | Rechercher et imprimer d'​anciens tickets Z           |
 +| ''​fr.pasteque.pos.sales.JPanelTicketEdits'' ​   | Accéder à l'​écran d'​édition des ventes ​              | ''​write-sales''​ |
 +| ''​fr.pasteque.pos.sales.JPanelTicketSales'' ​   | Accéder à l'​écran des ventes ​                        | ''​read-sales''​ |
 +| ''​Menu.BackOffice'' ​                           | Ouvrir l'​interface de gestion ​                       |
 +| ''​Menu.ChangePassword'' ​                       | Changer le mot de passe de l'​utilisateur ​            |
 +| ''​payment.cash'' ​                              | Autoriser le paiement en espèces ​                    |
 +| ''​payment.cheque'' ​                            | Autoriser le paiement par chèque ​                    |
 +| ''​payment.debt'' ​                              | Autoriser le paiement par dette                      |
 +| ''​payment.free'' ​                              | Autoriser le paiement gratuit ​                       |
 +| ''​payment.magcard'' ​                           | Autoriser le paiement par carte bleue                |
 +| ''​payment.paper'' ​                             | Autoriser le paiement par coupon ​                    |
 +| ''​payment.prepaid'' ​                           | Autoriser le paiement par pré-paiement ​              |
 +| ''​refund.cash'' ​                               | Autoriser le remboursement en espèces ​               |
 +| ''​refund.cheque'' ​                             | Autoriser le remboursement par chèque ​               |
 +| ''​refund.magcard'' ​                            | Autoriser le remboursement par carte bleue           |
 +| ''​refund.paper'' ​                              | Autoriser le remboursement par coupon ​               |
 +| ''​refund.prepaid'' ​                            | Autoriser le remboursement par pré-paiement ​         |
 +| ''​sales.ChangeTaxOptions'' ​                    | Changer de taxe                                      |
 +| ''​sales.EditLines'' ​                           | Modifier les lignes d'un ticket ​                     |
 +| ''​sales.EditTicket'' ​                          | Modifier un ticket ​                                  |
 +| ''​sales.PrintTicket'' ​                         | Imprimer un ticket ​                                  |
 +| ''​sales.RefundTicket'' ​                        | Rembourser un ticket ​                                |
 +| ''​sales.Total'' ​                               | Enregistrer le paiement d'un ticket ​                 |
 +
 +=== Places ===
 +
 +Sous Ekylibre, nous avons l'​équivalence avec les ''​BuildingDivision''​ qui représente des salles (//​floors//​). Pour le mode "​Restaurant"​ de Pastèque, le niveau en-dessous est le niveau "​table"​.
 +
 +Pour cela, il est nécessaire de rajouter une variété "​table"​. (À ajouter dans la nomenclature pour l'​instant).
 +
 +Pour la détermination de ''​x''​ et ''​y''​ au sens Pastèque, il n'est pas possible de les définir et stocker sous Ekylibre dans l'​immédiat. Dans une vision cours-terme,​ nous allons simuler qu'il y 4 colonnes de tables, triées par **id**.
 +Exemple :
 +<​code>​
 +    1      2      5      12
 +    15     ​17 ​    23
 +</​code>​
 +
 +=== TariffAreas ===
 +L′''​id''​ sous Ekylibre sera utilisé pour fournir le ''​dispOrder''​ des ''​TariffArea''​s.
 +=== Resources ===
 +Retourner du 404/''​NOT_FOUND''​ pour l'​instant.
 +
 +=== Categories ===
 +Il n'y a pas d'​arborescence de catégories à implémenter car aucune sous Ekylibre.
 +=== Compositions ===
 +
 +Les **compositions** sont des produits vendus par ensemble. Exemple : "3 brosses à dent".
 +
 +Il n'y a pas d'​équivalence dans Ekylibre. Non nécessaire pour le client Pastèque.
 +
 +<WRAP center round important 60%>
 +Le serveur doit répondre comme si la table existait mais vide.
 +</​WRAP>​
 +
 +=== Cashes ===
 +
 +Les **ouvertures de caisse** sont définies par un modèle spécifique : ''​CashSession''​. Ce modèle contient entre autres :
 +  * ''​cash_id''​ : Référence à la caisse (''​Cash''​ sous ERP / ''​cashRegisterId''​ sous Pasteque)
 +  * ''​started_at''​ : Début de l'​ouverture
 +  * ''​stopped_at''​ : Fin de l'​ouverture
 +  * ''​currency''​ : Monnaie (cf Nomenclature)
 +  * ''​noticed_start_amount''​ : Montant réel en caisse au début
 +  * ''​noticed_stop_amount''​ : Montant réel en caisse à la fin
 +  * ''​expected_stop_amount''​ : Montant attendu en caisse à la fin
 +  * ''​sequence_id''​ : Référence à la séquence utilisée par cette caisse. **Séquence non périodique obligatoirement**.
 +
 +De plus, il faut un lien facultatif entre ''​Affair''​ et ''​CashSession''​ pour la production de Z-tickets ((Un **Z-ticket** est un ticket récapitulatif de l'​ensemble des tickets pour une session donnée.)).
 +
 +=== DiscountProfiles ===
 +
 +Les **profils de réduction** sont un modèle spécifique.
 +
 +<WRAP center round important 60%>
 +Le serveur doit répondre comme si la table existait mais vide.
 +</​WRAP>​
 +
 +=== Customers ===
 +
 +<WRAP center round important 60%>
 +"​Prepaid Amount"​ : Le fonctionnement reste à déterminer avec l'​équipe Pastèque.
 +</​WRAP>​
 +
 +
 +=== Locations ===
 +
 +Les ''​Locations''​ sont des emplacements générique au niveau ''​Building''​ pour l'​instant.
 +
 +=== Stocks ===
 +
 +La ''​population''​ des produits est utilisée sous Ekylibre pour fournir la quantité des stocks.
 +
 +''​max'',​ ''​attrSetInstId''​ et ''​security''​ ne sont pas implémentés pour l'​instant.
 +=== Attributes ===
 +
 +Les **attributs** permettent de spécifier les options pour un produit. Exemple : Pour des t-Shirt, la taille (S, M, L, XL, XXL...) et la couleur (rouge, vert, noir...).
 +
 +<WRAP center round important 60%>
 +Le serveur doit répondre comme si la table existait mais vide.
 +</​WRAP>​
 +=== Tickets ===
 +
 +Un **ticket** correspond approximativement à une ''​Affair''​ à **1** vente (''​Sale''​) et **n** règlements (''​IncomingPayment''​) chez Ekylibre. Cela définit une vente et les règlements associés.
 +
 +Pour identifier clairement les tickets au sein des affaires, une colonne booléenne doit être ajoutée à la table ''​affairs''​.
 +<code ruby>
 +add_column :affairs, :ticket, :boolean, null: false, default: false
 +</​code>​
 +Un //scope// "​tickets"​ doit être défini au niveau du modèle ''​Affair''​ pour les retrouver en se basant sur ce booléen.
 +
 +Pas de gestion des attributs au niveau des lignes de ticket.
 +
 +== Partage de ticket ==
 +
 +Pas d'​équivalence pour l'​instant. Tous les tickets peuvent être considéré comme partagés.
 +
 +== Paiements ==
 +
 +Les types de paiement sous Pastèque sont : ''​cash'',​ ''​cheque'',​ ''​debt'',​ ''​free'',​ ''​magcard'',​ ''​paper'',​ ''​prepaid''​ (cf. la liste des droits sur types de paiement).
 +
 +Pour réaliser la correspondance avec les types d'​encaissement (''​IncomingPaymentMode''​) sous Ekylibre, il faut...
 +=== CashMvts ===
 +
 +Les **mouvements d'​espèces** sont les entrées/​sorties d'​argent au cours de l'​ouverture de la caisse. Ils permettent de rajouter ou sortir des sous de la caisse.
 +
 +Seuls les types ''​cashin''​ et ''​cashout''​ sont disponibles comme type de paiement.
 +
 +Pour l'​instant,​ aucun moyen de faire la correspondance avec Ekylibre de manière juste.. Donc l'​opération d'​ajout échouera à chaque fois via un retour ''​rej''​.
 +==== Correspondances des actions ====
 +
 +=== Actions génériques ===
 +
 +^ Mode ^ Pastèque ^ Ekylibre ^
 +| GET  | get      | show         |
 +| GET  | getAll ​  | index        |
 +| POST | update ​  | update ​      |
 +| POST | delete ​  | destroy ​     |
 +
 +=== Actions spécifiques ===
 +
 +^ Mode ^         ​Pastèque ​         ^          Ekylibre ​           ^
 +| POST | UsersAPI#​updPwd ​          | users#​update_password ​           |
 +| GET  | CurrenciesAPI#​getMain ​    | currencies#​main ​                 |
 +| GET  | CategoriesAPI#​getChildren | categories#​children ​             |
 +| GET  | ProductsAPI#​getCategory ​  | product_nature_variants#​category |
 +| GET  | CashesAPI#​search ​         | sessions#​search ​                 | 
 +| GET  | CustomersAPI#​getTop ​      | customers#​index?​mode=top ​        |
 +| POST | CustomersAPI#​addPrepaid ​  | customers#​update_prepaid ​        |