diff --git a/kfet/static/kfet/src/kpsul/managers/account_manager.js b/kfet/static/kfet/src/kpsul/managers/account_manager.js
index 3ee556a3..bae3b2ff 100644
--- a/kfet/static/kfet/src/kpsul/managers/account_manager.js
+++ b/kfet/static/kfet/src/kpsul/managers/account_manager.js
@@ -1,11 +1,13 @@
class AccountManager {
// Classe pour gérer la partie "compte" de K-Psul
// Devrait être la seule interface entre le JS de K-Psul et la logique des comptes.
- constructor() {
+ constructor(kpsul) {
// jQuery elements
this._$input = $("#id_trigramme");
this._$container = $("#account");
- this._$article_select = $("#article_autocomplete")
+
+ // Parent class
+ this.kpsul = kpsul
// Subordinated classes
this.account = new Account({ "trigramme": "" });
@@ -15,6 +17,10 @@ class AccountManager {
this._init_events();
}
+ get is_empty() {
+ return !this.account.is_valid()
+ }
+
get data() {
return this.account.toJSON();
}
@@ -51,6 +57,10 @@ class AccountManager {
this.update();
}
+ focus() {
+ this._$input.focus()
+ }
+
update() {
var trigramme = this._$input.val().format_trigramme();
this.account.set({ "trigramme": trigramme })
@@ -67,9 +77,9 @@ class AccountManager {
_on_success() {
// On utilise l'objet global window pour accéder aux fonctions nécessaires
this.account.render();
- this._$article_select.focus();
- window.updateBasketAmount();
- window.updateBasketRel();
+ this.kpsul._$article_select.focus();
+ this.kpsul.updateBasketAmount();
+ this.kpsul.updateBasketRel();
}
reset(hard_reset = false) {
diff --git a/kfet/static/kfet/src/kpsul/managers/checkout_manager.js b/kfet/static/kfet/src/kpsul/managers/checkout_manager.js
new file mode 100644
index 00000000..18f8f3fc
--- /dev/null
+++ b/kfet/static/kfet/src/kpsul/managers/checkout_manager.js
@@ -0,0 +1,47 @@
+class CheckoutManager {
+ constructor(kpsul) {
+ // jQuery elements
+ this._$input = $("#id_checkout_select");
+ this._$container = $("#checkout");
+
+ // Parent class
+ this.kpsul = kpsul
+
+ // Subordinated classes
+ this.checkout = new Checkout();
+
+ // Initialization
+ this._init_events();
+ }
+
+ _init_events() {
+ // L'input change ; on met à jour la caisse
+ this._$input.on("input", () => this.update())
+ }
+
+ update() {
+ var id = this._$input.val();
+ this.checkout.set("id", id);
+ this.checkout.fetch_all({
+ "success": this._on_success.bind(this),
+ })
+ }
+
+ ws_update(ws_data) {
+ for (const entry of ws_data) {
+ if (entry.id == this.checkout.id)
+ this.checkout.set("balance", entry.balance);
+ }
+
+ this.checkout.render()
+ }
+
+ _on_success() {
+ this.checkout.render()
+
+ if (this.kpsul.account_manager.is_empty)
+ this.kpsul.focus("account");
+ else
+ this.kpsul.focus("articles");
+ }
+}
\ No newline at end of file
diff --git a/kfet/static/kfet/src/kpsul/models/account.js b/kfet/static/kfet/src/kpsul/models/account.js
index 8f5d7e6c..f6a88ea3 100644
--- a/kfet/static/kfet/src/kpsul/models/account.js
+++ b/kfet/static/kfet/src/kpsul/models/account.js
@@ -1,15 +1,15 @@
var Account = Backbone.Model.extend({
defaults: {
- 'id': 0,
- 'name': '',
- 'email': '',
- 'is_cof': '',
- 'promo': '',
- 'balance': '',
- 'is_frozen': false,
- 'departement': '',
- 'nickname': '',
+ "id": 0,
+ "name": "",
+ "email": "",
+ "is_cof": "",
+ "promo": "",
+ "balance": "",
+ "is_frozen": false,
+ "departement": "",
+ "nickname": "",
},
url: function () {
@@ -18,13 +18,12 @@ var Account = Backbone.Model.extend({
reset: function () {
// Réinitialise les attributs du modèle à leurs défaults, sauf le trigramme qui est bind à l'input.
- // On n'utilise pas .clear() car on ne veut pas clear le trigramme.
this.set(this.defaults)
},
parse: function (resp, options) {
- if (_.has(resp, 'balance')) {
- return _.extend(resp, { 'balance': parseFloat(resp.balance) });
+ if (_.has(resp, "balance")) {
+ return _.extend(resp, { "balance": parseFloat(resp.balance) });
} else {
return resp;
}
@@ -32,9 +31,13 @@ var Account = Backbone.Model.extend({
view: function () {
var view_class;
+<<<<<<< HEAD
if (this.is_empty_account()) {
+=======
+ if (!this.is_valid()) {
+>>>>>>> New checkout model and manager
view_class = EmptyAccountView
- } else if (this.get("trigramme") == 'LIQ') {
+ } else if (this.get("trigramme") == "LIQ") {
view_class = LIQView
} else {
view_class = AccountView
@@ -46,15 +49,20 @@ var Account = Backbone.Model.extend({
this.view().render();
},
+<<<<<<< HEAD
is_empty_account: function () {
return (this.id == 0)
+=======
+ is_valid: function () {
+ return (this.id != 0)
+>>>>>>> New checkout model and manager
},
})
var AccountView = Backbone.View.extend({
- el: '#account',
- buttons: '.buttons',
+ el: "#account",
+ buttons: ".buttons",
id_field: "#id_on_acc",
props: _.keys(Account.prototype.defaults),
@@ -70,7 +78,7 @@ var AccountView = Backbone.View.extend({
},
get_is_cof: function () {
- return this.model.get("is_cof") ? 'COF' : 'Non-COF';
+ return this.model.get("is_cof") ? "COF" : "Non-COF";
},
get_balance: function () {
@@ -85,9 +93,9 @@ var AccountView = Backbone.View.extend({
} else if (this.model.get("balance") < 0) {
return 'neg';
} else if (this.model.get("balance") <= 5) {
- return 'low';
+ return "low";
} else {
- return 'ok';
+ return "ok";
}
},
@@ -115,24 +123,24 @@ var LIQView = AccountView.extend({
},
attr_data_balance: function () {
- return 'ok';
+ return "ok";
}
})
var EmptyAccountView = AccountView.extend({
get: function () {
- return '';
+ return "";
},
attr_data_balance: function () {
- return '';
+ return "";
},
get_buttons: function () {
/* Léger changement de fonctionnement :
on affiche *toujours* le bouton de recherche si
le compte est invalide */
- var buttons = '';
+ var buttons = ``;
var trigramme = this.model.get("trigramme")
if (trigramme.is_valid_trigramme()) {
trigramme = encodeURIComponent(trigramme);
diff --git a/kfet/static/kfet/src/kpsul/models/checkout.js b/kfet/static/kfet/src/kpsul/models/checkout.js
new file mode 100644
index 00000000..f9431b04
--- /dev/null
+++ b/kfet/static/kfet/src/kpsul/models/checkout.js
@@ -0,0 +1,118 @@
+var Statement = Backbone.Model.extend({
+ defaults: {
+ "id": 0,
+ "at": "",
+ "balance": 0,
+ "by": "",
+ "checkout_id": 0,
+ },
+
+ parse: function (resp) {
+ return _.extend(resp, { "balance": parseFloat(resp.balance) });
+ },
+
+ is_valid: function () {
+ return this.id != 0;
+ },
+});
+
+var Checkout = Backbone.Model.extend({
+
+ defaults: {
+ "id": 0,
+ "balance": 0,
+ "last_statement": new Statement()
+ },
+
+ url: function () {
+ return django_urls["kfet.kpsul.checkout_data"](this.id);
+ },
+
+ fetch_all: function (options) {
+ var that = this;
+
+ var success = options.success
+ options.success = function (model, resp, options) {
+ ls = that.get("last_statement");
+ ls.set(ls.parse(resp.last_statement));
+ success.call(options.context, model, resp, options);
+ }
+ return this.fetch(options)
+ },
+
+ is_valid: function () {
+ return this.id != 0;
+ },
+
+ parse: function (resp, options) {
+ return _(resp).pick(_.keys(_.omit(this.defaults, "last_statement")))
+ },
+
+ render: function () {
+ if (this.is_valid()) {
+ checkout_view = new CheckoutView({ "model": this });
+ statement_view = new StatementView({ "model": this.get("last_statement") });
+ checkout_view.render();
+ statement_view.render();
+ } else {
+ checkout_view = new EmptyCheckoutView({ "model": this });
+ checkout_view.render();
+ }
+ },
+
+ reset: function () {
+ this.set(this.defaults)
+ },
+
+});
+
+var CheckoutView = Backbone.View.extend({
+ el: "#checkout",
+ buttons: ".buttons",
+ id_field: "#id_checkout",
+
+ props: _.keys(Checkout.prototype.defaults),
+
+ render: function () {
+ for (let prop of this.props) {
+ selector = "#checkout-" + prop;
+ this.$(selector).text(this.model.get(prop));
+ }
+
+ this.$(this.buttons).html(this.get_buttons());
+ $(this.id_field).val(this.model.id);
+ },
+
+ get_buttons: function () {
+ var url_ls_create = django_urls["kfet.checkoutstatement.create"](this.model.id)
+ var url_update = django_urls["kfet.checkout.update"](this.model.id)
+
+ buttons = ``;
+ buttons += ``;
+
+ return buttons
+ }
+})
+
+var EmptyCheckoutView = CheckoutView.extend({
+ get_buttons: function () {
+ return "";
+ },
+})
+
+var StatementView = Backbone.View.extend({
+ el: "#last_statement",
+
+ render: function () {
+ var at = moment.tz(this.model.get("at"), "UTC");
+ var by = this.model.get("by")
+ var balance = this.model.get("balance")
+
+ at = at.tz('Europe/Paris').format('DD/MM/YY à HH:mm');
+ title = "Dernier relevé : "
+ content = `${balance}€ le ${at} par ${by}`
+
+ this.$el.html(title + "
" + content)
+ }
+})
+