From: Julien Moutinho Date: Wed, 8 May 2013 22:20:59 +0000 (+0200) Subject: Modification : gère point_of_sale.patch dans ce module. X-Git-Url: http://git.cyclocoop.org/?p=burette%2Fpos_membership.git;a=commitdiff_plain;h=4aab88f5f023e35aaafc6fe5e80b9e7b3f2db5dd Modification : gère point_of_sale.patch dans ce module. --- diff --git a/__init__.py b/__init__.py index ee06cef..67e0ed5 100644 --- a/__init__.py +++ b/__init__.py @@ -21,5 +21,6 @@ # ############################################################################## import pos_membership +import controllers # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/__openerp__.py b/__openerp__.py index 2ee6d8d..a73d3bb 100644 --- a/__openerp__.py +++ b/__openerp__.py @@ -33,13 +33,24 @@ 'depends': ['membership', 'remembership', 'point_of_sale'], 'init_xml': [], 'data': [], - 'js': [], - 'css': [], - 'qweb': ['static/src/xml/pos_membership.xml'], + 'js': [ + 'static/src/js/db.js', + 'static/src/js/models.js', + 'static/src/js/widgets.js', + 'static/src/js/screens.js', + 'static/src/js/main.js', + ], + 'css': [ + 'static/src/css/pos.css', # this is the default css with hover effects + #'static/src/css/pos_nohover.css', # this css has no hover effects (for resistive touchscreens) + ], + 'qweb': ['static/src/xml/pos.xml'], 'update_xml': [], 'demo_xml': [], 'test': [], 'installable': True, 'active': False, + } + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/controllers/__init__.py b/controllers/__init__.py new file mode 100644 index 0000000..8ee9bae --- /dev/null +++ b/controllers/__init__.py @@ -0,0 +1 @@ +import main diff --git a/controllers/main.py b/controllers/main.py new file mode 100644 index 0000000..7b2cdb2 --- /dev/null +++ b/controllers/main.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +import os +import openerp + +from openerp.addons.web.controllers.main import manifest_list, module_boot, html_template +from openerp.addons.point_of_sale.controllers.main import PointOfSaleController + +class PointOfSaleController(PointOfSaleController): + + @openerp.addons.web.http.httprequest + def app(self, req, s_action=None, **kw): + js = "\n ".join('' % i for i in manifest_list(req, None, 'js')) + css = "\n ".join('' % i for i in manifest_list(req, None, 'css')) + + cookie = req.httprequest.cookies.get("instance0|session_id") + session_id = cookie.replace("%22","") + template = html_template.replace(' -+
-+ -+
-+ -+ -+ -+
-+
-+
    -+
-+
-+
-+ -+
-+
-+ -+ -+
-+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+
-+ -+
-+
-+ -+
-+
-+
-+
-+ - -
-

Product Weighting

-@@ -210,6 +253,41 @@ -
-
- -+ -+
-+

Partner Create

-+
-+
-+
-+
-+ -+ Name: -+ -+ -+ -+
-+ -+ -+
-+
-+
-+
-+ - -
-

Payment

-@@ -370,6 +448,30 @@ -
-
- -+ -+
  • -+ -+
    -+ -+ -+
    -+
    -+ -+ -+
    -+
    -+
  • -+
    -+ - -
  • - diff --git a/pos_membership.py b/pos_membership.py index 49483cb..76fbfba 100644 --- a/pos_membership.py +++ b/pos_membership.py @@ -38,6 +38,73 @@ STATE = [ ('paid', 'Paid Member'), ] +class pos_order(osv.osv): + _inherit = 'pos.order' + + def create_partner_from_ui(self, cr, uid, partners, context=None): + print ("DEV: [pos_membership] [create_partner_from_ui] partners=%s" % str(partners)) + partner_ids = [] + partner_obj = self.pool.get('res.partner') + for tmp_partner in partners: + partner = tmp_partner['data'] + partner_id = partner_obj.create(cr, uid, { + 'name': partner['name'], + }, context) + partner_ids.append(partner_id) + #self.signal_paid(cr, uid, [partner_id]) + return partner_ids + + def create_from_ui(self, cr, uid, orders, context=None): + # NOTE: copied from openerp/addons/point_of_sale/point_of_sale.py + #_logger.info("orders: %r", orders) + print ("DEV: [pos_membership] [create_from_ui] order=", str(orders)) + order_ids = [] + for tmp_order in orders: + order = tmp_order['data'] + order_id = self.create(cr, uid, { + 'name': order['name'], + 'user_id': order['user_id'] or False, + 'session_id': order['pos_session_id'], + 'lines': order['lines'], + 'pos_reference':order['name'], + #-- BEGIN pos_membership + 'partner_id':order['partner_id'], + #-- END pos_membership + }, context) + + for payments in order['statement_ids']: + payment = payments[2] + self.add_payment(cr, uid, order_id, { + 'amount': payment['amount'] or 0.0, + 'payment_date': payment['name'], + 'statement_id': payment['statement_id'], + 'payment_name': payment.get('note', False), + 'journal': payment['journal_id'] + }, context=context) + + if order['amount_return']: + session = self.pool.get('pos.session').browse(cr, uid, order['pos_session_id'], context=context) + cash_journal = session.cash_journal_id + cash_statement = False + if not cash_journal: + cash_journal_ids = filter(lambda st: st.journal_id.type=='cash', session.statement_ids) + if not len(cash_journal_ids): + raise osv.except_osv( _('error!'), + _("No cash statement found for this session. Unable to record returned cash.")) + cash_journal = cash_journal_ids[0].journal_id + self.add_payment(cr, uid, order_id, { + 'amount': -order['amount_return'], + 'payment_date': time.strftime('%Y-%m-%d %H:%M:%S'), + 'payment_name': _('return'), + 'journal': cash_journal.id, + }, context=context) + order_ids.append(order_id) + wf_service = netsvc.LocalService("workflow") + wf_service.trg_validate(uid, 'pos.order', order_id, 'paid', cr) + return order_ids + +pos_order() + class membership_line(osv.osv): '''Member line''' _inherit = 'membership.membership_line' diff --git a/static/src/css/pos.css b/static/src/css/pos.css new file mode 100644 index 0000000..6ecf585 --- /dev/null +++ b/static/src/css/pos.css @@ -0,0 +1,196 @@ +/* NOTE: adapted from openerp/addons/point_of_sale/static/src/css/pos.css */ + +/* ********* The partner list ********* */ + +.point-of-sale .partner-list { + padding:10px !important; +} + +.point-of-sale .partner-list-scroller{ + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + width:100%; + height:100%; + overflow: hidden; +} +.point-of-sale .partner-list-container { + position:absolute; + top:0px; + bottom:0px; + left:0px; + right:0px; +} + +/* a) the search box */ + +.point-of-sale #partners-screen .searchbox { + position: absolute; + right: 2px; +} +.point-of-sale #partners-screen .searchbox input { + width: 130px; + border-radius: 11px; + border: 1px solid #cecbcb; + padding: 3px 19px; + margin: 6px; + background: url("../img/search.png") no-repeat 5px; + background-color: white; +} +.point-of-sale #partners-screen .search-clear { + position: absolute; + top: 11px; + right: 11px; + cursor: pointer; + display: none; +} + +.point-of-sale #partners-screen .search-create { + position: absolute; + top: 6px; + right: 22px; + cursor: pointer; + display: none; +} + + +/* b) the partner */ + +.point-of-sale .partner { + position:relative; + vertical-align: top; + display: inline-block; + line-height: 100px; + font-size: 11px; + margin: 5px !important; + width: 120px; + height:120px; + background:#fff; + border: 1px solid #fff; + border-radius: 3px; + -webkit-box-shadow: 0px 2px 0px #dad8e4, 0px 1px 8px #636480; + -moz-box-shadow: 0px 2px 0px #dad8e4, 0px 1px 8px #636480; + box-shadow: 0px 2px 0px #dad8e4, 0px 1px 8px #636480; +} + +.point-of-sale .partner .partner-img { + position: relative; + width: 120px; + height: 100px; + background: white; + text-align: center; +} + +.point-of-sale .partner .partner-img img { + max-height: 100px; + max-width: 120px; +} + +.point-of-sale .partner .price-tag { + position: absolute; + top: 2px; + right: 2px; + vertical-align: top; + color: white; + line-height: 13px; + background: #7f82ac; + padding: 2px 5px; + border-radius: 3px; + box-shadow: 0px 1px 0px #9A9CC5, 0px 3px 0px #7E86AC, 0px 3px 3px rgba(12, 14, 68, 0.67); +} + +.point-of-sale .partner .partner-name { + position: absolute; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + bottom:0; + top:auto; + line-height: 14px; + width:100%; + background: -webkit-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1)); + background: -moz-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1)); + background: -ms-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1)); + /* troublesome in latest webkit + background: linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1)); + */ + /*background:#FFF;*/ + padding: 3px; + padding-top:15px; +} + +/* c) the partner creation */ + +.point-of-sale .pos-step-container { + display: inline-block; + font-size: 1.5em; +} +.point-of-sale .greyed-out{ + color: #AAA; +} +.point-of-sale .pos-step-container input{ + font-size: 1em; + outline: none; + border: none; + padding: 0px 8px; + padding-top: 8px; + margin-left: 16px; + border-radius: 5px; + background: white; + box-shadow: 0px -1px 0px #E2E2E2 inset,0px 1px 0px white inset, 0px 4px 0px #DDD inset, 0px 4px 8px rgba(0, 0, 0, 0.55) inset; + color: #4c4c4c; + -webkit-animation: all 250ms linear; +} + +.point-of-sale .pos-step-container input:focus{ + box-shadow: 0px -1px 0px #C9CFFD inset,0px 1px 0px #B8C8FC inset, 0px 4px 0px #9FD5FF inset, 0px 4px 9px rgba(0, 31, 255, 0.55) inset; + color: #5d7ad6; + -webkit-animation: all 250ms linear; +} + +.point-of-sale .pos-partner-create-container { + text-align: left; + min-width: 500px; + margin-top: 50px; + padding: 40px; + background-color: #f8f8f8; + border-radius: 4px; + box-shadow: 0px 1px 0px white,0px -1px 0px white, 0px 4px 0px #DFDFDF, 0px 10px 30px rgba(0, 0, 0, 0.21); +} +.point-of-sale .pos-partner-create-container .left-block{ + display: inline-block; + width:49%; + margin:0; + padding:0; + text-align:left; +} +.point-of-sale .pos-partner-create-container .header{ + margin-top: 0px; + margin-bottom:20px; + font-weight: bold; +} +.point-of-sale .pos-partner-create-container .infoline{ + margin-top:5px; + margin-bottom:5px; +} +.point-of-sale .pos-partner-create-container .right-block{ + display: inline-block; + width:49%; + margin:0; + padding:0; + text-align:right; +} +.point-of-sale .pos-partner-create-container table { + width: 100%; + margin-bottom: 20px; +} +.point-of-sale .pos-partner-create-container td { + vertical-align: middle; +} +.point-of-sale .pos-partner-create-container .partner-createline-type { + font-size: 1em; + font-weight: bold; + margin-right:10px; +} diff --git a/static/src/css/pos_nohover.css b/static/src/css/pos_nohover.css new file mode 100644 index 0000000..9ffd9d2 --- /dev/null +++ b/static/src/css/pos_nohover.css @@ -0,0 +1,171 @@ +/* NOTE: adapted from openerp/addons/point_of_sale/static/src/css/pos_nohover.css */ + +/* ********* The partner list ********* */ + +.point-of-sale .partner-list { + padding:10px; +} + +.point-of-sale .partner-list-scroller{ + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + width:100%; + height:100%; + overflow: hidden; +} +.point-of-sale .partner-list-container { + position:absolute; + top:0px; + bottom:0px; + left:0px; + right:0px; + background: #eeedff; +} + +/* a) the search box */ + +.point-of-sale #partners-screen .searchbox { + position: absolute; + right: 2px; +} +.point-of-sale #partners-screen .searchbox input { + width: 130px; + border-radius: 11px; + border: 1px solid #cecbcb; + padding: 3px 19px; + margin: 6px; + background: url("../img/search.png") no-repeat 5px; + background-color: white; +} +.point-of-sale #partners-screen .search-clear { + position: absolute; + top: 11px; + right: 11px; + cursor: pointer; + display: none; +} +.point-of-sale #partners-screen .search-create { + position: absolute; + top: 6px; + right: 22px; + cursor: pointer; + display: none; +} + +/* b) the partner */ + +.point-of-sale .partner { + position:relative; + vertical-align: top; + display: inline-block; + line-height: 100px; + font-size: 11px; + margin: 5px; + width: 120px; + height:120px; + background:#fff; + border: 1px solid #fff; + border-radius: 3px; + -webkit-box-shadow: 0px 1px 8px rgba(127,130,172,0.4); + -moz-box-shadow: 0px 1px 8px rgba(127,130,172,0.4); + box-shadow: 0px 1px 8px rgba(127,130,172,0.4); +} + +.point-of-sale .partner .partner-img { + position: relative; + width: 120px; + height: 100px; + background: white; + text-align: center; +} + +.point-of-sale .partner .partner-img img { + max-height: 100px; + max-width: 120px; +} + +.point-of-sale .partner .price-tag { + position: absolute; + top: 2px; + right: 2px; + vertical-align: top; + color: white; + line-height: 14px; + background: #7f82ac; + padding: 2px 5px; + border-radius: 3px; +} + +.point-of-sale .partner .partner-name { + position: absolute; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + bottom:0; + top:auto; + line-height: 14px; + width:100%; + background: -webkit-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1)); + background: -moz-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1)); + background: -ms-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1)); + background: linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1)); + /*background:#FFF;*/ + padding: 3px; + padding-top:15px; +} + +/* c) the partner creation */ + +.point-of-sale .pos-step-container { + display: inline-block; + font-size: 1.5em; +} +.point-of-sale .greyed-out{ + color: #AAA; +} +.point-of-sale .pos-step-container input{ + font-size: 1em; +} + +.point-of-sale .pos-partner-create-container { + text-align: left; + min-width: 500px; +} +.point-of-sale .pos-partner-create-container .left-block{ + display: inline-block; + width:49%; + margin:0; + padding:0; + text-align:left; +} +.point-of-sale .pos-partner-create-container .header{ + margin-top: 50px; + margin-bottom:20px; + font-weight: bold; +} +.point-of-sale .pos-partner-create-container .infoline{ + margin-top:5px; + margin-bottom:5px; +} +.point-of-sale .pos-partner-create-container .right-block{ + display: inline-block; + width:49%; + margin:0; + padding:0; + text-align:right; +} +.point-of-sale .pos-partner-create-container table { + width: 100%; + margin-bottom: 20px; +} +.point-of-sale .pos-partner-create-container td { + vertical-align: middle; +} +.point-of-sale .pos-partner-create-container .partner-createline-type { + font-size: 1em; + font-weight: bold; + margin-right:10px; +} diff --git a/static/src/img/backspace.png b/static/src/img/backspace.png new file mode 100644 index 0000000..705051d Binary files /dev/null and b/static/src/img/backspace.png differ diff --git a/static/src/img/bancontact.png b/static/src/img/bancontact.png new file mode 100644 index 0000000..bd4f63d Binary files /dev/null and b/static/src/img/bancontact.png differ diff --git a/static/src/img/barcode.png b/static/src/img/barcode.png new file mode 100644 index 0000000..fc780b9 Binary files /dev/null and b/static/src/img/barcode.png differ diff --git a/static/src/img/bc-arrow.png b/static/src/img/bc-arrow.png new file mode 100644 index 0000000..0485c59 Binary files /dev/null and b/static/src/img/bc-arrow.png differ diff --git a/static/src/img/bg.png b/static/src/img/bg.png new file mode 100644 index 0000000..d54b630 Binary files /dev/null and b/static/src/img/bg.png differ diff --git a/static/src/img/default_category_photo.png b/static/src/img/default_category_photo.png new file mode 100644 index 0000000..25af75e Binary files /dev/null and b/static/src/img/default_category_photo.png differ diff --git a/static/src/img/grid-purple.png b/static/src/img/grid-purple.png new file mode 100644 index 0000000..2f0f433 Binary files /dev/null and b/static/src/img/grid-purple.png differ diff --git a/static/src/img/grid.png b/static/src/img/grid.png new file mode 100644 index 0000000..35dbab0 Binary files /dev/null and b/static/src/img/grid.png differ diff --git a/static/src/img/gtk-no.png b/static/src/img/gtk-no.png new file mode 100644 index 0000000..047ddcd Binary files /dev/null and b/static/src/img/gtk-no.png differ diff --git a/static/src/img/gtk-yes.png b/static/src/img/gtk-yes.png new file mode 100644 index 0000000..01fb373 Binary files /dev/null and b/static/src/img/gtk-yes.png differ diff --git a/static/src/img/headerbackground.jpg b/static/src/img/headerbackground.jpg new file mode 100644 index 0000000..cec8fa7 Binary files /dev/null and b/static/src/img/headerbackground.jpg differ diff --git a/static/src/img/home.png b/static/src/img/home.png new file mode 100644 index 0000000..53d0b22 Binary files /dev/null and b/static/src/img/home.png differ diff --git a/static/src/img/icon.png b/static/src/img/icon.png new file mode 100644 index 0000000..9054576 Binary files /dev/null and b/static/src/img/icon.png differ diff --git a/static/src/img/icons/bancontact.svg b/static/src/img/icons/bancontact.svg new file mode 100644 index 0000000..7060407 --- /dev/null +++ b/static/src/img/icons/bancontact.svg @@ -0,0 +1,1114 @@ + +image/svg+xmlJakub Steinerhttp://jimmac.musichall.czhomereturngodefaultuserdirectoryTuomas Kuosmanen + + + + + + + + + + + + + + + + +5 92102431 8 +Bancontact +Mistercash + \ No newline at end of file diff --git a/static/src/img/icons/png48/face-monkey.png b/static/src/img/icons/png48/face-monkey.png new file mode 100644 index 0000000..1a57c9e Binary files /dev/null and b/static/src/img/icons/png48/face-monkey.png differ diff --git a/static/src/img/icons/png48/go-next.png b/static/src/img/icons/png48/go-next.png new file mode 100644 index 0000000..bcd343d Binary files /dev/null and b/static/src/img/icons/png48/go-next.png differ diff --git a/static/src/img/icons/png48/go-previous.png b/static/src/img/icons/png48/go-previous.png new file mode 100644 index 0000000..0a084ad Binary files /dev/null and b/static/src/img/icons/png48/go-previous.png differ diff --git a/static/src/img/icons/png48/help.png b/static/src/img/icons/png48/help.png new file mode 100644 index 0000000..8c56bd4 Binary files /dev/null and b/static/src/img/icons/png48/help.png differ diff --git a/static/src/img/icons/png48/printer.png b/static/src/img/icons/png48/printer.png new file mode 100644 index 0000000..9747f37 Binary files /dev/null and b/static/src/img/icons/png48/printer.png differ diff --git a/static/src/img/icons/png48/scale.png b/static/src/img/icons/png48/scale.png new file mode 100644 index 0000000..3070c56 Binary files /dev/null and b/static/src/img/icons/png48/scale.png differ diff --git a/static/src/img/icons/png48/shut-down.png b/static/src/img/icons/png48/shut-down.png new file mode 100644 index 0000000..8478ab1 Binary files /dev/null and b/static/src/img/icons/png48/shut-down.png differ diff --git a/static/src/img/icons/png48/system-log-out.png b/static/src/img/icons/png48/system-log-out.png new file mode 100644 index 0000000..edd6e34 Binary files /dev/null and b/static/src/img/icons/png48/system-log-out.png differ diff --git a/static/src/img/icons/png48/validate.png b/static/src/img/icons/png48/validate.png new file mode 100644 index 0000000..75372c8 Binary files /dev/null and b/static/src/img/icons/png48/validate.png differ diff --git a/static/src/img/icons/printer.svg b/static/src/img/icons/printer.svg new file mode 100644 index 0000000..4c702dc --- /dev/null +++ b/static/src/img/icons/printer.svg @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Printer + + + Jakub Steiner + + + + http://jimmac.musichall.cz + + + printer + local + laser + bubblejet + inkjet + print + output + cups + lpd + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/src/img/icons/scale.svg b/static/src/img/icons/scale.svg new file mode 100644 index 0000000..a04a62a --- /dev/null +++ b/static/src/img/icons/scale.svg @@ -0,0 +1,797 @@ + +image/svg+xmlJakub Steinerhttp://jimmac.musichall.czhomereturngodefaultuserdirectoryTuomas Kuosmanen + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/src/img/icons/scan.svg b/static/src/img/icons/scan.svg new file mode 100644 index 0000000..4d753ac --- /dev/null +++ b/static/src/img/icons/scan.svg @@ -0,0 +1,984 @@ + +image/svg+xmlJakub Steinerhttp://jimmac.musichall.czhomereturngodefaultuserdirectoryTuomas Kuosmanen + + + + + + + + + + + + + + + + +5 92102431 8 + \ No newline at end of file diff --git a/static/src/img/icons/validate.svg b/static/src/img/icons/validate.svg new file mode 100644 index 0000000..be4c675 --- /dev/null +++ b/static/src/img/icons/validate.svg @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + + + go + lower + down + arrow + pointer + > + + + + + Andreas Nilsson + + + + + + + + + + + + + + + + + + + + diff --git a/static/src/img/logo.png b/static/src/img/logo.png new file mode 100644 index 0000000..9cf5eb0 Binary files /dev/null and b/static/src/img/logo.png differ diff --git a/static/src/img/pos_screenshot.jpg b/static/src/img/pos_screenshot.jpg new file mode 100644 index 0000000..1e884eb Binary files /dev/null and b/static/src/img/pos_screenshot.jpg differ diff --git a/static/src/img/scale.png b/static/src/img/scale.png new file mode 100644 index 0000000..8f66d1f Binary files /dev/null and b/static/src/img/scale.png differ diff --git a/static/src/img/scan.png b/static/src/img/scan.png new file mode 100644 index 0000000..c0bc93d Binary files /dev/null and b/static/src/img/scan.png differ diff --git a/static/src/img/search.png b/static/src/img/search.png new file mode 100644 index 0000000..d1705e9 Binary files /dev/null and b/static/src/img/search.png differ diff --git a/static/src/img/search_reset.gif b/static/src/img/search_reset.gif new file mode 100644 index 0000000..9d4253e Binary files /dev/null and b/static/src/img/search_reset.gif differ diff --git a/static/src/img/steps-arrow.png b/static/src/img/steps-arrow.png new file mode 100644 index 0000000..fe86913 Binary files /dev/null and b/static/src/img/steps-arrow.png differ diff --git a/static/src/img/steps-bg.png b/static/src/img/steps-bg.png new file mode 100644 index 0000000..cfe810a Binary files /dev/null and b/static/src/img/steps-bg.png differ diff --git a/static/src/img/validate-icon.png b/static/src/img/validate-icon.png new file mode 100644 index 0000000..a7d0260 Binary files /dev/null and b/static/src/img/validate-icon.png differ diff --git a/static/src/js/db.js b/static/src/js/db.js new file mode 100644 index 0000000..044e9be --- /dev/null +++ b/static/src/js/db.js @@ -0,0 +1,70 @@ +function openerp_pos_membership_db(instance, module){ + module.PosLS = module.PosLS.extend({ + init: function(options){ + //console.log("[pos_membership] [PosLS] [init]: options=", options, "this=", this); + this._super(this, options); + this.partner_search_string = ''; + this.partner_by_id = {}; + this.partner_list = []; + }, + _partner_search_string: function(partner){ + var str = '' + partner.id + ':' + partner.name; + return str + '\n'; + }, + add_partners: function(partners){ + if(!partners instanceof Array){ + partners = [partners]; + } + //console.log("[pos_membership] [add_partners] :", partners); + for(var i = 0, len = partners.length; i < len; i++){ + var partner = partners[i]; + //console.log("[db] [add_partners] partner.name:",partner.name); + this.partner_by_id[partner.id] = partner; + this.partner_list.push(partner); + this.partner_search_string += this._partner_search_string(partner); + } + //console.log("[db] [add_partners] partner_search_string:", this.partner_search_string); + }, + get_partner_by_id: function(id){ + return this.partner_by_id[id]; + }, + search_partner: function(query){ + var re = RegExp("([0-9]+):.*?"+query,"gi"); + var results = []; + //console.log("[db] [search_partner] query:",query); + for(var i = 0; i < this.limit; i++){ + r = re.exec(this.partner_search_string); + if(r){ + var id = Number(r[1]); + //console.log("[db] [search_partner] id:",id); + results.push(this.get_partner_by_id(id)); + } + else{ + break; + } + } + return results; + }, + get_partner_list: function(){ + return this.partner_list; + }, + add_partner: function(partner){ + //console.log("[pos_membership] [PosLS] [add_partner] partner=", partner.name); + var last_id = this.load('last_partner_id',0); + var partners = this.load('partners',[]); + partners.push({id: last_id + 1, data: partner}); + this.save('last_partner_id',last_id+1); + this.save('partners',partners); + }, + remove_partner: function(partner_id){ + var partners = this.load('partners',[]); + partners = _.filter(partners, function(partner){ + return partner.id !== partner_id; + }); + this.save('partners',partners); + }, + get_partners: function(){ + return this.load('partners',[]); + }, + }); + } diff --git a/static/src/js/main.js b/static/src/js/main.js new file mode 100644 index 0000000..5448712 --- /dev/null +++ b/static/src/js/main.js @@ -0,0 +1,8 @@ +openerp.pos_membership = function(instance) { + var module = instance.point_of_sale; + //console.log("[pos_membership] [instance.point_of_sale]"); + openerp_pos_membership_db(instance,module); // import db.js + openerp_pos_membership_models(instance,module); // import models.js + openerp_pos_membership_screens(instance,module); // import screens.js + openerp_pos_membership_widgets(instance,module); // import widgets.js + }; diff --git a/static/src/js/models.js b/static/src/js/models.js new file mode 100644 index 0000000..93f8271 --- /dev/null +++ b/static/src/js/models.js @@ -0,0 +1,254 @@ +function openerp_pos_membership_models(instance, module){ + //module.PosModel = instance.point_of_sale.PosModel.extend({}) + module.PosModel = module.PosModel.extend({ + initialize: function(session, attributes) { + //console.log("[pos_membership] [PosModel] [initialize]"); + //PosModel.prototype.initialize.apply(this, arguments); + module.PosModel.__super__.initialize.call(this, session, attributes); + this.partner_search_string = ''; + this.partner_by_id = {}; + this.partner_list = []; + this.db.clear('partners'); + this.set({ + 'partners': new module.PartnerCollection(), + 'selectedPartner': null, + }); + }, + load_server_data: function(){ + var self = this; + //console.log("[point_of_sale] [PosModel] [load_server_data]", "this.session=", this.session); + + var loaded = self.fetch('res.users',['name','company_id'],[['id','=',this.session.uid]]) + .then(function(users){ + //console.log("[point_of_sale] [PosModel] [load_server_data]", "users=", users); + self.set('user',users[0]); + + return self.fetch('res.company', + [ + 'currency_id', + 'email', + 'website', + 'company_registry', + 'vat', + 'name', + 'phone', + 'partner_id', + ], + [['id','=',users[0].company_id[0]]]); + }).then(function(companies){ + self.set('company',companies[0]); + + return self.fetch('res.partner',['contact_address'],[['id','=',companies[0].partner_id[0]]]); + }).then(function(company_partners){ + self.get('company').contact_address = company_partners[0].contact_address; + + return self.fetch('res.currency',['symbol','position','rounding','accuracy'],[['id','=',self.get('company').currency_id[0]]]); + }).then(function(currencies){ + self.set('currency',currencies[0]); + + return self.fetch('product.uom', null, null); + }).then(function(units){ + self.set('units',units); + var units_by_id = {}; + for(var i = 0, len = units.length; i < len; i++){ + units_by_id[units[i].id] = units[i]; + } + self.set('units_by_id',units_by_id); + + return self.fetch('product.packaging', null, null); + }).then(function(packagings){ + self.set('product.packaging',packagings); + + return self.fetch('res.users', ['name','ean13'], [['ean13', '!=', false]]); + }).then(function(users){ + self.set('user_list',users); + + return self.fetch('res.partner', ['name','ean13'], [['ean13', '!=', false]]); + }).then(function(partners){ + self.set('partner_list',partners); + + // NOTE: le moment du chargement des partners est important + // et doit être effectué vers ici, + // c'est pourquoi load_server_data() est recopiée en entier. + // BEGIN pos_membership + return self.fetch('res.partner', ['name']); + }).then(function(partners){ + self.db.add_partners(partners); + // END pos_membership + + return self.fetch('account.tax', ['amount', 'price_include', 'type']); + }).then(function(taxes){ + self.set('taxes', taxes); + + return self.fetch( + 'pos.session', + ['id', 'journal_ids','name','user_id','config_id','start_at','stop_at'], + [['state', '=', 'opened'], ['user_id', '=', self.session.uid]] + ); + }).then(function(sessions){ + self.set('pos_session', sessions[0]); + + return self.fetch( + 'pos.config', + ['name','journal_ids','shop_id','journal_id', + 'iface_self_checkout', 'iface_led', 'iface_cashdrawer', + 'iface_payment_terminal', 'iface_electronic_scale', 'iface_barscan', 'iface_vkeyboard', + 'iface_print_via_proxy','iface_cashdrawer','state','sequence_id','session_ids'], + [['id','=', self.get('pos_session').config_id[0]]] + ); + }).then(function(configs){ + var pos_config = configs[0]; + //console.log("[pos_membership] config=", pos_config); + self.set('pos_config', pos_config); + self.iface_electronic_scale = !!pos_config.iface_electronic_scale; + self.iface_print_via_proxy = !!pos_config.iface_print_via_proxy; + self.iface_vkeyboard = !!pos_config.iface_vkeyboard; + self.iface_self_checkout = !!pos_config.iface_self_checkout; + self.iface_cashdrawer = !!pos_config.iface_cashdrawer; + + return self.fetch('sale.shop',[],[['id','=',pos_config.shop_id[0]]]); + }).then(function(shops){ + self.set('shop',shops[0]); + + return self.fetch('product.packaging',['ean','product_id']); + }).then(function(packagings){ + self.db.add_packagings(packagings); + + return self.fetch('pos.category', ['id','name','parent_id','child_id','image']) + }).then(function(categories){ + self.db.add_categories(categories); + + return self.fetch( + 'product.product', + ['name', 'list_price','price','pos_categ_id', 'taxes_id', 'ean13', + 'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type', 'description_sale', 'description'], + [['sale_ok','=',true],['available_in_pos','=',true]], + {pricelist: self.get('shop').pricelist_id[0]} // context for price + ); + }).then(function(products){ + self.db.add_products(products); + + return self.fetch( + 'account.bank.statement', + ['account_id','currency','journal_id','state','name','user_id','pos_session_id'], + [['state','=','open'],['pos_session_id', '=', self.get('pos_session').id]] + ); + }).then(function(bank_statements){ + var journals = new Array(); + _.each(bank_statements,function(statement) { + journals.push(statement.journal_id[0]) + }); + self.set('bank_statements', bank_statements); + return self.fetch('account.journal', undefined, [['id','in', journals]]); + }).then(function(journals){ + self.set('journals',journals); + + // associate the bank statements with their journals. + var bank_statements = self.get('bank_statements'); + for(var i = 0, ilen = bank_statements.length; i < ilen; i++){ + for(var j = 0, jlen = journals.length; j < jlen; j++){ + if(bank_statements[i].journal_id[0] === journals[j].id){ + bank_statements[i].journal = journals[j]; + bank_statements[i].self_checkout_payment_method = journals[j].self_checkout_payment_method; + } + } + } + self.set({'cashRegisters' : new module.CashRegisterCollection(self.get('bank_statements'))}); + }); + return loaded; + }, + push_partner: function(partner) { + //console.log("[pos_membership] [PosModel] [push_partner] partner=", partner.name); + this.db.add_partner(partner); + this.flush_partner(); + }, + add_new_partner: function(attr){ + var partner = new module.PartnerCreate({pos:this, name:attr.name}); + //console.log("[pos_membership] [PosModel] [add_new_partner] partner=", partner.get('name')); + this.get('partners').add(partner); + this.set('selectedPartner', partner); + }, + flush_partner: function() { + //TODO make the mutex work + //this makes sure only one _int_flush is called at the same time + //return this.flush_mutex.exec(_.bind(function() { + // return this._flush_partner(0); + //}, this)); + this._flush_partner(0); + }, + _flush_partner: function(index){ + var self = this; + var partners = this.db.get_partners(); + self.set('nbr_pending_operations',partners.length); + + var partner = partners[index]; + var selectedOrder = self.get('selectedOrder'); + //console.log("[pos_membership] [PosModel] [_flush_partner] index=", index); + if(!partner){ + return; + } + //console.log("[pos_membership] [PosModel] [_flush_partner] partner=", partner.data.name); + //try to push a partner to the server + return (new instance.web.Model('pos.order')).get_func('create_partner_from_ui')([partner]) + .fail(function(unused, event){ + //don't show error popup if it fails + event.preventDefault(); + console.error('Failed to send partner:',partner); + self._flush_partner(index+1); + }) + .done(function(args){ + //remove from db if success + //console.log("[pos_membership] [PosModel] [_flush_partner] [.done] args=", args); + self.db.remove_partner(partner.id); + var name = partner.data.name; + p = {name:name, id:args[0]}; + //console.log("[pos_membership] [PosModel] [_flush_partner] [.done] partner=", p); + self.db.add_partners([p]); + //self.set('selectedPartner', p); + //console.log("[pos_membership] [PosModel] [_flush_partner] [.done] selectedPartner=", self.get('selectedPartner').name); + //console.log("[pos_membership] [PosModel] [_flush_partner] [.done] selectedPartner.id=", self.get('selectedPartner').id); + selectedOrder.addPartner(p); // NOTE: set .id asynchronously.. + self._flush_partner(index); + }); + }, + }); + module.Partner = Backbone.Model.extend({ + initialize: function(attr, options) { + this.name = attr.name; + this.id = attr.id; + }, + get_image_url: function(){ + return instance.session.url('/web/binary/image', {model: 'res.partner', field: 'image', id: this.get('id')}); + }, + }); + module.PartnerCollection = Backbone.Collection.extend({ + model: module.Partner, + }); + module.PartnerCreate = Backbone.Model.extend({ + initialize: function(attr){ + Backbone.Model.prototype.initialize.apply(this, arguments); + this.pos = attr.pos; + this.name = attr.name; + return this; + }, + exportAsJSON: function() { + //console.log("[PartnerCreate] [exportAsJSON] name=",this.name); + return { + name: this.name, + }; + }, + }); + module.Order = module.Order.extend({ + addPartner: function(partner, options){ + options = options || {}; + //console.log("[Order] [addPartner] partner=", partner.name, " partner_id=", partner.id); + this.set_client(partner); + }, + exportAsJSON: function() { + var json = module.Order.__super__.exportAsJSON.call(this); + json['partner_id'] = this.get('client') ? this.get('client').id : undefined; + //console.log("[Order] [exportAsJSON] json=", json); + return json; + }, + }); + } diff --git a/static/src/js/screens.js b/static/src/js/screens.js new file mode 100644 index 0000000..3e35a81 --- /dev/null +++ b/static/src/js/screens.js @@ -0,0 +1,120 @@ +function openerp_pos_membership_screens(instance, module){ + module.PartnerScreenWidget = module.ScreenWidget.extend({ + template:'PartnerScreenWidget', + + next_screen: 'products', + + show_numpad: false, + show_leftpane: false, + init: function(parent, options) { + //console.log("[pos_membership] [PartnerScreenWidget] [init]"); + this._super(parent, options); + this.model = options.model; + // TODO: this.pos.bind('change:selectedOrder', this.change_selected_order, this); + }, + start: function(){ + //console.log("[pos_membership] [PartnerScreenWidget] [start]"); + var self = this; + + this.partner_search_widget = new module.PartnerSearchWidget(this,{}); + this.partner_search_widget.replace($('.placeholder-PartnerSearchWidget')); + + this.partner_list_widget = new module.PartnerListWidget(this,{ + click_partner_action: function(partner){ + self.pos.get('selectedOrder').addPartner(partner); + self.pos_widget.screen_selector.set_current_screen(self.next_screen); + }, + }); + this.partner_list_widget.replace($('.placeholder-PartnerListWidget')); + }, + show: function(){ + //console.log("[pos_membership] [PartnerScreenWidget] [show]"); + this._super(); + + this.partner_search_widget.renderElement(); + + if(this.pos.iface_vkeyboard){ + this.pos_widget.onscreen_keyboard.connect(); + } + }, + close: function(){ + this._super(); + this.pos_widget.order_widget.set_numpad_state(null); + this.pos_widget.payment_screen.set_numpad_state(null); + }, + }); + module.ProductScreenWidget = module.ProductScreenWidget.extend({ + back_screen: 'partner', + show: function(){ + this._super(); + var self = this; + this.back_button = this.add_action_button({ + label: 'Back', + icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png', + click: function(){ + self.pos.get('selectedOrder').get('orderLines').reset([]); + self.pos_widget.numpad.state.trigger('set_value','remove'); + self.pos_widget.screen_selector.set_current_screen(self.back_screen); + }, + }); + }, + }); + module.PartnerCreateScreenWidget = module.ScreenWidget.extend({ + template: 'PartnerCreateScreenWidget', + show_numpad: false, + show_leftpane: false, + back_screen: 'partner', + next_screen: 'products', + init: function(parent, options) { + this._super(parent, options); + this.model = options.model; + }, + show: function(){ + //console.log("[pos_membership] [PartnerCreateScreenWidget] [show]"); + this._super(); + var self = this; + + this.back_button = this.add_action_button({ + label: 'Back', + icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png', + click: function(){ + self.pos_widget.screen_selector.set_current_screen(self.back_screen); + }, + }); + this.validate_button = this.add_action_button({ + label: 'Validate', + name: 'validation', + icon: '/point_of_sale/static/src/img/icons/png48/validate.png', + click: function(){ + self.validatePartner(); + }, + }); + this.updatePartnerCreateSummary(); + }, + close: function(){ + this._super(); + }, + back: function() { + this.pos_widget.screen_selector.set_current_screen(self.back_screen); + }, + validatePartner: function() { + var partner = this.pos.get('selectedPartner'); + + this.pos.push_partner(partner.exportAsJSON()); + this.pos.get('selectedOrder').addPartner({name:partner.name}); // NOTE: .id set asynchronously in .done() + this.pos_widget.screen_selector.set_current_screen(this.next_screen); + }, + renderElement: function() { + //console.log("[pos_membership] [PartnerCreateScreenWidget] [renderElement]"); + this._super(); + this.updatePartnerCreateSummary(); + }, + updatePartnerCreateSummary: function() { + var partner = this.pos.get('selectedPartner'); + if(partner){ + //console.log("[pos_membership] [PartnerCreateScreenWidget] [updatePartnerCreateSummary] partner=",partner.get('name')); + this.$('#partner-create-name').html(partner.get('name')); + } + }, + }); + } diff --git a/static/src/js/widgets.js b/static/src/js/widgets.js new file mode 100644 index 0000000..a123afb --- /dev/null +++ b/static/src/js/widgets.js @@ -0,0 +1,279 @@ +function openerp_pos_membership_widgets(instance, module){ + module.PartnerWidget = module.PosBaseWidget.extend({ + template: 'PartnerWidget', + init: function(parent, options){ + this._super(parent,options); + this.model = options.model; + this.next_screen = options.next_screen; //when a partner is clicked, this screen is set + this.click_partner_action = options.click_partner_action; + }, + renderElement: function(){ + // NOTE: returns the url of the partner thumbnail + //console.log("[pos_membership] [PartnerWidget] [renderElement]"); + this._super(); + this.$('img').replaceWith(this.pos_widget.image_cache.get_image(this.model.get_image_url())); + var self = this; + $("a", this.$el).click(function(e){ + if(self.click_partner_action){ + self.click_partner_action(self.model); + } + }); + }, + }); + module.PartnerSearchWidget = module.PosBaseWidget.extend({ + template: 'PartnerSearchWidget', + init: function(parent, options){ + var self = this; + this._super(parent,options); + }, + get_image_url: function(partner){ + return instance.session.url('/web/binary/image', {model: 'res.partner', field: 'image', id: partner.id}); + }, + renderElement: function(){ + //console.log("[pos_membership] [PartnerSearchWidget] [renderElement]"); + var self = this; + this._super(); + this.filter(); + }, + filter: function(category){ + var self = this; + + var partners = self.pos.db.get_partner_list(); + //console.log("[pos_membership] [PartnerSearchWidget] [filter] partners=",partners); + self.pos.get('partners').reset(partners); + + this.$('.searchbox input').keyup(function(){ + query = $(this).val(); + if(query){ + //console.log("[pos_membership] [PartnerSearchWidget] [filter]: query:", query); + var partners = self.pos.db.search_partner(query); + self.pos.get('partners').reset(partners); + //if(partners.length == 0) { + //console.log("[pos_membership] [PartnerSearchWidget] [filter]: no result"); + self.query = query; + self.$('.search-create').fadeIn(); + //}else{ + // self.$('.search-create').fadeOut(); + //} + self.$('.search-clear').fadeIn(); + } + else{ + var partners = self.pos.db.get_partner_list(); + self.pos.get('partners').reset(partners); + self.$('.search-clear').fadeOut(); + self.$('.search-create').fadeOut(); + } + }); + this.$('.searchbox input').click(function(){}); //Why ??? + this.$('.search-clear').click(function(){ + var partners = self.pos.db.get_partner_list(); + self.pos.get('partners').reset(partners); + self.$('.searchbox input').val('').focus(); + self.$('.search-clear').fadeOut(); + self.$('.search-create').fadeOut(); + }); + this.$('.search-create').click(function(){ + var partners = self.pos.db.get_partner_list(); + self.pos.get('partners').reset(partners); + self.$('.searchbox input').val('').focus(); + self.$('.search-clear').fadeOut(); + self.$('.search-create').fadeOut(); + //console.log("[pos_membership] [PartnerSearchWidget] [filter] [search-create] query=",self.query); + self.pos.add_new_partner({name:self.query}); + self.pos_widget.screen_selector.set_current_screen('partner_create'); + }); + }, + }); + module.PartnerListWidget = module.ScreenWidget.extend({ + template:'PartnerListWidget', + init: function(parent, options) { + //console.log("[pos_membership] [PartnerListWidget] [init]"); + var self = this; + this._super(parent, options); + this.model = options.model; + this.partnerwidgets = []; + this.weight = options.weight || 0; + this.show_scale = options.show_scale || false; + this.next_screen = options.next_screen || false; + this.back_screen = options.back_screen || false; + this.click_partner_action = options.click_partner_action; + + this.pos.get('partners').bind('reset', function(){ + //console.log("[pos_membership] [PartnerListWidget] [bind] [reset]"); + self.renderElement(); + }); + }, + renderElement: function() { + //console.log("[pos_membership] [PartnerListWidget] [renderElement]"); + var self = this; + this._super(); + + // free subwidgets memory from previous renders + for(var i = 0, len = this.partnerwidgets.length; i < len; i++){ + this.partnerwidgets[i].destroy(); + } + this.partnerwidgets = []; + if(this.scrollbar){ + this.scrollbar.destroy(); + } + var partners = this.pos.get('partners').models || []; + for(var i = 0, len = partners.length; i < len; i++){ + //console.log("[pos_membership] [PartnerListWidget] [renderElement]: partners[i].get('name')=",partners[i].get('name')); + var partner = new module.PartnerWidget(self, { + model: partners[i], + click_partner_action: this.click_partner_action, + }); + this.partnerwidgets.push(partner); + partner.appendTo(this.$('.partner-list')); + } + this.scrollbar = new module.ScrollbarWidget(this,{ + target_widget: this, + target_selector: '.partner-list-scroller', + on_show: function(){ + self.$('.partner-list-scroller').css({'padding-right':'62px'},100); + }, + on_hide: function(){ + self.$('.partner-list-scroller').css({'padding-right':'0px'},100); + }, + }); + + this.scrollbar.replace(this.$('.placeholder-ScrollbarWidget')); + }, + }); + module.PosWidget = module.PosWidget.extend({ + build_widgets: function() { + var self = this; + + // -------- Screens --------- + + // BEGIN pos_membership + this.partner_screen = new module.PartnerScreenWidget(this,{}); + this.partner_screen.appendTo($('#rightpane')); + // END pos_membership + + this.product_screen = new module.ProductScreenWidget(this,{}); + this.product_screen.appendTo($('#rightpane')); + + this.receipt_screen = new module.ReceiptScreenWidget(this, {}); + this.receipt_screen.appendTo($('#rightpane')); + + this.payment_screen = new module.PaymentScreenWidget(this, {}); + this.payment_screen.appendTo($('#rightpane')); + + // BEGIN pos_membership + this.partner_create_screen = new module.PartnerCreateScreenWidget(this, {}); + this.partner_create_screen.appendTo($('#rightpane')); + // END pos_membership + + this.welcome_screen = new module.WelcomeScreenWidget(this,{}); + this.welcome_screen.appendTo($('#rightpane')); + + this.client_payment_screen = new module.ClientPaymentScreenWidget(this, {}); + this.client_payment_screen.appendTo($('#rightpane')); + + this.scale_invite_screen = new module.ScaleInviteScreenWidget(this, {}); + this.scale_invite_screen.appendTo($('#rightpane')); + + this.scale_screen = new module.ScaleScreenWidget(this,{}); + this.scale_screen.appendTo($('#rightpane')); + + // -------- Popups --------- + + this.help_popup = new module.HelpPopupWidget(this, {}); + this.help_popup.appendTo($('.point-of-sale')); + + this.error_popup = new module.ErrorPopupWidget(this, {}); + this.error_popup.appendTo($('.point-of-sale')); + + this.error_product_popup = new module.ProductErrorPopupWidget(this, {}); + this.error_product_popup.appendTo($('.point-of-sale')); + + this.error_session_popup = new module.ErrorSessionPopupWidget(this, {}); + this.error_session_popup.appendTo($('.point-of-sale')); + + this.choose_receipt_popup = new module.ChooseReceiptPopupWidget(this, {}); + this.choose_receipt_popup.appendTo($('.point-of-sale')); + + this.error_negative_price_popup = new module.ErrorNegativePricePopupWidget(this, {}); + this.error_negative_price_popup.appendTo($('.point-of-sale')); + + // -------- Misc --------- + + this.notification = new module.SynchNotificationWidget(this,{}); + this.notification.appendTo(this.$('#rightheader')); + + this.username = new module.UsernameWidget(this,{}); + this.username.replace(this.$('.placeholder-UsernameWidget')); + + this.action_bar = new module.ActionBarWidget(this); + this.action_bar.appendTo($(".point-of-sale #rightpane")); + + this.left_action_bar = new module.ActionBarWidget(this); + this.left_action_bar.appendTo($(".point-of-sale #leftpane")); + + this.paypad = new module.PaypadWidget(this, {}); + this.paypad.replace($('#placeholder-PaypadWidget')); + + this.numpad = new module.NumpadWidget(this); + this.numpad.replace($('#placeholder-NumpadWidget')); + + this.order_widget = new module.OrderWidget(this, {}); + this.order_widget.replace($('#placeholder-OrderWidget')); + + this.onscreen_keyboard = new module.OnscreenKeyboardWidget(this, { + 'keyboard_model': 'simple' + }); + this.onscreen_keyboard.appendTo($(".point-of-sale #content")); + + this.close_button = new module.HeaderButtonWidget(this,{ + label:'Close', + action: function(){ self.try_close(); }, + }); + this.close_button.appendTo(this.$('#rightheader')); + + this.client_button = new module.HeaderButtonWidget(this,{ + label:'Self-Checkout', + action: function(){ self.screen_selector.set_user_mode('client'); }, + }); + this.client_button.appendTo(this.$('#rightheader')); + + + // -------- Screen Selector --------- + + this.screen_selector = new module.ScreenSelector({ + pos: this.pos, + screen_set:{ + 'products': this.product_screen, + 'payment' : this.payment_screen, + 'client_payment' : this.client_payment_screen, + 'scale_invite' : this.scale_invite_screen, + 'scale': this.scale_screen, + 'receipt' : this.receipt_screen, + 'welcome' : this.welcome_screen, + // BEGIN pos_membership + 'partner' : this.partner_screen, + 'partner_create' : this.partner_create_screen, + // END pos_membership + }, + popup_set:{ + 'help': this.help_popup, + 'error': this.error_popup, + 'error-product': this.error_product_popup, + 'error-session': this.error_session_popup, + 'error-negative-price': this.error_negative_price_popup, + 'choose-receipt': this.choose_receipt_popup, + }, + default_client_screen: 'welcome', + // BEGIN pos_membership + default_cashier_screen: 'partner', + // END pos_membership + default_mode: this.pos.iface_self_checkout ? 'client' : 'cashier', + }); + + if(this.pos.debug){ + this.debug_widget = new module.DebugWidget(this); + this.debug_widget.appendTo(this.$('#content')); + } + }, + }); + } diff --git a/static/src/xml/pos.xml b/static/src/xml/pos.xml new file mode 100644 index 0000000..3320f9d --- /dev/null +++ b/static/src/xml/pos.xml @@ -0,0 +1,99 @@ + + + + + +
    + +
    +
    + +
    +
    +
      +
    +
    +
    + +
    +
    + +
    + + + + + + + +
    + +
    +
    + +
    +
    +
    +
    + +
    +

    Partner Create

    +
    +
    +
    +
    + + Name: + + + +
    + + +
    +
    +
    +
    + +
  • + +
    + + +
    +
    + + +
    +
    +
  • +
    + diff --git a/static/src/xml/pos_membership.xml b/static/src/xml/pos_membership.xml deleted file mode 100644 index 0bd4311..0000000 --- a/static/src/xml/pos_membership.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - -