Merge pull request #7980 from rohitwaghchaure/target_bounty_redesign

[Enhancement] POS Redesign and new features
This commit is contained in:
Nabin Hait 2017-03-12 16:47:26 +05:30 committed by GitHub
commit d402829d17
15 changed files with 1515 additions and 711 deletions

View File

@ -1,5 +1,6 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "hash",
@ -21,7 +22,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Applicable for User",
"length": 0,
"no_copy": 0,
@ -50,7 +53,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Series",
"length": 0,
"no_copy": 1,
@ -81,7 +86,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Update Stock",
"length": 0,
"no_copy": 0,
@ -108,7 +115,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Warehouse",
"length": 0,
"no_copy": 0,
@ -137,7 +146,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Campaign",
"length": 0,
"no_copy": 0,
@ -165,7 +176,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
@ -191,7 +204,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Customer",
"length": 0,
"no_copy": 0,
@ -220,7 +235,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Company",
"length": 0,
"no_copy": 0,
@ -238,6 +255,36 @@
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "country",
"fieldtype": "Read Only",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Country",
"length": 0,
"no_copy": 0,
"options": "company.country",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
@ -249,7 +296,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Currency",
"length": 0,
"no_copy": 0,
@ -278,7 +327,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Ignore Pricing Rule",
"length": 0,
"no_copy": 0,
@ -305,7 +356,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Allow Delete",
"length": 0,
"no_copy": 0,
@ -332,7 +385,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Allow user to edit Rate",
"length": 0,
"no_copy": 0,
@ -359,7 +414,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
@ -385,7 +442,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Sales Invoice Payment",
"length": 0,
"no_copy": 0,
@ -413,7 +472,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
@ -439,7 +500,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Item Groups",
"length": 0,
"no_copy": 0,
@ -467,7 +530,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
@ -493,7 +558,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Customer Groups",
"length": 0,
"no_copy": 0,
@ -521,7 +588,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
@ -548,7 +617,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Print Format",
"length": 0,
"no_copy": 0,
@ -576,7 +647,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Letter Head",
"length": 0,
"no_copy": 0,
@ -605,7 +678,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Print Heading",
"length": 0,
"no_copy": 0,
@ -634,7 +709,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Terms and Conditions",
"length": 0,
"no_copy": 0,
@ -663,7 +740,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"oldfieldtype": "Column Break",
@ -690,7 +769,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Territory",
"length": 0,
"no_copy": 0,
@ -719,7 +800,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Price List",
"length": 0,
"no_copy": 0,
@ -748,7 +831,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Apply Discount",
"length": 0,
"no_copy": 0,
@ -777,7 +862,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Apply Discount On",
"length": 0,
"no_copy": 0,
@ -805,7 +892,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
@ -832,7 +921,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Write Off Account",
"length": 0,
"no_copy": 0,
@ -860,7 +951,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Write Off Cost Center",
"length": 0,
"no_copy": 0,
@ -888,7 +981,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Account for Change Amount",
"length": 0,
"no_copy": 0,
@ -916,7 +1011,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Taxes and Charges",
"length": 0,
"no_copy": 0,
@ -945,7 +1042,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
@ -971,7 +1070,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Income Account",
"length": 0,
"no_copy": 0,
@ -1001,7 +1102,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Expense Account",
"length": 0,
"no_copy": 0,
@ -1028,7 +1131,9 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Cost Center",
"length": 0,
"no_copy": 0,
@ -1047,18 +1152,18 @@
"unique": 0
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"icon": "icon-cog",
"idx": 1,
"image_view": 0,
"in_create": 0,
"in_dialog": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2016-12-28 15:14:59.411457",
"modified": "2017-03-10 16:53:56.390210",
"modified_by": "rohit@erpnext.com",
"module": "Accounts",
"name": "POS Profile",
@ -1074,7 +1179,6 @@
"export": 0,
"if_owner": 0,
"import": 0,
"is_custom": 0,
"permlevel": 0,
"print": 1,
"read": 1,
@ -1095,7 +1199,6 @@
"export": 0,
"if_owner": 0,
"import": 0,
"is_custom": 0,
"permlevel": 0,
"print": 1,
"read": 1,
@ -1110,8 +1213,10 @@
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"title_field": "user",
"track_changes": 0,
"track_seen": 0
}

View File

@ -5,6 +5,7 @@ from __future__ import unicode_literals
import frappe, json
from frappe.utils import nowdate
from erpnext.setup.utils import get_exchange_rate
from frappe.core.doctype.communication.email import make
from erpnext.stock.get_item_details import get_pos_profile
from erpnext.accounts.party import get_party_account_currency
from erpnext.controllers.accounts_controller import get_taxes_and_charges
@ -25,13 +26,15 @@ def get_pos_data():
update_multi_mode_option(doc, pos_profile)
default_print_format = pos_profile.get('print_format') or "Point of Sale"
print_template = frappe.db.get_value('Print Format', default_print_format, 'html')
customers = get_customers_list(pos_profile)
return {
'doc': doc,
'default_customer': pos_profile.get('customer'),
'items': get_items_list(pos_profile),
'item_groups': get_item_group(pos_profile),
'customers': get_customers_list(pos_profile),
'customers': customers,
'address': get_customers_address(customers),
'serial_no_data': get_serial_no_data(pos_profile, doc.company),
'batch_no_data': get_batch_no_data(),
'tax_data': get_item_tax_data(),
@ -60,6 +63,8 @@ def get_company_data(company):
def update_pos_profile_data(doc, pos_profile, company_data):
doc.campaign = pos_profile.get('campaign')
if not pos_profile.get('country'):
pos_profile["country"] = company_data.country
doc.write_off_account = pos_profile.get('write_off_account') or \
company_data.write_off_account
@ -163,6 +168,19 @@ def get_customers_list(pos_profile):
territory from tabCustomer where disabled = 0
and {cond}""".format(cond=cond), tuple(customer_groups), as_dict=1) or {}
def get_customers_address(customers):
customer_address = {}
for data in customers:
address = frappe.db.sql(""" select name, address_line1, address_line2, city, state,
email_id, phone, fax, pincode from `tabAddress` where is_primary_address =1 and name in
(select parent from `tabDynamic Link` where link_doctype = 'Customer' and link_name = %s
and parenttype = 'Address')""", data.name, as_dict=1)
if address:
address_data = address[0]
address_data.update({'full_name': data.customer_name})
customer_address[data.name] = address_data
return customer_address
def get_child_nodes(group_type, root):
lft, rgt = frappe.db.get_value(group_type, root, ["lft", "rgt"])
return frappe.db.sql_list(""" Select name from `tab{tab}` where
@ -257,12 +275,18 @@ def get_pricing_rule_data(doc):
return pricing_rules
@frappe.whitelist()
def make_invoice(doc_list):
def make_invoice(doc_list={}, email_queue_list={}, customers_list={}):
if isinstance(doc_list, basestring):
doc_list = json.loads(doc_list)
name_list = []
if isinstance(email_queue_list, basestring):
email_queue_list = json.loads(email_queue_list)
if isinstance(customers_list, basestring):
customers_list = json.loads(customers_list)
customers = make_customer_and_address(customers_list)
name_list = []
for docs in doc_list:
for name, doc in docs.items():
if not frappe.db.exists('Sales Invoice', {'offline_pos_name': name}):
@ -270,49 +294,72 @@ def make_invoice(doc_list):
si_doc = frappe.new_doc('Sales Invoice')
si_doc.offline_pos_name = name
si_doc.update(doc)
submit_invoice(si_doc, name)
submit_invoice(si_doc, name, doc)
name_list.append(name)
else:
name_list.append(name)
return name_list
email_queue = make_email_queue(email_queue_list)
return {
'invoice': name_list,
'email_queue': email_queue,
'customers': customers
}
def validate_records(doc):
validate_customer(doc)
validate_item(doc)
def validate_customer(doc):
if not frappe.db.exists('Customer', doc.get('customer')):
customer_doc = frappe.new_doc('Customer')
customer_doc.customer_name = doc.get('customer')
customer_doc.customer_type = 'Company'
customer_doc.customer_group = frappe.db.get_single_value('Selling Settings', 'customer_group')
customer_doc.territory = frappe.db.get_single_value('Selling Settings', 'territory')
customer_doc.flags.ignore_mandatory = True
customer_doc.save(ignore_permissions = True)
frappe.db.commit()
doc['customer'] = customer_doc.name
if doc.get('contact_details'):
args = json.loads(doc.get("contact_details"))
make_address(doc, args, customer_doc.name)
def make_customer_and_address(customers):
customer_list = []
for name, data in customers.items():
if not frappe.db.exists('Customer', name):
name = add_customer(name)
data = json.loads(data)
make_address(data, name)
customer_list.append(name)
return customer_list
def make_address(doc, args, customer):
if args.get("address_line1"):
def add_customer(name):
customer_doc = frappe.new_doc('Customer')
customer_doc.customer_name = name
customer_doc.customer_type = 'Company'
customer_doc.customer_group = frappe.db.get_single_value('Selling Settings', 'customer_group')
customer_doc.territory = frappe.db.get_single_value('Selling Settings', 'territory')
customer_doc.flags.ignore_mandatory = True
customer_doc.save(ignore_permissions = True)
frappe.db.commit()
def make_address(args, customer):
if args.get('name'):
address = frappe.get_doc('Address', args.get('name'))
else:
address = frappe.new_doc('Address')
address.address_line1 = args.get('address_line1')
address.address_line2 = args.get('address_line2')
address.city = args.get('city')
address.state = args.get('state')
address.zip_code = args.get('zip_code')
address.email_id = args.get('email_id')
address.flags.ignore_mandatory = True
address.country = frappe.db.get_value('Company', doc.get('company'), 'country')
address.country = frappe.db.get_value('Company', args.get('company'), 'country')
address.append('links',{
'link_doctype': 'Customer',
'link_name': customer
})
address.save(ignore_permissions = True)
frappe.db.commit()
address.is_primary_address = 1
address.is_shipping_address = 1
address.update(args)
address.save(ignore_permissions = True)
def make_email_queue(email_queue):
name_list = []
for key, data in email_queue.items():
name = frappe.db.get_value('Sales Invoice', {'offline_pos_name': key}, 'name')
data = json.loads(data)
sender = frappe.session.user
print_format = "POS Invoice"
attachments = [frappe.attach_print('Sales Invoice', name, print_format= print_format)]
make(subject = data.get('subject'), content = data.get('content'), recipients = data.get('recipients'),
sender=sender,attachments = attachments, send_email=True,
doctype='Sales Invoice', name=name)
name_list.append(key)
return name_list
def validate_item(doc):
for item in doc.get('items'):
@ -328,7 +375,8 @@ def validate_item(doc):
item_doc.save(ignore_permissions=True)
frappe.db.commit()
def submit_invoice(si_doc, name):
def submit_invoice(si_doc, name, doc):
try:
si_doc.insert()
si_doc.submit()

View File

@ -558,7 +558,7 @@ class TestSalesInvoice(unittest.TestCase):
{'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 330}]
invoice_data = [{'09052016142': pos}]
si = make_invoice(invoice_data)
si = make_invoice(invoice_data).get('invoice')
self.assertEquals(si[0], '09052016142')
sales_invoice = frappe.get_all('Sales Invoice', fields =["*"], filters = {'offline_pos_name': '09052016142', 'docstatus': 1})

File diff suppressed because it is too large Load Diff

View File

@ -20,8 +20,11 @@
"public/js/controllers/transaction.js",
"public/js/pos/pos.html",
"public/js/pos/pos_bill_item.html",
"public/js/pos/pos_bill_item_new.html",
"public/js/pos/pos_selected_item.html",
"public/js/pos/pos_item.html",
"public/js/pos/pos_tax_row.html",
"public/js/pos/customer_toolbar.html",
"public/js/pos/pos_invoice_list.html",
"public/js/payment/pos_payment.html",
"public/js/payment/payment_details.html",

View File

@ -12,113 +12,11 @@
height: 32px;
margin: -10px auto;
}
/* pos */
.pos-item-area {
padding: 0px 10px;
}
.pos-item-wrapper {
padding: 5px;
}
.pos-item {
overflow: hidden;
text-overflow: ellipsis;
cursor: pointer;
padding: 5px;
padding-bottom: 15px;
border: 1px solid #d1d8dd;
margin-bottom: 5px;
}
.pos-item-text {
padding: 0px 5px;
}
.pos-item .item-code {
margin-bottom: 0px;
}
.pos-item .no-image {
background-color: #fafbfc;
border: 1px dashed #d1d8dd;
}
.pos-item-image {
width: 100%;
height: 0px;
padding: 50% 0;
text-align: center;
line-height: 0;
color: #d1d8dd;
font-size: 30px;
background-size: contain;
border: 1px solid transparent;
background-position: center;
background-repeat: no-repeat;
}
.pos-item-area {
border: 1px solid #d1d8dd;
border-top: none;
}
.pos-item-toolbar {
padding: 10px 0px;
border-bottom: 1px solid #d1d8dd;
}
.item-list-area {
padding: 15px 0px;
overflow-y: scroll;
height: calc(100vh - 162px);
}
.pos-toolbar,
.pos-bill-toolbar {
padding: 10px 0px;
height: 51px;
}
.pos-item-toolbar .form-group {
margin-bottom: 0px;
}
.pos-bill-wrapper {
border: 1px solid #d1d8dd;
border-top: none;
margin-right: -1px;
}
.pos-bill {
border-top: 1px solid #d1d8dd;
margin-left: -15px;
margin-right: -15px;
}
.pos-bill-row {
margin: 0px;
padding: 7px 0px;
border-top: 1px solid #d1d8dd;
}
.pos-bill-header {
border: none !important;
background-color: #f5f7fa;
}
.pos-item-qty {
display: inline-block;
}
.pos-qty-row > div {
padding: 5px 0px;
}
.pos-qty-btn {
margin-top: 3px;
cursor: pointer;
font-size: 120%;
}
.pos .search-area .form-group {
max-width: 100% !important;
}
.pos .tax-table {
margin-bottom: 10px;
}
.erpnext-icon {
width: 24px;
ackmargin-right: 0px;
margin-right: 0px;
margin-top: -3px;
}
.pos .discount-amount-area .discount-field-col {
padding-left: 0px;
}
.pos .discount-amount-area .input-group {
margin-top: 2px;
}
.dashboard-list-item {
background-color: inherit;
padding: 5px 0px;
@ -130,91 +28,6 @@
.dashboard-list-item:last-child {
border-bottom: none;
}
.payment-toolbar .row {
width: 323px;
margin: 0 auto;
}
.payment-mode {
cursor: pointer;
font-family: sans-serif;
font-size: 15px;
}
.pos-payment-row .col-xs-6 {
padding: 15px;
}
.pos-payment-row {
border-bottom: 1px solid #d1d8dd;
margin: 2px 0px 5px 0px;
height: 60px;
margin-top: 0px;
margin-bottom: 0px;
}
.pos-payment-row:hover,
.pos-keyboard-key:hover {
background-color: #FAFBFC;
cursor: pointer;
}
.pos-keyboard-key,
.delete-btn {
border: 1px solid #d1d8dd;
height: 85px;
width: 85px;
margin: 10px 10px;
font-size: 24px;
font-weight: 200;
background-color: #FDFDFD;
border-color: #e8e8e8;
}
.multimode-payments {
padding-left: 30px;
}
.payment-toolbar {
padding-right: 30px;
}
.list-row-head.pos-invoice-list {
border-top: 1px solid #d1d8dd;
}
body[data-route="pos"] .modal-dialog {
width: 750px;
}
@media (max-width: 767px) {
body[data-route="pos"] .modal-dialog {
width: auto;
}
body[data-route="pos"] .modal-dialog .modal-content {
height: auto;
}
}
@media (max-width: 767px) {
.amount-row h3 {
font-size: 15px;
}
.pos-keyboard-key,
.delete-btn {
height: 50px;
}
.multimode-payments {
padding-left: 15px;
}
.payment-toolbar {
padding-right: 15px;
}
}
.amount-label {
font-size: 16px;
}
.selected-payment-mode {
background-color: #FAFBFC;
cursor: pointer;
}
.pos-invoice-list {
padding: 15px 10px;
}
.write_off_amount,
.change_amount {
margin: 15px;
width: 130px;
}
.frappe-control[data-fieldname='result_html'] {
overflow: scroll;
}
@ -237,3 +50,281 @@ body[data-route="pos"] .modal-dialog {
.assessment-result-tool .score {
text-align: right;
}
/* pos */
body[data-route="pos"] .pos-bill-toolbar {
padding: 10px 0px;
height: 51px;
}
body[data-route="pos"] .pos-bill-item:hover,
body[data-route="pos"] .list-customers-table > .pos-list-row:hover {
background-color: #f5f7fa;
cursor: pointer;
}
body[data-route="pos"] .pos-item-qty {
display: inline-block;
}
body[data-route="pos"] .pos-qty-row > div {
padding: 5px 0px;
}
body[data-route="pos"] .pos-qty-btn {
margin-top: 3px;
cursor: pointer;
font-size: 120%;
}
body[data-route="pos"] .search-area .form-group {
max-width: 100% !important;
}
body[data-route="pos"] .tax-table {
margin-bottom: 10px;
}
body[data-route="pos"] .discount-field-col {
padding-left: 24px;
}
body[data-route="pos"] .discount-amount-area .input-group:first-child {
margin-bottom: 2px;
}
body[data-route="pos"] .payment-toolbar .row {
width: 323px;
margin: 0 auto;
}
body[data-route="pos"] .payment-mode {
cursor: pointer;
font-family: sans-serif;
font-size: 15px;
}
body[data-route="pos"] .pos-payment-row .col-xs-6 {
padding: 15px;
}
body[data-route="pos"] .pos-payment-row {
border-bottom: 1px solid #d1d8dd;
margin: 2px 0px 5px 0px;
height: 60px;
margin-top: 0px;
margin-bottom: 0px;
}
body[data-route="pos"] .pos-payment-row:hover,
body[data-route="pos"] .pos-keyboard-key:hover {
background-color: #FAFBFC;
cursor: pointer;
}
body[data-route="pos"] .pos-keyboard-key,
body[data-route="pos"] .delete-btn {
border: 1px solid #d1d8dd;
height: 85px;
width: 85px;
margin: 10px 10px;
font-size: 24px;
font-weight: 200;
background-color: #FDFDFD;
border-color: #e8e8e8;
}
body[data-route="pos"] .numeric-keypad {
border: 1px solid #d1d8dd;
height: 69px;
width: 69px;
font-size: 20px;
font-weight: 200;
background-color: #FDFDFD;
border-color: #e8e8e8;
margin-left: -4px;
}
body[data-route="pos"] .pos-pay {
height: 69px;
width: 69px;
font-size: 17px;
font-weight: 200;
margin-left: -4px;
}
body[data-route="pos"] .numeric-keypad {
height: 60px;
width: 60px;
font-size: 20px;
font-weight: 200;
border-radius: 0;
background-color: #fff;
margin-left: -4px;
}
body[data-route="pos"] .numeric_keypad {
margin-left: -15px;
}
body[data-route="pos"] .numeric_keypad > .row > button {
border: none;
border-right: 1px solid #d1d8dd;
border-bottom: 1px solid #d1d8dd;
}
body[data-route="pos"] .numeric_keypad > .row > button:first-child {
border-left: 1px solid #d1d8dd;
}
body[data-route="pos"] .numeric_keypad > .row:first-child > button {
border-top: 1px solid #d1d8dd;
}
body[data-route="pos"] .pos-pay {
background-color: #5E64FF;
border: none;
}
body[data-route="pos"] .multimode-payments {
padding-left: 30px;
}
body[data-route="pos"] .payment-toolbar {
padding-right: 30px;
}
body[data-route="pos"] .list-row-head.pos-invoice-list {
border-top: 1px solid #d1d8dd;
}
body[data-route="pos"] .modal-dialog {
width: 750px;
}
@media (max-width: 767px) {
body[data-route="pos"] .modal-dialog {
width: auto;
}
body[data-route="pos"] .modal-dialog .modal-content {
height: auto;
}
}
@media (max-width: 767px) {
body[data-route="pos"] .amount-row h3 {
font-size: 15px;
}
body[data-route="pos"] .pos-keyboard-key,
body[data-route="pos"] .delete-btn {
height: 50px;
}
body[data-route="pos"] .multimode-payments {
padding-left: 15px;
}
body[data-route="pos"] .payment-toolbar {
padding-right: 15px;
}
}
body[data-route="pos"] .amount-label {
font-size: 16px;
}
body[data-route="pos"] .selected-payment-mode {
background-color: #FAFBFC;
cursor: pointer;
}
body[data-route="pos"] .pos-invoice-list {
padding: 15px 10px;
}
body[data-route="pos"] .write_off_amount,
body[data-route="pos"] .change_amount {
margin: 15px;
width: 130px;
}
body[data-route="pos"] .pos-list-row {
display: table;
table-layout: fixed;
width: 100%;
padding: 9px 15px;
font-size: 12px;
margin: 0px;
border-bottom: 1px solid #d1d8dd;
}
body[data-route="pos"] .pos-list-row .cell {
display: table-cell;
vertical-align: middle;
}
body[data-route="pos"] .pos-list-row .cell.price-cell {
width: 50%;
}
body[data-route="pos"] .pos-list-row .subject {
width: 40%;
}
body[data-route="pos"] .pos-list-row .list-row-checkbox,
body[data-route="pos"] .pos-list-row .list-select-all {
margin-right: 7px;
}
body[data-route="pos"] .pos-bill-header {
background-color: #f5f7fa;
border: 1px solid #d1d8dd;
padding: 13px 15px;
}
body[data-route="pos"] .pos-list-row.active {
background-color: #fffce7;
}
body[data-route="pos"] .totals-area {
border-right: 1px solid #d1d8dd;
border-left: 1px solid #d1d8dd;
margin-bottom: 15px;
}
body[data-route="pos"] .tax-area .pos-list-row {
border: none;
}
body[data-route="pos"] .item-cart-items {
height: calc(100vh - 526px);
overflow: auto;
border: 1px solid #d1d8dd;
border-top: none;
}
body[data-route="pos"] .no-items-message {
min-height: 200px;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
body[data-route="pos"] .pos-list-row:last-child {
border-bottom: none;
}
body[data-route="pos"] .form-section-heading {
padding: 0;
}
body[data-route="pos"] .item-list {
border: 1px solid #d1d8dd;
border-top: none;
max-height: calc(100vh - 190px);
overflow: auto;
}
@media (max-width: 767px) {
body[data-route="pos"] .item-list {
max-height: initial;
}
}
body[data-route="pos"] .item-list .image-field {
height: 140px;
}
body[data-route="pos"] .item-list .pos-item-wrapper {
position: relative;
}
body[data-route="pos"] .item-list .price-info {
position: absolute;
left: 0;
bottom: 0;
margin: 0 0 15px 15px;
background-color: rgba(141, 153, 166, 0.6);
padding: 5px 9px;
border-radius: 3px;
color: #fff;
}
body[data-route="pos"] .pos-bill-toolbar {
margin-top: 10px;
}
body[data-route="pos"] .search-item .form-group {
margin: 0;
}
body[data-route="pos"] .item-list-area .pos-bill-header {
padding: 5px;
padding-left: 15px;
}
body[data-route="pos"] .pos-selected-item-action > .pos-list-row {
border: none;
}
body[data-route="pos"] .edit-customer-btn {
position: absolute;
right: 57px;
top: 15px;
z-index: 100;
}
body[data-route="pos"] .btn-more {
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
background-color: #fafbfc;
min-height: 200px;
}
body[data-route="pos"] .collapse-btn {
cursor: pointer;
}

View File

@ -0,0 +1,16 @@
<div class="pos-bill-toolbar col-xs-9" style="display: flex; width: 70%;">
<div class="party-area" style="flex: 1;">
<span class="edit-customer-btn text-muted" style="display: inline;">
<a class="btn-open no-decoration" title="Edit Customer">
<i class="octicon octicon-pencil"></i>
</a>
</span>
</div>
<button class="btn btn-default list-customers-btn" style="margin-left: 12px">
<i class="octicon octicon-organization"></i>
</button>
</button> {% if (allow_delete) { %}
<button class="btn btn-default btn-danger" style="margin: 0 5px 0 5px">
<i class="octicon octicon-trashcan"></i>
</button> {% } %}
</div>

View File

@ -1,86 +1,127 @@
<div class="pos">
<div class="row">
<div class="col-sm-6 pos-bill-wrapper">
<div class="pos-bill-toolbar" style="display: flex;">
<div class="party-area" style="flex: 1;"></div>
<button class="btn btn-default list-customers-btn" style="margin: 0 5px 0 15px;">
<i class="fa fa-list"></i>
</button>
<button class="btn btn-default add-customer-btn">
<i class="fa fa-plus"></i>
</button>
{% if (allow_delete) { %}
<button class="btn btn-default btn-danger" style="margin: 0 5px 0 5px;display:none">
<i class="octicon octicon-trashcan"></i>
</button>
{% } %}
</div>
<div class="pos-bill">
<div class="item-cart">
<div class="row pos-bill-row pos-bill-header">
<div class="col-xs-4"><h6>{%= __("Item") %}</h6></div>
<div class="col-xs-3"><h6 class="text-right">{%= __("Quantity") %}</h6></div>
<div class="col-xs-2"><h6 class="text-right">{%= __("Discount") %}</h6></div>
<div class="col-xs-3"><h6 class="text-right">{%= __("Rate") %}</h6></div>
</div>
<div class="items"></div>
</div>
<div class="totals-area">
<div class="row pos-bill-row net-total-area">
<div class="col-xs-6"><h6 class="text-muted">{%= __("Net Total") %}</h6></div>
<div class="col-xs-6"><h6 class="net-total text-right"></h6></div>
</div>
<div class="row pos-bill-row tax-area hide">
<div class="col-xs-12 text-muted">
<h6>{%= __("Taxes") %}</h6>
<div class="tax-table small"></div>
<div class="row">
<div class="col-sm-5 pos-bill-wrapper">
<div class="col-sm-12"><h6 class="form-section-heading uppercase">{{ __("Item Cart") }}</h6></div>
<div class="pos-bill">
<div class="item-cart">
<div class="pos-list-row pos-bill-header text-muted h6">
<span class="cell subject">
<!--<input class="list-select-all" type="checkbox" title="{%= __("Select All") %}">-->
{{ __("Item Name")}}
</span>
<span class="cell text-right">{{ __("Quantity") }}</span>
<span class="cell text-right">{{ __("Discount") }}</span>
<span class="cell text-right">{{ __("Rate") }}</span>
</div>
<div class="item-cart-items">
<div class="no-items-message text-extra-muted">
<span class="text-center">
<i class="fa fa-2x fa-shopping-cart"></i>
<p>Tap items to add them here</p>
</span>
</div>
</div>
{% if (apply_discount_on) { %}
<div class="row pos-bill-row discount-amount-area">
<div class="col-xs-6"><h6 class="text-muted">{%= __("Discount") %}</h6></div>
<div class="col-xs-3 discount-field-col">
<div class="input-group input-group-sm">
<span class="input-group-addon">%</span>
<input type="text" class="form-control discount-percentage text-right">
</div>
</div>
<div class="col-xs-3 discount-field-col">
<div class="input-group input-group-sm">
<span class="input-group-addon">{%= get_currency_symbol(currency) %}</span>
<input type="text" class="form-control discount-amount text-right"
placeholder="{%= 0.00 %}">
</div>
</div>
</div>
{% } %}
<div class="row pos-bill-row grand-total-area">
<div class="col-xs-6"><h6>{%= __("Grand Total") %}</h6></div>
<div class="col-xs-6"><h6 class="grand-total text-right"></h6></div>
</div>
</div>
</div>
<div class="list-customers">
<div class="items">
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-6 pos-items-section">
<div class="row pos-item-area">
<div class="totals-area">
<div class="pos-list-row net-total-area">
<div class="cell"></div>
<div class="cell text-right">{%= __("Net Total") %}</div>
<div class="cell price-cell bold net-total text-right"></div>
</div>
<div class="pos-list-row tax-area">
<div class="cell"></div>
<div class="cell text-right">{%= __("Taxes") %}</div>
<div class="cell price-cell text-right tax-table">
</div>
</div>
{% if (apply_discount_on) { %}
<div class="pos-list-row discount-amount-area">
<div class="cell"></div>
<div class="cell text-right">{%= __("Discount") %}</div>
<div class="cell price-cell discount-field-col">
<div class="input-group input-group-sm">
<span class="input-group-addon">%</span>
<input type="text" class="form-control discount-percentage text-right">
</div>
<div class="input-group input-group-sm">
<span class="input-group-addon">{%= get_currency_symbol(currency) %}</span>
<input type="text" class="form-control discount-amount text-right" placeholder="{%= 0.00 %}">
</div>
</div>
</div>
{% } %}
<div class="pos-list-row grand-total-area collapse-btn" style="border-bottom:1px solid #d1d8dd;">
<div class="cell">
<a class="">
<i class="octicon octicon-chevron-down"></i>
</a>
</div>
<div class="cell text-right bold">{%= __("Grand Total") %}</div>
<div class="cell price-cell grand-total text-right lead"></div>
</div>
</div>
<span id="customer-results" style="color:#68a;"></span>
<div class="row pos-item-toolbar">
<div class="search-item-group col-xs-5"></div>
<div class="search-item col-xs-7"></div>
</div>
<div class="item-list-area" style="auto">
<div class="app-listing item-list"></ul>
</div>
</div>
<div class="row">
<div class="text-right list-paging-area">
<button class="btn btn-default btn-more btn-sm" style="margin:5px 20px">{{ __("More") }}</button>
<div class="row" style="margin-top: 30px">
<div class="col-sm-6 selected-item">
</div>
<div class="col-xs-6 numeric_keypad hidden-xs" style="display:none">
{% var chartData = ["Qty", "Disc", "Price"] %} {% for(var i=0; i
<3; i++) { %} <div class="row text-right">
{% for(var j=i*3; j
<(i+1)*3; j++) { %} <button type="button" class="btn btn-default numeric-keypad" val="{{j+1}}">{{j+1}}</button>
{% } %}
<button type="button" id="pos-item-{{ chartData[i].toLowerCase() }}" class="btn text-center btn-default numeric-keypad pos-operation">{{ chartData[i] }}</button>
</div>
{% } %}
<div class="row text-right">
<button type="button" class="btn btn-default numeric-keypad numeric-del">Del</button>
<button type="button" class="btn btn-default numeric-keypad" val="0">0</button>
<button type="button" class="btn btn-default numeric-keypad" val=".">.</button>
<button type="button" class="btn btn-primary numeric-keypad pos-pay">Pay</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-5 list-customers">
<div class="col-sm-12"><h6 class="form-section-heading uppercase">{{ __("Customers in Queue") }}</h6></div>
<div class="pos-list-row pos-bill-header">
<div class="cell subject"><input class="list-select-all" type="checkbox">{{ __("Customer") }}</div>
<div class="cell text-left">{{ __("Status") }}</div>
<div class="cell text-right">{{ __("Amount") }}</div>
<div class="cell text-right">{{ __("Grand Total") }}</div>
</div>
<div class="list-customers-table border-left border-right border-bottom">
<div class="no-items-message text-extra-muted">
<span class="text-center">
<i class="fa fa-2x fa-user"></i>
<p>No Customers yet!</p>
</span>
</div>
</div>
</div>
<div class="col-sm-7 pos-items-section">
<div class="col-sm-12"><h6 class="form-section-heading uppercase">{{ __("Stock Items") }}</h6></div>
<div class="row pos-item-area">
</div>
<span id="customer-results" style="color:#68a;"></span>
<div class="item-list-area">
<div class="pos-list-row pos-bill-header text-muted h6">
<div class="cell subject search-item-group">
<div class="dropdown">
<a class="text-muted dropdown-toggle" data-toggle="dropdown"><span class="dropdown-text">All Item Groups</span><i class="caret"></i></a>
<ul class="dropdown-menu">
</ul>
</div>
</div>
<div class="cell search-item"></div>
</div>
<div class="app-listing item-list image-view-container">
</div>
</div>
</div>
</div>

View File

@ -18,13 +18,13 @@
</div>
<div class="col-xs-2 text-right">
<div class="row input-sm">
<input type="tel" value="{%= discount_percentage %}" class="form-control text-right pos-item-discount">
<input type="tel" value="{%= discount_percentage %}" class="form-control text-right pos-item-disc">
</div>
</div>
<div class="col-xs-3 text-right">
<div class="text-muted" style="margin-top: 5px;">
{% if(enabled) { %}
<input type="tel" value="{%= rate %}" class="form-control input-sm pos-item-rate text-right">
<input type="tel" value="{%= rate %}" class="form-control input-sm pos-item-price text-right">
{% } else { %}
<h6>{%= format_currency(rate) %}</h6>
{% } %}

View File

@ -0,0 +1,9 @@
<div class="pos-list-row pos-bill-item" data-item-code="{{ item_code }}">
<div class="cell subject">
<!--<input class="list-row-checkbox" type="checkbox" data-name="{{item_code}}">-->
<a class="grey list-id" title="{{ item_name }}">{{ strip_html(__(item_name)) || item_code }}</a>
</div>
<div class="cell text-right">{%= qty %}</div>
<div class="cell text-right">{%= discount_percentage %}</div>
<div class="cell text-right">{%= format_currency(rate) %}</div>
</div>

View File

@ -1,7 +1,9 @@
<div class="row list-row pos-invoice-list" invoice-name = "{{name}}">
<div class="col-xs-1"><input class="list-delete" type="checkbox"></div>
<div class="list-column col-xs-3">{%= customer %}</div>
<div class="list-column col-xs-2 text-left"><span class="indicator {{data.indicator}}">{{ data.status }}</span></div>
<div class="list-column col-xs-3 text-right">{%= paid_amount %}</div>
<div class="list-column col-xs-3 text-right">{%= grand_total %}</div>
<div class="pos-list-row" invoice-name = "{{name}}">
<div class="list-column cell subject" invoice-name = "{{name}}">
<input class="list-delete text-left" type="checkbox" style = "margin-right:5px">
<a class="grey list-id text-left customer-row" title="{{ customer }}">{%= customer %}</a>
</div>
<div class="list-column cell text-left customer-row"><span class="indicator {{data.indicator}}">{{ data.status }}</span></div>
<div class="list-column cell text-right customer-row">{%= paid_amount %}</div>
<div class="list-column cell text-right customer-row">{%= grand_total %}</div>
</div>

View File

@ -1,13 +1,32 @@
<div class="pos-item-wrapper col-xs-3">
<div class="pos-item" data-item-code="{%= item_code %}" title="{%= item_name || item_code %}">
<div class="pos-item-image"
style="{% if (item_image) { %} background-image: {{ item_image }} {% }
else { %} background-color: {{ color }} {% } %}">
{% if (!item_image) { %}{{ abbr }}{% } %}
</div>
<div class="pos-item-text">
<h6 class="item-code ellipsis">{%= item_name ? (item_name + " (" + item_code + ")") : item_code %}</h6>
<div class="small ellipsis">{%= item_price %}</div>
<div class="pos-item-wrapper image-view-item" data-item-code="{{item_code}}">
<div class="image-view-header doclist-row">
<div class="list-value">
<a class="grey list-id" data-name="{{item_code}}" title="{{ item_name || item_code}}">{{item_name || item_code}}</a>
</div>
</div>
<div class="image-view-body">
<a data-item-code="{{ item_code }}"
title="{{ item_name || item_code }}"
>
<div class="image-field"
style="
{% if (!item_image) { %}
background-color: #fafbfc;
{% } %}
border: 0px;"
>
{% if (!item_image) { %}
<span class="placeholder-text">
{%= frappe.get_abbr(item_name || item_code) %}
</span>
{% } %}
{% if (item_image) { %}
<img src="{{ item_image }}" alt="{{item_name || item_code}}">
{% } %}
</div>
<span class="price-info">
{{item_price}}
</span>
</a>
</div>
</div>

View File

@ -0,0 +1,21 @@
<div class="pos-selected-item-action" data-item-code="{%= item_code %}">
<div class="pos-list-row">
<span class="cell bold">{{item_name}}</span>
</div>
<div class="pos-list-row">
<div class="cell">Quantity:</div>
<input class="form-control cell pos-item-qty" value="{%= qty %}"/>
</div>
<div class="pos-list-row">
<div class="cell">Discount:</div>
<input class="form-control cell pos-item-disc" value="{%= discount_percentage %}">
</div>
<div class="pos-list-row">
<div class="cell">Price:</div>
<input class="form-control cell pos-item-price" value="{%= rate %}"/>
</div>
<div class="pos-list-row">
<div class="cell">Amount:</div>
<input class="form-control cell" value="{%= amount %}"/>
</div>
</div>

View File

@ -1,4 +1,4 @@
<div class="row">
<div class="col-xs-9">{%= description %}</div>
<div class="col-xs-3 text-right">{%= tax_amount %}</div>
<div class="pos-list-row" style="padding-right: 0;">
<div class="cell">{%= description %}</div>
<div class="cell text-right bold">{%= tax_amount %}</div>
</div>

View File

@ -17,140 +17,12 @@
margin: -10px auto;
}
/* pos */
.pos-item-area {
padding: 0px 10px;
}
.pos-item-wrapper {
padding: 5px;
}
.pos-item {
overflow: hidden;
text-overflow: ellipsis;
cursor: pointer;
padding: 5px;
padding-bottom: 15px;
border: 1px solid #d1d8dd;
margin-bottom: 5px;
}
.pos-item-text {
padding: 0px 5px;
}
.pos-item .item-code {
margin-bottom: 0px;
}
.pos-item .no-image {
background-color: #fafbfc;
border: 1px dashed #d1d8dd;
}
.pos-item-image {
width: 100%;
height: 0px;
padding: 50% 0;
text-align: center;
line-height: 0;
color: @text-extra-muted;
font-size: 30px;
background-size: contain;
border: 1px solid transparent;
background-position: center;
background-repeat: no-repeat;
}
.pos-item-area {
border: 1px solid #d1d8dd;
border-top: none;
}
.pos-item-toolbar {
padding: 10px 0px;
border-bottom: 1px solid #d1d8dd;
}
.item-list-area {
padding: 15px 0px;
overflow-y: scroll;
height: ~"calc(100vh - 162px)";
}
.pos-toolbar, .pos-bill-toolbar {
padding: 10px 0px;
// border-bottom: 1px solid #d1d8dd;
height: 51px;
}
.pos-item-toolbar .form-group {
margin-bottom: 0px;
}
.pos-bill-wrapper {
border: 1px solid #d1d8dd;
border-top: none;
margin-right: -1px;
}
.pos-bill {
border-top: 1px solid @border-color;
margin-left: -15px;
margin-right: -15px;
}
.pos-bill-row {
margin: 0px;
padding: 7px 0px;
border-top: 1px solid #d1d8dd;
}
.pos-bill-header {
border: none !important;
background-color: #f5f7fa;
}
.pos-item-qty {
display: inline-block;
}
.pos-qty-row > div {
padding: 5px 0px;
}
.pos-qty-btn {
margin-top: 3px;
cursor: pointer;
font-size: 120%;
}
.pos .search-area .form-group {
max-width: 100% !important;
}
.pos .tax-table {
margin-bottom: 10px;
}
.erpnext-icon {
width: 24px;ack
width: 24px;
margin-right: 0px;
margin-top: -3px;
}
.pos .discount-amount-area {
.discount-field-col {
padding-left: 0px;
}
.input-group {
margin-top: 2px;
}
}
.dashboard-list-item {
background-color: inherit;
padding: 5px 0px;
@ -165,104 +37,6 @@
border-bottom: none;
}
.payment-toolbar {
.row {
width: 323px;
margin: 0 auto;
}
}
.payment-mode {
cursor: pointer;
font-family: sans-serif;
font-size: 15px;
}
.pos-payment-row .col-xs-6 {
padding :15px;
}
.pos-payment-row {
border-bottom:1px solid #d1d8dd;
margin: 2px 0px 5px 0px;
height: 60px;
margin-top: 0px;
margin-bottom: 0px;
}
.pos-payment-row:hover, .pos-keyboard-key:hover{
background-color: #FAFBFC;
cursor: pointer;
}
.pos-keyboard-key, .delete-btn {
border: 1px solid #d1d8dd;
height:85px;
width:85px;
margin:10px 10px;
font-size:24px;
font-weight:200;
background-color: #FDFDFD;
border-color: #e8e8e8;
}
.multimode-payments {
padding-left: 30px;
}
.payment-toolbar {
padding-right: 30px;
}
.list-row-head.pos-invoice-list {
border-top: 1px solid @border-color;
}
body[data-route="pos"] .modal-dialog {
width: 750px;
@media (max-width: @screen-xs) {
width: auto;
.modal-content {
height: auto;
}
}
}
@media (max-width: @screen-xs) {
.amount-row h3 {
font-size: 15px;
}
.pos-keyboard-key, .delete-btn {
height: 50px;
}
.multimode-payments {
padding-left: 15px;
}
.payment-toolbar {
padding-right: 15px;
}
}
.amount-label {
font-size: 16px;
}
.selected-payment-mode {
background-color: #FAFBFC;
cursor: pointer;
}
.pos-invoice-list {
padding: 15px 10px;
}
.write_off_amount, .change_amount {
margin: 15px;
width: 130px;
}
// assessment tool
.frappe-control[data-fieldname='result_html'] {
overflow: scroll;
@ -286,4 +60,338 @@ body[data-route="pos"] .modal-dialog {
.total-score, .grade, .score {
text-align: right;
}
}
/* pos */
body[data-route="pos"] {
.pos-bill-toolbar {
padding: 10px 0px;
height: 51px;
}
.pos-bill-item:hover, .list-customers-table > .pos-list-row:hover {
background-color: #f5f7fa;
cursor: pointer;
}
.pos-item-qty {
display: inline-block;
}
.pos-qty-row > div {
padding: 5px 0px;
}
.pos-qty-btn {
margin-top: 3px;
cursor: pointer;
font-size: 120%;
}
.search-area .form-group {
max-width: 100% !important;
}
.tax-table {
margin-bottom: 10px;
}
.discount-field-col {
padding-left: 24px;
}
.discount-amount-area {
.input-group:first-child {
margin-bottom: 2px;
}
}
.payment-toolbar {
.row {
width: 323px;
margin: 0 auto;
}
}
.payment-mode {
cursor: pointer;
font-family: sans-serif;
font-size: 15px;
}
.pos-payment-row .col-xs-6 {
padding :15px;
}
.pos-payment-row {
border-bottom:1px solid #d1d8dd;
margin: 2px 0px 5px 0px;
height: 60px;
margin-top: 0px;
margin-bottom: 0px;
}
.pos-payment-row:hover, .pos-keyboard-key:hover{
background-color: #FAFBFC;
cursor: pointer;
}
.pos-keyboard-key, .delete-btn {
border: 1px solid #d1d8dd;
height:85px;
width:85px;
margin:10px 10px;
font-size:24px;
font-weight:200;
background-color: #FDFDFD;
border-color: #e8e8e8;
}
.numeric-keypad {
border: 1px solid #d1d8dd;
height:69px;
width:69px;
font-size:20px;
font-weight:200;
background-color: #FDFDFD;
border-color: #e8e8e8;
margin-left:-4px;
}
.pos-pay {
height:69px;
width:69px;
font-size:17px;
font-weight:200;
margin-left:-4px;
}
.numeric-keypad {
height: 60px;
width: 60px;
font-size: 20px;
font-weight: 200;
border-radius: 0;
background-color: #fff;
margin-left:-4px;
}
.numeric_keypad {
margin-left: -15px;
& > .row > button {
border: none;
border-right: 1px solid @border-color;
border-bottom: 1px solid @border-color;
&:first-child {
border-left: 1px solid @border-color;
}
}
& > .row:first-child > button {
border-top: 1px solid @border-color;
}
}
.pos-pay {
background-color: @brand-primary;
border: none;
}
.multimode-payments {
padding-left: 30px;
}
.payment-toolbar {
padding-right: 30px;
}
.list-row-head.pos-invoice-list {
border-top: 1px solid @border-color;
}
.modal-dialog {
width: 750px;
@media (max-width: @screen-xs) {
width: auto;
.modal-content {
height: auto;
}
}
}
@media (max-width: @screen-xs) {
.amount-row h3 {
font-size: 15px;
}
.pos-keyboard-key, .delete-btn {
height: 50px;
}
.multimode-payments {
padding-left: 15px;
}
.payment-toolbar {
padding-right: 15px;
}
}
.amount-label {
font-size: 16px;
}
.selected-payment-mode {
background-color: #FAFBFC;
cursor: pointer;
}
.pos-invoice-list {
padding: 15px 10px;
}
.write_off_amount, .change_amount {
margin: 15px;
width: 130px;
}
.pos-list-row {
display: table;
table-layout: fixed;
width: 100%;
padding: 9px 15px;
font-size: 12px;
margin: 0px;
border-bottom: 1px solid @border-color;
.cell {
display: table-cell;
vertical-align: middle;
&.price-cell {
width: 50%;
}
}
.subject {
width: 40%
}
.list-row-checkbox, .list-select-all {
margin-right: 7px;
}
}
.pos-bill-header {
background-color: #f5f7fa;
border: 1px solid @border-color;
padding: 13px 15px;
}
.pos-list-row.active {
background-color: @light-yellow;
}
.totals-area {
border-right: 1px solid @border-color;
border-left: 1px solid @border-color;
margin-bottom: 15px;
}
.tax-area .pos-list-row {
border: none;
}
.item-cart-items {
height: ~"calc(100vh - 526px)";
overflow: auto;
border: 1px solid @border-color;
border-top: none;
}
.no-items-message {
min-height: 200px;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
.pos-list-row:last-child {
border-bottom: none;
}
.form-section-heading {
padding: 0;
}
.item-list {
border: 1px solid @border-color;
border-top: none;
max-height: ~"calc(100vh - 190px)";
overflow: auto;
@media (max-width: @screen-xs) {
max-height: initial;
}
.image-field {
height: 140px;
}
.pos-item-wrapper {
position: relative;
}
.price-info {
position: absolute;
left: 0;
bottom: 0;
margin: 0 0 15px 15px;
background-color: rgba(141, 153, 166, 0.6);
padding: 5px 9px;
border-radius: 3px;
color: #fff;
}
}
.pos-bill-toolbar {
margin-top: 10px;
}
.search-item .form-group {
margin: 0;
}
.item-list-area .pos-bill-header {
padding: 5px;
padding-left: 15px;
}
.pos-selected-item-action > .pos-list-row {
border: none;
}
.edit-customer-btn {
position: absolute;
right: 57px;
top: 15px;
z-index: 100;
}
.btn-more {
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
background-color: @light-bg;
min-height: 200px;
}
.collapse-btn {
cursor: pointer;
}
}