diff --git a/forms/ecomerce/basket/index.js b/forms/ecomerce/basket/index.js index 2e2ec1f2..d1880829 100644 --- a/forms/ecomerce/basket/index.js +++ b/forms/ecomerce/basket/index.js @@ -5,8 +5,16 @@ export default new Class({ Template: require('./ui.xml'), async open() { - const isOk = await Hedera.BasketChecker.check(this.conn, this.hash); - if (isOk) await Hedera.Form.prototype.open.call(this); + await Hedera.Form.prototype.open.call(this); + + let orderId = this.$.params.$.id; + if (!orderId) + orderId = localStorage.getItem('hederaBasket'); + if (!orderId) + this.hash.setAll({form: 'ecomerce/pending'}); + else + await Hedera.Basket.check(this.conn, this.hash); + this.$.params.set('id', orderId); }, activate() { @@ -15,7 +23,17 @@ export default new Class({ onConfigureClick() { Htk.Toast.showWarning(_('RememberReconfiguringImpact')); - this.hash.setAll({form: 'ecomerce/checkout'}); + this.hash.setAll({ + form: 'ecomerce/checkout', + id: this.$.params.$.id + }); + }, + + onConfirmClick() { + this.hash.setAll({ + form: 'ecomerce/confirm', + id: this.$.params.$.id + }); }, onDeleteClick(form) { diff --git a/forms/ecomerce/basket/style.scss b/forms/ecomerce/basket/style.scss index f46a077c..47f3f910 100644 --- a/forms/ecomerce/basket/style.scss +++ b/forms/ecomerce/basket/style.scss @@ -1,76 +1,94 @@ -.basket .head { - border-bottom: 1px solid #DDD; -} -.basket .head p { - font-weight: bold; - margin: 0; - padding: 0; - font-size: 1.4rem; - text-align: right; -} -.basket .form > p { - margin: 0; - font-size: 1.4rem; - color: white; - text-align: right; -} - -/* Lines */ - -.basket .line { - display: flex; - align-items: center; - gap: 12px; - margin: 10px 0; - height: 80px; -} -.basket .line:first-child { - margin-top: 0; -} -.basket .line:last-child { - margin-bottom: 0; -} -.basket .line > .delete { - margin: 0 -8px; -} -.basket .line > .photo { - flex: none; - border-radius: 50%; - width: 68px; - height: 68px; - gap: 0; -} -.basket .line > .info { - flex: 1; - overflow: hidden; -} -.basket .line > .info > * { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} -.basket .line > .info > h2 { - font-size: 1rem; - font-weight: normal; - margin: 0; -} -.basket .line > .info > p { - margin: 0; -} -.basket .line > .info > .tags { - color: #777; -} -.basket .line .subtotal { - float: right; -} - -/* Fields */ - -.basket td.available-exceeded input { - background-color: #FCC; -} -.basket .icon > img { - border-radius: 50%; +.hedera-basket { + .head { + border-bottom: 1px solid #DDD; + + & > div > div { + margin: 15px 0; + } + & > div > div:first-child { + margin: 0; + } + p { + margin: 3px 0; + + &.important { + font-size: 1.2rem; + font-weight: bold; + } + } + .total { + + font-weight: bold; + margin: 0; + padding: 0; + font-size: 1.4rem; + text-align: right; + } + } + .form > p { + margin: 0; + font-size: 1.4rem; + color: white; + text-align: right; + } + + /* Lines */ + + .line { + display: flex; + align-items: center; + gap: 12px; + margin: 10px 0; + height: 80px; + } + .line:first-child { + margin-top: 0; + } + .line:last-child { + margin-bottom: 0; + } + .line > .delete { + margin: 0 -8px; + } + .line > .photo { + flex: none; + border-radius: 50%; + width: 68px; + height: 68px; + gap: 0; + } + .line > .info { + flex: 1; + overflow: hidden; + } + .line > .info > * { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + .line > .info > h2 { + font-size: 1rem; + font-weight: normal; + margin: 0; + } + .line > .info > p { + margin: 0; + } + .line > .info > .tags { + color: #777; + } + .line .subtotal { + float: right; + } + + /* Fields */ + + td.available-exceeded input { + background-color: #FCC; + } + .icon > img { + border-radius: 50%; + } } diff --git a/forms/ecomerce/basket/ui.xml b/forms/ecomerce/basket/ui.xml index fd23a819..29e08853 100644 --- a/forms/ecomerce/basket/ui.xml +++ b/forms/ecomerce/basket/ui.xml @@ -1,6 +1,9 @@ + + +
-

ShoppingBasket

+

{{_(params.$.id ? 'Order' : 'ShoppingBasket')}}

+ on-click="this.onConfirmClick()"/>
-
+ + + + SELECT o.id, o.sent, + ag.description agency, v.code method, ad.nickname + FROM myOrder o + JOIN vn.agencyMode ag ON ag.id = o.agencyModeFk + LEFT JOIN myAddress ad ON ad.id = o.addressFk + JOIN vn.deliveryMethod v ON v.id = o.deliveryMethodFk + WHERE o.id = #id; + + + +
-

+

#{{order.id}}
+
+
ShippingInformation
+

+

Delivery at {{Vn.Value.format(order.sent, _('%D'))}}

+

Agency {{order.agency}}

+

{{order.nickname}}

+
+

Total @@ -28,15 +52,16 @@

- + SELECT bi.id, bi.amount, bi.price, i.longName item, i.tag5, i.value5, i.tag6, i.value6, i.tag7, i.value7, i.image, im.updated - FROM myBasketItem bi + FROM myOrderRow bi JOIN vn.item i ON i.id = bi.itemFk LEFT JOIN image im ON im.collectionFk = 'catalog' AND im.name = i.image + WHERE orderFk = #id
diff --git a/forms/ecomerce/catalog/index.js b/forms/ecomerce/catalog/index.js index 8b6eddd9..d9ce71f5 100644 --- a/forms/ecomerce/catalog/index.js +++ b/forms/ecomerce/catalog/index.js @@ -10,7 +10,7 @@ const Catalog = new Class({ let isOk = true; if (!localStorage.getItem('hederaGuest')) - isOk = await Hedera.BasketChecker.check(this.conn, this.hash); + isOk = await Hedera.Basket.check(this.conn, this.hash); else await this.conn.execQuery('CALL mybasket_configureForGuest'); diff --git a/forms/ecomerce/checkout/index.js b/forms/ecomerce/checkout/index.js index df10cd88..03113c1b 100644 --- a/forms/ecomerce/checkout/index.js +++ b/forms/ecomerce/checkout/index.js @@ -44,7 +44,7 @@ export default new Class({ } this.$.lot.assign({ - date: date, + date, method: row.deliveryMethod, agency: row.agencyModeFk, address: row.addressFk @@ -59,11 +59,21 @@ export default new Class({ async onConfirmClick() { this.disableButtons(true); - const query = 'CALL myBasket_configure(#date, #method, #agency, #address)'; + const id = this.$.params.$.id; + const params = Object.assign({}, this.$.lot.$); + + let query; + if (id) { + params.id = id; + query = 'CALL myOrder_configure(#id, #date, #method, #agency, #address)'; + } else { + query = 'CALL myOrder_create(@id, #date, #method, #agency, #address)'; + } + let resultSet; try { - resultSet = await this.conn.execQuery(query, this.$.lot.$); + resultSet = await this.conn.execQuery(query, params); } finally { this.disableButtons(false); } @@ -71,7 +81,7 @@ export default new Class({ if (!resultSet.fetchResult()) return; - if (this.$.orderForm.numRows > 0) + if (id) Htk.Toast.showMessage(_('OrderUpdated')); else Htk.Toast.showMessage(_('OrderStarted')); @@ -80,7 +90,7 @@ export default new Class({ }, onCancelClick() { - if (this.$.orderForm.numRows > 0) + if (this.$.params.$.id) window.history.back(); else this.hash.setAll({form: 'ecomerce/orders'}); diff --git a/forms/ecomerce/checkout/ui.xml b/forms/ecomerce/checkout/ui.xml index f9a32719..59eb31f1 100644 --- a/forms/ecomerce/checkout/ui.xml +++ b/forms/ecomerce/checkout/ui.xml @@ -1,4 +1,7 @@ + + + @@ -8,10 +11,11 @@ - + SELECT m.code deliveryMethod, o.sent, o.agencyModeFk, o.addressFk - FROM myBasket o + FROM myOrder o JOIN vn.deliveryMethod m ON m.id = o.deliveryMethodFk + WHERE o.id = #id + + + - - CALL myBasket_getTax; + + CALL myOrder_getTax(#id); SELECT o.id, o.sent, o.notes, o.companyFk, ag.description agency, v.code method, ad.nickname, ad.postalCode, ad.city, ad.street, t.*, c.credit, myClient_getDebt(NULL) debt - FROM myBasket o + FROM myOrder o JOIN vn.agencyMode ag ON ag.id = o.agencyModeFk LEFT JOIN myAddress ad ON ad.id = o.addressFk JOIN vn.deliveryMethod v ON v.id = o.deliveryMethodFk @@ -17,7 +20,8 @@ IFNULL(SUM(taxableBase), 0) taxableBase, IFNULL(SUM(tax), 0) tax FROM tmp.orderAmount - ) t; + ) t + WHERE o.id = #id; DROP TEMPORARY TABLE tmp.orderAmount, tmp.orderTax; @@ -37,7 +41,7 @@
ShippingInformation

- Delivery at {{Vn.Value.format(order.sent, _('%D'))}} + Delivery at {{Vn.Value.format(order.sent, _('%D'))}}

Agency {{order.agency}} diff --git a/forms/ecomerce/orders/style.scss b/forms/ecomerce/orders/style.scss index 80318bed..6c4fb965 100644 --- a/forms/ecomerce/orders/style.scss +++ b/forms/ecomerce/orders/style.scss @@ -36,4 +36,3 @@ .orders .htk-list .total { float: right; } - diff --git a/forms/ecomerce/pending/index.js b/forms/ecomerce/pending/index.js new file mode 100644 index 00000000..d5e9a666 --- /dev/null +++ b/forms/ecomerce/pending/index.js @@ -0,0 +1,21 @@ +import './style.scss'; + +export default new Class({ + Extends: Hedera.Form, + Template: require('./ui.xml'), + + activate() { + this.$.orders.setInfo('o', 'myOrder', 'hedera', ['id'], 'id'); + }, + + async onRemoveOrderClick(form) { + if (confirm(_('AreYouSureDeleteOrder'))) + await form.deleteRow(); + }, + + loadOrder(id) { + localStorage.setItem('hederaBasket', id); + this.hash.setAll({form: 'ecomerce/catalog'}); + Htk.Toast.showMessage(_('OrderLoadedIntoBasket')); + } +}); diff --git a/forms/ecomerce/pending/locale/ca.yml b/forms/ecomerce/pending/locale/ca.yml new file mode 100644 index 00000000..dd862364 --- /dev/null +++ b/forms/ecomerce/pending/locale/ca.yml @@ -0,0 +1 @@ +Pending: Pendents diff --git a/forms/ecomerce/pending/locale/en.yml b/forms/ecomerce/pending/locale/en.yml new file mode 100644 index 00000000..eeb6d5a0 --- /dev/null +++ b/forms/ecomerce/pending/locale/en.yml @@ -0,0 +1 @@ +Pending: Pending diff --git a/forms/ecomerce/pending/locale/es.yml b/forms/ecomerce/pending/locale/es.yml new file mode 100644 index 00000000..6a3cfa3c --- /dev/null +++ b/forms/ecomerce/pending/locale/es.yml @@ -0,0 +1,8 @@ +Pending: Pendientes +PendingOrders: Pedidos pendientes +NewOrder: Nuevo pedido +ViewOrder: Ver pedido +RemoveOrder: Eliminar pedido +LoadOrderIntoCart: Cargar pedido en la cesta +AreYouSureDeleteOrder: ¿Seguro que quieres borrar el pedido? +OrderLoadedIntoBasket: ¡Pedido cargado en la cesta! \ No newline at end of file diff --git a/forms/ecomerce/pending/locale/fr.yml b/forms/ecomerce/pending/locale/fr.yml new file mode 100644 index 00000000..dd862364 --- /dev/null +++ b/forms/ecomerce/pending/locale/fr.yml @@ -0,0 +1 @@ +Pending: Pendents diff --git a/forms/ecomerce/pending/locale/pt.yml b/forms/ecomerce/pending/locale/pt.yml new file mode 100644 index 00000000..e79f9482 --- /dev/null +++ b/forms/ecomerce/pending/locale/pt.yml @@ -0,0 +1 @@ +Pending: Pendientes diff --git a/forms/ecomerce/pending/style.scss b/forms/ecomerce/pending/style.scss new file mode 100644 index 00000000..e69de29b diff --git a/forms/ecomerce/pending/ui.xml b/forms/ecomerce/pending/ui.xml new file mode 100644 index 00000000..e0c1fc15 --- /dev/null +++ b/forms/ecomerce/pending/ui.xml @@ -0,0 +1,54 @@ + +

+

PendingOrders

+
+
+ +
+
+ + + SELECT o.id, o.sent, o.deliveryMethodFk, o.total, + a.nickname, am.description agency + FROM myOrder o + JOIN myAddress a ON a.id = o.addressFk + JOIN vn.agencyMode am ON am.id = o.agencyModeFk + WHERE NOT o.isConfirmed + ORDER BY o.sent DESC + + + +
+

+ {{Vn.Value.format(iter.sent, '%D')}} +

+

#{{iter.id}}

+

{{iter.nickname}}

+

{{iter.agency}}

+

{{Vn.Value.format(iter.total, '%.2d€')}}

+
+
+ + +
+
+
+
+
+ diff --git a/import.js b/import.js index 46c8f0d4..4b33cf30 100644 --- a/import.js +++ b/import.js @@ -70,7 +70,9 @@ export const routes = { orders: () => import('ecomerce/orders'), ticket: - () => import('ecomerce/ticket') + () => import('ecomerce/ticket'), + pending: + () => import('ecomerce/pending') }, news: { new: diff --git a/js/hedera/app.js b/js/hedera/app.js index 6e7ba1c2..8aa82737 100644 --- a/js/hedera/app.js +++ b/js/hedera/app.js @@ -9,6 +9,24 @@ module.exports = new Class({ ,get() { return this._conn; } + }, + hash: { + type: Vn.Hash + ,get() { + return this._hash; + } + }, + gui: { + type: Gui + ,get() { + return this._gui; + } + }, + login: { + type: Login + ,get() { + return this._login; + } } } @@ -35,6 +53,7 @@ module.exports = new Class({ ,showLogin() { const login = this._login = new Login({ + app: this, conn: this._conn, hash: this._hash }); @@ -47,6 +66,7 @@ module.exports = new Class({ if (this._gui) return; const gui = this._gui = new Gui({ + app: this, conn: this._conn, hash: this._hash }); diff --git a/js/hedera/basket-checker.js b/js/hedera/basket-checker.js deleted file mode 100644 index 29a6c841..00000000 --- a/js/hedera/basket-checker.js +++ /dev/null @@ -1,21 +0,0 @@ - -module.exports = { - async check(conn, hash) { - this.hash = hash; - const resultSet = await conn.execQuery('CALL myBasket_check'); - - const status = resultSet.fetchValue(); - if (!status) return; - - const isOk = status == 'UPDATED' || status == 'OK'; - - if (status == 'UPDATED') - Htk.Toast.showWarning(_('Order items updated')); - - if (!isOk) - this.hash.setAll({form: 'ecomerce/checkout'}); - - return isOk; - } -}; - diff --git a/js/hedera/basket.js b/js/hedera/basket.js new file mode 100644 index 00000000..deae7ec4 --- /dev/null +++ b/js/hedera/basket.js @@ -0,0 +1,42 @@ + +module.exports = class { + constructor(app) { + this.app = app; + let orderId = localStorage.getItem('hederaBasket'); + if (orderId) orderId = parseInt(orderId); + this.orderId = orderId; + } + async check(conn, hash) { + this.hash = hash; + const orderId = localStorage.getItem('hederaBasket'); + const resultSet = await this.app.conn.execQuery( + 'CALL myOrder_check(#id)', + {id: orderId} + ); + + const status = resultSet.fetchValue(); + if (!status) return; + + const isOk = status == 'updated' || status == 'ok'; + + if (status == 'updated') + Htk.Toast.showWarning(_('Order items updated')); + + if (!isOk) { + const params = {form: 'ecomerce/checkout'}; + if (orderId) params.id = orderId; + this.hash.setAll(params); + } + + return isOk; + } + async load(orderId) { + if (this.orderId != orderId) { + localStorage.setItem('hederaBasket', orderId); + this.orderId = orderId; + } + + await this.check() + } +}; + diff --git a/js/hedera/form.js b/js/hedera/form.js index 518cb3f9..8911fa6a 100644 --- a/js/hedera/form.js +++ b/js/hedera/form.js @@ -7,6 +7,7 @@ module.exports = new Class({ ,initialize(gui) { this.gui = gui; + this.app = gui.app; this.conn = gui.conn; this.hash = gui.hash; } diff --git a/js/hedera/hedera.js b/js/hedera/hedera.js index 5389daea..ab76578e 100644 --- a/js/hedera/hedera.js +++ b/js/hedera/hedera.js @@ -10,6 +10,6 @@ Hedera = module.exports = { ,Report : require('./report') ,App : require('./app') ,Tpv : require('./tpv') - ,BasketChecker : require('./basket-checker') + ,Basket : require('./basket') };