summaryrefslogtreecommitdiff
path: root/addons/point_of_sale/static/src/xml/Screens
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/point_of_sale/static/src/xml/Screens
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/point_of_sale/static/src/xml/Screens')
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ClientListScreen/ClientDetailsEdit.xml119
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ClientListScreen/ClientLine.xml30
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ClientListScreen/ClientListScreen.xml90
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/ControlButtons/InvoiceButton.xml12
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/ControlButtons/ReprintReceiptButton.xml12
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/MobileOrderManagementScreen.xml30
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderDetails.xml35
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderList.xml20
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderManagementControlPanel.xml36
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderManagementScreen.xml32
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderRow.xml15
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderlineDetails.xml21
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/ReprintReceiptScreen.xml26
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PSNumpadInputButton.xml18
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentMethodButton.xml13
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreen.xml99
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenElectronicPayment.xml76
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenNumpad.xml31
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenPaymentLines.xml62
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenStatus.xml43
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/ActionpadWidget.xml25
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/CashBoxOpening.xml28
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/CategoryBreadcrumb.xml15
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/CategoryButton.xml15
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/CategorySimpleButton.xml11
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/ControlButtons/SetFiscalPositionButton.xml12
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/ControlButtons/SetPricelistButton.xml11
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/HomeCategoryBreadcrumb.xml22
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/NumpadWidget.xml43
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/OrderSummary.xml23
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/OrderWidget.xml26
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/Orderline.xml75
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductItem.xml21
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductList.xml28
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductScreen.xml39
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductsWidget.xml11
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductsWidgetControlPanel.xml51
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ReceiptScreen/OrderReceipt.xml211
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ReceiptScreen/ReceiptScreen.xml47
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ReceiptScreen/WrappedProductNameLines.xml10
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/ScaleScreen/ScaleScreen.xml36
-rw-r--r--addons/point_of_sale/static/src/xml/Screens/TicketScreen/TicketScreen.xml60
42 files changed, 1640 insertions, 0 deletions
diff --git a/addons/point_of_sale/static/src/xml/Screens/ClientListScreen/ClientDetailsEdit.xml b/addons/point_of_sale/static/src/xml/Screens/ClientListScreen/ClientDetailsEdit.xml
new file mode 100644
index 00000000..5699dc64
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ClientListScreen/ClientDetailsEdit.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="ClientDetailsEdit" owl="1">
+ <section class="client-details edit">
+ <div class="client-picture">
+ <t t-if="partnerImageUrl">
+ <img t-att-src="partnerImageUrl" alt="Partner"
+ style="width: 64px; height: 64px; object-fit: cover;" />
+ </t>
+ <t t-else="">
+ <i class="fa fa-camera" role="img" aria-label="Picture" title="Picture"></i>
+ </t>
+ <input type="file" class="image-uploader" t-on-change="uploadImage" />
+ </div>
+ <input class="detail client-name" name="name" t-att-value="props.partner.name"
+ placeholder="Name" t-on-change="captureChange" />
+ <div class="client-details-box clearfix">
+ <div class="client-details-left">
+ <div class="client-detail">
+ <span class="label">Street</span>
+ <input class="detail client-address-street" name="street"
+ t-on-change="captureChange" t-att-value="props.partner.street || ''"
+ placeholder="Street" />
+ </div>
+ <div class="client-detail">
+ <span class="label">City</span>
+ <input class="detail client-address-city" name="city"
+ t-on-change="captureChange" t-att-value="props.partner.city || ''"
+ placeholder="City" />
+ </div>
+ <div class="client-detail">
+ <span class="label">Postcode</span>
+ <input class="detail client-address-zip" name="zip"
+ t-on-change="captureChange" t-att-value="props.partner.zip || ''"
+ placeholder="ZIP" />
+ </div>
+ <div class="client-detail">
+ <span class="label">State</span>
+ <select class="detail client-address-states needsclick" name="state_id"
+ t-on-change="captureChange">
+ <option value="">None</option>
+ <t t-foreach="env.pos.states" t-as="state" t-key="state.id">
+ <option t-if="props.partner.country_id[0] == state.country_id[0]"
+ t-att-value="state.id"
+ t-att-selected="props.partner.state_id ? ((state.id === props.partner.state_id[0]) ? true : undefined) : undefined">
+ <t t-esc="state.name" />
+ </option>
+ </t>
+ </select>
+ </div>
+ <div class="client-detail">
+ <span class="label">Country</span>
+ <select class="detail client-address-country needsclick" name="country_id"
+ t-on-change="captureChange">
+ <option value="">None</option>
+ <t t-foreach="env.pos.countries" t-as="country" t-key="country.id">
+ <option t-att-value="country.id"
+ t-att-selected="props.partner.country_id ? ((country.id === props.partner.country_id[0]) ? true : undefined) : undefined">
+ <t t-esc="country.name" />
+ </option>
+ </t>
+ </select>
+ </div>
+ </div>
+ <div class="client-details-right">
+ <div class="client-detail">
+ <span class="label">Language</span>
+ <select class="detail client-lang needsclick" name="lang"
+ t-on-change="captureChange">
+ <t t-foreach="env.pos.langs" t-as="lang" t-key="lang.id">
+ <option t-att-value="lang.code"
+ t-att-selected="props.partner.lang ? ((lang.code === props.partner.lang) ? true : undefined) : lang.code === env.pos.user.lang? true : undefined">
+ <t t-esc="lang.name" />
+ </option>
+ </t>
+ </select>
+ </div>
+ <div class="client-detail">
+ <span class="label">Email</span>
+ <input class="detail client-email" name="email" type="email"
+ t-on-change="captureChange"
+ t-att-value="props.partner.email || ''" />
+ </div>
+ <div class="client-detail">
+ <span class="label">Phone</span>
+ <input class="detail client-phone" name="phone" type="tel"
+ t-on-change="captureChange"
+ t-att-value="props.partner.phone || ''" />
+ </div>
+ <div class="client-detail">
+ <span class="label">Barcode</span>
+ <input class="detail barcode" name="barcode" t-on-change="captureChange"
+ t-att-value="props.partner.barcode || ''" />
+ </div>
+ <div class="client-detail">
+ <span class="label">Tax ID</span>
+ <input class="detail vat" name="vat" t-on-change="captureChange"
+ t-att-value="props.partner.vat || ''" />
+ </div>
+ <div t-if="env.pos.pricelists.length gt 1" class="client-detail">
+ <span class="label">Pricelist</span>
+ <select class="detail needsclick" name="property_product_pricelist"
+ t-on-change="captureChange">
+ <t t-foreach="env.pos.pricelists" t-as="pricelist"
+ t-key="pricelist.id">
+ <option t-att-value="pricelist.id"
+ t-att-selected="props.partner.property_product_pricelist ? (pricelist.id === props.partner.property_product_pricelist[0] ? true : false) : false">
+ <t t-esc="pricelist.display_name" />
+ </option>
+ </t>
+ </select>
+ </div>
+ </div>
+ </div>
+ </section>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ClientListScreen/ClientLine.xml b/addons/point_of_sale/static/src/xml/Screens/ClientListScreen/ClientLine.xml
new file mode 100644
index 00000000..7693f08c
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ClientListScreen/ClientLine.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="ClientLine" owl="1">
+ <tr t-attf-class="client-line {{highlight}}" t-att-data-id="props.partner.id"
+ t-on-click="trigger('click-client', {client: props.partner})">
+ <td>
+ <t t-esc="props.partner.name" />
+ <span t-if="highlight">
+ <br/><button class="edit-client-button" t-on-click.stop="trigger('click-edit')">EDIT</button>
+ </span>
+ </td>
+ <td t-if="!env.isMobile">
+ <t t-esc="props.partner.address" />
+ </td>
+ <td t-if="!env.isMobile" style="width: 130px;">
+ <t t-esc="props.partner.phone || ''" />
+ </td>
+ <td t-if="env.isMobile">
+ <t t-esc="props.partner.zip or ''" />
+ <span t-if="highlight"><br/></span>
+ </td>
+ <td>
+ <t t-esc="props.partner.email or ''" />
+ <span t-if="highlight"><br/></span>
+ </td>
+ </tr>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ClientListScreen/ClientListScreen.xml b/addons/point_of_sale/static/src/xml/Screens/ClientListScreen/ClientListScreen.xml
new file mode 100644
index 00000000..baefab13
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ClientListScreen/ClientListScreen.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="ClientListScreen" owl="1">
+ <div class="clientlist-screen screen" t-on-activate-edit-mode="activateEditMode">
+ <div class="screen-content">
+ <div class="top-content">
+ <div t-if="!state.detailIsShown &amp;&amp; !state.selectedClient" class="button new-customer" role="img" aria-label="Add a customer"
+ t-on-click="trigger('activate-edit-mode', { isNewClient: true })"
+ title="Add a customer">
+ <t t-if="!env.isMobile">
+ Create
+ </t>
+ <t t-else="">
+ <i class="fa fa-plus"></i>
+ </t>
+ </div>
+ <div t-if="isNextButtonVisible" t-on-click="clickNext"
+ class="button next highlight">
+ <t t-if="!env.isMobile">
+ <t t-esc="nextButton.text" />
+ </t>
+ <t t-else="">
+ <i t-if="nextButton.command === 'deselect'" class="fa fa-trash"></i>
+ <i t-if="nextButton.command === 'set'" class="fa fa-check"></i>
+ </t>
+ </div>
+ <div class="button" t-if="state.detailIsShown" t-on-click="trigger('click-save')">
+ <t t-if="!env.isMobile">
+ <i class="fa fa-floppy-o"/>
+ <span> Save</span>
+ </t>
+ <t t-else="">
+ <i class="fa fa-floppy-o"/>
+ </t>
+ </div>
+ <div class="button back" t-on-click="back">
+ <t t-if="!env.isMobile">Discard</t>
+ <t t-else="">
+ <i class="fa fa-undo"></i>
+ </t>
+ </div>
+ <div t-if="!state.detailIsShown" class="searchbox-client top-content-center">
+ <input placeholder="Search Customers" size="1" t-on-keyup="updateClientList" />
+ <span class="search-clear-client"></span>
+ </div>
+ </div>
+ <section class="full-content">
+ <div class="client-window">
+ <section class="subwindow collapsed">
+ <div class="subwindow-container collapsed">
+ <div t-if="state.detailIsShown" class="client-details-contents subwindow-container-fix">
+ <ClientDetailsEdit t-props="state.editModeProps"
+ t-on-cancel-edit="cancelEdit"/>
+ </div>
+ </div>
+ </section>
+ <section class="subwindow list">
+ <div class="subwindow-container">
+ <div t-if="!state.detailIsShown" class="subwindow-container-fix scrollable-y">
+ <table class="client-list">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th t-if="!env.isMobile">Address</th>
+ <th t-if="!env.isMobile">Phone</th>
+ <th t-if="env.isMobile">ZIP</th>
+ <th>Email</th>
+ </tr>
+ </thead>
+ <tbody class="client-list-contents">
+ <t t-foreach="clients" t-as="partner"
+ t-key="partner.id">
+ <ClientLine partner="partner"
+ selectedClient="state.selectedClient"
+ detailIsShown="state.detailIsShown"
+ t-on-click-client="clickClient" />
+ </t>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </section>
+ </div>
+ </section>
+ </div>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/ControlButtons/InvoiceButton.xml b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/ControlButtons/InvoiceButton.xml
new file mode 100644
index 00000000..72c85188
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/ControlButtons/InvoiceButton.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="InvoiceButton" owl="1">
+ <div class="control-button" t-att-class="{ highlight: isHighlighted }">
+ <i class="fa fa-file-pdf-o"></i>
+ <span> </span>
+ <span><t t-esc="commandName"></t></span>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/ControlButtons/ReprintReceiptButton.xml b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/ControlButtons/ReprintReceiptButton.xml
new file mode 100644
index 00000000..df3e4e06
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/ControlButtons/ReprintReceiptButton.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="ReprintReceiptButton" owl="1">
+ <div class="control-button">
+ <i class="fa fa-print"></i>
+ <span> </span>
+ <span>Print Receipt</span>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/MobileOrderManagementScreen.xml b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/MobileOrderManagementScreen.xml
new file mode 100644
index 00000000..479b35a4
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/MobileOrderManagementScreen.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <div t-name="MobileOrderManagementScreen" class="screen-full-width" owl="1">
+ <div t-if="mobileState.showDetails" class="leftpane">
+ <OrderDetails order="orderManagementContext.selectedOrder" />
+ <div class="pads">
+ <div class="control-buttons">
+ <t t-foreach="controlButtons" t-as="cb" t-key="cb.name">
+ <t t-component="cb.component" t-key="cb.name" />
+ </t>
+ </div>
+ <div class="subpads">
+ <ActionpadWidget client="selectedClient" />
+ <NumpadWidget />
+ </div>
+ </div>
+ <div class="back-to-list" t-on-click="mobileState.showDetails = false">
+ <span>Back to list</span>
+ </div>
+ </div>
+ <div t-else="" class="rightpane">
+ <div class="flex-container">
+ <OrderManagementControlPanel />
+ <OrderList orders="orders" initHighlightedOrder="orderManagementContext.selectedOrder" />
+ </div>
+ </div>
+ </div>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderDetails.xml b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderDetails.xml
new file mode 100644
index 00000000..87579d09
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderDetails.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="OrderDetails" owl="1">
+ <div class="order-container">
+ <div t-ref="scrollable" class="order-scroller touch-scrollable">
+ <div class="order">
+ <t t-if="!props.order">
+ <div class="order-empty">
+ <i class="fa fa-shopping-cart" role="img" aria-label="Shopping cart"
+ title="Shopping cart" />
+ <h1>Select an order</h1>
+ </div>
+ </t>
+ <t t-elif="orderlines.length === 0">
+ <div class="order-empty">
+ <i class="fa fa-shopping-cart" role="img" aria-label="Shopping cart"
+ title="Shopping cart" />
+ <h1>Order is empty</h1>
+ </div>
+ </t>
+ <t t-else="">
+ <ul class="orderlines">
+ <t t-foreach="orderlines" t-as="orderline" t-key="orderline.id">
+ <OrderlineDetails line="orderline" />
+ </t>
+ </ul>
+ <OrderSummary total="total" tax="tax" />
+ </t>
+ </div>
+ </div>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderList.xml b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderList.xml
new file mode 100644
index 00000000..865f609b
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderList.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="OrderList" owl="1">
+ <div class="orders">
+ <div class="order-row header">
+ <div class="header name">Order</div>
+ <div class="header date">Date</div>
+ <div class="header customer">Customer</div>
+ <div class="header total">Total</div>
+ </div>
+ <div class="order-list">
+ <t t-foreach="props.orders" t-as="order" t-key="order.cid">
+ <OrderRow order="order" highlightedOrder="highlightedOrder" />
+ </t>
+ </div>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderManagementControlPanel.xml b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderManagementControlPanel.xml
new file mode 100644
index 00000000..3a294bfd
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderManagementControlPanel.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="OrderManagementControlPanel" owl="1">
+ <div class="control-panel">
+ <div class="item button back" t-on-click="trigger('close-screen')">
+ <i class="fa fa-angle-double-left"></i>
+ <span> Back</span>
+ </div>
+ <div class="item search-box">
+ <span class="icon">
+ <i class="fa fa-search" />
+ </span>
+ <input type="text" t-model="orderManagementContext.searchString" t-on-keydown="onInputKeydown" placeholder="E.g. customer: Steward, date: 2020-05-09" />
+ <span class="clear" t-on-click="trigger('clear-search')">
+ <i class="fa fa-remove" />
+ </span>
+ </div>
+ <div t-if="showPageControls" class="item">
+ <div class="page-controls">
+ <div class="previous" t-on-click="trigger('prev-page')">
+ <i class="fa fa-fw fa-caret-left" role="img" aria-label="Previous Order List" title="Previous Order List"></i>
+ </div>
+ <div class="next" t-on-click="trigger('next-page')">
+ <i class="fa fa-fw fa-caret-right" role="img" aria-label="Next Order List" title="Next Order List"></i>
+ </div>
+ </div>
+ <div class="page">
+ <span><t t-esc="pageNumber" /></span>
+ </div>
+ </div>
+ <div t-else="" class="item"></div>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderManagementScreen.xml b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderManagementScreen.xml
new file mode 100644
index 00000000..8992e2c8
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderManagementScreen.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="OrderManagementScreen" owl="1">
+ <div class="order-management-screen screen" t-att-class="{ oe_hidden: !props.isShown }">
+ <div t-if="!env.isMobile" class="screen-full-width">
+ <div class="leftpane">
+ <OrderDetails order="orderManagementContext.selectedOrder" />
+ <div class="pads">
+ <div class="control-buttons">
+ <t t-foreach="controlButtons" t-as="cb" t-key="cb.name">
+ <t t-component="cb.component" t-key="cb.name" />
+ </t>
+ </div>
+ <div class="subpads">
+ <ActionpadWidget client="selectedClient" />
+ <NumpadWidget />
+ </div>
+ </div>
+ </div>
+ <div class="rightpane">
+ <div class="flex-container">
+ <OrderManagementControlPanel />
+ <OrderList orders="orders" initHighlightedOrder="orderManagementContext.selectedOrder" />
+ </div>
+ </div>
+ </div>
+ <MobileOrderManagementScreen t-else="" />
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderRow.xml b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderRow.xml
new file mode 100644
index 00000000..29b07cfe
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderRow.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="OrderRow" owl="1">
+ <div class="order-row"
+ t-att-class="{ highlight: highlighted, lighter: !props.order.locked }"
+ t-on-click="trigger('click-order', props.order)">
+ <div class="item name"><t t-esc="name" /></div>
+ <div class="item date"><t t-esc="date" /></div>
+ <div class="item customer"><t t-esc="customer" /></div>
+ <div class="item total"><t t-esc="total" /></div>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderlineDetails.xml b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderlineDetails.xml
new file mode 100644
index 00000000..2e6869e5
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/OrderlineDetails.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="OrderlineDetails" owl="1">
+ <li class="orderline">
+ <span class="product-name">
+ <t t-esc="productName" />
+ </span>
+ <span class="price">
+ <t t-esc="totalPrice" />
+ </span>
+ <li class="info">
+ <strong>
+ <t t-esc="quantity" />
+ </strong>
+ <span><t t-esc="pricePerUnit" /></span>
+ </li>
+ </li>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/ReprintReceiptScreen.xml b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/ReprintReceiptScreen.xml
new file mode 100644
index 00000000..0a80a0e0
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/OrderManagementScreen/ReprintReceiptScreen.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="ReprintReceiptScreen" owl="1">
+ <div class="receipt-screen screen">
+ <div class="screen-content">
+ <div class="top-content">
+ <span class="button back" t-on-click="confirm">
+ <i class="fa fa-angle-double-left"></i>
+ <span> </span>
+ <span>Back</span>
+ </span>
+ </div>
+ <div class="centered-content">
+ <div class="button print" t-on-click="tryReprint">
+ <i class="fa fa-print"></i> Print Receipt
+ </div>
+ <div class="pos-receipt-container">
+ <OrderReceipt order="props.order" t-ref="order-receipt" />
+ </div>
+ </div>
+ </div>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PSNumpadInputButton.xml b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PSNumpadInputButton.xml
new file mode 100644
index 00000000..381cd88c
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PSNumpadInputButton.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="PSNumpadInputButton" owl="1">
+ <button t-attf-class="{{ _class }}"
+ t-on-click="trigger('input-from-numpad', { key: props.value })">
+ <t t-slot="default">
+ <t t-if="props.text">
+ <t t-esc="props.text" />
+ </t>
+ <t t-else="">
+ <t t-esc="props.value" />
+ </t>
+ </t>
+ </button>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentMethodButton.xml b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentMethodButton.xml
new file mode 100644
index 00000000..dacf7e96
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentMethodButton.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="PaymentMethodButton" owl="1">
+ <div class="button paymentmethod"
+ t-on-click="trigger('new-payment-line', props.paymentMethod)">
+ <div class="payment-name">
+ <t t-esc="props.paymentMethod.name" />
+ </div>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreen.xml b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreen.xml
new file mode 100644
index 00000000..d78128c9
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreen.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="PaymentScreen" owl="1">
+ <div class="payment-screen screen" t-att-class="{ oe_hidden: !props.isShown }">
+ <div class="screen-content">
+ <t t-if="!env.isMobile">
+ <div class="top-content">
+ <div class="button back"
+ t-on-click="showScreen('ProductScreen')">
+ <i class="fa fa-angle-double-left fa-fw"></i>
+ <span class="back_text">Back</span>
+ </div>
+ <div class="top-content-center"><h1>Payment</h1></div>
+ <div class="button next" t-att-class="{ highlight: currentOrder.is_paid() }"
+ t-on-click="validateOrder(false)">
+ <span class="next_text">Validate</span>
+ <i class="fa fa-angle-double-right fa-fw"></i>
+ </div>
+ </div>
+ </t>
+ <div class="main-content">
+ <div class="left-content">
+ <t t-if="env.isMobile">
+ <section class="paymentlines-container">
+ <PaymentScreenStatus paymentLines="paymentLines" />
+ </section>
+ </t>
+ <div class="paymentmethods-container">
+ <PaymentScreenPaymentLines paymentLines="paymentLines" />
+ <div class="paymentmethods">
+ <t t-foreach="payment_methods_from_config" t-as="paymentMethod"
+ t-key="paymentMethod.id">
+ <PaymentMethodButton paymentMethod="paymentMethod" />
+ </t>
+ </div>
+ </div>
+ </div>
+ <div class="right-content">
+ <t t-if="!env.isMobile">
+ <section class="paymentlines-container">
+ <PaymentScreenStatus paymentLines="paymentLines" />
+ </section>
+ </t>
+
+ <div class="payment-buttons-container">
+ <section class="payment-numpad">
+ <PaymentScreenNumpad />
+ </section>
+
+ <div class="payment-buttons">
+ <div class="customer-button">
+ <div class="button" t-on-click="selectClient">
+ <i class="fa fa-user" role="img" aria-label="Customer"
+ title="Customer" />
+ <span class="js_customer_name">
+ <t t-if="env.pos.get_client()">
+ <t t-esc="env.pos.get_client().name" />
+ </t>
+ <t t-if="!env.pos.get_client()">
+ Customer
+ </t>
+ </span>
+ </div>
+ </div>
+ <div class="payment-controls">
+ <div t-if="env.pos.config.module_account" class="button js_invoice"
+ t-att-class="{ highlight: currentOrder.is_to_invoice() }"
+ t-on-click="toggleIsToInvoice">
+ <i class="fa fa-file-text-o" /> Invoice
+ </div>
+ <div t-if="env.pos.config.tip_product_id" class="button js_tip"
+ t-on-click="addTip">
+ <i class="fa fa-heart" /> Tip
+ </div>
+ <div t-if="env.pos.config.iface_cashdrawer" class="button js_cashdrawer"
+ t-on-click="openCashbox">
+ <i class="fa fa-archive" /> Open Cashbox
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <t t-if="env.isMobile">
+ <div class="switchpane">
+ <button class="btn-switchpane" t-att-class="{ secondary: !currentOrder.is_paid() }" t-on-click="validateOrder(false)">
+ <h1>Validate</h1>
+ </button>
+ <button class="btn-switchpane secondary" t-on-click="showScreen('ProductScreen', {mobile_pane: 'left'})">
+ <h1>Review</h1>
+ </button>
+ </div>
+ </t>
+ </div>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenElectronicPayment.xml b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenElectronicPayment.xml
new file mode 100644
index 00000000..792c490c
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenElectronicPayment.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="PaymentScreenElectronicPayment" owl="1">
+ <div class="paymentline electronic_payment">
+ <t t-if="props.line.payment_status == 'pending'">
+ <div>
+ Payment request pending
+ </div>
+ <div class="button send_payment_request highlight" title="Send Payment Request" t-on-click="trigger('send-payment-request', props.line)">
+ Send
+ </div>
+ </t>
+ <t t-elif="props.line.payment_status == 'retry'">
+ <div>
+ Transaction cancelled
+ </div>
+ <div class="button send_payment_request highlight" title="Send Payment Request" t-on-click="trigger('send-payment-request', props.line)">
+ Retry
+ </div>
+ </t>
+ <t t-elif="props.line.payment_status == 'force_done'">
+ <div>
+ Connection error
+ </div>
+ <div class="button send_force_done" title="Force Done" t-on-click="trigger('send-force-done', props.line)">
+ Force done
+ </div>
+ </t>
+ <t t-elif="props.line.payment_status == 'waitingCard'">
+ <div>
+ Waiting for card
+ </div>
+ <div class="button send_payment_cancel" title="Cancel Payment Request" t-on-click="trigger('send-payment-cancel', props.line)">
+ Cancel
+ </div>
+ </t>
+ <t t-elif="['waiting', 'waitingCancel'].includes(props.line.payment_status)">
+ <div>
+ Request sent
+ </div>
+ <div>
+ <i class="fa fa-spinner fa-spin" role="img" />
+ </div>
+ </t>
+ <t t-elif="props.line.payment_status == 'reversing'">
+ <div>
+ Reversal request sent to terminal
+ </div>
+ <div>
+ <i class="fa fa-spinner fa-spin" role="img" />
+ </div>
+ </t>
+ <t t-elif="props.line.payment_status == 'done'">
+ <div>
+ Payment Successful
+ </div>
+ <t t-if="props.line.can_be_reversed">
+ <div class="button send_payment_reversal" title="Reverse Payment" t-on-click="trigger('send-payment-reverse', props.line)">
+ Reverse
+ </div>
+ </t>
+ <t t-else="">
+ <div></div>
+ </t>
+ </t>
+ <t t-elif="props.line.payment_status == 'reversed'">
+ <div>
+ Payment reversed
+ </div>
+ <div></div>
+ </t>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenNumpad.xml b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenNumpad.xml
new file mode 100644
index 00000000..d988ab5f
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenNumpad.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="PaymentScreenNumpad" owl="1">
+ <div class="numpad">
+ <PSNumpadInputButton value="'1'" />
+ <PSNumpadInputButton value="'2'" />
+ <PSNumpadInputButton value="'3'" />
+ <PSNumpadInputButton value="'+10'" changeClassTo="'mode-button'" />
+ <br />
+ <PSNumpadInputButton value="'4'" />
+ <PSNumpadInputButton value="'5'" />
+ <PSNumpadInputButton value="'6'" />
+ <PSNumpadInputButton value="'+20'" changeClassTo="'mode-button'" />
+ <br />
+ <PSNumpadInputButton value="'7'" />
+ <PSNumpadInputButton value="'8'" />
+ <PSNumpadInputButton value="'9'" />
+ <PSNumpadInputButton value="'+50'" changeClassTo="'mode-button'" />
+ <br />
+ <PSNumpadInputButton value="'-'" text="'+/-'" />
+ <PSNumpadInputButton value="'0'" />
+ <PSNumpadInputButton value="decimalPoint" />
+ <PSNumpadInputButton value="'Backspace'">
+ <img src="/point_of_sale/static/src/img/backspace.png" width="24" height="21"
+ alt="Backspace" />
+ </PSNumpadInputButton>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenPaymentLines.xml b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenPaymentLines.xml
new file mode 100644
index 00000000..6816f300
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenPaymentLines.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="PaymentScreenPaymentLines" owl="1">
+ <div class="paymentlines">
+ <t t-foreach="props.paymentLines" t-as="line" t-key="line.cid">
+ <t t-if="line.selected">
+ <div class="paymentline selected"
+ t-att-class="selectedLineClass(line)"
+ t-on-click="trigger('select-payment-line', { cid: line.cid })">
+ <div class="payment-name">
+ <t t-esc="line.payment_method.name" />
+ </div>
+ <div class="payment-amount">
+ <t t-if="line and line.payment_status and ['done', 'waitingCard', 'waiting', 'reversing', 'reversed'].includes(line.payment_status)">
+ <t t-esc="env.pos.format_currency_no_symbol(line.get_amount())" />
+ </t>
+ <t t-else="">
+ <t t-esc="formatLineAmount(line)" />
+ </t>
+ </div>
+ <t t-if="!line.payment_status or !['done', 'reversed'].includes(line.payment_status)">
+ <div class="delete-button"
+ t-on-click="trigger('delete-payment-line', { cid: line.cid })"
+ aria-label="Delete" title="Delete">
+ <i class="fa fa-times-circle" />
+ </div>
+ </t>
+ </div>
+ <t t-if="line and line.payment_status">
+ <PaymentScreenElectronicPayment line="line" />
+ </t>
+ </t>
+ <t t-else="">
+ <div class="paymentline"
+ t-att-class="unselectedLineClass(line)"
+ t-on-click="trigger('select-payment-line', { cid: line.cid })">
+ <div class="payment-name">
+ <t t-esc="line.payment_method.name" />
+ </div>
+ <div class="payment-amount">
+ <t t-if="line and line.payment_status and ['done', 'waitingCard', 'waiting', 'reversing', 'reversed'].includes(line.payment_status)">
+ <t t-esc="env.pos.format_currency_no_symbol(line.get_amount())" />
+ </t>
+ <t t-else="">
+ <t t-esc="formatLineAmount(line)" />
+ </t>
+ </div>
+ <t t-if="!line.payment_status or !['done', 'reversed'].includes(line.payment_status)">
+ <div class="delete-button"
+ t-on-click="trigger('delete-payment-line', { cid: line.cid })"
+ aria-label="Delete" title="Delete">
+ <i class="fa fa-times-circle" />
+ </div>
+ </t>
+ </div>
+ </t>
+ </t>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenStatus.xml b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenStatus.xml
new file mode 100644
index 00000000..7c90c8a5
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/PaymentScreen/PaymentScreenStatus.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+<t t-name="PaymentScreenStatus" owl="1">
+ <div t-if="props.paymentLines.length === 0" class="paymentlines-empty">
+ <div class="total">
+ <t t-esc="totalDueText" />
+ </div>
+ <div class="message">
+ Please select a payment method.
+ </div>
+ </div>
+
+ <div t-else="">
+ <div class="payment-status-container">
+ <div>
+ <div class="payment-status-remaining">
+ <span class="label">Remaining</span>
+ <span class="amount"
+ t-att-class="{ highlight: currentOrder.get_due() > 0 }">
+ <t t-esc="remainingText" />
+ </span>
+ </div>
+ <div class="payment-status-total-due">
+ <span class="label">Total Due</span>
+ <span>
+ <t t-esc="totalDueText" />
+ </span>
+ </div>
+ </div>
+ <div>
+ <div class="payment-status-change">
+ <span class="label">Change</span>
+ <span class="amount"
+ t-att-class="{ highlight: currentOrder.get_change() > 0 }">
+ <t t-esc="changeText" />
+ </span>
+ </div>
+ </div>
+ </div>
+ </div>
+</t>
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ActionpadWidget.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ActionpadWidget.xml
new file mode 100644
index 00000000..183912fd
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ActionpadWidget.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="ActionpadWidget" owl="1">
+ <div class="actionpad">
+ <button class="button set-customer" t-att-class="{'decentered': isLongName}"
+ t-on-click="trigger('click-customer')">
+ <t t-if="!env.isMobile"><i class="fa fa-user" role="img" aria-label="Customer" title="Customer" /></t>
+ <t t-if="client">
+ <t t-esc="client.name" />
+ </t>
+ <t t-else="">
+ Customer
+ </t>
+ </button>
+ <button class="button pay" t-on-click="trigger('click-pay')">
+ <div class="pay-circle">
+ <i class="fa fa-chevron-right" role="img" aria-label="Pay" title="Pay" />
+ </div>
+ Payment
+ </button>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/CashBoxOpening.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/CashBoxOpening.xml
new file mode 100644
index 00000000..27193bf9
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/CashBoxOpening.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="CashBoxOpening" owl="1">
+ <div style="margin-top: -20px;">
+ <br/>
+ <h1>
+ <span>
+ Pos closed.
+ </span><br/>
+ <span>
+ Set a cash opening
+ </span>
+
+ </h1>
+ <h1>Opening amount:</h1>
+ <input name="cashBoxValue" class="cashbox-input" t-on-change="captureChange" t-att-value="defaultValue"/>
+ <span class="currencyCashBox" t-esc="symbol"/>
+
+ <h1>Notes:</h1>
+ <textarea name="notes" style="width: 51%" t-on-change="captureChange"/><br/><br/>
+
+ <span class="control-button" t-on-click="startSession()">Open</span>
+
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/CategoryBreadcrumb.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/CategoryBreadcrumb.xml
new file mode 100644
index 00000000..0e9ba155
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/CategoryBreadcrumb.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="CategoryBreadcrumb" owl="1">
+ <span class="breadcrumb">
+ <img src="/point_of_sale/static/src/img/bc-arrow-big.png" class="breadcrumb-arrow"
+ alt="Slash" />
+ <span class="breadcrumb-button"
+ t-on-click="trigger('switch-category', props.category.id)">
+ <t t-esc="props.category.name"></t>
+ </span>
+ </span>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/CategoryButton.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/CategoryButton.xml
new file mode 100644
index 00000000..da829cba
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/CategoryButton.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="CategoryButton" owl="1">
+ <span class="category-button" t-on-click="trigger('switch-category', props.category.id)">
+ <div class="category-img">
+ <img t-att-src="imageUrl" alt="Category" />
+ </div>
+ <div class="category-name">
+ <t t-esc="props.category.name" />
+ </div>
+ </span>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/CategorySimpleButton.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/CategorySimpleButton.xml
new file mode 100644
index 00000000..de052e16
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/CategorySimpleButton.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="CategorySimpleButton" owl="1">
+ <span class="category-simple-button"
+ t-on-click="trigger('switch-category', props.category.id)">
+ <t t-esc="props.category.name" />
+ </span>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ControlButtons/SetFiscalPositionButton.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ControlButtons/SetFiscalPositionButton.xml
new file mode 100644
index 00000000..ab09f363
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ControlButtons/SetFiscalPositionButton.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="SetFiscalPositionButton" owl="1">
+ <div class="control-button o_fiscal_position_button">
+ <i class="fa fa-book" role="img" aria-label="Set fiscal position"
+ title="Set fiscal position" />
+ <t t-esc='currentFiscalPositionName' />
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ControlButtons/SetPricelistButton.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ControlButtons/SetPricelistButton.xml
new file mode 100644
index 00000000..ffe3e3ec
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ControlButtons/SetPricelistButton.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="SetPricelistButton" owl="1">
+ <div class="control-button o_pricelist_button">
+ <i class="fa fa-th-list" role="img" aria-label="Price list" title="Price list" />
+ <t t-esc="currentPricelistName" />
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/HomeCategoryBreadcrumb.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/HomeCategoryBreadcrumb.xml
new file mode 100644
index 00000000..2bfa426e
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/HomeCategoryBreadcrumb.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="HomeCategoryBreadcrumb" owl="1">
+ <span class="breadcrumb">
+ <span t-if="!env.isMobile" class="breadcrumb-button breadcrumb-home"
+ t-on-click="trigger('switch-category', 0)">
+ <i class="fa fa-home" role="img" aria-label="Home" title="Home"></i>
+ </span>
+ <span t-if="env.isMobile" class="breadcrumb-button breadcrumb-home"
+ t-on-click="trigger('categ-popup', props.subcategories)">
+ <t t-if="env.pos.get('selectedCategoryId') === 0">
+ All
+ </t>
+ <t t-else="">
+ <t t-esc="props.currentCat.name"/>
+ </t>
+ </span>
+ </span>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/NumpadWidget.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/NumpadWidget.xml
new file mode 100644
index 00000000..4b9962c0
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/NumpadWidget.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="NumpadWidget" owl="1">
+ <div class="numpad">
+ <button class="input-button number-char" t-on-click="sendInput('1')">1</button>
+ <button class="input-button number-char" t-on-click="sendInput('2')">2</button>
+ <button class="input-button number-char" t-on-click="sendInput('3')">3</button>
+ <button class="mode-button" t-att-class="{'selected-mode': props.activeMode === 'quantity'}"
+ t-on-click="changeMode('quantity')">Qty</button>
+ <br />
+ <button class="input-button number-char" t-on-click="sendInput('4')">4</button>
+ <button class="input-button number-char" t-on-click="sendInput('5')">5</button>
+ <button class="input-button number-char" t-on-click="sendInput('6')">6</button>
+ <button class="mode-button" t-att-class="{
+ 'selected-mode': props.activeMode === 'discount',
+ 'disabled-mode': !hasManualDiscount
+ }"
+ t-att-disabled="!hasManualDiscount"
+ t-on-click="changeMode('discount')">Disc</button>
+ <br />
+ <button class="input-button number-char" t-on-click="sendInput('7')">7</button>
+ <button class="input-button number-char" t-on-click="sendInput('8')">8</button>
+ <button class="input-button number-char" t-on-click="sendInput('9')">9</button>
+ <button class="mode-button" t-att-class="{
+ 'selected-mode': props.activeMode === 'price',
+ 'disabled-mode': !hasPriceControlRights
+ }" t-att-disabled="!hasPriceControlRights"
+ t-on-click="changeMode('price')">Price</button>
+ <br />
+ <button class="input-button numpad-minus" t-on-click="sendInput('-')">+/-</button>
+ <button class="input-button number-char" t-on-click="sendInput('0')">0</button>
+ <button class="input-button number-char" t-on-click="sendInput(decimalSeparator)">
+ <t t-esc="decimalSeparator" />
+ </button>
+ <button class="input-button numpad-backspace" t-on-click="sendInput('Backspace')">
+ <img style="pointer-events: none;" src="/point_of_sale/static/src/img/backspace.png"
+ width="24" height="21" alt="Backspace" />
+ </button>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/OrderSummary.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/OrderSummary.xml
new file mode 100644
index 00000000..a229c53a
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/OrderSummary.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="OrderSummary" owl="1">
+ <div class="summary clearfix">
+ <div class="line">
+ <div class="entry total">
+ <span class="badge">Total: </span>
+ <span class="value">
+ <t t-esc="props.total" />
+ </span>
+ <div t-if="props.tax" class="subentry">
+ Taxes:
+ <span class="value">
+ <t t-esc="props.tax" />
+ </span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </t>
+
+</templates> \ No newline at end of file
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/OrderWidget.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/OrderWidget.xml
new file mode 100644
index 00000000..532309dc
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/OrderWidget.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="OrderWidget" owl="1">
+ <div class="order-container" t-ref="scrollable">
+ <div class="order">
+ <t t-if="orderlinesArray.length === 0" >
+ <div class='order-empty'>
+ <i class='fa fa-shopping-cart' role="img" aria-label="Shopping cart"
+ title="Shopping cart"/>
+ <h1>This order is empty</h1>
+ </div>
+ </t>
+ <t t-else="">
+ <ul class="orderlines">
+ <t t-foreach="orderlinesArray" t-as="orderline" t-key="orderline.id">
+ <Orderline line="orderline" />
+ </t>
+ </ul>
+ <OrderSummary total="state.total" tax="state.tax" />
+ </t>
+ </div>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/Orderline.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/Orderline.xml
new file mode 100644
index 00000000..e4ede636
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/Orderline.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="Orderline" owl="1">
+ <li t-on-click="selectLine" class="orderline" t-att-class="addedClasses">
+ <span class="product-name">
+ <t t-esc="props.line.get_full_product_name()"/>
+ <span> </span>
+ <t t-if="props.line.get_product().tracking!=='none' &amp;&amp; (env.pos.picking_type.use_create_lots || env.pos.picking_type.use_existing_lots)">
+ <t t-if="props.line.has_valid_product_lot()">
+ <i t-on-click.stop="lotIconClicked"
+ class="oe_link_icon fa fa-list oe_icon line-lot-icon oe_green"
+ aria-label="Valid product lot"
+ role="img"
+ title="Valid product lot"
+ />
+ </t>
+ <t t-else="">
+ <i t-on-click.stop="lotIconClicked"
+ class="oe_link_icon fa fa-list oe_icon line-lot-icon oe_red"
+ aria-label="Invalid product lot"
+ role="img"
+ title="Invalid product lot"
+ />
+ </t>
+ </t>
+ </span>
+ <span class="price">
+ <t t-esc="env.pos.format_currency(props.line.get_display_price())"/>
+ </span>
+ <ul class="info-list">
+ <t t-if="props.line.get_quantity_str() !== '1' || props.line.selected ">
+ <li class="info">
+ <em>
+ <t t-esc="props.line.get_quantity_str()" />
+ </em>
+ <span> </span><t t-esc="props.line.get_unit().name" />
+ at
+ <t t-if="props.line.display_discount_policy() == 'without_discount' and
+ props.line.get_unit_display_price() &lt; props.line.get_lst_price()">
+ <s>
+ <t t-esc="env.pos.format_currency(props.line.get_fixed_lst_price(),'Product Price')" />
+ </s>
+ <t t-esc="env.pos.format_currency(props.line.get_unit_display_price(),'Product Price')" />
+ </t>
+ <t t-else="">
+ <t t-esc="env.pos.format_currency(props.line.get_unit_display_price(),'Product Price')" />
+ </t>
+ /
+ <t t-esc="props.line.get_unit().name" />
+ </li>
+ </t>
+ <t t-if="props.line.get_discount_str() !== '0'">
+ <li class="info">
+ With a
+ <em>
+ <t t-esc="props.line.get_discount_str()" />%
+ </em>
+ discount
+ </li>
+ </t>
+ </ul>
+ <t t-if="props.line.get_lot_lines()">
+ <ul class="info-list">
+ <t t-foreach="props.line.get_lot_lines()" t-as="lot" t-key="lot.cid">
+ <li>
+ SN <t t-esc="lot.attributes['lot_name']"/>
+ </li>
+ </t>
+ </ul>
+ </t>
+ </li>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductItem.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductItem.xml
new file mode 100644
index 00000000..4825efaf
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductItem.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="ProductItem" owl="1">
+ <article class="product" tabindex="0" t-on-keypress="spaceClickProduct"
+ t-on-click="trigger('click-product', props.product)"
+ t-att-data-product-id="props.product.id"
+ t-attf-aria-labelledby="article_product_{{props.product.id}}">
+ <div class="product-img">
+ <img t-att-src="imageUrl" t-att-alt="props.product.display_name" />
+ <span class="price-tag">
+ <t t-esc="price" />
+ </span>
+ </div>
+ <div class="product-name" t-attf-id="article_product_{{props.product.id}}">
+ <t t-esc="props.product.display_name" />
+ </div>
+ </article>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductList.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductList.xml
new file mode 100644
index 00000000..9e87ca95
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductList.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="ProductList" owl="1">
+ <div class="product-list-container">
+ <div t-if="props.products.length != 0" class="product-list">
+ <t t-foreach="props.products" t-as="product" t-key="product.id">
+ <ProductItem product="product" />
+ </t>
+ </div>
+ <div t-else="" class="product-list-empty">
+ <div class="product-list-empty">
+ <t t-if="props.searchWord !== ''">
+ <p>
+ No results found for "
+ <b t-esc="props.searchWord"></b>
+ ".
+ </p>
+ </t>
+ <t t-else="">
+ <p>There are no products in this category.</p>
+ </t>
+ </div>
+ </div>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductScreen.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductScreen.xml
new file mode 100644
index 00000000..6bef9281
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductScreen.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="ProductScreen" owl="1">
+ <div class="product-screen screen" t-att-class="{ oe_hidden: !props.isShown }">
+ <div class="screen-full-width">
+ <div class="leftpane" t-if="!env.isMobile || mobile_pane === 'left'">
+ <t t-if="state.cashControl">
+ <CashBoxOpening cashControl="state"/>
+ </t>
+ <t t-else="">
+ <OrderWidget/>
+ <div class="pads">
+ <div class="control-buttons">
+ <t t-foreach="controlButtons" t-as="cb" t-key="cb.name">
+ <t t-component="cb.component" t-key="cb.name" />
+ </t>
+ </div>
+ <div class="subpads">
+ <ActionpadWidget client="client"/>
+ <NumpadWidget activeMode="state.numpadMode" />
+ </div>
+ </div>
+ <t t-if="env.isMobile">
+ <MobileOrderWidget pane="mobile_pane" t-on-switchpane="switchPane"/>
+ </t>
+ </t>
+ </div>
+ <div class="rightpane" t-if="!env.isMobile || mobile_pane === 'right'">
+ <ProductsWidget t-if="!state.cashControl"/>
+ <t t-if="env.isMobile">
+ <MobileOrderWidget pane="mobile_pane" t-on-switchpane="switchPane"/>
+ </t>
+ </div>
+ </div>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductsWidget.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductsWidget.xml
new file mode 100644
index 00000000..3dfd5276
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductsWidget.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="ProductsWidget" owl="1">
+ <div class="products-widget">
+ <ProductsWidgetControlPanel breadcrumbs="breadcrumbs" subcategories="subcategories" hasNoCategories="hasNoCategories" />
+ <ProductList products="productsToDisplay" searchWord="searchWord" />
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductsWidgetControlPanel.xml b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductsWidgetControlPanel.xml
new file mode 100644
index 00000000..2c7d7727
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ProductScreen/ProductsWidgetControlPanel.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="ProductsWidgetControlPanel" owl="1">
+ <div class="products-widget-control">
+ <t t-if="!props.hasNoCategories">
+ <div class="rightpane-header" t-att-class="{
+ 'green-border-bottom': !env.pos.config.iface_display_categ_images,
+ 'grey-border-bottom': env.pos.config.iface_display_categ_images,
+ }">
+ <!-- Breadcrumbs -->
+ <div class="breadcrumbs">
+ <HomeCategoryBreadcrumb subcategories="props.subcategories" currentCat="props.breadcrumbs[props.breadcrumbs.length - 1]"/>
+ <t t-if="!env.isMobile">
+ <t t-foreach="props.breadcrumbs" t-as="category" t-key="category.id">
+ <CategoryBreadcrumb category="category" />
+ </t>
+ </t>
+ </div>
+ <!-- Subcategories -->
+ <t t-if="props.subcategories.length > 0 and !env.pos.config.iface_display_categ_images and !env.isMobile">
+ <t t-foreach="props.subcategories" t-as="category" t-key="category.id">
+ <CategorySimpleButton category="category" />
+ </t>
+ </t>
+ </div>
+ <t t-if="props.subcategories.length > 0 and env.pos.config.iface_display_categ_images and !env.isMobile">
+ <div class="categories">
+ <div class="category-list-scroller">
+ <div class="category-list">
+ <t t-foreach="props.subcategories" t-as="category" t-key="category.id">
+ <CategoryButton category="category" />
+ </t>
+ </div>
+ </div>
+ </div>
+ </t>
+ </t>
+ <Portal target="'.pos .search-bar-portal'">
+ <div class="search-box">
+ <span class="icon"><i class="fa fa-search"></i></span>
+ <span t-on-click="clearSearch" class="clear-icon">
+ <i class="fa fa-times" aria-hidden="true"></i>
+ </span>
+ <input t-ref="search-word-input" type="text" placeholder="Search Products..." t-on-keyup="updateSearch" />
+ </div>
+ </Portal>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ReceiptScreen/OrderReceipt.xml b/addons/point_of_sale/static/src/xml/Screens/ReceiptScreen/OrderReceipt.xml
new file mode 100644
index 00000000..379b360d
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ReceiptScreen/OrderReceipt.xml
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="OrderReceipt" owl="1">
+ <div class="pos-receipt">
+ <t t-if="receipt.company.logo">
+ <img class="pos-receipt-logo" t-att-src="receipt.company.logo" alt="Logo"/>
+ <br/>
+ </t>
+ <t t-if="!receipt.company.logo">
+ <h2 class="pos-receipt-center-align">
+ <t t-esc="receipt.company.name" />
+ </h2>
+ <br/>
+ </t>
+ <div class="pos-receipt-contact">
+ <t t-if="receipt.company.contact_address">
+ <div><t t-esc="receipt.company.contact_address" /></div>
+ </t>
+ <t t-if="receipt.company.phone">
+ <div>Tel:<t t-esc="receipt.company.phone" /></div>
+ </t>
+ <t t-if="receipt.company.vat">
+ <div><t t-esc="receipt.company.vat_label"/>:<t t-esc="receipt.company.vat" /></div>
+ </t>
+ <t t-if="receipt.company.email">
+ <div><t t-esc="receipt.company.email" /></div>
+ </t>
+ <t t-if="receipt.company.website">
+ <div><t t-esc="receipt.company.website" /></div>
+ </t>
+ <t t-if="receipt.header_html">
+ <t t-raw="receipt.header_html" />
+ </t>
+ <t t-if="!receipt.header_html and receipt.header">
+ <div style="white-space:pre-line"><t t-esc="receipt.header" /></div>
+ </t>
+ <t t-if="receipt.cashier">
+ <div class="cashier">
+ <div>--------------------------------</div>
+ <div>Served by <t t-esc="receipt.cashier" /></div>
+ </div>
+ </t>
+ </div>
+ <br /><br />
+
+ <!-- Orderlines -->
+
+ <div class="orderlines">
+ <t t-foreach="receipt.orderlines" t-as="line" t-key="line.id">
+ <t t-if="isSimple(line)">
+ <div>
+ <t t-esc="line.product_name_wrapped[0]" />
+ <span t-esc="env.pos.format_currency_no_symbol(line.price_display)" class="price_display pos-receipt-right-align"/>
+ </div>
+ <WrappedProductNameLines line="line" />
+ </t>
+ <t t-else="">
+ <div t-esc="line.product_name_wrapped[0]" />
+ <WrappedProductNameLines line="line" />
+ <t t-if="line.display_discount_policy == 'without_discount' and line.price != line.price_lst">
+ <div class="pos-receipt-left-padding">
+ <t t-esc="env.pos.format_currency_no_symbol(line.price_lst)" />
+ ->
+ <t t-esc="env.pos.format_currency_no_symbol(line.price)" />
+ </div>
+ </t>
+ <t t-elif="line.discount !== 0">
+ <div class="pos-receipt-left-padding">
+ <t t-if="env.pos.config.iface_tax_included === 'total'">
+ <t t-esc="env.pos.format_currency_no_symbol(line.price_with_tax_before_discount)"/>
+ </t>
+ <t t-else="">
+ <t t-esc="env.pos.format_currency_no_symbol(line.price)"/>
+ </t>
+ </div>
+ </t>
+ <t t-if="line.discount !== 0">
+ <div class="pos-receipt-left-padding">
+ Discount: <t t-esc="line.discount" />%
+ </div>
+ </t>
+ <div class="pos-receipt-left-padding">
+ <t t-esc="Math.round(line.quantity * Math.pow(10, env.pos.dp['Product Unit of Measure'])) / Math.pow(10, env.pos.dp['Product Unit of Measure'])"/>
+ <t t-if="!line.is_in_unit" t-esc="line.unit_name" />
+ x
+ <t t-esc="env.pos.format_currency_no_symbol(line.price_display_one)" />
+ <span class="price_display pos-receipt-right-align">
+ <t t-esc="env.pos.format_currency_no_symbol(line.price_display)" />
+ </span>
+ </div>
+ </t>
+ <t t-if="line.pack_lot_lines">
+ <div class="pos-receipt-left-padding">
+ <ul>
+ <t t-foreach="line.pack_lot_lines" t-as="lot" t-key="lot.cid">
+ <li>
+ SN <t t-esc="lot.attributes['lot_name']"/>
+ </li>
+ </t>
+ </ul>
+ </div>
+ </t>
+ </t>
+ </div>
+
+ <!-- Subtotal -->
+
+ <t t-if="!isTaxIncluded">
+ <div class="pos-receipt-right-align">--------</div>
+ <br/>
+ <div>Subtotal<span t-esc="env.pos.format_currency(receipt.subtotal)" class="pos-receipt-right-align"/></div>
+ <t t-foreach="receipt.tax_details" t-as="tax" t-key="tax.name">
+ <div>
+ <t t-esc="tax.name" />
+ <span t-esc='env.pos.format_currency_no_symbol(tax.amount)' class="pos-receipt-right-align"/>
+ </div>
+ </t>
+ </t>
+
+ <!-- Total -->
+ <div class="pos-receipt-right-align">--------</div>
+ <br/>
+ <div class="pos-receipt-amount">
+ TOTAL
+ <span t-esc="env.pos.format_currency(receipt.total_with_tax)" class="pos-receipt-right-align"/>
+ </div>
+ <t t-if="receipt.total_rounded != receipt.total_with_tax">
+ <div class="pos-receipt-amount">
+ Rounding
+ <span t-esc='env.pos.format_currency(receipt.rounding_applied)' class="pos-receipt-right-align"/>
+ </div>
+ <div class="pos-receipt-amount">
+ To Pay
+ <span t-esc='env.pos.format_currency(receipt.total_rounded)' class="pos-receipt-right-align"/>
+ </div>
+ </t>
+ <br/><br/>
+
+ <!-- Payment Lines -->
+
+ <t t-foreach="receipt.paymentlines" t-as="line" t-key="line.cid">
+ <div>
+ <t t-esc="line.name" />
+ <span t-esc="env.pos.format_currency_no_symbol(line.amount)" class="pos-receipt-right-align"/>
+ </div>
+ </t>
+ <br/>
+
+ <div class="pos-receipt-amount receipt-change">
+ CHANGE
+ <span t-esc="env.pos.format_currency(receipt.change)" class="pos-receipt-right-align"/>
+ </div>
+ <br/>
+
+ <!-- Extra Payment Info -->
+
+ <t t-if="receipt.total_discount">
+ <div>
+ Discounts
+ <span t-esc="env.pos.format_currency(receipt.total_discount)" class="pos-receipt-right-align"/>
+ </div>
+ </t>
+ <t t-if="isTaxIncluded">
+ <t t-foreach="receipt.tax_details" t-as="tax" t-key="tax.name">
+ <div>
+ <t t-esc="tax.name" />
+ <span t-esc="env.pos.format_currency_no_symbol(tax.amount)" class="pos-receipt-right-align"/>
+ </div>
+ </t>
+ <div>
+ Total Taxes
+ <span t-esc="env.pos.format_currency(receipt.total_tax)" class="pos-receipt-right-align"/>
+ </div>
+ </t>
+
+ <div class="before-footer" />
+
+ <!-- Footer -->
+ <div t-if="receipt.footer_html" class="pos-receipt-center-align">
+ <t t-raw="receipt.footer_html" />
+ </div>
+
+ <div t-if="!receipt.footer_html and receipt.footer" class="pos-receipt-center-align" style="white-space:pre-line">
+ <br/>
+ <t t-esc="receipt.footer" />
+ <br/>
+ <br/>
+ </div>
+
+ <div class="after-footer">
+ <t t-foreach="receipt.paymentlines" t-as="line">
+ <t t-if="line.ticket">
+ <br />
+ <div class="pos-payment-terminal-receipt">
+ <t t-raw="line.ticket" />
+ </div>
+ </t>
+ </t>
+ </div>
+
+ <br/>
+ <div class="pos-receipt-order-data">
+ <div><t t-esc="receipt.name" /></div>
+ <div><t t-esc="receipt.date.localestring" /></div>
+ </div>
+
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ReceiptScreen/ReceiptScreen.xml b/addons/point_of_sale/static/src/xml/Screens/ReceiptScreen/ReceiptScreen.xml
new file mode 100644
index 00000000..8f0bd54a
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ReceiptScreen/ReceiptScreen.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="ReceiptScreen" owl="1">
+ <div class="receipt-screen screen">
+ <div class="screen-content">
+ <div class="top-content">
+ <div class="top-content-center">
+ <h1 t-if="!env.isMobile">
+ <t t-esc="orderAmountPlusTip" />
+ </h1>
+ </div>
+ <div class="button next" t-att-class="{ highlight: !locked }"
+ t-on-click="orderDone">
+ New Order <i class="fa fa-angle-double-right"></i>
+ </div>
+ </div>
+ <div class="default-view">
+ <div class="pos-receipt-container">
+ <OrderReceipt order="currentOrder" t-ref="order-receipt" />
+ </div>
+ <div class="actions">
+ <h1>How would you like to receive your receipt?</h1>
+ <div class="buttons">
+ <div class="button print" t-on-click="printReceipt">
+ <i class="fa fa-print"></i> Print Receipt
+ </div>
+ </div>
+ <form t-on-submit.prevent="onSendEmail" class="send-email">
+ <div class="email-icon"><i class="fa fa-envelope-o" aria-hidden="true"></i></div>
+ <div class="input-email">
+ <input type="email" placeholder="Email Receipt" t-model="orderUiState.inputEmail" />
+ <button class="send" t-att-class="{ highlight: is_email(orderUiState.inputEmail) }" type="submit">Send</button>
+ </div>
+ </form>
+ <t t-if="orderUiState.emailSuccessful !== null">
+ <div class="notice" t-attf-class="{{ orderUiState.emailSuccessful ? 'successful' : 'failed' }}">
+ <t t-esc="orderUiState.emailNotice"></t>
+ </div>
+ </t>
+ </div>
+ </div>
+ </div>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ReceiptScreen/WrappedProductNameLines.xml b/addons/point_of_sale/static/src/xml/Screens/ReceiptScreen/WrappedProductNameLines.xml
new file mode 100644
index 00000000..d49061a8
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ReceiptScreen/WrappedProductNameLines.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="WrappedProductNameLines" owl="1">
+ <span>
+ <t t-foreach="props.line.product_name_wrapped.slice(1)" t-as="wrapped_line"><t t-esc="wrapped_line"/></t>
+ </span>
+ </t>
+
+</templates>
diff --git a/addons/point_of_sale/static/src/xml/Screens/ScaleScreen/ScaleScreen.xml b/addons/point_of_sale/static/src/xml/Screens/ScaleScreen/ScaleScreen.xml
new file mode 100644
index 00000000..de21dcc3
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/ScaleScreen/ScaleScreen.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="ScaleScreen" owl="1">
+ <div class="scale-screen screen">
+ <div class="screen-content">
+ <div class="top-content">
+ <span class="button back" t-on-click="back">
+ <i class="fa fa-angle-double-left"></i>
+ Back
+ </span>
+ <h1 class="product-name">
+ <t t-esc="productName" />
+ </h1>
+ </div>
+ <div class="centered-content">
+ <div class="weight js-weight">
+ <t t-esc="productWeightString" />
+ </div>
+ <div class="product-price">
+ <t
+ t-esc="env.pos.format_currency(productPrice) + '/' + productUom" />
+ </div>
+ <div class="computed-price">
+ <t t-esc="computedPriceString" />
+ </div>
+ <div class="buy-product" t-on-click="confirm">
+ Order
+ <i class="fa fa-angle-double-right"></i>
+ </div>
+ </div>
+ </div>
+ </div>
+ </t>
+
+</templates> \ No newline at end of file
diff --git a/addons/point_of_sale/static/src/xml/Screens/TicketScreen/TicketScreen.xml b/addons/point_of_sale/static/src/xml/Screens/TicketScreen/TicketScreen.xml
new file mode 100644
index 00000000..40bfc501
--- /dev/null
+++ b/addons/point_of_sale/static/src/xml/Screens/TicketScreen/TicketScreen.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+
+ <t t-name="TicketScreen" owl="1">
+ <div class="ticket-screen screen">
+ <div class="screen-content">
+ <div class="controls">
+ <div class="buttons">
+ <button t-if="showNewTicketButton" class="highlight" t-on-click="createNewOrder">New Order</button>
+ <button class="discard" t-on-click="trigger('close-screen')">Discard</button>
+ </div>
+ <t t-set="placeholder">Search Tickets...</t>
+ <SearchBar config="searchBarConfig" placeholder="placeholder" />
+ </div>
+ <div class="orders">
+ <div class="header-row">
+ <div class="col start wide">Date</div>
+ <div class="col start wide">Receipt Number</div>
+ <div class="col start">Customer</div>
+ <div class="col start wide" t-if="showCardholderName()">Cardholder Name</div>
+ <div class="col start">Employee</div>
+ <div class="col end">Total</div>
+ <div class="col start narrow">Status</div>
+ <div class="col center very-narrow" name="delete"></div>
+ </div>
+ <t t-foreach="filteredOrderList" t-as="order" t-key="order.cid">
+ <div class="order-row pointer" t-on-click="selectOrder(order)">
+ <div class="col start wide">
+ <t t-esc="getDate(order)"></t>
+ </div>
+ <div class="col start wide">
+ <t t-esc="order.name"></t>
+ </div>
+ <div class="col start">
+ <t t-esc="getCustomer(order)"></t>
+ </div>
+ <div t-if="showCardholderName()" class="col start">
+ <t t-esc="getCardholderName(order)"></t>
+ </div>
+ <div class="col start">
+ <t t-esc="getEmployee(order)"></t>
+ </div>
+ <div class="col end">
+ <t t-esc="getTotal(order)"></t>
+ </div>
+ <div class="col start narrow">
+ <t t-esc="getStatus(order)"></t>
+ </div>
+ <div t-if="!hideDeleteButton(order)" class="col center very-narrow delete-button" name="delete" t-on-click.stop="deleteOrder(order)">
+ <i class="fa fa-trash" aria-hidden="true"></i>
+ </div>
+ <div t-else="" class="col center very-narrow delete-button"></div>
+ </div>
+ </t>
+ </div>
+ </div>
+ </div>
+ </t>
+
+</templates>