[shopping-cart] i'm back
This commit is contained in:
parent
39dbf73de7
commit
3daa49ac1f
@ -48,5 +48,12 @@ def get_data():
|
||||
"color": "#2c3e50",
|
||||
"icon": "icon-phone",
|
||||
"type": "module"
|
||||
},
|
||||
"Shopping Cart": {
|
||||
"color": "#B7E090",
|
||||
"icon": "icon-shopping-cart",
|
||||
"label": _("Shopping Cart"),
|
||||
"link": "Form/Shopping Cart Settings",
|
||||
"type": "module"
|
||||
}
|
||||
}
|
||||
|
@ -11,14 +11,18 @@ error_report_email = "support@erpnext.com"
|
||||
app_include_js = "assets/js/erpnext.min.js"
|
||||
app_include_css = "assets/css/erpnext.css"
|
||||
web_include_js = "assets/js/erpnext-web.min.js"
|
||||
web_include_css = "assets/css/shopping-cart-web.css"
|
||||
|
||||
after_install = "erpnext.setup.install.after_install"
|
||||
|
||||
boot_session = "erpnext.startup.boot.boot_session"
|
||||
notification_config = "erpnext.startup.notifications.get_notification_config"
|
||||
|
||||
on_session_creation = "erpnext.shopping_cart.utils.set_cart_count"
|
||||
on_logout = "erpnext.shopping_cart.utils.clear_cart_count"
|
||||
update_website_context = ["erpnext.shopping_cart.utils.update_website_context", "erpnext.startup.webutils.update_website_context"]
|
||||
|
||||
dump_report_map = "erpnext.startup.report_data_map.data_map"
|
||||
update_website_context = "erpnext.startup.webutils.update_website_context"
|
||||
|
||||
before_tests = "erpnext.setup.utils.before_tests"
|
||||
|
||||
@ -36,7 +40,13 @@ doc_events = {
|
||||
"User": {
|
||||
"validate": "erpnext.hr.doctype.employee.employee.validate_employee_role",
|
||||
"on_update": "erpnext.hr.doctype.employee.employee.update_user_permissions"
|
||||
}
|
||||
},
|
||||
"Sales Taxes and Charges Master": {
|
||||
"on_update": "erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings.validate_cart_settings"
|
||||
},
|
||||
"Price List": {
|
||||
"on_update": "erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings.validate_cart_settings"
|
||||
},
|
||||
}
|
||||
|
||||
scheduler_events = {
|
||||
@ -55,6 +65,5 @@ scheduler_events = {
|
||||
]
|
||||
}
|
||||
|
||||
default_mail_footer = """<div style="padding: 7px; text-align: right; color: #888"><small>
|
||||
<a style="color: #888" href="https://erpnext.com">Sent via ERPNext</a></div>"""
|
||||
|
||||
default_mail_footer = """<div style="padding: 7px; text-align: right;">
|
||||
<a style="color: #888; font-size: 80%;" href="https://erpnext.com">Sent via ERPNext</a></div>"""
|
||||
|
@ -9,3 +9,4 @@ Stock
|
||||
Support
|
||||
Utilities
|
||||
Contacts
|
||||
Shopping Cart
|
||||
|
@ -74,6 +74,9 @@ def set_party_in_jv_and_gl_entry(receivable_payable_accounts):
|
||||
for d in accounts:
|
||||
account_map.setdefault(d.name, d)
|
||||
|
||||
if not account_map:
|
||||
return
|
||||
|
||||
for dt in ["Journal Voucher Detail", "GL Entry"]:
|
||||
records = frappe.db.sql("""select name, account from `tab%s` where account in (%s)""" %
|
||||
(dt, ", ".join(['%s']*len(account_map))), tuple(account_map.keys()))
|
||||
|
@ -7,6 +7,6 @@ def execute():
|
||||
account_settings = frappe.get_doc("Accounts Settings")
|
||||
|
||||
if not account_settings.frozen_accounts_modifier and account_settings.bde_auth_role:
|
||||
account_settings.frozen_accounts_modifier = account_settings.bde_auth_role
|
||||
frappe.db.set_value("Account Settings", None,
|
||||
"frozen_accounts_modifier", account_settings.bde_auth_role)
|
||||
|
||||
account_settings.save()
|
||||
|
@ -3,7 +3,8 @@
|
||||
"public/css/erpnext.css"
|
||||
],
|
||||
"js/erpnext-web.min.js": [
|
||||
"public/js/website_utils.js"
|
||||
"public/js/website_utils.js",
|
||||
"public/js/shopping_cart.js"
|
||||
],
|
||||
"js/erpnext.min.js": [
|
||||
"public/js/conf.js",
|
||||
@ -11,5 +12,8 @@
|
||||
"public/js/utils.js",
|
||||
"public/js/queries.js",
|
||||
"public/js/utils/party.js"
|
||||
],
|
||||
"css/shopping-cart-web.css": [
|
||||
"public/css/shopping_cart.css"
|
||||
]
|
||||
}
|
||||
|
11
erpnext/public/css/shopping_cart.css
Normal file
11
erpnext/public/css/shopping_cart.css
Normal file
@ -0,0 +1,11 @@
|
||||
.item-main-image {
|
||||
max-width: 100%;
|
||||
margin: auto;
|
||||
}
|
||||
.web-long-description {
|
||||
font-size: 18px;
|
||||
line-height: 200%;
|
||||
}
|
||||
.item-stock {
|
||||
margin-bottom: 10px !important;
|
||||
}
|
66
erpnext/public/js/shopping_cart.js
Normal file
66
erpnext/public/js/shopping_cart.js
Normal file
@ -0,0 +1,66 @@
|
||||
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
// License: GNU General Public License v3. See license.txt
|
||||
|
||||
// shopping cart
|
||||
frappe.provide("shopping_cart");
|
||||
|
||||
$(function() {
|
||||
// update user
|
||||
if(full_name) {
|
||||
$('.navbar li[data-label="User"] a')
|
||||
.html('<i class="icon-fixed-width icon-user"></i> ' + full_name);
|
||||
}
|
||||
|
||||
// update login
|
||||
shopping_cart.set_cart_count();
|
||||
});
|
||||
|
||||
$.extend(shopping_cart, {
|
||||
update_cart: function(opts) {
|
||||
if(!full_name) {
|
||||
if(localStorage) {
|
||||
localStorage.setItem("last_visited", window.location.pathname);
|
||||
localStorage.setItem("pending_add_to_cart", opts.item_code);
|
||||
}
|
||||
window.location.href = "/login";
|
||||
} else {
|
||||
return frappe.call({
|
||||
type: "POST",
|
||||
method: "erpnext.shopping_cart.cart.update_cart",
|
||||
args: {
|
||||
item_code: opts.item_code,
|
||||
qty: opts.qty,
|
||||
with_doc: opts.with_doc || 0
|
||||
},
|
||||
btn: opts.btn,
|
||||
callback: function(r) {
|
||||
if(opts.callback)
|
||||
opts.callback(r);
|
||||
|
||||
shopping_cart.set_cart_count();
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
set_cart_count: function() {
|
||||
var cart_count = getCookie("cart_count");
|
||||
var $cart = $("#website-post-login").find('[data-label="Cart"]');
|
||||
var $badge = $cart.find(".badge");
|
||||
var $cog = $("#website-post-login").find(".dropdown-toggle");
|
||||
var $cog_count = $cog.find(".cart-count");
|
||||
if(cart_count) {
|
||||
if($badge.length === 0) {
|
||||
var $badge = $('<span class="badge pull-right"></span>').prependTo($cart.find("a"));
|
||||
}
|
||||
$badge.html(cart_count);
|
||||
if($cog_count.length === 0) {
|
||||
var $cog_count = $('<sup class="cart-count"></span>').insertAfter($cog.find(".icon-cog"));
|
||||
}
|
||||
$cog_count.html(cart_count);
|
||||
} else {
|
||||
$badge.remove();
|
||||
$cog_count.remove();
|
||||
}
|
||||
}
|
||||
});
|
126
erpnext/shopping_cart/__init__.py
Normal file
126
erpnext/shopping_cart/__init__.py
Normal file
@ -0,0 +1,126 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.utils import get_fullname, flt
|
||||
from erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings import is_shopping_cart_enabled, get_default_territory
|
||||
|
||||
# TODO
|
||||
# validate stock of each item in Website Warehouse or have a list of possible warehouses in Shopping Cart Settings
|
||||
|
||||
def get_quotation(user=None):
|
||||
if not user:
|
||||
user = frappe.session.user
|
||||
if user == "Guest":
|
||||
raise frappe.PermissionError
|
||||
|
||||
is_shopping_cart_enabled()
|
||||
party = get_party(user)
|
||||
values = {
|
||||
"order_type": "Shopping Cart",
|
||||
party.doctype.lower(): party.name,
|
||||
"docstatus": 0,
|
||||
"contact_email": user
|
||||
}
|
||||
|
||||
try:
|
||||
quotation = frappe.get_doc("Quotation", values)
|
||||
except frappe.DoesNotExistError:
|
||||
quotation = frappe.new_doc("Quotation")
|
||||
quotation.update(values)
|
||||
if party.doctype == "Customer":
|
||||
quotation.contact_person = frappe.db.get_value("Contact", {"customer": party.name, "email_id": user})
|
||||
quotation.insert(ignore_permissions=True)
|
||||
|
||||
return quotation
|
||||
|
||||
def set_item_in_cart(item_code, qty, user=None):
|
||||
validate_item(item_code)
|
||||
quotation = get_quotation(user=user)
|
||||
qty = flt(qty)
|
||||
quotation_item = quotation.get("quotation_details", {"item_code": item_code})
|
||||
|
||||
if qty==0:
|
||||
if quotation_item:
|
||||
# remove
|
||||
quotation.get("quotation_details").remove(quotation_item[0])
|
||||
else:
|
||||
# add or update
|
||||
if quotation_item:
|
||||
quotation_item[0].qty = qty
|
||||
else:
|
||||
quotation.append("quotation_details", {
|
||||
"doctype": "Quotation Item",
|
||||
"item_code": item_code,
|
||||
"qty": qty
|
||||
})
|
||||
|
||||
quotation.save(ignore_permissions=True)
|
||||
return quotation
|
||||
|
||||
def set_address_in_cart(address_fieldname, address, user=None):
|
||||
quotation = get_quotation(user=user)
|
||||
validate_address(quotation, address_fieldname, address)
|
||||
|
||||
if quotation.get(address_fieldname) != address:
|
||||
quotation.set(address_fieldname, address)
|
||||
if address_fieldname=="customer_address":
|
||||
quotation.set("address_display", None)
|
||||
else:
|
||||
quotation.set("shipping_address", None)
|
||||
|
||||
quotation.save(ignore_permissions=True)
|
||||
|
||||
return quotation
|
||||
|
||||
def validate_item(item_code):
|
||||
item = frappe.db.get_value("Item", item_code, ["item_name", "show_in_website"], as_dict=True)
|
||||
if not item.show_in_website:
|
||||
frappe.throw(_("{0} cannot be purchased using Shopping Cart").format(item.item_name))
|
||||
|
||||
def validate_address(quotation, address_fieldname, address):
|
||||
party = get_party(quotation.contact_email)
|
||||
address_doc = frappe.get_doc(address)
|
||||
if address_doc.get(party.doctype.lower()) != party.name:
|
||||
if address_fieldname=="customer_address":
|
||||
frappe.throw(_("Invalid Billing Address"))
|
||||
else:
|
||||
frappe.throw(_("Invalid Shipping Address"))
|
||||
|
||||
def get_party(user):
|
||||
def _get_party(user):
|
||||
customer = frappe.db.get_value("Contact", {"email_id": user}, "customer")
|
||||
if customer:
|
||||
return frappe.get_doc("Customer", customer)
|
||||
|
||||
lead = frappe.db.get_value("Lead", {"email_id": user})
|
||||
if lead:
|
||||
return frappe.get_doc("Lead", lead)
|
||||
|
||||
# create a lead
|
||||
lead = frappe.new_doc("Lead")
|
||||
lead.update({
|
||||
"email_id": user,
|
||||
"lead_name": get_fullname(user),
|
||||
"territory": guess_territory()
|
||||
})
|
||||
lead.insert(ignore_permissions=True)
|
||||
|
||||
return lead
|
||||
|
||||
if not getattr(frappe.local, "shopping_cart_party", None):
|
||||
frappe.local.shopping_cart_party = {}
|
||||
|
||||
if not frappe.local.shopping_cart_party.get(user):
|
||||
frappe.local.shopping_cart_party[user] = _get_party(user)
|
||||
|
||||
return frappe.local.shopping_cart_party[user]
|
||||
|
||||
def guess_territory():
|
||||
territory = None
|
||||
if frappe.session.get("session_country"):
|
||||
territory = frappe.db.get_value("Territory", frappe.session.get("session_country"))
|
||||
|
||||
return territory or get_default_territory()
|
434
erpnext/shopping_cart/cart.py
Normal file
434
erpnext/shopping_cart/cart.py
Normal file
@ -0,0 +1,434 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe import throw, _
|
||||
import frappe.defaults
|
||||
from frappe.utils import flt, get_fullname, fmt_money, cstr
|
||||
from erpnext.utilities.doctype.address.address import get_address_display
|
||||
from frappe.utils.nestedset import get_root_of
|
||||
|
||||
class WebsitePriceListMissingError(frappe.ValidationError): pass
|
||||
|
||||
def set_cart_count(quotation=None):
|
||||
if not quotation:
|
||||
quotation = _get_cart_quotation()
|
||||
cart_count = cstr(len(quotation.get("quotation_details")))
|
||||
frappe.local.cookie_manager.set_cookie("cart_count", cart_count)
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_cart_quotation(doc=None):
|
||||
party = get_lead_or_customer()
|
||||
|
||||
if not doc:
|
||||
quotation = _get_cart_quotation(party)
|
||||
doc = quotation
|
||||
set_cart_count(quotation)
|
||||
|
||||
return {
|
||||
"doc": decorate_quotation_doc(doc),
|
||||
"addresses": [{"name": address.name, "display": address.display}
|
||||
for address in get_address_docs(party)],
|
||||
"shipping_rules": get_applicable_shipping_rules(party)
|
||||
}
|
||||
|
||||
@frappe.whitelist()
|
||||
def place_order():
|
||||
quotation = _get_cart_quotation()
|
||||
quotation.company = frappe.db.get_value("Shopping Cart Settings", None, "company")
|
||||
for fieldname in ["customer_address", "shipping_address_name"]:
|
||||
if not quotation.get(fieldname):
|
||||
throw(_("{0} is required").format(quotation.meta.get_label(fieldname)))
|
||||
|
||||
quotation.ignore_permissions = True
|
||||
quotation.submit()
|
||||
|
||||
if quotation.lead:
|
||||
# company used to create customer accounts
|
||||
frappe.defaults.set_user_default("company", quotation.company)
|
||||
|
||||
from erpnext.selling.doctype.quotation.quotation import _make_sales_order
|
||||
sales_order = frappe.get_doc(_make_sales_order(quotation.name, ignore_permissions=True))
|
||||
for item in sales_order.get("sales_order_details"):
|
||||
item.reserved_warehouse = frappe.db.get_value("Item", item.item_code, "website_warehouse") or None
|
||||
|
||||
sales_order.ignore_permissions = True
|
||||
sales_order.insert()
|
||||
sales_order.submit()
|
||||
frappe.local.cookie_manager.delete_cookie("cart_count")
|
||||
|
||||
return sales_order.name
|
||||
|
||||
@frappe.whitelist()
|
||||
def update_cart(item_code, qty, with_doc):
|
||||
quotation = _get_cart_quotation()
|
||||
|
||||
qty = flt(qty)
|
||||
if qty == 0:
|
||||
quotation.set("quotation_details", quotation.get("quotation_details", {"item_code": ["!=", item_code]}))
|
||||
if not quotation.get("quotation_details") and \
|
||||
not quotation.get("__islocal"):
|
||||
quotation.__delete = True
|
||||
|
||||
else:
|
||||
quotation_items = quotation.get("quotation_details", {"item_code": item_code})
|
||||
if not quotation_items:
|
||||
quotation.append("quotation_details", {
|
||||
"doctype": "Quotation Item",
|
||||
"item_code": item_code,
|
||||
"qty": qty
|
||||
})
|
||||
else:
|
||||
quotation_items[0].qty = qty
|
||||
|
||||
apply_cart_settings(quotation=quotation)
|
||||
|
||||
if hasattr(quotation, "__delete"):
|
||||
frappe.delete_doc("Quotation", quotation.name, ignore_permissions=True)
|
||||
quotation = _get_cart_quotation()
|
||||
else:
|
||||
quotation.ignore_permissions = True
|
||||
quotation.save()
|
||||
|
||||
set_cart_count(quotation)
|
||||
|
||||
if with_doc:
|
||||
return get_cart_quotation(quotation)
|
||||
else:
|
||||
return quotation.name
|
||||
|
||||
@frappe.whitelist()
|
||||
def update_cart_address(address_fieldname, address_name):
|
||||
quotation = _get_cart_quotation()
|
||||
address_display = get_address_display(frappe.get_doc("Address", address_name).as_dict())
|
||||
|
||||
if address_fieldname == "shipping_address_name":
|
||||
quotation.shipping_address_name = address_name
|
||||
quotation.shipping_address = address_display
|
||||
|
||||
if not quotation.customer_address:
|
||||
address_fieldname == "customer_address"
|
||||
|
||||
if address_fieldname == "customer_address":
|
||||
quotation.customer_address = address_name
|
||||
quotation.address_display = address_display
|
||||
|
||||
|
||||
apply_cart_settings(quotation=quotation)
|
||||
|
||||
quotation.ignore_permissions = True
|
||||
quotation.save()
|
||||
|
||||
return get_cart_quotation(quotation)
|
||||
|
||||
def guess_territory():
|
||||
territory = None
|
||||
geoip_country = frappe.session.get("session_country")
|
||||
if geoip_country:
|
||||
territory = frappe.db.get_value("Territory", geoip_country)
|
||||
|
||||
return territory or \
|
||||
frappe.db.get_value("Shopping Cart Settings", None, "territory") or \
|
||||
get_root_of("Territory")
|
||||
|
||||
def decorate_quotation_doc(quotation_doc):
|
||||
doc = frappe._dict(quotation_doc.as_dict())
|
||||
for d in doc.get("quotation_details", []):
|
||||
d.update(frappe.db.get_value("Item", d["item_code"],
|
||||
["website_image", "description", "page_name"], as_dict=True))
|
||||
d["formatted_rate"] = fmt_money(d.get("rate"), currency=doc.currency)
|
||||
d["formatted_amount"] = fmt_money(d.get("amount"), currency=doc.currency)
|
||||
|
||||
for d in doc.get("other_charges", []):
|
||||
d["formatted_tax_amount"] = fmt_money(flt(d.get("tax_amount")) / doc.conversion_rate,
|
||||
currency=doc.currency)
|
||||
|
||||
doc.formatted_grand_total_export = fmt_money(doc.grand_total_export,
|
||||
currency=doc.currency)
|
||||
|
||||
return doc
|
||||
|
||||
def _get_cart_quotation(party=None):
|
||||
if not party:
|
||||
party = get_lead_or_customer()
|
||||
|
||||
quotation = frappe.db.get_value("Quotation",
|
||||
{party.doctype.lower(): party.name, "order_type": "Shopping Cart", "docstatus": 0})
|
||||
|
||||
if quotation:
|
||||
qdoc = frappe.get_doc("Quotation", quotation)
|
||||
else:
|
||||
qdoc = frappe.get_doc({
|
||||
"doctype": "Quotation",
|
||||
"naming_series": frappe.defaults.get_user_default("shopping_cart_quotation_series") or "QTN-CART-",
|
||||
"quotation_to": party.doctype,
|
||||
"company": frappe.db.get_value("Shopping Cart Settings", None, "company"),
|
||||
"order_type": "Shopping Cart",
|
||||
"status": "Draft",
|
||||
"docstatus": 0,
|
||||
"__islocal": 1,
|
||||
(party.doctype.lower()): party.name
|
||||
})
|
||||
|
||||
if party.doctype == "Customer":
|
||||
qdoc.contact_person = frappe.db.get_value("Contact", {"email_id": frappe.session.user,
|
||||
"customer": party.name})
|
||||
|
||||
qdoc.ignore_permissions = True
|
||||
qdoc.run_method("set_missing_values")
|
||||
apply_cart_settings(party, qdoc)
|
||||
|
||||
return qdoc
|
||||
|
||||
def update_party(fullname, company_name=None, mobile_no=None, phone=None):
|
||||
party = get_lead_or_customer()
|
||||
|
||||
if party.doctype == "Lead":
|
||||
party.company_name = company_name
|
||||
party.lead_name = fullname
|
||||
party.mobile_no = mobile_no
|
||||
party.phone = phone
|
||||
else:
|
||||
party.customer_name = company_name or fullname
|
||||
party.customer_type == "Company" if company_name else "Individual"
|
||||
|
||||
contact_name = frappe.db.get_value("Contact", {"email_id": frappe.session.user,
|
||||
"customer": party.name})
|
||||
contact = frappe.get_doc("Contact", contact_name)
|
||||
contact.first_name = fullname
|
||||
contact.last_name = None
|
||||
contact.customer_name = party.customer_name
|
||||
contact.mobile_no = mobile_no
|
||||
contact.phone = phone
|
||||
contact.ignore_permissions = True
|
||||
contact.save()
|
||||
|
||||
party_doc = frappe.get_doc(party.as_dict())
|
||||
party_doc.ignore_permissions = True
|
||||
party_doc.save()
|
||||
|
||||
qdoc = _get_cart_quotation(party)
|
||||
if not qdoc.get("__islocal"):
|
||||
qdoc.customer_name = company_name or fullname
|
||||
qdoc.run_method("set_missing_lead_customer_details")
|
||||
qdoc.ignore_permissions = True
|
||||
qdoc.save()
|
||||
|
||||
def apply_cart_settings(party=None, quotation=None):
|
||||
if not party:
|
||||
party = get_lead_or_customer()
|
||||
if not quotation:
|
||||
quotation = _get_cart_quotation(party)
|
||||
|
||||
cart_settings = frappe.get_doc("Shopping Cart Settings")
|
||||
|
||||
billing_territory = get_address_territory(quotation.customer_address) or \
|
||||
party.territory or get_root_of("Territory")
|
||||
|
||||
set_price_list_and_rate(quotation, cart_settings, billing_territory)
|
||||
|
||||
quotation.run_method("calculate_taxes_and_totals")
|
||||
|
||||
set_taxes(quotation, cart_settings, billing_territory)
|
||||
|
||||
_apply_shipping_rule(party, quotation, cart_settings)
|
||||
|
||||
def set_price_list_and_rate(quotation, cart_settings, billing_territory):
|
||||
"""set price list based on billing territory"""
|
||||
quotation.selling_price_list = cart_settings.get_price_list(billing_territory)
|
||||
|
||||
# reset values
|
||||
quotation.price_list_currency = quotation.currency = \
|
||||
quotation.plc_conversion_rate = quotation.conversion_rate = None
|
||||
for item in quotation.get("quotation_details"):
|
||||
item.price_list_rate = item.discount_percentage = item.rate = item.amount = None
|
||||
|
||||
# refetch values
|
||||
quotation.run_method("set_price_list_and_item_details")
|
||||
|
||||
# set it in cookies for using in product page
|
||||
frappe.local.cookie_manager.set_cookie("selling_price_list", quotation.selling_price_list)
|
||||
|
||||
def set_taxes(quotation, cart_settings, billing_territory):
|
||||
"""set taxes based on billing territory"""
|
||||
quotation.taxes_and_charges = cart_settings.get_tax_master(billing_territory)
|
||||
|
||||
# clear table
|
||||
quotation.set("other_charges", [])
|
||||
|
||||
# append taxes
|
||||
quotation.append_taxes_from_master("other_charges", "taxes_and_charges")
|
||||
|
||||
def get_lead_or_customer():
|
||||
customer = frappe.db.get_value("Contact", {"email_id": frappe.session.user}, "customer")
|
||||
if customer:
|
||||
return frappe.get_doc("Customer", customer)
|
||||
|
||||
lead = frappe.db.get_value("Lead", {"email_id": frappe.session.user})
|
||||
if lead:
|
||||
return frappe.get_doc("Lead", lead)
|
||||
else:
|
||||
lead_doc = frappe.get_doc({
|
||||
"doctype": "Lead",
|
||||
"email_id": frappe.session.user,
|
||||
"lead_name": get_fullname(frappe.session.user),
|
||||
"territory": guess_territory(),
|
||||
"status": "Open" # TODO: set something better???
|
||||
})
|
||||
|
||||
if frappe.session.user not in ("Guest", "Administrator"):
|
||||
lead_doc.ignore_permissions = True
|
||||
lead_doc.insert()
|
||||
|
||||
return lead_doc
|
||||
|
||||
def get_address_docs(party=None):
|
||||
if not party:
|
||||
party = get_lead_or_customer()
|
||||
|
||||
address_docs = frappe.db.sql("""select * from `tabAddress`
|
||||
where `%s`=%s order by name""" % (party.doctype.lower(), "%s"), party.name,
|
||||
as_dict=True, update={"doctype": "Address"})
|
||||
|
||||
for address in address_docs:
|
||||
address.display = get_address_display(address)
|
||||
address.display = (address.display).replace("\n", "<br>\n")
|
||||
|
||||
return address_docs
|
||||
|
||||
@frappe.whitelist()
|
||||
def apply_shipping_rule(shipping_rule):
|
||||
quotation = _get_cart_quotation()
|
||||
|
||||
quotation.shipping_rule = shipping_rule
|
||||
|
||||
apply_cart_settings(quotation=quotation)
|
||||
|
||||
quotation.ignore_permissions = True
|
||||
quotation.save()
|
||||
|
||||
return get_cart_quotation(quotation)
|
||||
|
||||
def _apply_shipping_rule(party=None, quotation=None, cart_settings=None):
|
||||
shipping_rules = get_shipping_rules(party, quotation, cart_settings)
|
||||
|
||||
if not shipping_rules:
|
||||
return
|
||||
|
||||
elif quotation.shipping_rule not in shipping_rules:
|
||||
quotation.shipping_rule = shipping_rules[0]
|
||||
|
||||
quotation.run_method("apply_shipping_rule")
|
||||
quotation.run_method("calculate_taxes_and_totals")
|
||||
|
||||
def get_applicable_shipping_rules(party=None, quotation=None):
|
||||
shipping_rules = get_shipping_rules(party, quotation)
|
||||
|
||||
if shipping_rules:
|
||||
rule_label_map = frappe.db.get_values("Shipping Rule", shipping_rules, "label")
|
||||
# we need this in sorted order as per the position of the rule in the settings page
|
||||
return [[rule, rule_label_map.get(rule)] for rule in shipping_rules]
|
||||
|
||||
def get_shipping_rules(party=None, quotation=None, cart_settings=None):
|
||||
if not party:
|
||||
party = get_lead_or_customer()
|
||||
if not quotation:
|
||||
quotation = _get_cart_quotation()
|
||||
if not cart_settings:
|
||||
cart_settings = frappe.get_doc("Shopping Cart Settings")
|
||||
|
||||
# set shipping rule based on shipping territory
|
||||
shipping_territory = get_address_territory(quotation.shipping_address_name) or \
|
||||
party.territory
|
||||
|
||||
shipping_rules = cart_settings.get_shipping_rules(shipping_territory)
|
||||
|
||||
return shipping_rules
|
||||
|
||||
def get_address_territory(address_name):
|
||||
"""Tries to match city, state and country of address to existing territory"""
|
||||
territory = None
|
||||
|
||||
if address_name:
|
||||
address_fields = frappe.db.get_value("Address", address_name,
|
||||
["city", "state", "country"])
|
||||
for value in address_fields:
|
||||
territory = frappe.db.get_value("Territory", value)
|
||||
if territory:
|
||||
break
|
||||
|
||||
return territory
|
||||
|
||||
import unittest
|
||||
test_dependencies = ["Item", "Price List", "Contact", "Shopping Cart Settings"]
|
||||
|
||||
class TestCart(unittest.TestCase):
|
||||
def tearDown(self):
|
||||
return
|
||||
|
||||
cart_settings = frappe.get_doc("Shopping Cart Settings")
|
||||
cart_settings.ignore_permissions = True
|
||||
cart_settings.enabled = 0
|
||||
cart_settings.save()
|
||||
|
||||
def enable_shopping_cart(self):
|
||||
return
|
||||
if not frappe.db.get_value("Shopping Cart Settings", None, "enabled"):
|
||||
cart_settings = frappe.get_doc("Shopping Cart Settings")
|
||||
cart_settings.ignore_permissions = True
|
||||
cart_settings.enabled = 1
|
||||
cart_settings.save()
|
||||
|
||||
def test_get_lead_or_customer(self):
|
||||
frappe.session.user = "test@example.com"
|
||||
party1 = get_lead_or_customer()
|
||||
party2 = get_lead_or_customer()
|
||||
self.assertEquals(party1.name, party2.name)
|
||||
self.assertEquals(party1.doctype, "Lead")
|
||||
|
||||
frappe.session.user = "test_contact_customer@example.com"
|
||||
party = get_lead_or_customer()
|
||||
self.assertEquals(party.name, "_Test Customer")
|
||||
|
||||
def test_add_to_cart(self):
|
||||
self.enable_shopping_cart()
|
||||
frappe.session.user = "test@example.com"
|
||||
|
||||
update_cart("_Test Item", 1)
|
||||
|
||||
quotation = _get_cart_quotation()
|
||||
quotation_items = quotation.get("quotation_details", {"item_code": "_Test Item"})
|
||||
self.assertTrue(quotation_items)
|
||||
self.assertEquals(quotation_items[0].qty, 1)
|
||||
|
||||
return quotation
|
||||
|
||||
def test_update_cart(self):
|
||||
self.test_add_to_cart()
|
||||
|
||||
update_cart("_Test Item", 5)
|
||||
|
||||
quotation = _get_cart_quotation()
|
||||
quotation_items = quotation.get("quotation_details", {"item_code": "_Test Item"})
|
||||
self.assertTrue(quotation_items)
|
||||
self.assertEquals(quotation_items[0].qty, 5)
|
||||
|
||||
return quotation
|
||||
|
||||
def test_remove_from_cart(self):
|
||||
quotation0 = self.test_add_to_cart()
|
||||
|
||||
update_cart("_Test Item", 0)
|
||||
|
||||
quotation = _get_cart_quotation()
|
||||
self.assertEquals(quotation0.name, quotation.name)
|
||||
|
||||
quotation_items = quotation.get("quotation_details", {"item_code": "_Test Item"})
|
||||
self.assertEquals(quotation_items, [])
|
||||
|
||||
def test_place_order(self):
|
||||
quotation = self.test_update_cart()
|
||||
sales_order_name = place_order()
|
||||
sales_order = frappe.get_doc("Sales Order", sales_order_name)
|
||||
self.assertEquals(sales_order.getone({"item_code": "_Test Item"}).prevdoc_docname, quotation.name)
|
0
erpnext/shopping_cart/doctype/__init__.py
Normal file
0
erpnext/shopping_cart/doctype/__init__.py
Normal file
@ -0,0 +1,23 @@
|
||||
{
|
||||
"creation": "2013-06-20 16:00:18.000000",
|
||||
"docstatus": 0,
|
||||
"doctype": "DocType",
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "selling_price_list",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Price List",
|
||||
"options": "Price List",
|
||||
"permlevel": 0,
|
||||
"reqd": 1
|
||||
}
|
||||
],
|
||||
"idx": 1,
|
||||
"istable": 1,
|
||||
"modified": "2013-12-20 19:30:47.000000",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Shopping Cart",
|
||||
"name": "Shopping Cart Price List",
|
||||
"owner": "Administrator"
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
|
||||
from frappe.model.document import Document
|
||||
|
||||
class ShoppingCartPriceList(Document):
|
||||
pass
|
@ -0,0 +1,10 @@
|
||||
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
// License: GNU General Public License v3. See license.txt
|
||||
|
||||
$.extend(cur_frm.cscript, {
|
||||
onload: function() {
|
||||
if(cur_frm.doc.__onload && cur_frm.doc.__onload.quotation_series) {
|
||||
cur_frm.fields_dict.quotation_series.df.options = cur_frm.doc.__onload.quotation_series;
|
||||
}
|
||||
}
|
||||
});
|
@ -0,0 +1,115 @@
|
||||
{
|
||||
"creation": "2013-06-19 15:57:32",
|
||||
"description": "Default settings for Shopping Cart",
|
||||
"docstatus": 0,
|
||||
"doctype": "DocType",
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "enabled",
|
||||
"fieldtype": "Check",
|
||||
"in_list_view": 1,
|
||||
"label": "Enable Shopping Cart",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "section_break_2",
|
||||
"fieldtype": "Section Break",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "company",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Company",
|
||||
"options": "Company",
|
||||
"permlevel": 0,
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"description": "<a href=\"#Sales Browser/Territory\">Add / Edit</a>",
|
||||
"fieldname": "default_territory",
|
||||
"fieldtype": "Link",
|
||||
"ignore_user_permissions": 1,
|
||||
"in_list_view": 1,
|
||||
"label": "Default Territory",
|
||||
"options": "Territory",
|
||||
"permlevel": 0,
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break_4",
|
||||
"fieldtype": "Column Break",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"description": "<a href=\"#Sales Browser/Customer Group\">Add / Edit</a>",
|
||||
"fieldname": "default_customer_group",
|
||||
"fieldtype": "Link",
|
||||
"ignore_user_permissions": 1,
|
||||
"label": "Default Customer Group",
|
||||
"options": "Customer Group",
|
||||
"permlevel": 0,
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "quotation_series",
|
||||
"fieldtype": "Select",
|
||||
"label": "Quotation Series",
|
||||
"permlevel": 0,
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "section_break_6",
|
||||
"fieldtype": "Section Break",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "price_lists",
|
||||
"fieldtype": "Table",
|
||||
"label": "Shopping Cart Price Lists",
|
||||
"options": "Shopping Cart Price List",
|
||||
"permlevel": 0,
|
||||
"reqd": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "shipping_rules",
|
||||
"fieldtype": "Table",
|
||||
"label": "Shopping Cart Shipping Rules",
|
||||
"options": "Shopping Cart Shipping Rule",
|
||||
"permlevel": 0,
|
||||
"reqd": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break_10",
|
||||
"fieldtype": "Column Break",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "sales_taxes_and_charges_masters",
|
||||
"fieldtype": "Table",
|
||||
"label": "Shopping Cart Taxes and Charges Masters",
|
||||
"options": "Shopping Cart Taxes and Charges Master",
|
||||
"permlevel": 0,
|
||||
"reqd": 0
|
||||
}
|
||||
],
|
||||
"icon": "icon-shopping-cart",
|
||||
"idx": 1,
|
||||
"issingle": 1,
|
||||
"modified": "2014-05-26 03:05:53.747800",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Shopping Cart",
|
||||
"name": "Shopping Cart Settings",
|
||||
"owner": "Administrator",
|
||||
"permissions": [
|
||||
{
|
||||
"create": 1,
|
||||
"email": 1,
|
||||
"permlevel": 0,
|
||||
"print": 1,
|
||||
"read": 1,
|
||||
"role": "Website Manager",
|
||||
"write": 1
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,215 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe import _, msgprint
|
||||
from frappe.utils import comma_and
|
||||
from frappe.model.document import Document
|
||||
from frappe.utils.nestedset import get_ancestors_of
|
||||
from erpnext.utilities.doctype.address.address import get_territory_from_address
|
||||
|
||||
class ShoppingCartSetupError(frappe.ValidationError): pass
|
||||
|
||||
class ShoppingCartSettings(Document):
|
||||
def onload(self):
|
||||
self.get("__onload").quotation_series = frappe.get_meta("Quotation").get_options("naming_series")
|
||||
|
||||
def validate(self):
|
||||
if self.enabled:
|
||||
self.validate_price_lists()
|
||||
self.validate_tax_masters()
|
||||
self.validate_exchange_rates_exist()
|
||||
|
||||
def on_update(self):
|
||||
frappe.db.set_default("shopping_cart_enabled", self.get("enabled") or 0)
|
||||
frappe.db.set_default("shopping_cart_quotation_series", self.get("quotation_series"))
|
||||
|
||||
def validate_overlapping_territories(self, parentfield, fieldname):
|
||||
# for displaying message
|
||||
doctype = self.meta.get_field(parentfield).options
|
||||
|
||||
# specify atleast one entry in the table
|
||||
self.validate_table_has_rows(parentfield, raise_exception=ShoppingCartSetupError)
|
||||
|
||||
territory_name_map = self.get_territory_name_map(parentfield, fieldname)
|
||||
for territory, names in territory_name_map.items():
|
||||
if len(names) > 1:
|
||||
frappe.throw(_("{0} {1} has a common territory {2}").format(_(doctype), comma_and(names), territory), ShoppingCartSetupError)
|
||||
|
||||
return territory_name_map
|
||||
|
||||
def validate_price_lists(self):
|
||||
territory_name_map = self.validate_overlapping_territories("price_lists", "selling_price_list")
|
||||
|
||||
# validate that a Shopping Cart Price List exists for the default territory as a catch all!
|
||||
price_list_for_default_territory = self.get_name_from_territory(self.default_territory, "price_lists",
|
||||
"selling_price_list")
|
||||
|
||||
if not price_list_for_default_territory:
|
||||
msgprint(_("Please specify a Price List which is valid for Territory") +
|
||||
": " + self.default_territory, raise_exception=ShoppingCartSetupError)
|
||||
|
||||
def validate_tax_masters(self):
|
||||
self.validate_overlapping_territories("sales_taxes_and_charges_masters",
|
||||
"sales_taxes_and_charges_master")
|
||||
|
||||
def get_territory_name_map(self, parentfield, fieldname):
|
||||
territory_name_map = {}
|
||||
|
||||
# entries in table
|
||||
names = [doc.get(fieldname) for doc in self.get(parentfield)]
|
||||
|
||||
if names:
|
||||
# for condition in territory check
|
||||
parenttype = frappe.get_meta(self.meta.get_options(parentfield)).get_options(fieldname)
|
||||
|
||||
# to validate territory overlap
|
||||
# make a map of territory: [list of names]
|
||||
# if list against each territory has more than one element, raise exception
|
||||
territory_name = frappe.db.sql("""select `territory`, `parent`
|
||||
from `tabApplicable Territory`
|
||||
where `parenttype`=%s and `parent` in (%s)""" %
|
||||
("%s", ", ".join(["%s"]*len(names))), tuple([parenttype] + names))
|
||||
|
||||
for territory, name in territory_name:
|
||||
territory_name_map.setdefault(territory, []).append(name)
|
||||
|
||||
if len(territory_name_map[territory]) > 1:
|
||||
territory_name_map[territory].sort(key=lambda val: names.index(val))
|
||||
|
||||
return territory_name_map
|
||||
|
||||
def validate_exchange_rates_exist(self):
|
||||
"""check if exchange rates exist for all Price List currencies (to company's currency)"""
|
||||
company_currency = frappe.db.get_value("Company", self.company, "default_currency")
|
||||
if not company_currency:
|
||||
msgprint(_("Please specify currency in Company") + ": " + self.company,
|
||||
raise_exception=ShoppingCartSetupError)
|
||||
|
||||
price_list_currency_map = frappe.db.get_values("Price List",
|
||||
[d.selling_price_list for d in self.get("price_lists")],
|
||||
"currency")
|
||||
|
||||
# check if all price lists have a currency
|
||||
for price_list, currency in price_list_currency_map.items():
|
||||
if not currency:
|
||||
frappe.throw(_("Currency is required for Price List {0}").format(price_list))
|
||||
|
||||
expected_to_exist = [currency + "-" + company_currency
|
||||
for currency in price_list_currency_map.values()
|
||||
if currency != company_currency]
|
||||
|
||||
if expected_to_exist:
|
||||
exists = frappe.db.sql_list("""select name from `tabCurrency Exchange`
|
||||
where name in (%s)""" % (", ".join(["%s"]*len(expected_to_exist)),),
|
||||
tuple(expected_to_exist))
|
||||
|
||||
missing = list(set(expected_to_exist).difference(exists))
|
||||
|
||||
if missing:
|
||||
msgprint(_("Missing Currency Exchange Rates for {0}").format(comma_and(missing)),
|
||||
raise_exception=ShoppingCartSetupError)
|
||||
|
||||
def get_name_from_territory(self, territory, parentfield, fieldname):
|
||||
name = None
|
||||
territory_name_map = self.get_territory_name_map(parentfield, fieldname)
|
||||
|
||||
if territory_name_map.get(territory):
|
||||
name = territory_name_map.get(territory)
|
||||
else:
|
||||
territory_ancestry = self.get_territory_ancestry(territory)
|
||||
for ancestor in territory_ancestry:
|
||||
if territory_name_map.get(ancestor):
|
||||
name = territory_name_map.get(ancestor)
|
||||
break
|
||||
|
||||
return name
|
||||
|
||||
def get_price_list(self, billing_territory):
|
||||
price_list = self.get_name_from_territory(billing_territory, "price_lists", "selling_price_list")
|
||||
return price_list and price_list[0] or None
|
||||
|
||||
def get_tax_master(self, billing_territory):
|
||||
tax_master = self.get_name_from_territory(billing_territory, "sales_taxes_and_charges_masters",
|
||||
"sales_taxes_and_charges_master")
|
||||
return tax_master and tax_master[0] or None
|
||||
|
||||
def get_shipping_rules(self, shipping_territory):
|
||||
return self.get_name_from_territory(shipping_territory, "shipping_rules", "shipping_rule")
|
||||
|
||||
def get_territory_ancestry(self, territory):
|
||||
if not hasattr(self, "_territory_ancestry"):
|
||||
self._territory_ancestry = {}
|
||||
|
||||
if not self._territory_ancestry.get(territory):
|
||||
self._territory_ancestry[territory] = get_ancestors_of("Territory", territory)
|
||||
|
||||
return self._territory_ancestry[territory]
|
||||
|
||||
def validate_cart_settings(doc, method):
|
||||
frappe.get_doc("Shopping Cart Settings", "Shopping Cart Settings").run_method("validate")
|
||||
|
||||
def get_shopping_cart_settings():
|
||||
if not getattr(frappe.local, "shopping_cart_settings", None):
|
||||
frappe.local.shopping_cart_settings = frappe.get_doc("Shopping Cart Settings", "Shopping Cart Settings")
|
||||
|
||||
return frappe.local.shopping_cart_settings
|
||||
|
||||
def get_default_territory():
|
||||
return get_shopping_cart_settings().default_territory
|
||||
|
||||
def is_shopping_cart_enabled():
|
||||
if not get_shopping_cart_settings().enabled:
|
||||
frappe.throw(_("You need to enable Shopping Cart"), ShoppingCartSetupError)
|
||||
|
||||
def apply_shopping_cart_settings(quotation, method):
|
||||
"""Called via a validate hook on Quotation"""
|
||||
from erpnext.shopping_cart import get_party
|
||||
if quotation.order_type != "Shopping Cart":
|
||||
return
|
||||
|
||||
quotation.billing_territory = (get_territory_from_address(quotation.customer_address)
|
||||
or get_party(quotation.contact_email).territory or get_default_territory())
|
||||
quotation.shipping_territory = (get_territory_from_address(quotation.shipping_address_name)
|
||||
or get_party(quotation.contact_email).territory or get_default_territory())
|
||||
|
||||
set_price_list(quotation)
|
||||
set_taxes_and_charges(quotation)
|
||||
quotation.calculate_taxes_and_totals()
|
||||
set_shipping_rule(quotation)
|
||||
|
||||
def set_price_list(quotation):
|
||||
previous_selling_price_list = quotation.selling_price_list
|
||||
quotation.selling_price_list = get_shopping_cart_settings().get_price_list(quotation.billing_territory)
|
||||
|
||||
if not quotation.selling_price_list:
|
||||
quotation.selling_price_list = get_shopping_cart_settings().get_price_list(get_default_territory())
|
||||
|
||||
if previous_selling_price_list != quotation.selling_price_list:
|
||||
quotation.price_list_currency = quotation.currency = quotation.plc_conversion_rate = quotation.conversion_rate = None
|
||||
for d in quotation.get("quotation_details"):
|
||||
d.price_list_rate = d.discount_percentage = d.rate = d.amount = None
|
||||
|
||||
quotation.set_price_list_and_item_details()
|
||||
|
||||
def set_taxes_and_charges(quotation):
|
||||
previous_taxes_and_charges = quotation.taxes_and_charges
|
||||
quotation.taxes_and_charges = get_shopping_cart_settings().get_tax_master(quotation.billing_territory)
|
||||
|
||||
if previous_taxes_and_charges != quotation.taxes_and_charges:
|
||||
quotation.set_other_charges()
|
||||
|
||||
def set_shipping_rule(quotation):
|
||||
shipping_rules = get_shopping_cart_settings().get_shipping_rules(quotation.shipping_territory)
|
||||
if not shipping_rules:
|
||||
quotation.remove_shipping_charge()
|
||||
return
|
||||
|
||||
if quotation.shipping_rule not in shipping_rules:
|
||||
quotation.remove_shipping_charge()
|
||||
quotation.shipping_rule = shipping_rules[0]
|
||||
|
||||
quotation.apply_shipping_rule()
|
@ -0,0 +1,79 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
import unittest
|
||||
from erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings import ShoppingCartSetupError
|
||||
|
||||
class TestShoppingCartSettings(unittest.TestCase):
|
||||
def setUp(self):
|
||||
frappe.db.sql("""delete from `tabSingles` where doctype="Shipping Cart Settings" """)
|
||||
frappe.db.sql("""delete from `tabShopping Cart Price List`""")
|
||||
frappe.db.sql("""delete from `tabShopping Cart Taxes and Charges Master`""")
|
||||
frappe.db.sql("""delete from `tabShopping Cart Shipping Rule`""")
|
||||
|
||||
def get_cart_settings(self):
|
||||
return frappe.get_doc({"doctype": "Shopping Cart Settings",
|
||||
"company": "_Test Company"})
|
||||
|
||||
def test_price_list_territory_overlap(self):
|
||||
cart_settings = self.get_cart_settings()
|
||||
|
||||
def _add_price_list(price_list):
|
||||
cart_settings.append("price_lists", {
|
||||
"doctype": "Shopping Cart Price List",
|
||||
"selling_price_list": price_list
|
||||
})
|
||||
|
||||
for price_list in ("_Test Price List Rest of the World", "_Test Price List India",
|
||||
"_Test Price List"):
|
||||
_add_price_list(price_list)
|
||||
|
||||
controller = cart_settings
|
||||
controller.validate_overlapping_territories("price_lists", "selling_price_list")
|
||||
|
||||
_add_price_list("_Test Price List 2")
|
||||
|
||||
controller = cart_settings
|
||||
self.assertRaises(ShoppingCartSetupError, controller.validate_overlapping_territories,
|
||||
"price_lists", "selling_price_list")
|
||||
|
||||
return cart_settings
|
||||
|
||||
def test_taxes_territory_overlap(self):
|
||||
cart_settings = self.get_cart_settings()
|
||||
|
||||
def _add_tax_master(tax_master):
|
||||
cart_settings.append("sales_taxes_and_charges_masters", {
|
||||
"doctype": "Shopping Cart Taxes and Charges Master",
|
||||
"sales_taxes_and_charges_master": tax_master
|
||||
})
|
||||
|
||||
for tax_master in ("_Test Sales Taxes and Charges Master", "_Test India Tax Master"):
|
||||
_add_tax_master(tax_master)
|
||||
|
||||
controller = cart_settings
|
||||
controller.validate_overlapping_territories("sales_taxes_and_charges_masters",
|
||||
"sales_taxes_and_charges_master")
|
||||
|
||||
_add_tax_master("_Test Sales Taxes and Charges Master - Rest of the World")
|
||||
|
||||
controller = cart_settings
|
||||
self.assertRaises(ShoppingCartSetupError, controller.validate_overlapping_territories,
|
||||
"sales_taxes_and_charges_masters", "sales_taxes_and_charges_master")
|
||||
|
||||
def test_exchange_rate_exists(self):
|
||||
frappe.db.sql("""delete from `tabCurrency Exchange`""")
|
||||
|
||||
cart_settings = self.test_price_list_territory_overlap()
|
||||
controller = cart_settings
|
||||
self.assertRaises(ShoppingCartSetupError, controller.validate_exchange_rates_exist)
|
||||
|
||||
from erpnext.setup.doctype.currency_exchange.test_currency_exchange import test_records as \
|
||||
currency_exchange_records
|
||||
frappe.get_doc(currency_exchange_records[0]).insert()
|
||||
controller.validate_exchange_rates_exist()
|
||||
|
@ -0,0 +1,23 @@
|
||||
{
|
||||
"creation": "2013-07-03 13:15:34.000000",
|
||||
"docstatus": 0,
|
||||
"doctype": "DocType",
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "shipping_rule",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Shipping Rule",
|
||||
"options": "Shipping Rule",
|
||||
"permlevel": 0,
|
||||
"reqd": 1
|
||||
}
|
||||
],
|
||||
"idx": 1,
|
||||
"istable": 1,
|
||||
"modified": "2013-12-20 19:30:47.000000",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Shopping Cart",
|
||||
"name": "Shopping Cart Shipping Rule",
|
||||
"owner": "Administrator"
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
|
||||
from frappe.model.document import Document
|
||||
|
||||
class ShoppingCartShippingRule(Document):
|
||||
pass
|
@ -0,0 +1,23 @@
|
||||
{
|
||||
"creation": "2013-06-20 16:57:03.000000",
|
||||
"docstatus": 0,
|
||||
"doctype": "DocType",
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "sales_taxes_and_charges_master",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Tax Master",
|
||||
"options": "Sales Taxes and Charges Master",
|
||||
"permlevel": 0,
|
||||
"reqd": 1
|
||||
}
|
||||
],
|
||||
"idx": 1,
|
||||
"istable": 1,
|
||||
"modified": "2013-12-20 19:30:47.000000",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Shopping Cart",
|
||||
"name": "Shopping Cart Taxes and Charges Master",
|
||||
"owner": "Administrator"
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
|
||||
from frappe.model.document import Document
|
||||
|
||||
class ShoppingCartTaxesandChargesMaster(Document):
|
||||
pass
|
54
erpnext/shopping_cart/product.py
Normal file
54
erpnext/shopping_cart/product.py
Normal file
@ -0,0 +1,54 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import frappe
|
||||
from frappe.utils import cint, fmt_money, cstr
|
||||
from erpnext.shopping_cart.cart import _get_cart_quotation
|
||||
from urllib import unquote
|
||||
|
||||
@frappe.whitelist(allow_guest=True)
|
||||
def get_product_info(item_code):
|
||||
"""get product price / stock info"""
|
||||
if not cint(frappe.db.get_default("shopping_cart_enabled")):
|
||||
return {}
|
||||
|
||||
cart_quotation = _get_cart_quotation()
|
||||
|
||||
price_list = cstr(unquote(frappe.local.request.cookies.get("selling_price_list")))
|
||||
|
||||
warehouse = frappe.db.get_value("Item", item_code, "website_warehouse")
|
||||
if warehouse:
|
||||
in_stock = frappe.db.sql("""select actual_qty from tabBin where
|
||||
item_code=%s and warehouse=%s""", (item_code, warehouse))
|
||||
if in_stock:
|
||||
in_stock = in_stock[0][0] > 0 and 1 or 0
|
||||
else:
|
||||
in_stock = -1
|
||||
|
||||
price = price_list and frappe.db.sql("""select price_list_rate, currency from
|
||||
`tabItem Price` where item_code=%s and price_list=%s""",
|
||||
(item_code, price_list), as_dict=1) or []
|
||||
|
||||
price = price and price[0] or None
|
||||
qty = 0
|
||||
|
||||
if price:
|
||||
price["formatted_price"] = fmt_money(price["price_list_rate"], currency=price["currency"])
|
||||
|
||||
price["currency"] = not cint(frappe.db.get_default("hide_currency_symbol")) \
|
||||
and (frappe.db.get_value("Currency", price.currency, "symbol") or price.currency) \
|
||||
or ""
|
||||
|
||||
if frappe.session.user != "Guest":
|
||||
item = cart_quotation.get({"item_code": item_code})
|
||||
if item:
|
||||
qty = item[0].qty
|
||||
|
||||
return {
|
||||
"price": price,
|
||||
"stock": in_stock,
|
||||
"uom": frappe.db.get_value("Item", item_code, "stock_uom"),
|
||||
"qty": qty
|
||||
}
|
230
erpnext/shopping_cart/test_shopping_cart.py
Normal file
230
erpnext/shopping_cart/test_shopping_cart.py
Normal file
@ -0,0 +1,230 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import unittest
|
||||
import frappe
|
||||
from erpnext.shopping_cart import get_quotation, set_item_in_cart
|
||||
|
||||
class TestShoppingCart(unittest.TestCase):
|
||||
"""
|
||||
Note:
|
||||
Shopping Cart == Quotation
|
||||
"""
|
||||
def setUp(self):
|
||||
frappe.set_user("Administrator")
|
||||
self.enable_shopping_cart()
|
||||
|
||||
def tearDown(self):
|
||||
frappe.set_user("Administrator")
|
||||
self.disable_shopping_cart()
|
||||
|
||||
def test_get_cart_new_user(self):
|
||||
self.login_as_new_user()
|
||||
|
||||
# test if lead is created and quotation with new lead is fetched
|
||||
quotation = get_quotation()
|
||||
self.assertEquals(quotation.quotation_to, "Lead")
|
||||
self.assertEquals(frappe.db.get_value("Lead", quotation.lead, "email_id"), "test_cart_user@example.com")
|
||||
self.assertEquals(quotation.customer, None)
|
||||
self.assertEquals(quotation.contact_email, frappe.session.user)
|
||||
|
||||
return quotation
|
||||
|
||||
def test_get_cart_lead(self):
|
||||
self.login_as_lead()
|
||||
|
||||
# test if quotation with lead is fetched
|
||||
quotation = get_quotation()
|
||||
self.assertEquals(quotation.quotation_to, "Lead")
|
||||
self.assertEquals(quotation.lead, frappe.db.get_value("Lead", {"email_id": "test_cart_lead@example.com"}))
|
||||
self.assertEquals(quotation.customer, None)
|
||||
self.assertEquals(quotation.contact_email, frappe.session.user)
|
||||
|
||||
return quotation
|
||||
|
||||
def test_get_cart_customer(self):
|
||||
self.login_as_customer()
|
||||
|
||||
# test if quotation with customer is fetched
|
||||
quotation = get_quotation()
|
||||
self.assertEquals(quotation.quotation_to, "Customer")
|
||||
self.assertEquals(quotation.customer, "_Test Customer")
|
||||
self.assertEquals(quotation.lead, None)
|
||||
self.assertEquals(quotation.contact_email, frappe.session.user)
|
||||
|
||||
return quotation
|
||||
|
||||
def test_add_to_cart(self):
|
||||
self.login_as_lead()
|
||||
|
||||
# add first item
|
||||
set_item_in_cart("_Test Item", 1)
|
||||
quotation = self.test_get_cart_lead()
|
||||
self.assertEquals(quotation.get("quotation_details")[0].item_code, "_Test Item")
|
||||
self.assertEquals(quotation.get("quotation_details")[0].qty, 1)
|
||||
self.assertEquals(quotation.get("quotation_details")[0].amount, 10)
|
||||
|
||||
# add second item
|
||||
set_item_in_cart("_Test Item 2", 1)
|
||||
quotation = self.test_get_cart_lead()
|
||||
self.assertEquals(quotation.get("quotation_details")[1].item_code, "_Test Item 2")
|
||||
self.assertEquals(quotation.get("quotation_details")[1].qty, 1)
|
||||
self.assertEquals(quotation.get("quotation_details")[1].amount, 20)
|
||||
|
||||
self.assertEquals(len(quotation.get("quotation_details")), 2)
|
||||
|
||||
def test_update_cart(self):
|
||||
# first, add to cart
|
||||
self.test_add_to_cart()
|
||||
|
||||
# update first item
|
||||
set_item_in_cart("_Test Item", 5)
|
||||
quotation = self.test_get_cart_lead()
|
||||
self.assertEquals(quotation.get("quotation_details")[0].item_code, "_Test Item")
|
||||
self.assertEquals(quotation.get("quotation_details")[0].qty, 5)
|
||||
self.assertEquals(quotation.get("quotation_details")[0].amount, 50)
|
||||
self.assertEquals(quotation.net_total, 70)
|
||||
self.assertEquals(len(quotation.get("quotation_details")), 2)
|
||||
|
||||
def test_remove_from_cart(self):
|
||||
# first, add to cart
|
||||
self.test_add_to_cart()
|
||||
|
||||
# remove first item
|
||||
set_item_in_cart("_Test Item", 0)
|
||||
quotation = self.test_get_cart_lead()
|
||||
self.assertEquals(quotation.get("quotation_details")[0].item_code, "_Test Item 2")
|
||||
self.assertEquals(quotation.get("quotation_details")[0].qty, 1)
|
||||
self.assertEquals(quotation.get("quotation_details")[0].amount, 20)
|
||||
self.assertEquals(quotation.net_total, 20)
|
||||
self.assertEquals(len(quotation.get("quotation_details")), 1)
|
||||
|
||||
# remove second item
|
||||
set_item_in_cart("_Test Item 2", 0)
|
||||
quotation = self.test_get_cart_lead()
|
||||
self.assertEquals(quotation.net_total, 0)
|
||||
self.assertEquals(len(quotation.get("quotation_details")), 0)
|
||||
|
||||
def test_set_billing_address(self):
|
||||
return
|
||||
|
||||
# first, add to cart
|
||||
self.test_add_to_cart()
|
||||
|
||||
quotation = self.test_get_cart_lead()
|
||||
default_address = frappe.get_doc("Address", {"lead": quotation.lead, "is_primary_address": 1})
|
||||
self.assertEquals("customer_address", default_address.name)
|
||||
|
||||
def test_set_shipping_address(self):
|
||||
# first, add to cart
|
||||
self.test_add_to_cart()
|
||||
|
||||
|
||||
|
||||
def test_shipping_rule(self):
|
||||
self.test_set_shipping_address()
|
||||
|
||||
# check if shipping rule changed
|
||||
pass
|
||||
|
||||
def test_price_list(self):
|
||||
self.test_set_billing_address()
|
||||
|
||||
# check if price changed
|
||||
pass
|
||||
|
||||
def test_place_order(self):
|
||||
pass
|
||||
|
||||
# helper functions
|
||||
def enable_shopping_cart(self):
|
||||
settings = frappe.get_doc("Shopping Cart Settings", "Shopping Cart Settings")
|
||||
|
||||
if settings.default_territory == "_Test Territory Rest Of The World":
|
||||
settings.enabled = 1
|
||||
else:
|
||||
settings.update({
|
||||
"enabled": 1,
|
||||
"company": "_Test Company",
|
||||
"default_territory": "_Test Territory Rest Of The World",
|
||||
"default_customer_group": "_Test Customer Group",
|
||||
"quotation_series": "_T-Quotation-"
|
||||
})
|
||||
settings.set("price_lists", [
|
||||
# price lists
|
||||
{"doctype": "Shopping Cart Price List", "parentfield": "price_lists",
|
||||
"selling_price_list": "_Test Price List India"},
|
||||
{"doctype": "Shopping Cart Price List", "parentfield": "price_lists",
|
||||
"selling_price_list": "_Test Price List Rest of the World"}
|
||||
])
|
||||
settings.set("sales_taxes_and_charges_masters", [
|
||||
# tax masters
|
||||
{"doctype": "Shopping Cart Taxes and Charges Master", "parentfield": "sales_taxes_and_charges_masters",
|
||||
"sales_taxes_and_charges_master": "_Test India Tax Master"},
|
||||
{"doctype": "Shopping Cart Taxes and Charges Master", "parentfield": "sales_taxes_and_charges_masters",
|
||||
"sales_taxes_and_charges_master": "_Test Sales Taxes and Charges Master - Rest of the World"},
|
||||
])
|
||||
settings.set("shipping_rules", {"doctype": "Shopping Cart Shipping Rule", "parentfield": "shipping_rules",
|
||||
"shipping_rule": "_Test Shipping Rule - India"})
|
||||
|
||||
settings.save()
|
||||
frappe.local.shopping_cart_settings = None
|
||||
|
||||
def disable_shopping_cart(self):
|
||||
settings = frappe.get_doc("Shopping Cart Settings", "Shopping Cart Settings")
|
||||
settings.enabled = 0
|
||||
settings.save()
|
||||
frappe.local.shopping_cart_settings = None
|
||||
|
||||
def login_as_new_user(self):
|
||||
frappe.set_user("test_cart_user@example.com")
|
||||
|
||||
def login_as_lead(self):
|
||||
self.create_lead()
|
||||
frappe.set_user("test_cart_lead@example.com")
|
||||
|
||||
def login_as_customer(self):
|
||||
frappe.set_user("test_contact_customer@example.com")
|
||||
|
||||
def create_lead(self):
|
||||
if frappe.db.get_value("Lead", {"email_id": "test_cart_lead@example.com"}):
|
||||
return
|
||||
|
||||
lead = frappe.get_doc({
|
||||
"doctype": "Lead",
|
||||
"email_id": "test_cart_lead@example.com",
|
||||
"lead_name": "_Test Website Lead",
|
||||
"status": "Open",
|
||||
"territory": "_Test Territory Rest Of The World"
|
||||
})
|
||||
lead.insert(ignore_permissions=True)
|
||||
|
||||
frappe.get_doc({
|
||||
"doctype": "Address",
|
||||
"address_line1": "_Test Address Line 1",
|
||||
"address_title": "_Test Cart Lead Address",
|
||||
"address_type": "Office",
|
||||
"city": "_Test City",
|
||||
"country": "United States",
|
||||
"lead": lead.name,
|
||||
"lead_name": "_Test Website Lead",
|
||||
"is_primary_address": 1,
|
||||
"phone": "+91 0000000000"
|
||||
}).insert(ignore_permissions=True)
|
||||
|
||||
frappe.get_doc({
|
||||
"doctype": "Address",
|
||||
"address_line1": "_Test Address Line 1",
|
||||
"address_title": "_Test Cart Lead Address",
|
||||
"address_type": "Home",
|
||||
"city": "_Test City",
|
||||
"country": "India",
|
||||
"lead": lead.name,
|
||||
"lead_name": "_Test Website Lead",
|
||||
"phone": "+91 0000000000"
|
||||
}).insert(ignore_permissions=True)
|
||||
|
||||
|
||||
test_dependencies = ["Sales Taxes and Charges Master", "Price List", "Item Price", "Shipping Rule", "Currency Exchange",
|
||||
"Customer Group", "Lead", "Customer", "Contact", "Address", "Item"]
|
47
erpnext/shopping_cart/utils.py
Normal file
47
erpnext/shopping_cart/utils.py
Normal file
@ -0,0 +1,47 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import frappe
|
||||
import frappe.defaults
|
||||
from frappe.utils import cint
|
||||
|
||||
def show_cart_count():
|
||||
if (frappe.db.get_default("shopping_cart_enabled") and
|
||||
frappe.db.get_value("User", frappe.session.user, "user_type") == "Website User"):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def set_cart_count(login_manager):
|
||||
if show_cart_count():
|
||||
from .shopping_cart.cart import set_cart_count
|
||||
set_cart_count()
|
||||
|
||||
def clear_cart_count(login_manager):
|
||||
if show_cart_count():
|
||||
frappe.local.cookie_manager.delete_cookie("cart_count")
|
||||
|
||||
def update_website_context(context):
|
||||
post_login = []
|
||||
cart_enabled = cint(frappe.db.get_default("shopping_cart_enabled"))
|
||||
context["shopping_cart_enabled"] = cart_enabled
|
||||
|
||||
if cart_enabled:
|
||||
post_login += [
|
||||
{"label": "Cart", "url": "cart", "icon": "icon-shopping-cart", "class": "cart-count"},
|
||||
{"class": "divider"}
|
||||
]
|
||||
|
||||
post_login += [
|
||||
{"label": "User", "url": "user", "icon": "icon-user"},
|
||||
{"label": "Addresses", "url": "addresses", "icon": "icon-map-marker"},
|
||||
{"label": "My Orders", "url": "orders", "icon": "icon-list"},
|
||||
{"label": "My Tickets", "url": "tickets", "icon": "icon-tags"},
|
||||
{"label": "Invoices", "url": "invoices", "icon": "icon-file-text"},
|
||||
{"label": "Shipments", "url": "shipments", "icon": "icon-truck"},
|
||||
{"class": "divider"}
|
||||
]
|
||||
|
||||
context["post_login"] = post_login + context.get("post_login", [])
|
297
erpnext/templates/includes/cart.js
Normal file
297
erpnext/templates/includes/cart.js
Normal file
@ -0,0 +1,297 @@
|
||||
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
// License: GNU General Public License v3. See license.txt
|
||||
|
||||
// js inside blog page
|
||||
|
||||
// shopping cart
|
||||
frappe.provide("shopping_cart");
|
||||
|
||||
$.extend(shopping_cart, {
|
||||
show_error: function(title, text) {
|
||||
$("#cart-container").html('<div class="well"><h4>' + title + '</h4> ' + text + '</div>');
|
||||
},
|
||||
|
||||
bind_events: function() {
|
||||
// bind update button
|
||||
$(document).on("click", ".item-update-cart button", function() {
|
||||
var item_code = $(this).attr("data-item-code");
|
||||
shopping_cart.update_cart({
|
||||
item_code: item_code,
|
||||
qty: $('input[data-item-code="'+item_code+'"]').val(),
|
||||
with_doc: 1,
|
||||
btn: this,
|
||||
callback: function(r) {
|
||||
if(!r.exc) {
|
||||
shopping_cart.render(r.message);
|
||||
var $button = $('button[data-item-code="'+item_code+'"]').addClass("btn-success");
|
||||
setTimeout(function() { $button.removeClass("btn-success"); }, 1000);
|
||||
}
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
$("#cart-add-shipping-address").on("click", function() {
|
||||
window.location.href = "address?address_fieldname=shipping_address_name";
|
||||
});
|
||||
|
||||
$("#cart-add-billing-address").on("click", function() {
|
||||
window.location.href = "address?address_fieldname=customer_address";
|
||||
});
|
||||
|
||||
$(".btn-place-order").on("click", function() {
|
||||
shopping_cart.place_order(this);
|
||||
});
|
||||
},
|
||||
|
||||
render: function(out) {
|
||||
var doc = out.doc;
|
||||
var addresses = out.addresses;
|
||||
|
||||
var $cart_items = $("#cart-items").empty();
|
||||
var $cart_taxes = $("#cart-taxes").empty();
|
||||
var $cart_totals = $("#cart-totals").empty();
|
||||
var $cart_billing_address = $("#cart-billing-address").empty();
|
||||
var $cart_shipping_address = $("#cart-shipping-address").empty();
|
||||
|
||||
var no_items = $.map(doc.quotation_details || [],
|
||||
function(d) { return d.item_code || null;}).length===0;
|
||||
if(no_items) {
|
||||
shopping_cart.show_error("Empty :-(", frappe._("Go ahead and add something to your cart."));
|
||||
$("#cart-addresses").toggle(false);
|
||||
return;
|
||||
}
|
||||
|
||||
var shipping_rule_added = false;
|
||||
var taxes_exist = false;
|
||||
var shipping_rule_labels = $.map(out.shipping_rules || [], function(rule) { return rule[1]; });
|
||||
|
||||
$.each(doc.quotation_details || [], function(i, d) {
|
||||
shopping_cart.render_item_row($cart_items, d);
|
||||
});
|
||||
|
||||
$.each(doc.other_charges || [], function(i, d) {
|
||||
if(out.shipping_rules && out.shipping_rules.length &&
|
||||
shipping_rule_labels.indexOf(d.description)!==-1) {
|
||||
shipping_rule_added = true;
|
||||
shopping_cart.render_tax_row($cart_taxes, d, out.shipping_rules);
|
||||
} else {
|
||||
shopping_cart.render_tax_row($cart_taxes, d);
|
||||
}
|
||||
|
||||
taxes_exist = true;
|
||||
});
|
||||
|
||||
if(out.shipping_rules && out.shipping_rules.length && !shipping_rule_added) {
|
||||
shopping_cart.render_tax_row($cart_taxes, {description: "", formatted_tax_amount: ""},
|
||||
out.shipping_rules);
|
||||
taxes_exist = true;
|
||||
}
|
||||
|
||||
if(taxes_exist)
|
||||
$('<hr>').appendTo($cart_taxes);
|
||||
|
||||
shopping_cart.render_tax_row($cart_totals, {
|
||||
description: "<strong>Total</strong>",
|
||||
formatted_tax_amount: "<strong>" + doc.formatted_grand_total_export + "</strong>"
|
||||
});
|
||||
|
||||
if(!(addresses && addresses.length)) {
|
||||
$cart_shipping_address.html('<div class="well">'+frappe._("Hey! Go ahead and add an address")+'</div>');
|
||||
} else {
|
||||
shopping_cart.render_address($cart_shipping_address, addresses, doc.shipping_address_name);
|
||||
shopping_cart.render_address($cart_billing_address, addresses, doc.customer_address);
|
||||
}
|
||||
},
|
||||
|
||||
render_item_row: function($cart_items, doc) {
|
||||
doc.image_html = doc.website_image ?
|
||||
'<div style="height: 120px; overflow: hidden;"><img src="' + doc.website_image + '" /></div>' :
|
||||
'{% include "templates/includes/product_missing_image.html" %}';
|
||||
|
||||
if(doc.description === doc.item_name) doc.description = "";
|
||||
|
||||
$(repl('<div class="row">\
|
||||
<div class="col-md-9 col-sm-9">\
|
||||
<div class="row">\
|
||||
<div class="col-md-3">%(image_html)s</div>\
|
||||
<div class="col-md-9">\
|
||||
<h4><a href="%(page_name)s">%(item_name)s</a></h4>\
|
||||
<p>%(description)s</p>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="col-md-3 col-sm-3 text-right">\
|
||||
<div class="input-group item-update-cart">\
|
||||
<input type="text" placeholder="Qty" value="%(qty)s" \
|
||||
data-item-code="%(item_code)s" class="text-right form-control">\
|
||||
<div class="input-group-btn">\
|
||||
<button class="btn btn-primary" data-item-code="%(item_code)s">\
|
||||
<i class="icon-ok"></i></button>\
|
||||
</div>\
|
||||
</div>\
|
||||
<p style="margin-top: 10px;">at %(formatted_rate)s</p>\
|
||||
<small class="text-muted" style="margin-top: 10px;">= %(formatted_amount)s</small>\
|
||||
</div>\
|
||||
</div><hr>', doc)).appendTo($cart_items);
|
||||
},
|
||||
|
||||
render_tax_row: function($cart_taxes, doc, shipping_rules) {
|
||||
var shipping_selector;
|
||||
if(shipping_rules) {
|
||||
shipping_selector = '<select class="form-control">' + $.map(shipping_rules, function(rule) {
|
||||
return '<option value="' + rule[0] + '">' + rule[1] + '</option>' }).join("\n") +
|
||||
'</select>';
|
||||
}
|
||||
|
||||
var $tax_row = $(repl('<div class="row">\
|
||||
<div class="col-md-9 col-sm-9">\
|
||||
<div class="row">\
|
||||
<div class="col-md-9 col-md-offset-3">' +
|
||||
(shipping_selector || '<p>%(description)s</p>') +
|
||||
'</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="col-md-3 col-sm-3 text-right">\
|
||||
<p' + (shipping_selector ? ' style="margin-top: 5px;"' : "") + '>%(formatted_tax_amount)s</p>\
|
||||
</div>\
|
||||
</div>', doc)).appendTo($cart_taxes);
|
||||
|
||||
if(shipping_selector) {
|
||||
$tax_row.find('select option').each(function(i, opt) {
|
||||
if($(opt).html() == doc.description) {
|
||||
$(opt).attr("selected", "selected");
|
||||
}
|
||||
});
|
||||
$tax_row.find('select').on("change", function() {
|
||||
shopping_cart.apply_shipping_rule($(this).val(), this);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
apply_shipping_rule: function(rule, btn) {
|
||||
return frappe.call({
|
||||
btn: btn,
|
||||
type: "POST",
|
||||
method: "erpnext.shopping_cart.cart.apply_shipping_rule",
|
||||
args: { shipping_rule: rule },
|
||||
callback: function(r) {
|
||||
if(!r.exc) {
|
||||
shopping_cart.render(r.message);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
render_address: function($address_wrapper, addresses, address_name) {
|
||||
$.each(addresses, function(i, address) {
|
||||
$(repl('<div class="panel panel-default"> \
|
||||
<div class="panel-heading"> \
|
||||
<div class="row"> \
|
||||
<div class="col-md-10 address-title" \
|
||||
data-address-name="%(name)s"><strong>%(name)s</strong></div> \
|
||||
<div class="col-md-2"><input type="checkbox" \
|
||||
data-address-name="%(name)s"></div> \
|
||||
</div> \
|
||||
</div> \
|
||||
<div class="panel-collapse collapse" data-address-name="%(name)s"> \
|
||||
<div class="panel-body">%(display)s</div> \
|
||||
</div> \
|
||||
</div>', address))
|
||||
.css({"margin": "10px auto"})
|
||||
.appendTo($address_wrapper);
|
||||
});
|
||||
|
||||
$address_wrapper.find(".panel-heading")
|
||||
.find(".address-title")
|
||||
.css({"cursor": "pointer"})
|
||||
.on("click", function() {
|
||||
$address_wrapper.find('.panel-collapse[data-address-name="'
|
||||
+$(this).attr("data-address-name")+'"]').collapse("toggle");
|
||||
});
|
||||
|
||||
$address_wrapper.find('input[type="checkbox"]').on("click", function() {
|
||||
if($(this).prop("checked")) {
|
||||
var me = this;
|
||||
$address_wrapper.find('input[type="checkbox"]').each(function(i, chk) {
|
||||
if($(chk).attr("data-address-name")!=$(me).attr("data-address-name")) {
|
||||
$(chk).prop("checked", false);
|
||||
}
|
||||
});
|
||||
|
||||
return frappe.call({
|
||||
type: "POST",
|
||||
method: "erpnext.shopping_cart.cart.update_cart_address",
|
||||
args: {
|
||||
address_fieldname: $address_wrapper.attr("data-fieldname"),
|
||||
address_name: $(this).attr("data-address-name")
|
||||
},
|
||||
callback: function(r) {
|
||||
if(!r.exc) {
|
||||
shopping_cart.render(r.message);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
$address_wrapper.find('input[type="checkbox"][data-address-name="'+ address_name +'"]')
|
||||
.prop("checked", true);
|
||||
|
||||
$address_wrapper.find(".panel-collapse").collapse({
|
||||
parent: $address_wrapper,
|
||||
toggle: false
|
||||
});
|
||||
|
||||
$address_wrapper.find('.panel-collapse[data-address-name="'+ address_name +'"]')
|
||||
.collapse("show");
|
||||
},
|
||||
|
||||
place_order: function(btn) {
|
||||
return frappe.call({
|
||||
type: "POST",
|
||||
method: "erpnext.shopping_cart.cart.place_order",
|
||||
btn: btn,
|
||||
callback: function(r) {
|
||||
if(r.exc) {
|
||||
var msg = "";
|
||||
if(r._server_messages) {
|
||||
msg = JSON.parse(r._server_messages || []).join("<br>");
|
||||
}
|
||||
|
||||
$("#cart-error")
|
||||
.empty()
|
||||
.html(msg || frappe._("Something went wrong!"))
|
||||
.toggle(true);
|
||||
} else {
|
||||
window.location.href = "order?name=" + encodeURIComponent(r.message);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
shopping_cart.bind_events();
|
||||
return frappe.call({
|
||||
type: "POST",
|
||||
method: "erpnext.shopping_cart.cart.get_cart_quotation",
|
||||
callback: function(r) {
|
||||
$("#cart-container").removeClass("hide");
|
||||
$(".progress").remove();
|
||||
if(r.exc) {
|
||||
if(r.exc.indexOf("WebsitePriceListMissingError")!==-1) {
|
||||
shopping_cart.show_error("Oops!", frappe._("Price List not configured."));
|
||||
} else if(r["403"]) {
|
||||
shopping_cart.show_error("Hey!", frappe._("You need to be logged in to view your cart."));
|
||||
} else {
|
||||
shopping_cart.show_error("Oops!", frappe._("Something went wrong."));
|
||||
}
|
||||
} else {
|
||||
shopping_cart.set_cart_count();
|
||||
shopping_cart.render(r.message);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
@ -7,7 +7,7 @@ $(document).ready(function() {
|
||||
|
||||
frappe.call({
|
||||
type: "POST",
|
||||
method: "shopping_cart.shopping_cart.product.get_product_info",
|
||||
method: "erpnext.shopping_cart.product.get_product_info",
|
||||
args: {
|
||||
item_code: "{{ name }}"
|
||||
},
|
||||
|
85
erpnext/templates/includes/sale.html
Normal file
85
erpnext/templates/includes/sale.html
Normal file
@ -0,0 +1,85 @@
|
||||
<div class="sale-content">
|
||||
<ul class="breadcrumb">
|
||||
<li><a href="index">Home</a></li>
|
||||
<li><a href="{{ parent_link }}">{{ parent_title }}</a></li>
|
||||
<li class="active"><i class="icon-file icon-fixed-width"></i> {{ doc.name }}</li>
|
||||
</ul>
|
||||
<h3><i class="icon-file icon-fixed-width"></i> {{ doc.name }}</h3>
|
||||
{% if doc.name == _("Not Allowed") -%}
|
||||
<script>ask_to_login();</script>
|
||||
{% else %}
|
||||
<hr>
|
||||
<div>
|
||||
<div class="row">
|
||||
<div class="col-xs-6">
|
||||
{% if doc.status -%}{{ doc.status }}{%- endif %}
|
||||
</div>
|
||||
<div class="col-xs-6">
|
||||
<span class="pull-right">{{ frappe.utils.formatdate(doc.posting_date or doc.transaction_date) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<table class="table table-bordered">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Sr</th>
|
||||
<th>Item Name</th>
|
||||
<th>Description</th>
|
||||
<th>Qty</th>
|
||||
<th>UoM</th>
|
||||
<th>Basic Rate</th>
|
||||
<th>Amount</th>
|
||||
</tr>
|
||||
{%- for row in doc.get({"doctype": doc.doctype + " Item"}) %}
|
||||
<tr>
|
||||
<td style="width: 3%;">{{ row.idx }}</td>
|
||||
<td style="width: 20%;">{{ row.item_name }}</td>
|
||||
<td style="width: 37%;">{{ row.description }}</td>
|
||||
<td style="width: 5%; text-align: right;">{{ row.qty }}</td>
|
||||
<td style="width: 5%;">{{ row.stock_uom }}</td>
|
||||
<td style="width: 15%; text-align: right;">{{ frappe.utils.fmt_money(row.rate, currency=doc.currency) }}</td>
|
||||
<td style="width: 15%; text-align: right;">{{ frappe.utils.fmt_money(row.amount, currency=doc.currency) }}</td>
|
||||
</tr>
|
||||
{% endfor -%}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6"></div>
|
||||
<div class="col-md-6">
|
||||
<table cellspacing=0 width=100%>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td width=40% style="text-align: right;">{{
|
||||
frappe.utils.fmt_money(doc.net_total/doc.conversion_rate, currency=doc.currency)
|
||||
}}</td>
|
||||
</tr>
|
||||
{%- for charge in doc.get({"doctype":"Sales Taxes and Charges"}) -%}
|
||||
{%- if not charge.included_in_print_rate -%}
|
||||
<tr>
|
||||
<td>{{ charge.description }}</td>
|
||||
<td style="text-align: right;">{{ frappe.utils.fmt_money(charge.tax_amount / doc.conversion_rate, currency=doc.currency) }}</td>
|
||||
</tr>
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
<tr>
|
||||
<td>Grand Total</td>
|
||||
<td style="text-align: right;">{{ frappe.utils.fmt_money(doc.grand_total_export, currency=doc.currency) }}</td>
|
||||
</tr>
|
||||
<tr style='font-weight: bold'>
|
||||
<td>Rounded Total</td>
|
||||
<td style="text-align: right;">{{ frappe.utils.fmt_money(doc.rounded_total_export, currency=doc.currency) }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{%- endif %}
|
||||
</div>
|
||||
|
||||
<!-- no-sidebar -->
|
30
erpnext/templates/includes/sales_transactions.html
Normal file
30
erpnext/templates/includes/sales_transactions.html
Normal file
@ -0,0 +1,30 @@
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
global_number_format = "{{ global_number_format }}";
|
||||
currency = "{{ currency }}";
|
||||
frappe.currency_symbols = {{ currency_symbols }};
|
||||
});
|
||||
</script>
|
||||
|
||||
{% include "templates/includes/transactions.html" %}
|
||||
|
||||
<script>
|
||||
var render = function(doc) {
|
||||
doc.grand_total_export = format_currency(doc.grand_total_export, doc.currency);
|
||||
if(!doc.status) doc.status = "";
|
||||
|
||||
$(repl('<a href="{{ page }}?name=%(name)s" class="list-group-item">\
|
||||
<div class="row">\
|
||||
<div class="col-md-6">\
|
||||
<div class="row col-md-12">%(name)s</div>\
|
||||
<div class="row col-md-12 text-muted">%(items)s</div>\
|
||||
<div class="row col-md-12">%(status)s</div>\
|
||||
</div>\
|
||||
<div class="col-md-3 text-right">%(grand_total_export)s</div>\
|
||||
<div class="col-md-3 text-right text-muted">%(creation)s</div>\
|
||||
</div>\
|
||||
</a>', doc)).appendTo($list);
|
||||
};
|
||||
</script>
|
||||
|
||||
<!-- no-sidebar -->
|
53
erpnext/templates/includes/transactions.html
Normal file
53
erpnext/templates/includes/transactions.html
Normal file
@ -0,0 +1,53 @@
|
||||
<div class="transactions-content">
|
||||
<ul class="breadcrumb">
|
||||
<li><a href="index">Home</a></li>
|
||||
<li class="active"><i class="{{ icon }} icon-fixed-width"></i> {{ title }}</li>
|
||||
</ul>
|
||||
<p id="msgprint-alert" class="alert alert-danger"
|
||||
style="display: none;"> </p>
|
||||
<div class="list-group transaction-list">
|
||||
<div class="progress progress-striped active">
|
||||
<div class="progress-bar progress-bar-info" style="width: 100%;"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<button class="btn btn-default btn-show-more hide">More</button>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
var get_transactions = function(btn) {
|
||||
frappe.call({
|
||||
method: "{{ method }}",
|
||||
args: { start: start },
|
||||
btn: btn,
|
||||
callback: function(r) {
|
||||
$list.find(".progress").remove();
|
||||
$show_more.toggleClass("hide", !(r.message && r.message.length===20));
|
||||
if(!(r.message && r.message.length)) {
|
||||
if(!$list.html().trim()) {
|
||||
$list.html("<div class='text-muted'>\
|
||||
{{ empty_list_message }}</div>");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
start += r.message.length;
|
||||
|
||||
$.each(r.message, function(i, doc) {
|
||||
render(doc);
|
||||
});
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
$(document).ready(function() {
|
||||
window.start = 0;
|
||||
window.$list = $(".transaction-list");
|
||||
window.$list.find(".list-group-item").remove();
|
||||
window.$show_more = $(".btn-show-more").on("click", function() { get_transactions(this); })
|
||||
|
||||
get_transactions();
|
||||
});
|
||||
</script>
|
||||
|
||||
<!-- no-sidebar -->
|
112
erpnext/templates/pages/address.html
Normal file
112
erpnext/templates/pages/address.html
Normal file
@ -0,0 +1,112 @@
|
||||
{% block title %} {{ title }} {% endblock %}
|
||||
|
||||
{% block header %}<h2>{{ title }}</h2>{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% macro render_fields(docfields) -%}
|
||||
{% for df in docfields -%}
|
||||
{% if df.fieldtype == "Data" -%}
|
||||
<fieldset>
|
||||
<label>{{ df.label }}</label>
|
||||
<input class="form-control" type="text" placeholder="Type {{ df.label }}"
|
||||
data-fieldname="{{ df.fieldname }}" data-fieldtype="{{ df.fieldtype }}"
|
||||
{% if doc and doc.get(df.fieldname) -%} value="{{ doc[df.fieldname] }}" {%- endif %}>
|
||||
</fieldset>
|
||||
{% elif df.fieldtype == "Check" -%}
|
||||
<fieldset class="checkbox">
|
||||
<label><input type="checkbox" data-fieldname="{{ df.fieldname }}"
|
||||
data-fieldtype="{{ df.fieldtype }}"
|
||||
{% if doc and frappe.utils.cint(doc.get(df.fieldname)) -%} checked="checked" {%- endif %}>
|
||||
{{ df.label }}</label>
|
||||
</fieldset>
|
||||
{% elif df.fieldtype in ("Select", "Link") -%}
|
||||
<fieldset>
|
||||
{% set select_options = frappe.get_list(df.options)|map(attribute="name")
|
||||
if df.fieldtype == "Link" else df.options.split("\n") %}
|
||||
<label>{{ df.label }}</label>
|
||||
<select class="form-control" data-fieldname="{{ df.fieldname }}" data-fieldtype="{{ df.fieldtype }}">
|
||||
{% for value in select_options -%}
|
||||
{% if doc and doc.get(df.fieldname) == value -%}
|
||||
<option selected="selected">{{ value }}</option>
|
||||
{% else -%}
|
||||
<option>{{ value }}</option>
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
</select>
|
||||
</fieldset>
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{%- endmacro %}
|
||||
|
||||
<div class="container content">
|
||||
<ul class="breadcrumb">
|
||||
<li><a href="index">Home</a></li>
|
||||
<li><a href="addresses">My Addresses</a></li>
|
||||
<li class="active"><i class="icon-map-marker icon-fixed-width"></i> {{ title }}</li>
|
||||
</ul>
|
||||
<h3><i class="icon-map-marker icon-fixed-width"></i> {{ title }}</h3>
|
||||
<button type="button" class="btn btn-primary pull-right" id="address-save"><i class="icon-ok"></i>
|
||||
{{ doc and "Save" or "Insert" }}</button>
|
||||
<div class="clearfix"></div>
|
||||
<hr>
|
||||
<div id="address-error" class="alert alert-danger" style="display:none"></div>
|
||||
<form autocomplete="on">
|
||||
<div class="row">
|
||||
<section class="col-md-6">
|
||||
{{ render_fields(meta.left_fields) }}
|
||||
</section>
|
||||
<section class="col-md-6">
|
||||
{{ render_fields(meta.right_fields) }}
|
||||
</section>
|
||||
</section>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
;(function() {
|
||||
console.log("yoyo");
|
||||
frappe.ready(function() {
|
||||
bind_save();
|
||||
});
|
||||
|
||||
var bind_save = function() {
|
||||
$("#address-save").on("click", function() {
|
||||
console.log("clicked!");
|
||||
|
||||
var fields = {
|
||||
name: "{{ docname or '' }}"
|
||||
};
|
||||
|
||||
$("form").find("[data-fieldname]").each(function(i, input) {
|
||||
var $input = $(input);
|
||||
var fieldname = $(input).attr("data-fieldname");
|
||||
var fieldtype = $(input).attr("data-fieldtype");
|
||||
|
||||
if(fieldtype == "Check") {
|
||||
fields[fieldname] = $input.is(":checked") ? 1 : 0;
|
||||
} else {
|
||||
fields[fieldname] = $input.val();
|
||||
}
|
||||
});
|
||||
|
||||
frappe.call({
|
||||
btn: $(this),
|
||||
type: "POST",
|
||||
method: "shopping_cart.templates.pages.address.save_address",
|
||||
args: { fields: fields, address_fieldname: get_url_arg("address_fieldname") },
|
||||
error_msg: "#address-error",
|
||||
callback: function(r) {
|
||||
if(get_url_arg("address_fieldname")) {
|
||||
window.location.href = "cart";
|
||||
} else {
|
||||
window.location.href = "address?name=" + encodeURIComponent(r.message);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
})();
|
||||
</script>
|
||||
|
||||
<!-- no-sidebar -->
|
||||
{% endblock %}
|
62
erpnext/templates/pages/address.py
Normal file
62
erpnext/templates/pages/address.py
Normal file
@ -0,0 +1,62 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import json
|
||||
|
||||
import frappe
|
||||
from erpnext.shopping_cart.cart import get_lead_or_customer, update_cart_address
|
||||
from frappe.desk.form.meta import get_meta
|
||||
|
||||
no_cache = 1
|
||||
no_sitemap = 1
|
||||
|
||||
def get_context(context):
|
||||
def _get_fields(fieldnames):
|
||||
return [frappe._dict(zip(["label", "fieldname", "fieldtype", "options"],
|
||||
[df.label, df.fieldname, df.fieldtype, df.options]))
|
||||
for df in get_meta("Address").get("fields", {"fieldname": ["in", fieldnames]})]
|
||||
|
||||
docname = doc = None
|
||||
title = "New Address"
|
||||
if frappe.form_dict.name:
|
||||
doc = frappe.get_doc("Address", frappe.form_dict.name)
|
||||
docname = doc.name
|
||||
title = doc.name
|
||||
|
||||
return {
|
||||
"doc": doc,
|
||||
"meta": frappe._dict({
|
||||
"left_fields": _get_fields(["address_title", "address_type", "address_line1", "address_line2",
|
||||
"city", "state", "pincode", "country"]),
|
||||
"right_fields": _get_fields(["email_id", "phone", "fax", "is_primary_address",
|
||||
"is_shipping_address"])
|
||||
}),
|
||||
"docname": docname,
|
||||
"title": title
|
||||
}
|
||||
|
||||
@frappe.whitelist()
|
||||
def save_address(fields, address_fieldname=None):
|
||||
party = get_lead_or_customer()
|
||||
fields = json.loads(fields)
|
||||
|
||||
if fields.get("name"):
|
||||
doc = frappe.get_doc("Address", fields.get("name"))
|
||||
else:
|
||||
doc = frappe.get_doc({"doctype": "Address", "__islocal": 1})
|
||||
|
||||
doc.update(fields)
|
||||
|
||||
party_fieldname = party.doctype.lower()
|
||||
doc.update({
|
||||
party_fieldname: party.name,
|
||||
(party_fieldname + "_name"): party.get(party_fieldname + "_name")
|
||||
})
|
||||
doc.ignore_permissions = True
|
||||
doc.save()
|
||||
|
||||
if address_fieldname:
|
||||
update_cart_address(address_fieldname, doc.name)
|
||||
|
||||
return doc.name
|
52
erpnext/templates/pages/addresses.html
Normal file
52
erpnext/templates/pages/addresses.html
Normal file
@ -0,0 +1,52 @@
|
||||
{% block title %} {{ "My Addresses" }} {% endblock %}
|
||||
|
||||
{% block header %}<h2>My Addresses</h2>{% endblock %}
|
||||
|
||||
{% block breadcrumbs %}{% include "templates/includes/breadcrumbs.html" %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="addresses-content">
|
||||
<p><a class="btn btn-default" href="address"><i class="icon-plus"> New Address</i></a></p>
|
||||
<hr>
|
||||
<div id="address-list">
|
||||
<div class="progress progress-striped active">
|
||||
<div class="progress-bar progress-bar-info" style="width: 100%;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
;(function() {
|
||||
var fetch_addresses = function() {
|
||||
frappe.call({
|
||||
method: "shopping_cart.templates.pages.addresses.get_addresses",
|
||||
callback: function(r) {
|
||||
$("#address-list .progress").remove();
|
||||
var $list = $("#address-list");
|
||||
|
||||
if(!(r.message && r.message.length)) {
|
||||
$list.html("<div class='alert'>No Addresses Found</div>");
|
||||
return;
|
||||
}
|
||||
|
||||
$.each(r.message, function(i, address) {
|
||||
address.url_name = encodeURIComponent(address.name);
|
||||
$(repl('<div> \
|
||||
<p><a href="address?name=%(url_name)s">%(name)s</a></p> \
|
||||
<p>%(display)s</p> \
|
||||
<hr> \
|
||||
</div>', address)).appendTo($list);
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
$(document).ready(function() {
|
||||
fetch_addresses();
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
|
||||
<!-- no-sidebar -->
|
||||
{% endblock %}
|
||||
|
13
erpnext/templates/pages/addresses.py
Normal file
13
erpnext/templates/pages/addresses.py
Normal file
@ -0,0 +1,13 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from erpnext.shopping_cart.cart import get_address_docs
|
||||
|
||||
no_cache = 1
|
||||
no_sitemap = 1
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_addresses():
|
||||
return get_address_docs()
|
57
erpnext/templates/pages/cart.html
Normal file
57
erpnext/templates/pages/cart.html
Normal file
@ -0,0 +1,57 @@
|
||||
{% block title %} {{ "Shopping Cart" }} {% endblock %}
|
||||
|
||||
{% block header %}<h2><i class="icon-shopping-cart"></i> Shopping Cart</h2>{% endblock %}
|
||||
|
||||
{% block script %}{% include "templates/includes/cart.js" %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="cart-content">
|
||||
<div class="progress progress-striped active">
|
||||
<div class="progress-bar progress-bar-info" style="width: 100%;"></div>
|
||||
</div>
|
||||
<div id="cart-container" class="hide">
|
||||
<p class="pull-right"><button class="btn btn-success btn-place-order" type="button">Place Order</button></p>
|
||||
<div class="clearfix"></div>
|
||||
<div id="cart-error" class="alert alert-danger" style="display: none;"></div>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-md-9 col-sm-9">
|
||||
<div class="row">
|
||||
<div class="col-md-9 col-md-offset-3"><h4>Item Details</h4></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3 col-sm-3 text-right"><h4>Qty, Amount</h4></div>
|
||||
</div><hr>
|
||||
<div id="cart-items">
|
||||
</div>
|
||||
<div id="cart-taxes">
|
||||
</div>
|
||||
<div id="cart-totals">
|
||||
</div>
|
||||
<hr>
|
||||
<div id="cart-addresses">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h4>Shipping Address</h4>
|
||||
<div id="cart-shipping-address" class="panel-group"
|
||||
data-fieldname="shipping_address_name"></div>
|
||||
<button class="btn btn-default" type="button" id="cart-add-shipping-address">
|
||||
<span class="icon icon-plus"></span> New Shipping Address</button>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h4>Billing Address</h4>
|
||||
<div id="cart-billing-address" class="panel-group"
|
||||
data-fieldname="customer_address"></div>
|
||||
<button class="btn btn-default" type="button" id="cart-add-billing-address">
|
||||
<span class="icon icon-plus"></span> New Billing Address</button>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
</div>
|
||||
<p class="pull-right"><button class="btn btn-success btn-place-order" type="button">Place Order</button></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- no-sidebar -->
|
||||
{% endblock %}
|
||||
|
7
erpnext/templates/pages/cart.py
Normal file
7
erpnext/templates/pages/cart.py
Normal file
@ -0,0 +1,7 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
no_cache = 1
|
||||
no_sitemap = 1
|
6
erpnext/templates/pages/invoice.html
Normal file
6
erpnext/templates/pages/invoice.html
Normal file
@ -0,0 +1,6 @@
|
||||
{% block title %} {{ doc.name }} {% endblock %}
|
||||
|
||||
{% block header %}<h2>{{ doc.name }}</h2>{% endblock %}
|
||||
|
||||
{% block content%}{% include "templates/includes/sale.html" %}{% endblock %}
|
||||
|
31
erpnext/templates/pages/invoice.py
Normal file
31
erpnext/templates/pages/invoice.py
Normal file
@ -0,0 +1,31 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.utils import flt, fmt_money
|
||||
from shopping_cart.templates.utils import get_transaction_context
|
||||
|
||||
no_cache = 1
|
||||
no_sitemap = 1
|
||||
|
||||
def get_context(context):
|
||||
invoice_context = frappe._dict({
|
||||
"parent_link": "invoices",
|
||||
"parent_title": "Invoices"
|
||||
})
|
||||
invoice_context.update(get_transaction_context("Sales Invoice", frappe.form_dict.name))
|
||||
modify_status(invoice_context.doc)
|
||||
return invoice_context
|
||||
|
||||
def modify_status(doc):
|
||||
doc.status = ""
|
||||
if flt(doc.outstanding_amount):
|
||||
doc.status = '<span class="label %s"><i class="icon-fixed-width %s"></i> %s</span>' % \
|
||||
("label-warning", "icon-exclamation-sign",
|
||||
_("To Pay") + " = " + fmt_money(doc.outstanding_amount, currency=doc.currency))
|
||||
else:
|
||||
doc.status = '<span class="label %s"><i class="icon-fixed-width %s"></i> %s</span>' % \
|
||||
("label-success", "icon-ok", _("Paid"))
|
||||
|
6
erpnext/templates/pages/invoices.html
Normal file
6
erpnext/templates/pages/invoices.html
Normal file
@ -0,0 +1,6 @@
|
||||
{% block title %} {{ title }} {% endblock %}
|
||||
|
||||
{% block header %}<h2>{{ title }}</h2>{% endblock %}
|
||||
|
||||
{% block content %}{% include "templates/includes/sales_transactions.html" %}{% endblock %}
|
||||
|
29
erpnext/templates/pages/invoices.py
Normal file
29
erpnext/templates/pages/invoices.py
Normal file
@ -0,0 +1,29 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from shopping_cart.templates.utils import get_currency_context
|
||||
|
||||
no_cache = 1
|
||||
no_sitemap = 1
|
||||
|
||||
def get_context(context):
|
||||
invoices_context = get_currency_context()
|
||||
invoices_context.update({
|
||||
"title": "Invoices",
|
||||
"method": "shopping_cart.templates.pages.invoices.get_invoices",
|
||||
"icon": "icon-file-text",
|
||||
"empty_list_message": "No Invoices Found",
|
||||
"page": "invoice"
|
||||
})
|
||||
return invoices_context
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_invoices(start=0):
|
||||
from shopping_cart.templates.utils import get_transaction_list
|
||||
from shopping_cart.templates.pages.invoice import modify_status
|
||||
invoices = get_transaction_list("Sales Invoice", start, ["outstanding_amount"])
|
||||
for d in invoices:
|
||||
modify_status(d)
|
||||
return invoices
|
6
erpnext/templates/pages/order.html
Normal file
6
erpnext/templates/pages/order.html
Normal file
@ -0,0 +1,6 @@
|
||||
{% block title %} {{ doc.name }} {% endblock %}
|
||||
|
||||
{% block header %}<h2>{{ doc.name }}</h2>{% endblock %}
|
||||
|
||||
{% block content%}{% include "templates/includes/sale.html" %}{% endblock %}
|
||||
|
34
erpnext/templates/pages/order.py
Normal file
34
erpnext/templates/pages/order.py
Normal file
@ -0,0 +1,34 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe import _
|
||||
from shopping_cart.templates.utils import get_transaction_context
|
||||
|
||||
no_cache = 1
|
||||
no_sitemap = 1
|
||||
|
||||
def get_context(context):
|
||||
order_context = frappe._dict({
|
||||
"parent_link": "orders",
|
||||
"parent_title": "My Orders"
|
||||
})
|
||||
|
||||
order_context.update(get_transaction_context("Sales Order", frappe.form_dict.name))
|
||||
modify_status(order_context.doc)
|
||||
return order_context
|
||||
|
||||
def modify_status(doc):
|
||||
doc.status = []
|
||||
if 0 < doc.per_billed < 100:
|
||||
doc.status.append(("label-warning", "icon-ok", _("Partially Billed")))
|
||||
elif doc.per_billed == 100:
|
||||
doc.status.append(("label-success", "icon-ok", _("Billed")))
|
||||
|
||||
if 0 < doc.per_delivered < 100:
|
||||
doc.status.append(("label-warning", "icon-truck", _("Partially Delivered")))
|
||||
elif doc.per_delivered == 100:
|
||||
doc.status.append(("label-success", "icon-truck", _("Delivered")))
|
||||
doc.status = " " + " ".join(('<span class="label %s"><i class="icon-fixed-width %s"></i> %s</span>' % s
|
||||
for s in doc.status))
|
5
erpnext/templates/pages/orders.html
Normal file
5
erpnext/templates/pages/orders.html
Normal file
@ -0,0 +1,5 @@
|
||||
{% block title %} {{ title }} {% endblock %}
|
||||
|
||||
{% block header %}<h2>{{ title }}</h2>{% endblock %}
|
||||
|
||||
{% block content %}{% include "templates/includes/sales_transactions.html" %}{% endblock %}
|
30
erpnext/templates/pages/orders.py
Normal file
30
erpnext/templates/pages/orders.py
Normal file
@ -0,0 +1,30 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from shopping_cart.templates.utils import get_currency_context, get_transaction_list
|
||||
from shopping_cart.templates.pages.order import modify_status
|
||||
|
||||
no_cache = 1
|
||||
no_sitemap = 1
|
||||
|
||||
def get_context(context):
|
||||
orders_context = get_currency_context()
|
||||
orders_context.update({
|
||||
"title": "My Orders",
|
||||
"method": "shopping_cart.templates.pages.orders.get_orders",
|
||||
"icon": "icon-list",
|
||||
"empty_list_message": "No Orders Yet",
|
||||
"page": "order",
|
||||
})
|
||||
return orders_context
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_orders(start=0):
|
||||
orders = get_transaction_list("Sales Order", start, ["per_billed", "per_delivered"])
|
||||
for d in orders:
|
||||
modify_status(d)
|
||||
|
||||
return orders
|
||||
|
6
erpnext/templates/pages/shipment.html
Normal file
6
erpnext/templates/pages/shipment.html
Normal file
@ -0,0 +1,6 @@
|
||||
{% block title %} {{ doc.name }} {% endblock %}
|
||||
|
||||
{% block header %}<h2>{{ doc.name }}</h2>{% endblock %}
|
||||
|
||||
{% block content%}{% include "templates/includes/sale.html" %}{% endblock %}
|
||||
|
17
erpnext/templates/pages/shipment.py
Normal file
17
erpnext/templates/pages/shipment.py
Normal file
@ -0,0 +1,17 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from shopping_cart.templates.utils import get_transaction_context
|
||||
|
||||
no_cache = 1
|
||||
no_sitemap = 1
|
||||
|
||||
def get_context(context):
|
||||
shipment_context = frappe._dict({
|
||||
"parent_link": "shipments",
|
||||
"parent_title": "Shipments"
|
||||
})
|
||||
shipment_context.update(get_transaction_context("Delivery Note", frappe.form_dict.name))
|
||||
return shipment_context
|
5
erpnext/templates/pages/shipments.html
Normal file
5
erpnext/templates/pages/shipments.html
Normal file
@ -0,0 +1,5 @@
|
||||
{% block title %} {{ title }} {% endblock %}
|
||||
|
||||
{% block header %}<h2>{{ title }}</h2>{% endblock %}
|
||||
|
||||
{% block content %}{% include "templates/includes/sales_transactions.html" %}{% endblock %}
|
25
erpnext/templates/pages/shipments.py
Normal file
25
erpnext/templates/pages/shipments.py
Normal file
@ -0,0 +1,25 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from shopping_cart.templates.utils import get_currency_context
|
||||
|
||||
no_cache = 1
|
||||
no_sitemap = 1
|
||||
|
||||
def get_context(context):
|
||||
shipments_context = get_currency_context()
|
||||
shipments_context.update({
|
||||
"title": "Shipments",
|
||||
"method": "shopping_cart.templates.pages.shipments.get_shipments",
|
||||
"icon": "icon-truck",
|
||||
"empty_list_message": "No Shipments Found",
|
||||
"page": "shipment"
|
||||
})
|
||||
return shipments_context
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_shipments(start=0):
|
||||
from shopping_cart.templates.utils import get_transaction_list
|
||||
return get_transaction_list("Delivery Note", start)
|
116
erpnext/templates/pages/ticket.html
Normal file
116
erpnext/templates/pages/ticket.html
Normal file
@ -0,0 +1,116 @@
|
||||
{% block title %} {{ title }} {% endblock %}
|
||||
|
||||
{% block header %}<h2><i class="icon-ticket icon-fixed-width"></i> {{ title }}</h2>{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% set status_label = {
|
||||
"Open": "label-success",
|
||||
"To Reply": "label-danger",
|
||||
"Closed": "label-default"
|
||||
} %}
|
||||
|
||||
<div class="ticket-content">
|
||||
<ul class="breadcrumb">
|
||||
<li><a href="index">Home</a></li>
|
||||
<li><a href="tickets">My Tickets</a></li>
|
||||
<li class="active"><i class="icon-ticket icon-fixed-width"></i> {{ doc.name or "" }}</li>
|
||||
</ul>
|
||||
{% if not doc -%}
|
||||
<script>ask_to_login();</script>
|
||||
{% else %}
|
||||
<hr>
|
||||
{%- if doc.status -%}
|
||||
{% if doc.status == "Waiting for Customer" -%}
|
||||
{% set status = "To Reply" %}
|
||||
{% else %}
|
||||
{% set status = doc.status %}
|
||||
{%- endif -%}
|
||||
<div class="row">
|
||||
<div class="col-md-2" style="margin-bottom: 7px;">
|
||||
<span class="label {{ status_label.get(status) or 'label-default' }}">{{ status }}</span>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<div class="row col-md-12">{{ doc.subject }}</div>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<span class="text-muted pull-right">{{ frappe.utils.formatdate(doc.creation) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<h4 class="col-xs-6">Messages</h4>
|
||||
<div class="col-xs-6">
|
||||
<button class="btn btn-sm btn-primary pull-right" id="ticket-reply">
|
||||
<i class="icon-envelope icon-fixed-width"></i> Reply</button>
|
||||
<button class="btn btn-sm btn-success pull-right hide" id="ticket-reply-send">
|
||||
<i class="icon-arrow-right icon-fixed-width"></i> Send</button>
|
||||
</div>
|
||||
</div>
|
||||
<p id="ticket-alert" class="alert alert-danger"
|
||||
style="display: none;"> </p>
|
||||
<div>
|
||||
<table class="table table-bordered table-striped" id="ticket-thread">
|
||||
<tbody>
|
||||
{%- for comm in
|
||||
(doc.get({"doctype":"Communication"})|sort(reverse=True, attribute="creation")) %}
|
||||
<tr>
|
||||
<td>
|
||||
<h5 style="text-transform: none">
|
||||
{{ comm.sender }} on {{ frappe.utils.formatdate(comm.creation) }}</h5>
|
||||
<hr>
|
||||
<p>{{ frappe.utils.is_html(comm.content) and comm.content or
|
||||
comm.content.replace("\n", "<br>")}}</p>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor -%}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{%- endif -%}
|
||||
{% endif -%}
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$("#ticket-reply").on("click", function() {
|
||||
if(!$("#ticket-reply-editor").length) {
|
||||
$('<tr id="ticket-reply-editor"><td>\
|
||||
<h5 style="text-transform: none">Reply</h5>\
|
||||
<hr>\
|
||||
<textarea rows=10 class="form-control" style="resize: vertical;"></textarea>\
|
||||
</td></tr>').prependTo($("#ticket-thread").find("tbody"));
|
||||
$("#ticket-reply").addClass("hide");
|
||||
$("#ticket-reply-send").removeClass("hide");
|
||||
}
|
||||
});
|
||||
|
||||
$("#ticket-reply-send").on("click", function() {
|
||||
var reply = $("#ticket-reply-editor").find("textarea").val().trim();
|
||||
if(!reply) {
|
||||
msgprint("Please write something in reply!");
|
||||
} else {
|
||||
frappe.call({
|
||||
type: "POST",
|
||||
method: "shopping_cart.templates.pages.ticket.add_reply",
|
||||
btn: this,
|
||||
args: { ticket: "{{ doc.name }}", message: reply },
|
||||
callback: function(r) {
|
||||
if(r.exc) {
|
||||
msgprint(r._server_messages
|
||||
? JSON.parse(r._server_messages).join("<br>")
|
||||
: "Something went wrong!");
|
||||
} else {
|
||||
window.location.reload();
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
var msgprint = function(txt) {
|
||||
if(txt) $("#ticket-alert").html(txt).toggle(true);
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- no-sidebar -->
|
||||
{% endblock %}
|
41
erpnext/templates/pages/ticket.py
Normal file
41
erpnext/templates/pages/ticket.py
Normal file
@ -0,0 +1,41 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.utils import today
|
||||
|
||||
no_cache = 1
|
||||
no_sitemap = 1
|
||||
|
||||
def get_context(context):
|
||||
doc = frappe.get_doc("Support Ticket", frappe.form_dict.name)
|
||||
if doc.raised_by == frappe.session.user:
|
||||
ticket_context = {
|
||||
"title": doc.name,
|
||||
"doc": doc
|
||||
}
|
||||
else:
|
||||
ticket_context = {"title": "Not Allowed", "doc": {}}
|
||||
|
||||
return ticket_context
|
||||
|
||||
@frappe.whitelist()
|
||||
def add_reply(ticket, message):
|
||||
if not message:
|
||||
raise frappe.throw(_("Please write something"))
|
||||
|
||||
doc = frappe.get_doc("Support Ticket", ticket)
|
||||
if doc.raised_by != frappe.session.user:
|
||||
raise frappe.throw(_("You are not allowed to reply to this ticket."), frappe.PermissionError)
|
||||
|
||||
comm = frappe.get_doc({
|
||||
"doctype":"Communication",
|
||||
"subject": doc.subject,
|
||||
"content": message,
|
||||
"sender": doc.raised_by,
|
||||
"sent_or_received": "Received"
|
||||
})
|
||||
comm.insert(ignore_permissions=True)
|
||||
|
92
erpnext/templates/pages/tickets.html
Normal file
92
erpnext/templates/pages/tickets.html
Normal file
@ -0,0 +1,92 @@
|
||||
{% block title %} {{ title }} {% endblock %}
|
||||
|
||||
{% block header %}<h2>{{ title }}</h2>{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% include "templates/includes/transactions.html" %}
|
||||
|
||||
<script>
|
||||
var status_label = {
|
||||
"Open": "label-success",
|
||||
"Waiting for Customer": "label-danger",
|
||||
"Closed": "label-default"
|
||||
}
|
||||
|
||||
var render = function(doc) {
|
||||
doc.status = doc.status.trim();
|
||||
doc.label_class = status_label[doc.status] || "label-default";
|
||||
if(doc.status==="Waiting for Customer") doc.status = "To Reply";
|
||||
|
||||
$(repl('<a href="{{ page }}?name=%(name)s" class="list-group-item">\
|
||||
<div class="row">\
|
||||
<div class="col-md-2" style="margin-bottom: 7px;"><span class="label %(label_class)s">\
|
||||
%(status)s</span></div>\
|
||||
<div class="col-md-8">\
|
||||
<div class="row col-md-12">%(name)s</div>\
|
||||
<div class="row col-md-12 text-muted">%(subject)s</div>\
|
||||
</div>\
|
||||
<div class="col-md-2 pull-right">\
|
||||
<span class="text-muted">%(creation)s</span>\
|
||||
</div>\
|
||||
</div>\
|
||||
</a>', doc)).appendTo($list);
|
||||
};
|
||||
|
||||
frappe.ready(function() {
|
||||
if(!window.$new_ticket) {
|
||||
window.$new_ticket = $('<div>\
|
||||
<button class="btn btn-primary" style="margin-bottom: 15px;" id="new-ticket">\
|
||||
<i class="icon-tag icon-fixed-width"></i> New Ticket\
|
||||
</button>\
|
||||
<button class="btn btn-success hide" style="margin-bottom: 15px;" id="new-ticket-send">\
|
||||
<i class="icon-arrow-right icon-fixed-width"></i> Send\
|
||||
</button>\
|
||||
</div>').insertBefore(".transaction-list");
|
||||
}
|
||||
|
||||
window.$new_ticket.find("#new-ticket").on("click", function() {
|
||||
$(this).addClass("hide");
|
||||
$(window.$new_ticket).find("#new-ticket-send").removeClass("hide");
|
||||
$('<div class="well" id="ticket-editor">\
|
||||
<div class="form-group"><input class="form-control" type="data"\
|
||||
placeholder="Subject" data-fieldname="subject"></div>\
|
||||
<div class="form-group"><textarea rows=10 class="form-control" \
|
||||
style="resize: vertical;" placeholder="Message" \
|
||||
data-fieldname="message"></textarea></div>\
|
||||
</div>')
|
||||
.insertAfter(window.$new_ticket);
|
||||
});
|
||||
|
||||
window.$new_ticket.find("#new-ticket-send").on("click", function() {
|
||||
var subject = $("#ticket-editor").find('[data-fieldname="subject"]').val().trim();
|
||||
var message = $("#ticket-editor").find('[data-fieldname="message"]').val().trim();
|
||||
if(!(subject && message)) {
|
||||
msgprint("Please write something in subject and message!");
|
||||
} else {
|
||||
frappe.call({
|
||||
type: "POST",
|
||||
method: "shopping_cart.templates.pages.tickets.make_new_ticket",
|
||||
btn: this,
|
||||
args: { subject: subject, message: message },
|
||||
callback: function(r) {
|
||||
if(r.exc) {
|
||||
msgprint(r._server_messages
|
||||
? JSON.parse(r._server_messages).join("<br>")
|
||||
: "Something went wrong!");
|
||||
} else {
|
||||
window.location.href = "ticket?name=" + encodeURIComponent(r.message);
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
var msgprint = function(txt) {
|
||||
if(txt) $("#msgprint-alert").html(txt).toggle(true);
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- no-sidebar -->
|
||||
{% endblock %}
|
||||
|
54
erpnext/templates/pages/tickets.py
Normal file
54
erpnext/templates/pages/tickets.py
Normal file
@ -0,0 +1,54 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe.utils import cint, formatdate
|
||||
|
||||
no_cache = 1
|
||||
no_sitemap = 1
|
||||
|
||||
def get_context(context):
|
||||
return {
|
||||
"title": "My Tickets",
|
||||
"method": "shopping_cart.templates.pages.tickets.get_tickets",
|
||||
"icon": "icon-ticket",
|
||||
"empty_list_message": "No Tickets Raised",
|
||||
"page": "ticket"
|
||||
}
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_tickets(start=0):
|
||||
tickets = frappe.db.sql("""select name, subject, status, creation
|
||||
from `tabSupport Ticket` where raised_by=%s
|
||||
order by modified desc
|
||||
limit %s, 20""", (frappe.session.user, cint(start)), as_dict=True)
|
||||
for t in tickets:
|
||||
t.creation = formatdate(t.creation)
|
||||
|
||||
return tickets
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_new_ticket(subject, message):
|
||||
if not (subject and message):
|
||||
raise frappe.throw(_("Please write something in subject and message!"))
|
||||
|
||||
ticket = frappe.get_doc({
|
||||
"doctype":"Support Ticket",
|
||||
"subject": subject,
|
||||
"raised_by": frappe.session.user,
|
||||
})
|
||||
ticket.insert(ignore_permissions=True)
|
||||
|
||||
comm = frappe.get_doc({
|
||||
"doctype":"Communication",
|
||||
"subject": subject,
|
||||
"content": message,
|
||||
"sender": frappe.session.user,
|
||||
"sent_or_received": "Received",
|
||||
"reference_doctype": "Support Ticket",
|
||||
"reference_name": ticket.name
|
||||
})
|
||||
comm.insert(ignore_permissions=True)
|
||||
|
||||
return ticket.name
|
57
erpnext/templates/pages/user.html
Normal file
57
erpnext/templates/pages/user.html
Normal file
@ -0,0 +1,57 @@
|
||||
{% block title %} {{ "My Profile" }} {% endblock %}
|
||||
|
||||
{% block header %}<h2>My Profile</h2>{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="user-content" style="max-width: 500px;">
|
||||
<ul class="breadcrumb">
|
||||
<li><a href="index">Home</a></li>
|
||||
<li class="active"><i class="icon-user icon-fixed-width"></i> My Profile</li>
|
||||
</ul>
|
||||
<div class="alert alert-warning" id="message" style="display: none;"></div>
|
||||
<form>
|
||||
<fieldset>
|
||||
<label>Full Name</label>
|
||||
<input class="form-control" type="text" id="fullname" placeholder="Your Name">
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<label>Company Name</label>
|
||||
<input class="form-control" type="text" id="company_name" placeholder="Company Name" value="{{ company_name }}">
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<label>Mobile No</label>
|
||||
<input class="form-control" type="text" id="mobile_no" placeholder="Mobile No" value="{{ mobile_no }}">
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<label>Phone</label>
|
||||
<input class="form-control" type="text" id="phone" placeholder="Phone" value="{{ phone }}">
|
||||
</fieldset>
|
||||
<button id="update_user" type="submit" class="btn btn-default">Update</button>
|
||||
</form>
|
||||
</div>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$("#fullname").val(getCookie("full_name") || "");
|
||||
$("#update_user").click(function() {
|
||||
frappe.call({
|
||||
method: "shopping_cart.templates.pages.user.update_user",
|
||||
type: "POST",
|
||||
args: {
|
||||
fullname: $("#fullname").val(),
|
||||
company_name: $("#company_name").val(),
|
||||
mobile_no: $("#mobile_no").val(),
|
||||
phone: $("#phone").val()
|
||||
},
|
||||
btn: this,
|
||||
msg: $("#message"),
|
||||
callback: function(r) {
|
||||
if(!r.exc) $("#user-full-name").html($("#fullname").val());
|
||||
}
|
||||
});
|
||||
return false;
|
||||
})
|
||||
})
|
||||
</script>
|
||||
<!-- no-sidebar -->
|
||||
{% endblock %}
|
||||
|
40
erpnext/templates/pages/user.py
Normal file
40
erpnext/templates/pages/user.py
Normal file
@ -0,0 +1,40 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.utils import cstr
|
||||
from erpnext.shopping_cart.cart import get_lead_or_customer
|
||||
|
||||
no_cache = 1
|
||||
no_sitemap = 1
|
||||
|
||||
def get_context(context):
|
||||
party = get_lead_or_customer()
|
||||
if party.doctype == "Lead":
|
||||
mobile_no = party.mobile_no
|
||||
phone = party.phone
|
||||
else:
|
||||
mobile_no, phone = frappe.db.get_value("Contact", {"email_id": frappe.session.user,
|
||||
"customer": party.name}, ["mobile_no", "phone"])
|
||||
|
||||
return {
|
||||
"company_name": cstr(party.customer_name if party.doctype == "Customer" else party.company_name),
|
||||
"mobile_no": cstr(mobile_no),
|
||||
"phone": cstr(phone)
|
||||
}
|
||||
|
||||
@frappe.whitelist()
|
||||
def update_user(fullname, password=None, company_name=None, mobile_no=None, phone=None):
|
||||
from erpnext.shopping_cart.cart import update_party
|
||||
update_party(fullname, company_name, mobile_no, phone)
|
||||
|
||||
if not fullname:
|
||||
return _("Name is required")
|
||||
|
||||
frappe.db.set_value("User", frappe.session.user, "first_name", fullname)
|
||||
frappe.local.cookie_manager.set_cookie("full_name", fullname)
|
||||
|
||||
return _("Updated")
|
||||
|
@ -2,7 +2,10 @@
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
|
||||
import frappe, json
|
||||
from frappe import _
|
||||
from frappe.utils import cint, formatdate
|
||||
|
||||
@frappe.whitelist(allow_guest=True)
|
||||
def send_message(subject="Website Query", message="", sender="", status="Open"):
|
||||
@ -18,3 +21,47 @@ def send_message(subject="Website Query", message="", sender="", status="Open"):
|
||||
"sent_or_received": "Received"
|
||||
})
|
||||
comm.insert(ignore_permissions=True)
|
||||
|
||||
def get_transaction_list(doctype, start, additional_fields=None):
|
||||
# find customer id
|
||||
customer = frappe.db.get_value("Contact", {"email_id": frappe.session.user},
|
||||
"customer")
|
||||
|
||||
if customer:
|
||||
if additional_fields:
|
||||
additional_fields = ", " + ", ".join(("`%s`" % f for f in additional_fields))
|
||||
else:
|
||||
additional_fields = ""
|
||||
|
||||
transactions = frappe.db.sql("""select name, creation, currency, grand_total_export
|
||||
%s
|
||||
from `tab%s` where customer=%s and docstatus=1
|
||||
order by creation desc
|
||||
limit %s, 20""" % (additional_fields, doctype, "%s", "%s"),
|
||||
(customer, cint(start)), as_dict=True)
|
||||
for doc in transactions:
|
||||
items = frappe.db.sql_list("""select item_name
|
||||
from `tab%s Item` where parent=%s limit 6""" % (doctype, "%s"), doc.name)
|
||||
doc.items = ", ".join(items[:5]) + ("..." if (len(items) > 5) else "")
|
||||
doc.creation = formatdate(doc.creation)
|
||||
return transactions
|
||||
else:
|
||||
return []
|
||||
|
||||
def get_currency_context():
|
||||
return {
|
||||
"global_number_format": frappe.db.get_default("number_format") or "#,###.##",
|
||||
"currency": frappe.db.get_default("currency"),
|
||||
"currency_symbols": json.dumps(dict(frappe.db.sql("""select name, symbol
|
||||
from tabCurrency where ifnull(enabled,0)=1""")))
|
||||
}
|
||||
|
||||
def get_transaction_context(doctype, name):
|
||||
customer = frappe.db.get_value("Contact", {"email_id": frappe.session.user},
|
||||
"customer")
|
||||
|
||||
doc = frappe.get_doc(doctype, name)
|
||||
if doc.customer != customer:
|
||||
return { "doc": frappe._dict({"name": _("Not Allowed")}) }
|
||||
else:
|
||||
return { "doc": doc }
|
||||
|
@ -3329,3 +3329,49 @@ website page link,الموقع رابط الصفحة
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: مركز التكلفة إلزامي القطعة ل{2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} غير موجود في جدول تفاصيل الفاتورة
|
||||
(Half Day),(نصف يوم)
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> إضافة / تحرير < / A>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> إضافة / تحرير < / A>"
|
||||
Billed,توصف
|
||||
Company,شركة
|
||||
Currency is required for Price List {0},مطلوب العملة ل قائمة الأسعار {0}
|
||||
Default Customer Group,المجموعة الافتراضية العملاء
|
||||
Default Territory,الافتراضي الإقليم
|
||||
Delivered,تسليم
|
||||
Enable Shopping Cart,تمكين سلة التسوق
|
||||
Go ahead and add something to your cart.,المضي قدما وإضافة شيء إلى عربة التسوق.
|
||||
Hey! Go ahead and add an address,احترس المضي قدما وإضافة عنوان
|
||||
Invalid Billing Address,عنوان الفواتير غير صالحة
|
||||
Invalid Shipping Address,العنوان شحن غير صالحة
|
||||
Missing Currency Exchange Rates for {0},أسعار صرف العملات في عداد المفقودين ل {0}
|
||||
Name is required,مطلوب اسم
|
||||
Not Allowed,غير مسموح
|
||||
Paid,مدفوع
|
||||
Partially Billed,وصفت جزئيا
|
||||
Partially Delivered,سلمت جزئيا
|
||||
Please specify a Price List which is valid for Territory,الرجاء تحديد قائمة الأسعار التي هي صالحة للأراضي
|
||||
Please specify currency in Company,يرجى تحديد العملة في شركة
|
||||
Please write something,يرجى كتابة شيء
|
||||
Please write something in subject and message!,يرجى كتابة شيء في الموضوع و رسالة !
|
||||
Price List,قائمة الأسعار
|
||||
Price List not configured.,قائمة السعر لم يتم تكوين.
|
||||
Quotation Series,سلسلة الاقتباس
|
||||
Shipping Rule,الشحن القاعدة
|
||||
Shopping Cart,سلة التسوق
|
||||
Shopping Cart Price List,عربة التسوق قائمة الأسعار
|
||||
Shopping Cart Price Lists,سلة التسوق قوائم الأسعار
|
||||
Shopping Cart Settings,إعدادات سلة التسوق
|
||||
Shopping Cart Shipping Rule,سلة التسوق الشحن القاعدة
|
||||
Shopping Cart Shipping Rules,سلة التسوق قواعد الشحن
|
||||
Shopping Cart Taxes and Charges Master,التسوق سلة الضرائب والرسوم ماجستير
|
||||
Shopping Cart Taxes and Charges Masters,التسوق سلة الضرائب والرسوم الماجستير
|
||||
Something went wrong!,ذهب شيئا خاطئا!
|
||||
Something went wrong.,ذهب شيئا خاطئا.
|
||||
Tax Master,ماستر الضرائب
|
||||
To Pay,على الدفع
|
||||
Updated,تحديث
|
||||
You are not allowed to reply to this ticket.,لا يسمح لك للرد على هذه التذكرة .
|
||||
You need to be logged in to view your cart.,تحتاج إلى تسجيل الدخول لمشاهدة عربة التسوق.
|
||||
You need to enable Shopping Cart,تحتاج إلى تمكين سلة التسوق
|
||||
{0} cannot be purchased using Shopping Cart,{0} لا يمكن شراؤها باستخدام عربة التسوق
|
||||
{0} is required,{0} مطلوب
|
||||
{0} {1} has a common territory {2},{0} {1} لديه أراضي مشتركة {2}
|
||||
|
|
@ -3460,3 +3460,51 @@ website page link,Website-Link
|
||||
{0} {1} status is Unstopped,{0} {1} Status unstopped
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: Kostenstelle ist obligatorisch für Artikel {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} nicht in der Rechnungs Details-Tabelle gefunden
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> Hinzufügen / Bearbeiten </ a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> Hinzufügen / Bearbeiten </ a>"
|
||||
Billed,Abgerechnet
|
||||
Company,Unternehmen
|
||||
Currency is required for Price List {0},Die Währung ist für Preisliste erforderlich {0}
|
||||
Default Customer Group,Standardkundengruppe
|
||||
Default Territory,Standardregion
|
||||
Default settings for Shopping Cart,Standardeinstellungen für Einkaufswagen
|
||||
Delivered,Geliefert
|
||||
Enable Shopping Cart,Einkaufswagen aktivieren
|
||||
Go ahead and add something to your cart.,Gehen Sie voran und fügen Sie etwas in Ihren Warenkorb.
|
||||
Hey! Go ahead and add an address,Hallo! Gehen Sie voran und fügen Sie eine Adresse
|
||||
Invalid Billing Address,Ungültige Rechnungsadresse
|
||||
Invalid Shipping Address,Falsche Lieferadresse
|
||||
Missing Currency Exchange Rates for {0},Fehlende Wechselkurse für {0}
|
||||
Name is required,Name ist erforderlich
|
||||
Not Allowed,Nicht erlaubt
|
||||
Paid,bezahlt
|
||||
Partially Billed,teilweise Angekündigt
|
||||
Partially Delivered,teilweise Lieferung
|
||||
Please specify a Price List which is valid for Territory,"Legen Sie eine Preisliste fest, die für die Region gültig ist"
|
||||
Please specify currency in Company,Geben Sie die Währung im Unternehmen an
|
||||
Please write something,Bitte schreiben Sie etwas
|
||||
Please write something in subject and message!,Bitte schreiben Sie etwas in Betreff und die Nachricht !
|
||||
Price List,Preisliste
|
||||
Price List not configured.,Preisliste nicht konfiguriert.
|
||||
Quotation Series,Angebotsserie
|
||||
Shipping Rule,Versandregel
|
||||
Shopping Cart,Einkaufswagen
|
||||
Shopping Cart Price List,Einkaufswagen Preisliste
|
||||
Shopping Cart Price Lists,Einkaufswagen Preislisten
|
||||
Shopping Cart Settings,Einkaufswageneinstellungen
|
||||
Shopping Cart Shipping Rule,Einkaufswagen-Versandregel
|
||||
Shopping Cart Shipping Rules,Einkaufswagen-Versandregeln
|
||||
Shopping Cart Taxes and Charges Master,Einkaufswagen-Steuern und Abgabenstamm
|
||||
Shopping Cart Taxes and Charges Masters,Einkaufswagen-Steuern und Abgabenstämme
|
||||
Something went wrong!,Etwas ist schiefgelaufen!
|
||||
Something went wrong.,Es gab ein Problem.
|
||||
Tax Master,Steuerstamm
|
||||
To Pay,To Pay
|
||||
Updated,Aktualisiert
|
||||
Website Manager,
|
||||
You are not allowed to reply to this ticket.,"Sie sind nicht berechtigt, auf diesem Ticket antworten ."
|
||||
You need to be logged in to view your cart.,"Sie müssen angemeldet sein, um Ihren Warenkorb zu sehen."
|
||||
You need to enable Shopping Cart,Sie benötigen den Einkaufswagen zu ermöglichen
|
||||
{0} cannot be purchased using Shopping Cart,{0} kann nicht mit Einkaufswagen erworben werden
|
||||
{0} is required,{0} ist erforderlich
|
||||
{0} {1} has a common territory {2},{0} {1} hat einen gemeinsamen Territorium {2}
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,Ιστοσελίδα link της σελίδας
|
||||
{0} {1} status is Unstopped,{0} {1} η κατάσταση είναι ανεμπόδιστη
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: Κέντρο Κόστους είναι υποχρεωτική για τη θέση {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} δεν βρέθηκε στον πίνακα Στοιχεία τιμολογίου
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> Προσθήκη / Επεξεργασία < / a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> Προσθήκη / Επεξεργασία < / a>"
|
||||
Billed,Χρεώνεται
|
||||
Company,Εταιρεία
|
||||
Currency is required for Price List {0},Νόμισμα απαιτείται για Τιμοκατάλογος {0}
|
||||
Default Customer Group,Προεπιλογή Ομάδα πελατών
|
||||
Default Territory,Έδαφος Προεπιλογή
|
||||
Delivered,Δημοσιεύθηκε
|
||||
Enable Shopping Cart,Ενεργοποίηση Καλάθι Αγορών
|
||||
Go ahead and add something to your cart.,Προχωρήστε και να προσθέσω κάτι στο καλάθι σας.
|
||||
Hey! Go ahead and add an address,Γειά! Προχωρήστε και να προσθέσετε μια διεύθυνση
|
||||
Invalid Billing Address,Μη έγκυρη διεύθυνση χρέωσης
|
||||
Invalid Shipping Address,Μη έγκυρη διεύθυνση αποστολής
|
||||
Missing Currency Exchange Rates for {0},Λείπει Τιμές συναλλάγματος για {0}
|
||||
Name is required,Όνομα απαιτείται
|
||||
Not Allowed,δεν επιτρέπονται κατοικίδια
|
||||
Paid,Αμειβόμενος
|
||||
Partially Billed,μερικώς Billed
|
||||
Partially Delivered,μερικώς Δημοσιεύθηκε
|
||||
Please specify a Price List which is valid for Territory,Παρακαλείστε να προσδιορίσετε μια λίστα τιμών που ισχύει για Επικράτεια
|
||||
Please specify currency in Company,Παρακαλείστε να προσδιορίσετε το νόμισμα στην εταιρεία
|
||||
Please write something,Παρακαλώ γράψτε κάτι
|
||||
Please write something in subject and message!,Παρακαλώ γράψτε κάτι στο θέμα και το μήνυμα !
|
||||
Price List,Τιμοκατάλογος
|
||||
Price List not configured.,Τιμοκατάλογος δεν έχει ρυθμιστεί.
|
||||
Quotation Series,Σειρά Προσφοράς
|
||||
Shipping Rule,Αποστολές Κανόνας
|
||||
Shopping Cart,Καλάθι Αγορών
|
||||
Shopping Cart Price List,Shopping Τιμοκατάλογος Καλάθι
|
||||
Shopping Cart Price Lists,Τιμοκατάλογοι Καλάθι Αγορών
|
||||
Shopping Cart Settings,Ρυθμίσεις Καλάθι Αγορών
|
||||
Shopping Cart Shipping Rule,Καλάθι Αγορών αποστολή Κανόνας
|
||||
Shopping Cart Shipping Rules,Κανόνες Shipping Καλάθι Αγορών
|
||||
Shopping Cart Taxes and Charges Master,Φόροι Καλάθι και Χρεώσεις Δάσκαλος
|
||||
Shopping Cart Taxes and Charges Masters,Φόροι Καλάθι και Χρεώσεις Masters
|
||||
Something went wrong!,Κάτι πήγε στραβά!
|
||||
Something went wrong.,Κάτι πήγε στραβά.
|
||||
Tax Master,Δάσκαλος φόρου
|
||||
To Pay,να πληρώσει
|
||||
Updated,Ενημέρωση
|
||||
You are not allowed to reply to this ticket.,Δεν επιτρέπεται να απαντήσετε σε αυτό το εισιτήριο .
|
||||
You need to be logged in to view your cart.,Θα πρέπει να είστε συνδεδεμένοι για να δείτε το καλάθι σας.
|
||||
You need to enable Shopping Cart,Χρειάζεται να ενεργοποιήσετε Καλάθι Αγορών
|
||||
{0} cannot be purchased using Shopping Cart,{0} δεν μπορούν να αγοραστούν χρησιμοποιώντας Καλάθι Αγορών
|
||||
{0} is required,{0} απαιτείται
|
||||
{0} {1} has a common territory {2},{0} {1} έχει ένα κοινό έδαφος {2}
|
||||
|
|
@ -3335,3 +3335,49 @@ website page link,el vínculo web
|
||||
{0} {1} status is Unstopped,{0} {1} Estado es destapados
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: Centro de Costo es obligatorio para el punto {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} no se encuentra en la factura Detalles mesa
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer grupo""> Añadir / Editar < / a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> Añadir / Editar < / a>"
|
||||
Billed,Anunciado
|
||||
Company,Empresa
|
||||
Currency is required for Price List {0},Se requiere de divisas para el precio de lista {0}
|
||||
Default Customer Group,Grupo predeterminado Cliente
|
||||
Default Territory,Territorio predeterminado
|
||||
Delivered,liberado
|
||||
Enable Shopping Cart,Habilitar Compras
|
||||
Go ahead and add something to your cart.,Seguir adelante y añadir algo a su carrito.
|
||||
Hey! Go ahead and add an address,¡Hey! Seguir adelante y añadir una dirección
|
||||
Invalid Billing Address,No válida dirección de facturación
|
||||
Invalid Shipping Address,Dirección no válida de envío
|
||||
Missing Currency Exchange Rates for {0},Missing Tipo de Cambio para {0}
|
||||
Name is required,El nombre es necesario
|
||||
Not Allowed,No se permite
|
||||
Paid,pagado
|
||||
Partially Billed,Parcialmente Anunciado
|
||||
Partially Delivered,Parcialmente Entregado
|
||||
Please specify a Price List which is valid for Territory,"Por favor, especifique una lista de precios que es válido para el territorio"
|
||||
Please specify currency in Company,"Por favor, especifique la moneda en la empresa"
|
||||
Please write something,"Por favor, escribir algo"
|
||||
Please write something in subject and message!,"Por favor, escriba algo en asunto y el mensaje !"
|
||||
Price List,Lista de Precios
|
||||
Price List not configured.,Lista de precios no está configurado.
|
||||
Quotation Series,Serie Cotización
|
||||
Shipping Rule,Regla de envío
|
||||
Shopping Cart,Cesta de la compra
|
||||
Shopping Cart Price List,Cesta de la compra Precio de lista
|
||||
Shopping Cart Price Lists,Compras Listas de precios
|
||||
Shopping Cart Settings,Compras Ajustes
|
||||
Shopping Cart Shipping Rule,Compras Regla de envío
|
||||
Shopping Cart Shipping Rules,Compras Reglas de Envío
|
||||
Shopping Cart Taxes and Charges Master,Compras Impuestos y Cargos Maestro
|
||||
Shopping Cart Taxes and Charges Masters,Carrito impuestos y las cargas Masters
|
||||
Something went wrong!,¡Algo salió mal!
|
||||
Something went wrong.,Algo salió mal.
|
||||
Tax Master,Maestro de Impuestos
|
||||
To Pay,Pagar
|
||||
Updated,actualizado
|
||||
You are not allowed to reply to this ticket.,No se le permite responder a este boleto.
|
||||
You need to be logged in to view your cart.,Tienes que estar registrado para ver su carrito.
|
||||
You need to enable Shopping Cart,Necesita habilitar Compras
|
||||
{0} cannot be purchased using Shopping Cart,{0} no puede ser comprado usando Compras
|
||||
{0} is required,{0} es necesario
|
||||
{0} {1} has a common territory {2},{0} {1} tiene un territorio común {2}
|
||||
|
|
@ -3330,3 +3330,49 @@ website page link,Lien vers page web
|
||||
{0} {1} status is Unstopped,Vous ne pouvez pas reporter le numéro de rangée supérieure ou égale à numéro de la ligne actuelle pour ce type de charge
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: Centre de coûts est obligatoire pour objet {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} ne trouve pas dans la table Détails de la facture
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> Ajouter / Modifier < / a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> Ajouter / Modifier < / a>"
|
||||
Billed,Facturé
|
||||
Company,Entreprise
|
||||
Currency is required for Price List {0},{0} est obligatoire
|
||||
Default Customer Group,Groupe de clients par défaut
|
||||
Default Territory,Territoire défaut
|
||||
Delivered,Livré
|
||||
Enable Shopping Cart,Activer Panier
|
||||
Go ahead and add something to your cart.,Allez-y et ajouter quelque chose à votre panier.
|
||||
Hey! Go ahead and add an address,Hé ! Allez-y et ajoutez une adresse
|
||||
Invalid Billing Address,"Pour exécuter un test ajouter le nom du module dans la route après '{0}' . Par exemple, {1}"
|
||||
Invalid Shipping Address,effondrement
|
||||
Missing Currency Exchange Rates for {0},Vider le cache
|
||||
Name is required,Le nom est obligatoire
|
||||
Not Allowed,"Groupe ajoutée, rafraîchissant ..."
|
||||
Paid,payé
|
||||
Partially Billed,partiellement Facturé
|
||||
Partially Delivered,Livré partiellement
|
||||
Please specify a Price List which is valid for Territory,S'il vous plaît spécifier une liste de prix qui est valable pour le territoire
|
||||
Please specify currency in Company,S'il vous plaît préciser la devise dans la société
|
||||
Please write something,S'il vous plaît écrire quelque chose
|
||||
Please write something in subject and message!,S'il vous plaît écrire quelque chose dans le thème et le message !
|
||||
Price List,Liste des Prix
|
||||
Price List not configured.,Liste des prix non configuré.
|
||||
Quotation Series,Série de devis
|
||||
Shipping Rule,Livraison règle
|
||||
Shopping Cart,Panier
|
||||
Shopping Cart Price List,Panier Liste des prix
|
||||
Shopping Cart Price Lists,Panier Liste des prix
|
||||
Shopping Cart Settings,Panier Paramètres
|
||||
Shopping Cart Shipping Rule,Panier Livraison règle
|
||||
Shopping Cart Shipping Rules,Panier Règles d'expédition
|
||||
Shopping Cart Taxes and Charges Master,Panier taxes et redevances Maître
|
||||
Shopping Cart Taxes and Charges Masters,Panier Taxes et frais de maîtrise
|
||||
Something went wrong!,Quelque chose s'est mal passé!
|
||||
Something went wrong.,Une erreur est survenue.
|
||||
Tax Master,Maître d'impôt
|
||||
To Pay,à payer
|
||||
Updated,Mise à jour
|
||||
You are not allowed to reply to this ticket.,Vous n'êtes pas autorisé à répondre à ce billet .
|
||||
You need to be logged in to view your cart.,Vous devez être connecté pour voir votre panier.
|
||||
You need to enable Shopping Cart,Poster n'existe pas . S'il vous plaît ajoutez poste !
|
||||
{0} cannot be purchased using Shopping Cart,Envoyer permanence {0} ?
|
||||
{0} is required,{0} ne peut pas être acheté en utilisant Panier
|
||||
{0} {1} has a common territory {2},Alternative lien de téléchargement
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,वेबसाइट के पेज लिंक
|
||||
{0} {1} status is Unstopped,{0} {1} स्थिति unstopped है
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: लागत केंद्र मद के लिए अनिवार्य है {2}
|
||||
{0}: {1} not found in Invoice Details table,{0} {1} चालान विवरण तालिका में नहीं मिला
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> जोड़ें / संपादित करें </ a >"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> जोड़ें / संपादित करें </ a >"
|
||||
Billed,का बिल
|
||||
Company,कंपनी
|
||||
Currency is required for Price List {0},मुद्रा मूल्य सूची के लिए आवश्यक है {0}
|
||||
Default Customer Group,डिफ़ॉल्ट ग्राहक समूह
|
||||
Default Territory,Default टेरिटरी
|
||||
Delivered,दिया गया
|
||||
Enable Shopping Cart,शॉपिंग कार्ट सक्षम करें
|
||||
Go ahead and add something to your cart.,आगे बढ़ो और अपनी गाड़ी को कुछ जोड़ सकते.
|
||||
Hey! Go ahead and add an address,अरे! आगे बढ़ो और एक पते जोड़
|
||||
Invalid Billing Address,अवैध बिलिंग पता
|
||||
Invalid Shipping Address,अवैध शिपिंग पता
|
||||
Missing Currency Exchange Rates for {0},के लिए मुद्रा विनिमय दरें गुम {0}
|
||||
Name is required,नाम आवश्यक है
|
||||
Not Allowed,अनुमति नहीं
|
||||
Paid,प्रदत्त
|
||||
Partially Billed,आंशिक रूप से बिल
|
||||
Partially Delivered,आंशिक रूप से वितरित
|
||||
Please specify a Price List which is valid for Territory,राज्य क्षेत्र के लिए मान्य है जो एक मूल्य सूची निर्दिष्ट करें
|
||||
Please specify currency in Company,कंपनी में मुद्रा निर्दिष्ट करें
|
||||
Please write something,कुछ लिखें
|
||||
Please write something in subject and message!,विषय और संदेश में कुछ लिखने के लिए धन्यवाद !
|
||||
Price List,कीमत सूची
|
||||
Price List not configured.,मूल्य सूची कॉन्फ़िगर नहीं.
|
||||
Quotation Series,कोटेशन सीरीज
|
||||
Shipping Rule,नौवहन नियम
|
||||
Shopping Cart,खरीदारी की टोकरी
|
||||
Shopping Cart Price List,शॉपिंग कार्ट में मूल्य सूची
|
||||
Shopping Cart Price Lists,शॉपिंग कार्ट में मूल्य सूची
|
||||
Shopping Cart Settings,शॉपिंग कार्ट सेटिंग्स
|
||||
Shopping Cart Shipping Rule,शॉपिंग कार्ट शिपिंग नियम
|
||||
Shopping Cart Shipping Rules,शॉपिंग कार्ट शिपिंग नियम
|
||||
Shopping Cart Taxes and Charges Master,शॉपिंग कार्ट में करों और शुल्कों मास्टर
|
||||
Shopping Cart Taxes and Charges Masters,शॉपिंग कार्ट में करों और शुल्कों मास्टर्स
|
||||
Something went wrong!,कुछ गलत हो गया!
|
||||
Something went wrong.,कुछ गलत हो गया.
|
||||
Tax Master,टैक्स मास्टर
|
||||
To Pay,भुगतान करने के लिए
|
||||
Updated,अद्यतित
|
||||
You are not allowed to reply to this ticket.,आप इस टिकट का उत्तर देने की अनुमति नहीं है .
|
||||
You need to be logged in to view your cart.,आप अपनी गाड़ी को देखने के लिए लॉग इन करना होगा.
|
||||
You need to enable Shopping Cart,आप शॉपिंग कार्ट में सक्रिय करने की जरूरत
|
||||
{0} cannot be purchased using Shopping Cart,{0} शॉपिंग कार्ट का उपयोग कर खरीदा नहीं जा सकता
|
||||
{0} is required,{0} के लिए आवश्यक है
|
||||
{0} {1} has a common territory {2},{0} {1} एक सामान्य क्षेत्र है {2}
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,web stranica vode
|
||||
{0} {1} status is Unstopped,{0} {1} status Unstopped
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: troška je obvezno za točku {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} nije pronađen u Pojedinosti dostavnice stolu
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> Dodaj / Uredi < />"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> Dodaj / Uredi < />"
|
||||
Billed,Naplaćeno
|
||||
Company,Društvo
|
||||
Currency is required for Price List {0},Valuta je potrebno za Cjenika {0}
|
||||
Default Customer Group,Zadani Korisnik Grupa
|
||||
Default Territory,Zadani Regija
|
||||
Delivered,Isporučena
|
||||
Enable Shopping Cart,Omogućite Košarica
|
||||
Go ahead and add something to your cart.,Ići naprijed i dodati nešto u košaricu.
|
||||
Hey! Go ahead and add an address,Hej! Ići naprijed i dodati adresu
|
||||
Invalid Billing Address,Pogrešna adresa naplate
|
||||
Invalid Shipping Address,Invalid Dostava Adresa
|
||||
Missing Currency Exchange Rates for {0},Nedostaje Tečajne stope za {0}
|
||||
Name is required,Ime je potrebno
|
||||
Not Allowed,Not Allowed
|
||||
Paid,plaćen
|
||||
Partially Billed,djelomično Naplaćeno
|
||||
Partially Delivered,djelomično Isporučeno
|
||||
Please specify a Price List which is valid for Territory,Navedite cjenik koji vrijedi za teritoriju
|
||||
Please specify currency in Company,Navedite valutu u Društvu
|
||||
Please write something,Molimo napisati nešto
|
||||
Please write something in subject and message!,Molimo napisati nešto u temi i poruke !
|
||||
Price List,Cjenik
|
||||
Price List not configured.,Popis Cijena nije konfiguriran.
|
||||
Quotation Series,Ponuda Serija
|
||||
Shipping Rule,Dostava Pravilo
|
||||
Shopping Cart,Košarica
|
||||
Shopping Cart Price List,Košarica Cjenik
|
||||
Shopping Cart Price Lists,Košarica cjenike
|
||||
Shopping Cart Settings,Košarica Postavke
|
||||
Shopping Cart Shipping Rule,Košarica Dostava Pravilo
|
||||
Shopping Cart Shipping Rules,Košarica Dostava Pravila
|
||||
Shopping Cart Taxes and Charges Master,Košarica poreze i troškove Master
|
||||
Shopping Cart Taxes and Charges Masters,Košarica Porezi i naknade Masters
|
||||
Something went wrong!,Nešto je pošlo po krivu!
|
||||
Something went wrong.,Nešto je pošlo po zlu.
|
||||
Tax Master,Porezna Master
|
||||
To Pay,platiti
|
||||
Updated,Obnovljeno
|
||||
You are not allowed to reply to this ticket.,Vi ne smijete odgovoriti na ovu kartu.
|
||||
You need to be logged in to view your cart.,Morate biti prijavljeni da biste vidjeli svoju košaricu.
|
||||
You need to enable Shopping Cart,Morate omogućiti Košarica
|
||||
{0} cannot be purchased using Shopping Cart,{0} ne može se kupiti pomoću Košarica
|
||||
{0} is required,{0} je potrebno
|
||||
{0} {1} has a common territory {2},{0} {1} ima zajednički teritorij {2}
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,tautan halaman situs web
|
||||
{0} {1} status is Unstopped,{0} {1} status unstopped
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: Biaya Pusat adalah wajib untuk Item {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} tidak ditemukan dalam Faktur Rincian table
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> Add / Edit </ a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> Tambah / Edit </ a>"
|
||||
Billed,Ditagih
|
||||
Company,Perusahaan
|
||||
Currency is required for Price List {0},Mata Uang diperlukan untuk Daftar Harga {0}
|
||||
Default Customer Group,Bawaan Pelanggan Grup
|
||||
Default Territory,Wilayah standar
|
||||
Delivered,Disampaikan
|
||||
Enable Shopping Cart,Aktifkan Keranjang Belanja
|
||||
Go ahead and add something to your cart.,Pergi ke depan dan menambahkan sesuatu ke keranjang Anda.
|
||||
Hey! Go ahead and add an address,Hei! Pergi ke depan dan menambahkan alamat
|
||||
Invalid Billing Address,Alamat Penagihan valid
|
||||
Invalid Shipping Address,Alamat Pengiriman valid
|
||||
Missing Currency Exchange Rates for {0},Hilang Kurs mata uang Tarif untuk {0}
|
||||
Name is required,Nama dibutuhkan
|
||||
Not Allowed,Tidak Diizinkan
|
||||
Paid,Terbayar
|
||||
Partially Billed,Sebagian Ditagih
|
||||
Partially Delivered,Sebagian Disampaikan
|
||||
Please specify a Price List which is valid for Territory,Tentukan Daftar Harga yang berlaku untuk Wilayah
|
||||
Please specify currency in Company,Silakan tentukan mata uang di Perusahaan
|
||||
Please write something,Silahkan menulis sesuatu
|
||||
Please write something in subject and message!,Silahkan menulis sesuatu dalam subjek dan pesan!
|
||||
Price List,Daftar Harga
|
||||
Price List not configured.,Daftar Harga belum dikonfigurasi.
|
||||
Quotation Series,Quotation Series
|
||||
Shipping Rule,Aturan Pengiriman
|
||||
Shopping Cart,Daftar Belanja
|
||||
Shopping Cart Price List,Daftar Belanja Daftar Harga
|
||||
Shopping Cart Price Lists,Daftar Harga Daftar Belanja
|
||||
Shopping Cart Settings,Pengaturan Keranjang Belanja
|
||||
Shopping Cart Shipping Rule,Belanja Pengiriman Rule
|
||||
Shopping Cart Shipping Rules,Daftar Belanja Pengiriman Aturan
|
||||
Shopping Cart Taxes and Charges Master,Pajak Keranjang Belanja dan Biaya Guru
|
||||
Shopping Cart Taxes and Charges Masters,Daftar Belanja Pajak dan Biaya Masters
|
||||
Something went wrong!,Ada yang tidak beres!
|
||||
Something went wrong.,Ada Sesuatu yang tidak beres.
|
||||
Tax Master,Guru Pajak
|
||||
To Pay,Untuk Bayar
|
||||
Updated,Diperbarui
|
||||
You are not allowed to reply to this ticket.,Anda tidak diizinkan untuk membalas tiket ini.
|
||||
You need to be logged in to view your cart.,Anda harus login untuk melihat keranjang Anda.
|
||||
You need to enable Shopping Cart,Anda harus mengaktifkan Keranjang Belanja
|
||||
{0} cannot be purchased using Shopping Cart,{0} tidak dapat dibeli dengan menggunakan Keranjang Belanja
|
||||
{0} is required,{0} diperlukan
|
||||
{0} {1} has a common territory {2},{0} {1} memiliki wilayah umum {2}
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,sito web link alla pagina
|
||||
{0} {1} status is Unstopped,{0} {1} stato è unstopped
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: centro di costo è obbligatoria per la voce {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} non trovato in fattura tabella Dettagli
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> Aggiungi / Modifica < / a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> Aggiungi / Modifica < / a>"
|
||||
Billed,Addebbitato
|
||||
Company,Azienda
|
||||
Currency is required for Price List {0},È richiesto di valuta per il listino prezzi {0}
|
||||
Default Customer Group,Gruppo Clienti Predefinito
|
||||
Default Territory,Territorio Predefinito
|
||||
Delivered,Consegnato
|
||||
Enable Shopping Cart,Abilita Carello Acquisti
|
||||
Go ahead and add something to your cart.,Vai avanti e aggiungere qualcosa al tuo carrello.
|
||||
Hey! Go ahead and add an address,Ehi! Vai avanti e aggiungere un indirizzo
|
||||
Invalid Billing Address,Valido indirizzo di fatturazione
|
||||
Invalid Shipping Address,Valido Indirizzo di spedizione
|
||||
Missing Currency Exchange Rates for {0},Manca valuta Tassi di cambio {0}
|
||||
Name is required,Il nome è obbligatorio
|
||||
Not Allowed,non sono ammessi
|
||||
Paid,pagato
|
||||
Partially Billed,parzialmente Fatturato
|
||||
Partially Delivered,parzialmente Consegnato
|
||||
Please specify a Price List which is valid for Territory,Si prega di specificare una lista di prezzi è valido per il Territorio
|
||||
Please specify currency in Company,Si prega di specificare la valuta in Azienda
|
||||
Please write something,Si prega di scrivere qualcosa
|
||||
Please write something in subject and message!,Si prega di scrivere qualcosa in oggetto e il messaggio !
|
||||
Price List,Listino Prezzi
|
||||
Price List not configured.,Prezzo di listino non è configurato.
|
||||
Quotation Series,Serie Quotazione
|
||||
Shipping Rule,Spedizione Rule
|
||||
Shopping Cart,Carrello spesa
|
||||
Shopping Cart Price List,Carrello Prezzo di listino
|
||||
Shopping Cart Price Lists,Carrello Listini
|
||||
Shopping Cart Settings,Carrello Impostazioni
|
||||
Shopping Cart Shipping Rule,Carrello Spedizioni Rule
|
||||
Shopping Cart Shipping Rules,Carrello Regole di Spedizione
|
||||
Shopping Cart Taxes and Charges Master,Carrello Tasse e Spese master
|
||||
Shopping Cart Taxes and Charges Masters,Carrello Tasse e Costi Masters
|
||||
Something went wrong!,Qualcosa è andato storto!
|
||||
Something went wrong.,Qualcosa è andato storto.
|
||||
Tax Master,Tax Maestro
|
||||
To Pay,To Pay
|
||||
Updated,Aggiornato
|
||||
You are not allowed to reply to this ticket.,Non sei autorizzato a rispondere a questo biglietto .
|
||||
You need to be logged in to view your cart.,Devi essere loggato per vedere il tuo carrello.
|
||||
You need to enable Shopping Cart,È necessario abilitare Carrello
|
||||
{0} cannot be purchased using Shopping Cart,{0} non può essere acquistato tramite Carrello
|
||||
{0} is required,{0} è richiesto
|
||||
{0} {1} has a common territory {2},{0} {1} ha un territorio comune {2}
|
||||
|
|
@ -3335,3 +3335,49 @@ website page link,ウェブサイトのページリンク(ウェブサイト
|
||||
{0} {1} status is Unstopped,{0} {1}ステータスが塞がです
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}:コストセンターではアイテムのために必須である{2}
|
||||
{0}: {1} not found in Invoice Details table,{0}:{1}請求書詳細テーブルにない
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","もし、ごhref=""#Sales Browser/Customer Group"">追加/編集</ A>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","もし、ごhref=""#Sales Browser/Territory"">追加/編集</ A>"
|
||||
Billed,課金
|
||||
Company,会社
|
||||
Currency is required for Price List {0},通貨は価格表{0}に必要です
|
||||
Default Customer Group,デフォルトの顧客グループ
|
||||
Default Territory,デフォルトの地域
|
||||
Delivered,配送
|
||||
Enable Shopping Cart,ショッピングカートを使用可能に
|
||||
Go ahead and add something to your cart.,先に行くと、ショッピングカートに何かを追加。
|
||||
Hey! Go ahead and add an address,ハイ!先に行くとアドレスを追加
|
||||
Invalid Billing Address,無効な請求先住所
|
||||
Invalid Shipping Address,無効な配送先住所
|
||||
Missing Currency Exchange Rates for {0},{0}のために為替レートが不足して
|
||||
Name is required,名前が必要です
|
||||
Not Allowed,許可されていない
|
||||
Paid,料金
|
||||
Partially Billed,部分的に銘打た
|
||||
Partially Delivered,部分的に配信
|
||||
Please specify a Price List which is valid for Territory,地域で有効な価格表を指定してください
|
||||
Please specify currency in Company,会社で通貨を指定してください
|
||||
Please write something,何かを書いてください
|
||||
Please write something in subject and message!,件名とメッセージで何かを書いてください!
|
||||
Price List,価格リスト
|
||||
Price List not configured.,価格表が構成されていません。
|
||||
Quotation Series,引用シリーズ
|
||||
Shipping Rule,出荷ルール
|
||||
Shopping Cart,カート
|
||||
Shopping Cart Price List,ショッピングカート価格表
|
||||
Shopping Cart Price Lists,ショッピングカート価格表
|
||||
Shopping Cart Settings,ショッピングカートの設定
|
||||
Shopping Cart Shipping Rule,ショッピングカート配送ルール
|
||||
Shopping Cart Shipping Rules,ショッピングカート配送ルール
|
||||
Shopping Cart Taxes and Charges Master,ショッピングカートの税金、料金マスター
|
||||
Shopping Cart Taxes and Charges Masters,ショッピングカートの税金、料金のマスターズ
|
||||
Something went wrong!,何かが間違っていた!
|
||||
Something went wrong.,エラーが発生しました。
|
||||
Tax Master,税金のマスター
|
||||
To Pay,支払わなければ
|
||||
Updated,更新日
|
||||
You are not allowed to reply to this ticket.,あなたは、このチケットに返信することはできません。
|
||||
You need to be logged in to view your cart.,あなたは買い物カゴを見るためにログインする必要があります。
|
||||
You need to enable Shopping Cart,あなたはショッピングカートを有効にする必要があります
|
||||
{0} cannot be purchased using Shopping Cart,{0}ショッピングカートを使用して購入することはできません
|
||||
{0} is required,{0}が必要である
|
||||
{0} {1} has a common territory {2},{0} {1}は、共通の領土を持っている{2}
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,ವೆಬ್ಸೈಟ್ ಪುಟ ಲಿಂಕ್
|
||||
{0} {1} status is Unstopped,{0} {1} ಸ್ಥಿತಿಯನ್ನು unstopped ಆಗಿದೆ
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: ವೆಚ್ಚ ಸೆಂಟರ್ ಐಟಂ ಕಡ್ಡಾಯ {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} ಸರಕುಪಟ್ಟಿ ವಿವರಗಳು ಟೇಬಲ್ ಕಂಡುಬಂದಿಲ್ಲ
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","ಕವಿದ href=""#Sales Browser/Customer Group""> ಸೇರಿಸಿ / ಸಂಪಾದಿಸಿ </ ಒಂದು >"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","ಕವಿದ href=""#Sales Browser/Territory""> ಸೇರಿಸಿ / ಸಂಪಾದಿಸಿ </ ಒಂದು >"
|
||||
Billed,ಖ್ಯಾತವಾದ
|
||||
Company,ಕಂಪನಿ
|
||||
Currency is required for Price List {0},ಕರೆನ್ಸಿ ಬೆಲೆ ಪಟ್ಟಿ ಅಗತ್ಯವಿದೆ {0}
|
||||
Default Customer Group,ಡೀಫಾಲ್ಟ್ ಗ್ರಾಹಕ ಗುಂಪಿನ
|
||||
Default Territory,ಡೀಫಾಲ್ಟ್ ಪ್ರದೇಶ
|
||||
Delivered,ತಲುಪಿಸಲಾಗಿದೆ
|
||||
Enable Shopping Cart,ಶಾಪಿಂಗ್ ಕಾರ್ಟ್ ಸಕ್ರಿಯಗೊಳಿಸಿ
|
||||
Go ahead and add something to your cart.,ಮುಂದೆ ಹೋಗಿ ಮತ್ತು ನಿಮ್ಮ ಕಾರ್ಟ್ ಏನಾದರೂ ಸೇರಿಸಿ.
|
||||
Hey! Go ahead and add an address,ಹೇ! ಮುಂದೆ ಹೋಗಿ ಒಂದು ಸೇರಿಸಿ
|
||||
Invalid Billing Address,ಅಮಾನ್ಯವಾದ ಬಿಲ್ಲಿಂಗ್ ವಿಳಾಸ
|
||||
Invalid Shipping Address,ಅಮಾನ್ಯವಾದ ಶಿಪ್ಪಿಂಗ್ ವಿಳಾಸ
|
||||
Missing Currency Exchange Rates for {0},ಕರೆನ್ಸಿ ವಿನಿಮಯ ದರಗಳು ಮಿಸ್ಸಿಂಗ್ {0}
|
||||
Name is required,ಹೆಸರು ಅಗತ್ಯವಿದೆ
|
||||
Not Allowed,ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ
|
||||
Paid,ಪಾವತಿಸಿದ
|
||||
Partially Billed,ಭಾಗಶಃ ಖ್ಯಾತವಾದ
|
||||
Partially Delivered,ಭಾಗಶಃ ತಲುಪಿಸಲಾಗಿದೆ
|
||||
Please specify a Price List which is valid for Territory,ಪ್ರದೇಶ ಮಾನ್ಯ ಬೆಲೆ ಪಟ್ಟಿ ಸೂಚಿಸಲು ದಯವಿಟ್ಟು
|
||||
Please specify currency in Company,ಕಂಪನಿ ಕರೆನ್ಸಿ ಸೂಚಿಸಲು ದಯವಿಟ್ಟು
|
||||
Please write something,ಏನೋ ಬರೆಯಲು ಮಾಡಿ
|
||||
Please write something in subject and message!,ವಿಷಯ ಮತ್ತು ಸಂದೇಶದ ಏನೋ ಬರೆಯಲು ಮಾಡಿ !
|
||||
Price List,ಬೆಲೆ ಪಟ್ಟಿ
|
||||
Price List not configured.,ಬೆಲೆ ಪಟ್ಟಿ ಕಾನ್ಫಿಗರ್.
|
||||
Quotation Series,ನುಡಿಮುತ್ತುಗಳು ಸರಣಿ
|
||||
Shipping Rule,ಶಿಪ್ಪಿಂಗ್ ರೂಲ್
|
||||
Shopping Cart,ಶಾಪಿಂಗ್ ಕಾರ್ಟ್
|
||||
Shopping Cart Price List,ಶಾಪಿಂಗ್ ಕಾರ್ಟ್ ಬೆಲೆ ಪಟ್ಟಿ
|
||||
Shopping Cart Price Lists,ಶಾಪಿಂಗ್ ಕಾರ್ಟ್ ಬೆಲೆ ಪಟ್ಟಿ
|
||||
Shopping Cart Settings,ಶಾಪಿಂಗ್ ಕಾರ್ಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳು
|
||||
Shopping Cart Shipping Rule,ಶಾಪಿಂಗ್ ಕಾರ್ಟ್ ಶಿಪ್ಪಿಂಗ್ ರೂಲ್
|
||||
Shopping Cart Shipping Rules,ಶಾಪಿಂಗ್ ಕಾರ್ಟ್ ಶಿಪ್ಪಿಂಗ್ ನಿಯಮಗಳು
|
||||
Shopping Cart Taxes and Charges Master,ಶಾಪಿಂಗ್ ಕಾರ್ಟ್ ತೆರಿಗೆಗಳು ಮತ್ತು ಶುಲ್ಕಗಳು ಮಾಸ್ಟರ್
|
||||
Shopping Cart Taxes and Charges Masters,ಶಾಪಿಂಗ್ ಕಾರ್ಟ್ ತೆರಿಗೆಗಳು ಮತ್ತು ಶುಲ್ಕಗಳು ಮಾಸ್ಟರ್ಸ್
|
||||
Something went wrong!,ಏನೋ ತಪ್ಪಾಗಿದೆ!
|
||||
Something went wrong.,ಯಾವುದೋ ತಪ್ಪು ಸಂಭವಿಸಿದೆ.
|
||||
Tax Master,ತೆರಿಗೆ ಮಾಸ್ಟರ್
|
||||
To Pay,ಪಾವತಿಸಲು
|
||||
Updated,ನವೀಕರಿಸಲಾಗಿದೆ
|
||||
You are not allowed to reply to this ticket.,ಈ ಟಿಕೆಟ್ ಪ್ರತ್ಯುತ್ತರ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ.
|
||||
You need to be logged in to view your cart.,ನಿಮ್ಮ ಕಾರ್ಟ್ ಲಾಗಿನ್ ಅಗತ್ಯವಿದೆ.
|
||||
You need to enable Shopping Cart,ನೀವು ಶಾಪಿಂಗ್ ಕಾರ್ಟ್ ಸಕ್ರಿಯಗೊಳಿಸಬೇಕು
|
||||
{0} cannot be purchased using Shopping Cart,{0} ಶಾಪಿಂಗ್ ಕಾರ್ಟ್ ಬಳಸಿ ಕೊಳ್ಳಬಹುದು ಸಾಧ್ಯವಿಲ್ಲ
|
||||
{0} is required,{0} ಅಗತ್ಯವಿದೆ
|
||||
{0} {1} has a common territory {2},{0} {1} ಸಾಮಾನ್ಯ ಪ್ರದೇಶವನ್ನು ಹೊಂದಿದೆ {2}
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,웹 사이트 페이지 링크
|
||||
{0} {1} status is Unstopped,{0} {1} 상태 Unstopped입니다
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1} : 코스트 센터는 항목에 대해 필수입니다 {2}
|
||||
{0}: {1} not found in Invoice Details table,{0} {1} 송장 정보 테이블에서 찾을 수 없습니다
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","만약 당신이 좋아 href=""#Sales Browser/Customer Group""> 추가 / 편집 </ A>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","만약 당신이 좋아 href=""#Sales Browser/Territory""> 추가 / 편집 </ A>"
|
||||
Billed,청구
|
||||
Company,회사
|
||||
Currency is required for Price List {0},환율은 가격 목록에 필요한 {0}
|
||||
Default Customer Group,기본 고객 그룹
|
||||
Default Territory,기본 지역
|
||||
Delivered,배달
|
||||
Enable Shopping Cart,쇼핑 카트를 사용
|
||||
Go ahead and add something to your cart.,가서 당신의 손수레로 뭔가를 추가 할 수 있습니다.
|
||||
Hey! Go ahead and add an address,야!가서 주소를 추가
|
||||
Invalid Billing Address,잘못된 청구 주소
|
||||
Invalid Shipping Address,잘못된 배송 주소
|
||||
Missing Currency Exchange Rates for {0},를 위해 환율 누락 {0}
|
||||
Name is required,이름이 필요합니다
|
||||
Not Allowed,허용하지 않음
|
||||
Paid,유료
|
||||
Partially Billed,일부 청구
|
||||
Partially Delivered,부분적으로 배달
|
||||
Please specify a Price List which is valid for Territory,지역에 유효한 가격 목록을 지정하십시오
|
||||
Please specify currency in Company,회사에 통화를 지정하십시오
|
||||
Please write something,뭔가를 작성 해주세요
|
||||
Please write something in subject and message!,제목과 메시지에 무언가를 써주세요!
|
||||
Price List,가격리스트
|
||||
Price List not configured.,가격 목록이 구성되어 있지.
|
||||
Quotation Series,견적 시리즈
|
||||
Shipping Rule,배송 규칙
|
||||
Shopping Cart,쇼핑 카트
|
||||
Shopping Cart Price List,쇼핑 카트의 가격 목록
|
||||
Shopping Cart Price Lists,쇼핑 카트의 가격 목록
|
||||
Shopping Cart Settings,쇼핑 카트 설정
|
||||
Shopping Cart Shipping Rule,장바구니 배송 규칙
|
||||
Shopping Cart Shipping Rules,장바구니 배송 규칙
|
||||
Shopping Cart Taxes and Charges Master,쇼핑 카트 세금과 요금 마스터
|
||||
Shopping Cart Taxes and Charges Masters,쇼핑 카트 세금과 요금의 석사
|
||||
Something went wrong!,문제가 발생했습니다!
|
||||
Something went wrong.,문제가 발생했습니다.
|
||||
Tax Master,세금 마스터
|
||||
To Pay,지불하는
|
||||
Updated,업데이트
|
||||
You are not allowed to reply to this ticket.,당신이 티켓에 회신 할 수 없습니다.
|
||||
You need to be logged in to view your cart.,당신은 당신의 카트를 보려면 로그인해야합니다.
|
||||
You need to enable Shopping Cart,당신은 쇼핑 카트를 활성화해야
|
||||
{0} cannot be purchased using Shopping Cart,{0} 쇼핑 카트를 사용하여 구입 할 수 없습니다
|
||||
{0} is required,{0}이 필요합니다
|
||||
{0} {1} has a common territory {2},{0} {1} 공통의 영토가 {2}
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,website Paginalink
|
||||
{0} {1} status is Unstopped,{0} {1} status ontsloten
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: kostenplaats is verplicht voor Item {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} niet gevonden in Factuur Details tabel
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> toevoegen / bewerken < / a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> toevoegen / bewerken < / a>"
|
||||
Billed,Gefactureerd
|
||||
Company,Vennootschap
|
||||
Currency is required for Price List {0},Valuta is vereist voor prijslijst {0}
|
||||
Default Customer Group,Standaard Klant Groep
|
||||
Default Territory,Standaard Territory
|
||||
Delivered,Geleverd
|
||||
Enable Shopping Cart,Enable Winkelwagen
|
||||
Go ahead and add something to your cart.,Ga je gang en iets toe te voegen aan uw winkelwagen.
|
||||
Hey! Go ahead and add an address,Hé! Ga je gang en voeg een adres
|
||||
Invalid Billing Address,Ongeldig Factuuradres
|
||||
Invalid Shipping Address,Ongeldig verzendadres
|
||||
Missing Currency Exchange Rates for {0},Ontbrekende wisselkoersen gedurende {0}
|
||||
Name is required,Naam is vereist
|
||||
Not Allowed,niet toegestaan
|
||||
Paid,betaald
|
||||
Partially Billed,gedeeltelijk gefactureerde
|
||||
Partially Delivered,gedeeltelijk Geleverd
|
||||
Please specify a Price List which is valid for Territory,Geef een prijslijst die geldig is voor het grondgebied
|
||||
Please specify currency in Company,Specificeer munt in Bedrijf
|
||||
Please write something,Iets schrijven aub
|
||||
Please write something in subject and message!,Schrijf iets in het onderwerp en een bericht !
|
||||
Price List,Prijslijst
|
||||
Price List not configured.,Prijslijst niet geconfigureerd.
|
||||
Quotation Series,Offerte Series
|
||||
Shipping Rule,Verzending Rule
|
||||
Shopping Cart,Winkelwagen
|
||||
Shopping Cart Price List,Winkelwagen Prijslijst
|
||||
Shopping Cart Price Lists,Winkelwagen Prijslijsten
|
||||
Shopping Cart Settings,Winkelwagen Instellingen
|
||||
Shopping Cart Shipping Rule,Winkelwagen Scheepvaart Rule
|
||||
Shopping Cart Shipping Rules,Winkelwagen Scheepvaart Regels
|
||||
Shopping Cart Taxes and Charges Master,Winkelwagen en-heffingen Master
|
||||
Shopping Cart Taxes and Charges Masters,Winkelwagen en-heffingen Masters
|
||||
Something went wrong!,Er ging iets mis!
|
||||
Something went wrong.,Er is iets fout gegaan
|
||||
Tax Master,Fiscale Master
|
||||
To Pay,te betalen
|
||||
Updated,Bijgewerkt
|
||||
You are not allowed to reply to this ticket.,Het is niet toegestaan om te reageren op dit kaartje .
|
||||
You need to be logged in to view your cart.,Je moet ingelogd zijn om uw winkelwagentje te bekijken.
|
||||
You need to enable Shopping Cart,U moet Winkelwagen stellen
|
||||
{0} cannot be purchased using Shopping Cart,{0} kan niet worden aangeschaft met Winkelwagen
|
||||
{0} is required,{0} is verplicht
|
||||
{0} {1} has a common territory {2},{0} {1} heeft een gemeenschappelijk grondgebied {2}
|
||||
|
|
@ -3377,3 +3377,49 @@ website page link,link da página do site
|
||||
{0} {1} status is Unstopped,{0} {1} status é abrirão
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: Centro de Custo é obrigatória para item {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} não foi encontrado na fatura Detalhes Mesa
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer grupo""> Adicionar / Editar </ a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> Adicionar / Editar </ a>"
|
||||
Billed,Faturado
|
||||
Company,Empresa
|
||||
Currency is required for Price List {0},Moeda é necessário para Preço de {0}
|
||||
Default Customer Group,Grupo de Clientes padrão
|
||||
Default Territory,Território padrão
|
||||
Delivered,Entregue
|
||||
Enable Shopping Cart,Ativar Carrinho de Compras
|
||||
Go ahead and add something to your cart.,Vá em frente e acrescentar algo ao seu carrinho.
|
||||
Hey! Go ahead and add an address,Ei! Vá em frente e adicionar um endereço
|
||||
Invalid Billing Address,Inválido Endereço de Cobrança
|
||||
Invalid Shipping Address,Inválido envio Endereço
|
||||
Missing Currency Exchange Rates for {0},Falta de câmbio de moeda para {0}
|
||||
Name is required,Nome é obrigatório
|
||||
Not Allowed,não Permitido
|
||||
Paid,pago
|
||||
Partially Billed,parcialmente faturado
|
||||
Partially Delivered,parcialmente entregues
|
||||
Please specify a Price List which is valid for Territory,"Por favor, especifique uma lista de preços que é válido para o território"
|
||||
Please specify currency in Company,"Por favor, especificar a moeda em Empresa"
|
||||
Please write something,"Por favor, escreva algo"
|
||||
Please write something in subject and message!,"Por favor, escreva algo no assunto e uma mensagem !"
|
||||
Price List,Lista de Preços
|
||||
Price List not configured.,Lista de Preço não configurado.
|
||||
Quotation Series,Série citação
|
||||
Shipping Rule,Regra de envio
|
||||
Shopping Cart,Carrinho de Compras
|
||||
Shopping Cart Price List,Carrinho de Compras Lista de Preços
|
||||
Shopping Cart Price Lists,Carrinho listas de preços
|
||||
Shopping Cart Settings,Carrinho Configurações
|
||||
Shopping Cart Shipping Rule,Carrinho de Compras Rule envio
|
||||
Shopping Cart Shipping Rules,Carrinho Regras frete
|
||||
Shopping Cart Taxes and Charges Master,Carrinho impostos e taxas Mestre
|
||||
Shopping Cart Taxes and Charges Masters,Carrinho Impostos e Taxas de mestrado
|
||||
Something went wrong!,Algo deu errado!
|
||||
Something went wrong.,Algo deu errado.
|
||||
Tax Master,Imposto de Mestre
|
||||
To Pay,pagar
|
||||
Updated,Atualizado
|
||||
You are not allowed to reply to this ticket.,Você não tem permissão para responder a este bilhete .
|
||||
You need to be logged in to view your cart.,Você precisa estar logado para ver seu carrinho.
|
||||
You need to enable Shopping Cart,Você precisa habilitar o Carrinho de Compras
|
||||
{0} cannot be purchased using Shopping Cart,{0} não pode ser comprado usando Carrinho de Compras
|
||||
{0} is required,{0} é necessária
|
||||
{0} {1} has a common territory {2},{0} {1} tem um território comum {2}
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,link da página site
|
||||
{0} {1} status is Unstopped,{0} {1} status é abrirão
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: Centro de Custo é obrigatória para item {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} não foi encontrado na fatura Detalhes Mesa
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> toevoegen / bewerken < / a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> toevoegen / bewerken < / a>"
|
||||
Billed,Faturado
|
||||
Company,Companhia
|
||||
Currency is required for Price List {0},Moeda é necessário para Preço de {0}
|
||||
Default Customer Group,Grupo de Clientes padrão
|
||||
Default Territory,Território padrão
|
||||
Delivered,Entregue
|
||||
Enable Shopping Cart,Ativar Carrinho de Compras
|
||||
Go ahead and add something to your cart.,Vá em frente e acrescentar algo ao seu carrinho.
|
||||
Hey! Go ahead and add an address,Ei! Vá em frente e adicionar um endereço
|
||||
Invalid Billing Address,Inválido Endereço de Cobrança
|
||||
Invalid Shipping Address,Inválido envio Endereço
|
||||
Missing Currency Exchange Rates for {0},Falta de câmbio de moeda para {0}
|
||||
Name is required,Nome é obrigatório
|
||||
Not Allowed,não Permitido
|
||||
Paid,betaald
|
||||
Partially Billed,gedeeltelijk gefactureerde
|
||||
Partially Delivered,gedeeltelijk Geleverd
|
||||
Please specify a Price List which is valid for Territory,"Por favor, especifique uma lista de preços que é válido para o território"
|
||||
Please specify currency in Company,"Por favor, especificar a moeda em Empresa"
|
||||
Please write something,Iets schrijven aub
|
||||
Please write something in subject and message!,Schrijf iets in het onderwerp en een bericht !
|
||||
Price List,Lista de Preços
|
||||
Price List not configured.,Lista de Preço não configurado.
|
||||
Quotation Series,Série citação
|
||||
Shipping Rule,Regra de envio
|
||||
Shopping Cart,Carrinho de Compras
|
||||
Shopping Cart Price List,Carrinho de Compras Lista de Preços
|
||||
Shopping Cart Price Lists,Carrinho listas de preços
|
||||
Shopping Cart Settings,Carrinho Configurações
|
||||
Shopping Cart Shipping Rule,Carrinho de Compras Rule envio
|
||||
Shopping Cart Shipping Rules,Carrinho Regras frete
|
||||
Shopping Cart Taxes and Charges Master,Carrinho impostos e taxas Mestre
|
||||
Shopping Cart Taxes and Charges Masters,Carrinho Impostos e Taxas de mestrado
|
||||
Something went wrong!,Algo deu errado!
|
||||
Something went wrong.,Algo deu errado.
|
||||
Tax Master,Imposto de Mestre
|
||||
To Pay,te betalen
|
||||
Updated,Atualizado
|
||||
You are not allowed to reply to this ticket.,Het is niet toegestaan om te reageren op dit kaartje .
|
||||
You need to be logged in to view your cart.,Você precisa estar logado para ver seu carrinho.
|
||||
You need to enable Shopping Cart,Você precisa habilitar o Carrinho de Compras
|
||||
{0} cannot be purchased using Shopping Cart,{0} não pode ser comprado usando Carrinho de Compras
|
||||
{0} is required,{0} é necessária
|
||||
{0} {1} has a common territory {2},{0} {1} tem um território comum {2}
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,pagina site-ului link-ul
|
||||
{0} {1} status is Unstopped,{0} {1} statut este destupate
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: Cost Center este obligatorie pentru postul {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} nu a fost găsit în factură Detalii masă
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> Add / Edit </ a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> Add / Edit </ a>"
|
||||
Billed,Facturat
|
||||
Company,Firma
|
||||
Currency is required for Price List {0},Monedă este necesară pentru lista de prețuri {0}
|
||||
Default Customer Group,Implicit Client Group
|
||||
Default Territory,Implicit Teritoriul
|
||||
Delivered,Livrat
|
||||
Enable Shopping Cart,Activați Cosul de cumparaturi
|
||||
Go ahead and add something to your cart.,Du-te și adaugă ceva la coș.
|
||||
Hey! Go ahead and add an address,Hei! Du-te și adăugați o adresă
|
||||
Invalid Billing Address,Adresa de facturare invalid
|
||||
Invalid Shipping Address,Adresa Transport invalid
|
||||
Missing Currency Exchange Rates for {0},Lipsește valutar Curs valutar pentru {0}
|
||||
Name is required,Este necesar numele
|
||||
Not Allowed,Nu este permis
|
||||
Paid,Platit
|
||||
Partially Billed,Parțial Taxat
|
||||
Partially Delivered,Parțial livrate
|
||||
Please specify a Price List which is valid for Territory,"Vă rugăm să specificați o listă de prețuri, care este valabil pentru teritoriul"
|
||||
Please specify currency in Company,Vă rugăm să specificați în valută de companie
|
||||
Please write something,Vă rugăm să scrieți ceva
|
||||
Please write something in subject and message!,Vă rugăm să scrieți ceva în subiect și un mesaj!
|
||||
Price List,Lista de prețuri
|
||||
Price List not configured.,Lista de prețuri nu a fost configurat.
|
||||
Quotation Series,Citat Series
|
||||
Shipping Rule,Regula de transport maritim
|
||||
Shopping Cart,Cosul de cumparaturi
|
||||
Shopping Cart Price List,Cosul de cumparaturi Lista de prețuri
|
||||
Shopping Cart Price Lists,Cosul de cumparaturi Liste de prețuri
|
||||
Shopping Cart Settings,Setări Cosul de cumparaturi
|
||||
Shopping Cart Shipping Rule,Cosul de cumparaturi Regula Transport
|
||||
Shopping Cart Shipping Rules,Cosul de cumparaturi Reguli de expediere
|
||||
Shopping Cart Taxes and Charges Master,Taxele coș de cumpărături și taxe de Master
|
||||
Shopping Cart Taxes and Charges Masters,Cumpărături Impozite și taxe cos Masters
|
||||
Something went wrong!,Ceva a mers prost!
|
||||
Something went wrong.,Ceva nu a funcționat.
|
||||
Tax Master,Taxa de Master
|
||||
To Pay,Pentru a Pay
|
||||
Updated,Actualizat
|
||||
You are not allowed to reply to this ticket.,Nu vi se permite să răspundeți la acest bilet.
|
||||
You need to be logged in to view your cart.,Ai nevoie să fii logat pentru a vedea cosul de cumparaturi.
|
||||
You need to enable Shopping Cart,Ai nevoie pentru a permite Cosul de cumparaturi
|
||||
{0} cannot be purchased using Shopping Cart,{0} nu pot fi achiziționate cu ajutorul Cosul de cumparaturi
|
||||
{0} is required,{0} este necesară
|
||||
{0} {1} has a common territory {2},{0} {1} are un teritoriu comun {2}
|
||||
|
|
@ -3332,3 +3332,49 @@ website page link,сайт ссылку
|
||||
{0} {1} status is Unstopped,{0} {1} статус отверзутся
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: МВЗ является обязательным для п. {2}
|
||||
{0}: {1} not found in Invoice Details table,{0} {1} не найден в счете-фактуре таблице
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> Добавить / Изменить </>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> Добавить / Изменить </>"
|
||||
Billed,Объявленный
|
||||
Company,Организация
|
||||
Currency is required for Price List {0},Валюта необходима для Прейскурантом {0}
|
||||
Default Customer Group,По умолчанию Группа клиентов
|
||||
Default Territory,По умолчанию Территория
|
||||
Delivered,Доставлено
|
||||
Enable Shopping Cart,Включить Корзина
|
||||
Go ahead and add something to your cart.,Идем дальше и добавить что-то в корзину.
|
||||
Hey! Go ahead and add an address,16.35 Эй! Идем дальше и добавить адрес
|
||||
Invalid Billing Address,Неверный Адрес для выставления счета
|
||||
Invalid Shipping Address,Неверный адрес пересылки
|
||||
Missing Currency Exchange Rates for {0},Отсутствует валютный курс для {0}
|
||||
Name is required,Имя обязательно
|
||||
Not Allowed,Не разрешены
|
||||
Paid,Оплачено
|
||||
Partially Billed,Частично Объявленный
|
||||
Partially Delivered,Частично Поставляются
|
||||
Please specify a Price List which is valid for Territory,"Пожалуйста, сформулируйте прайс-лист, который действителен для территории"
|
||||
Please specify currency in Company,"Пожалуйста, сформулируйте валюту в компании"
|
||||
Please write something,"Пожалуйста, напишите что-нибудь"
|
||||
Please write something in subject and message!,"Пожалуйста, напишите что-нибудь в тему и текст сообщения!"
|
||||
Price List,Прайс-лист
|
||||
Price List not configured.,Прайс-лист не настроен.
|
||||
Quotation Series,Цитата серии
|
||||
Shipping Rule,Правило Доставка
|
||||
Shopping Cart,Корзина
|
||||
Shopping Cart Price List,Корзина Прайс-лист
|
||||
Shopping Cart Price Lists,Корзина Прайс-листы
|
||||
Shopping Cart Settings,Корзина Настройки
|
||||
Shopping Cart Shipping Rule,Корзина Правило Доставка
|
||||
Shopping Cart Shipping Rules,Корзина Правила Доставка
|
||||
Shopping Cart Taxes and Charges Master,Корзина Налоги и сборы Мастер
|
||||
Shopping Cart Taxes and Charges Masters,Налоги Корзина Торговые и сборы Мастера
|
||||
Something went wrong!,Что-то пошло не так!
|
||||
Something went wrong.,Что-то пошло не так.
|
||||
Tax Master,Налоговый Мастер
|
||||
To Pay,Платить
|
||||
Updated,Обновлено
|
||||
You are not allowed to reply to this ticket.,Вы не можете отвечать на этот билет.
|
||||
You need to be logged in to view your cart.,"Вы должны войти в систему, чтобы просмотреть свою корзину."
|
||||
You need to enable Shopping Cart,Вам необходимо включить Корзина
|
||||
{0} cannot be purchased using Shopping Cart,{0} не может быть приобретен с помощью Корзина
|
||||
{0} is required,{0} требуется
|
||||
{0} {1} has a common territory {2},{0} {1} имеет общую территорию {2}
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,веб страница веза
|
||||
{0} {1} status is Unstopped,{0} {1} статус отверзутся
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: Трошкови Центар је обавезан за пункт {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} није пронађен у табели Фактура Детаљи
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<а хреф=""#Салес Бровсер/Цустомер Гроуп""> Додај / Уреди < />"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<а хреф=""#Салес Бровсер/Территори""> Додај / Уреди < />"
|
||||
Billed,Изграђена
|
||||
Company,Компанија
|
||||
Currency is required for Price List {0},Валюта необходима для Прейскурантом {0}
|
||||
Default Customer Group,Уобичајено групу потрошача
|
||||
Default Territory,Уобичајено Територија
|
||||
Delivered,Испоручено
|
||||
Enable Shopping Cart,Омогући Корпа
|
||||
Go ahead and add something to your cart.,Само напред и додати нешто у вашој корпи.
|
||||
Hey! Go ahead and add an address,Хеј! Само напред и додај адресу
|
||||
Invalid Billing Address,Неверный Адрес для выставления счета
|
||||
Invalid Shipping Address,Неверный адрес пересылки
|
||||
Missing Currency Exchange Rates for {0},Отсутствует валютный курс для {0}
|
||||
Name is required,Име је обавезно
|
||||
Not Allowed,Не разрешены
|
||||
Paid,плаћен
|
||||
Partially Billed,Делимично Изграђена
|
||||
Partially Delivered,Делимично Испоручено
|
||||
Please specify a Price List which is valid for Territory,Наведите ценовник који важи за територију
|
||||
Please specify currency in Company,Наведите валуту у компанији
|
||||
Please write something,Молимо вас да напишете нешто
|
||||
Please write something in subject and message!,Молимо вас да напишете нешто у теми и поруци !
|
||||
Price List,Ценовник
|
||||
Price List not configured.,Ценовник није подесио.
|
||||
Quotation Series,Цитат серија
|
||||
Shipping Rule,Достава Правило
|
||||
Shopping Cart,Корпа
|
||||
Shopping Cart Price List,Корпа Ценовник
|
||||
Shopping Cart Price Lists,Корпа Ценовници
|
||||
Shopping Cart Settings,Корпа Подешавања
|
||||
Shopping Cart Shipping Rule,Корпа Достава Правило
|
||||
Shopping Cart Shipping Rules,Корпа испоруке Правила
|
||||
Shopping Cart Taxes and Charges Master,Корпа такси и накнада Мастер
|
||||
Shopping Cart Taxes and Charges Masters,Корпа такси и накнада Мастерс
|
||||
Something went wrong!,Нешто је пошло наопако!
|
||||
Something went wrong.,Нешто је пошло наопако.
|
||||
Tax Master,Пореска Мастер
|
||||
To Pay,То Паи
|
||||
Updated,Ажурирано
|
||||
You are not allowed to reply to this ticket.,Нисте дозвољено да одговори на ову карту .
|
||||
You need to be logged in to view your cart.,Морате бити пријављени да бисте видели вашу корпу.
|
||||
You need to enable Shopping Cart,Вам необходимо включить Корзина
|
||||
{0} cannot be purchased using Shopping Cart,{0} не может быть приобретен с помощью Корзина
|
||||
{0} is required,{0} требуется
|
||||
{0} {1} has a common territory {2},{0} {1} имеет общую территорию {2}
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,இணைய பக்கம் இணைப்பு
|
||||
{0} {1} status is Unstopped,{0} {1} நிலையை ஐபோனில் இருக்கிறது
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: செலவு மையம் பொருள் கட்டாய {2}
|
||||
{0}: {1} not found in Invoice Details table,{0} {1} விலைப்பட்டியல் விவரம் அட்டவணையில் இல்லை
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","மிக href=""#Sales Browser/Customer Group""> சேர் / திருத்து </ a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","மிக href=""#Sales Browser/Territory""> சேர் / திருத்து </ a>"
|
||||
Billed,கட்டணம்
|
||||
Company,நிறுவனம்
|
||||
Currency is required for Price List {0},நாணய விலை பட்டியல் தேவை {0}
|
||||
Default Customer Group,முன்னிருப்பு வாடிக்கையாளர் பிரிவு
|
||||
Default Territory,முன்னிருப்பு மண்டலம்
|
||||
Delivered,வழங்கினார்
|
||||
Enable Shopping Cart,வணிக வண்டியில் செயல்படுத்த
|
||||
Go ahead and add something to your cart.,முன்னோக்கி சென்று உங்கள் வண்டி ஒன்று சேர்க்க.
|
||||
Hey! Go ahead and add an address,ஏய்! போய் ஒரு முகவரியை சேர்க்க
|
||||
Invalid Billing Address,தவறான பில்லிங் முகவரி
|
||||
Invalid Shipping Address,செல்லாத கப்பல் முகவரி
|
||||
Missing Currency Exchange Rates for {0},ஐந்து நாணய மாற்று விகிதங்கள் காணவில்லை {0}
|
||||
Name is required,பெயர் தேவை
|
||||
Not Allowed,அனுமதி இல்லை
|
||||
Paid,பணம்
|
||||
Partially Billed,பகுதி கூறப்படுவது
|
||||
Partially Delivered,பகுதியளவு வழங்கப்படுகிறது
|
||||
Please specify a Price List which is valid for Territory,மண்டலம் செல்லுபடியாகும் ஒரு விலை பட்டியல் குறிப்பிடவும்
|
||||
Please specify currency in Company,நிறுவனத்தின் நாணய குறிப்பிடவும்
|
||||
Please write something,ஏதாவது எழுத கொள்ளவும்
|
||||
Please write something in subject and message!,பொருள் மற்றும் செய்தி ஏதாவது எழுத கொள்ளவும் !
|
||||
Price List,விலை பட்டியல்
|
||||
Price List not configured.,விலை பட்டியல் கட்டமைக்கப்பட்ட.
|
||||
Quotation Series,மேற்கோள் தொடர்
|
||||
Shipping Rule,கப்பல் விதி
|
||||
Shopping Cart,வணிக வண்டி
|
||||
Shopping Cart Price List,வணிக வண்டியில் விலை பட்டியல்
|
||||
Shopping Cart Price Lists,வணிக வண்டியில் விலை பட்டியல்கள்
|
||||
Shopping Cart Settings,வணிக வண்டியில் அமைப்புகள்
|
||||
Shopping Cart Shipping Rule,வணிக வண்டியில் கப்பல் போக்குவரத்து விதி
|
||||
Shopping Cart Shipping Rules,வணிக வண்டியில் கப்பல் போக்குவரத்து விதிகள்
|
||||
Shopping Cart Taxes and Charges Master,வணிக வண்டியில் வரிகள் மற்றும் கட்டணங்கள் மாஸ்டர்
|
||||
Shopping Cart Taxes and Charges Masters,வணிக வண்டியில் வரிகள் மற்றும் கட்டணங்கள் முதுநிலை
|
||||
Something went wrong!,ஏதோ தவறு!
|
||||
Something went wrong.,ஏதோ தவறு நடந்துவிட்டது.
|
||||
Tax Master,வரி மாஸ்டர்
|
||||
To Pay,பணம்
|
||||
Updated,புதுப்பிக்கப்பட்ட
|
||||
You are not allowed to reply to this ticket.,இந்த டிக்கெட் பதில் அனுமதி இல்லை .
|
||||
You need to be logged in to view your cart.,உங்கள் வண்டி பார்வையிட உள்நுழைந்திருக்க வேண்டும்.
|
||||
You need to enable Shopping Cart,வணிக வண்டியில் செயல்படுத்த வேண்டும்
|
||||
{0} cannot be purchased using Shopping Cart,{0} வணிக வண்டியில் பயன்படுத்தி வாங்க முடியாது
|
||||
{0} is required,{0} தேவைப்படுகிறது
|
||||
{0} {1} has a common territory {2},{0} {1} ஒரு பொதுவான பகுதியில் உள்ளது {2}
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,การเชื่อมโยงหน้าเว็บ
|
||||
{0} {1} status is Unstopped,{0} {1} สถานะ เบิก
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: ศูนย์ต้นทุนจำเป็นสำหรับรายการ {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} ไม่พบในตารางรายละเอียดใบแจ้งหนี้
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> เพิ่ม / แก้ไข </ a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> เพิ่ม / แก้ไข </ a>"
|
||||
Billed,เรียกเก็บเงิน
|
||||
Company,บริษัท
|
||||
Currency is required for Price List {0},สกุลเงิน เป็นสิ่งจำเป็นสำหรับ ราคาตามรายการ {0}
|
||||
Default Customer Group,กลุ่มลูกค้าเริ่มต้น
|
||||
Default Territory,ดินแดนเริ่มต้น
|
||||
Delivered,ส่ง
|
||||
Enable Shopping Cart,เปิดใช้งานรถเข็น
|
||||
Go ahead and add something to your cart.,ไปข้างหน้าและเพิ่มสิ่งที่รถเข็นของคุณ
|
||||
Hey! Go ahead and add an address,นี่ ไปข้างหน้าและเพิ่มที่อยู่
|
||||
Invalid Billing Address,ที่อยู่ การเรียกเก็บเงิน ไม่ถูกต้อง
|
||||
Invalid Shipping Address,ที่อยู่ ในการจัดส่ง ที่ไม่ถูกต้อง
|
||||
Missing Currency Exchange Rates for {0},หายไป สกุลเงิน อัตราแลกเปลี่ยน เพื่อ {0}
|
||||
Name is required,ชื่อจะต้อง
|
||||
Not Allowed,ไม่อนุญาตให้
|
||||
Paid,ต้องจ่าย
|
||||
Partially Billed,ในจำนวน บางส่วน
|
||||
Partially Delivered,ส่ง บางส่วน
|
||||
Please specify a Price List which is valid for Territory,โปรดระบุรายชื่อราคาที่ถูกต้องสำหรับดินแดน
|
||||
Please specify currency in Company,โปรดระบุสกุลเงินใน บริษัท
|
||||
Please write something,กรุณาเขียน บางสิ่งบางอย่าง
|
||||
Please write something in subject and message!,กรุณาเขียน อะไรบางอย่างใน เรื่อง และ ข้อความ !
|
||||
Price List,บัญชีแจ้งราคาสินค้า
|
||||
Price List not configured.,ราคาไม่ได้กำหนดค่า
|
||||
Quotation Series,ชุดใบเสนอราคา
|
||||
Shipping Rule,กฎการจัดส่งสินค้า
|
||||
Shopping Cart,รถเข็นช้อปปิ้ง
|
||||
Shopping Cart Price List,รายการสินค้าราคาสินค้าในรถเข็น
|
||||
Shopping Cart Price Lists,ช้อปปิ้งสินค้าราคา Lists
|
||||
Shopping Cart Settings,การตั้งค่ารถเข็น
|
||||
Shopping Cart Shipping Rule,ช้อปปิ้งรถเข็นกฎการจัดส่งสินค้า
|
||||
Shopping Cart Shipping Rules,รถเข็นกฎการจัดส่งสินค้า
|
||||
Shopping Cart Taxes and Charges Master,ภาษีรถเข็นและปริญญาโทค่าใช้จ่าย
|
||||
Shopping Cart Taxes and Charges Masters,ภาษีรถเข็นช้อปปิ้งและปริญญาโทค่าใช้จ่าย
|
||||
Something went wrong!,สิ่งที่ผิดพลาด!
|
||||
Something went wrong.,สิ่งที่ผิดพลาด
|
||||
Tax Master,ปริญญาโทภาษี
|
||||
To Pay,การชำระเงิน
|
||||
Updated,อัพเดต
|
||||
You are not allowed to reply to this ticket.,คุณยังไม่ได้ รับอนุญาตให้ ตอบกลับ ตั๋ว นี้
|
||||
You need to be logged in to view your cart.,คุณต้องเข้าสู่ระบบเพื่อดูรถเข็นของคุณ
|
||||
You need to enable Shopping Cart,คุณต้อง เปิดการใช้งาน รถเข็น
|
||||
{0} cannot be purchased using Shopping Cart,{0} ไม่สามารถ ซื้อโดยใช้ รถเข็น
|
||||
{0} is required,{0} จะต้อง
|
||||
{0} {1} has a common territory {2},{0} {1} มีดินแดน ที่พบบ่อย {2}
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,web sayfa linki
|
||||
{0} {1} status is Unstopped,{0} {1} durumu Unstopped olduğunu
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: Maliyet Merkezi Ürün için zorunludur {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} Fatura Ayrıntıları tablosunda bulunamadı
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group""> Ekle / Düzenle </ a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory""> Ekle / Düzenle </ a>"
|
||||
Billed,Faturalanmış
|
||||
Company,Şirket
|
||||
Currency is required for Price List {0},Döviz Fiyat Listesi için gereklidir {0}
|
||||
Default Customer Group,Varsayılan Müşteri Grubu
|
||||
Default Territory,Standart Bölge
|
||||
Delivered,Teslim Edildi
|
||||
Enable Shopping Cart,Alışveriş sepeti etkinleştirin
|
||||
Go ahead and add something to your cart.,Devam edin ve sepetinize şey eklemek.
|
||||
Hey! Go ahead and add an address,Hey! Devam edin ve bir adres eklemek
|
||||
Invalid Billing Address,Geçersiz Fatura Adresi
|
||||
Invalid Shipping Address,Geçersiz Teslimat Adresi
|
||||
Missing Currency Exchange Rates for {0},Döviz Kurların eksik {0}
|
||||
Name is required,Adı gerekli
|
||||
Not Allowed,İzin Verilmedi
|
||||
Paid,Ödendi
|
||||
Partially Billed,Kısmen Faturalı
|
||||
Partially Delivered,Kısmen Teslim
|
||||
Please specify a Price List which is valid for Territory,Territory için geçerli olan bir Fiyat Listesi belirtin
|
||||
Please specify currency in Company,Şirket para birimi belirtiniz
|
||||
Please write something,Bir şeyler yazınız
|
||||
Please write something in subject and message!,Konu ve mesaj bir şeyler yazınız!
|
||||
Price List,Fiyat listesi
|
||||
Price List not configured.,Fiyat Listesi yapılandırılmamış.
|
||||
Quotation Series,Teklif Serisi
|
||||
Shipping Rule,Kargo Kural
|
||||
Shopping Cart,Alışveriş Sepeti
|
||||
Shopping Cart Price List,Alışveriş Sepeti Fiyat Listesi
|
||||
Shopping Cart Price Lists,Alışveriş Sepeti Fiyat Listeleri
|
||||
Shopping Cart Settings,Alışveriş sepeti Ayarları
|
||||
Shopping Cart Shipping Rule,Alışveriş Sepeti Kargo Kural
|
||||
Shopping Cart Shipping Rules,Alışveriş Sepeti Nakliye Kuralları
|
||||
Shopping Cart Taxes and Charges Master,Alışveriş Sepeti Vergi ve Harçlar Usta
|
||||
Shopping Cart Taxes and Charges Masters,Alışveriş Sepeti Vergi ve Harçlar Masters
|
||||
Something went wrong!,Bir şeyler yanlış gitti!
|
||||
Something went wrong.,Bir şeyler yanlış gitti.
|
||||
Tax Master,Vergi Usta
|
||||
To Pay,Ödeme
|
||||
Updated,Güncellenmiş
|
||||
You are not allowed to reply to this ticket.,Bu bilet için cevap izin verilmez.
|
||||
You need to be logged in to view your cart.,Eğer sepeti görmek için oturum açmanız gerekir.
|
||||
You need to enable Shopping Cart,Sen Alışveriş Sepeti etkinleştirmeniz gerekir
|
||||
{0} cannot be purchased using Shopping Cart,{0} sepeti kullanarak satın alınamaz
|
||||
{0} is required,{0} gereklidir
|
||||
{0} {1} has a common territory {2},"{0} {1}, ortak bir bölge var {2}"
|
||||
|
|
@ -3329,3 +3329,49 @@ website page link,liên kết trang web
|
||||
{0} {1} status is Unstopped,{0} {1} tình trạng là Unstopped
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: Trung tâm chi phí là bắt buộc đối với hàng {2}
|
||||
{0}: {1} not found in Invoice Details table,{0}: {1} không tìm thấy trong hóa đơn chi tiết bảng
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>",{0} là cần thiết
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>",Tiền tệ là cần thiết cho Giá liệt kê {0}
|
||||
Billed,Một cái gì đó đã đi sai!
|
||||
Company,Giỏ hàng Giá liệt kê
|
||||
Currency is required for Price List {0},Danh sách giá
|
||||
Default Customer Group,Xin vui lòng viết một cái gì đó trong chủ đề và thông điệp!
|
||||
Default Territory,Vui lòng ghi rõ tiền tệ tại Công ty
|
||||
Delivered,"Nếu được chỉ định, gửi các bản tin sử dụng địa chỉ email này"
|
||||
Enable Shopping Cart,Dòng báo giá
|
||||
Go ahead and add something to your cart.,Được quảng cáo một phần
|
||||
Hey! Go ahead and add an address,Một cái gì đó đã đi sai.
|
||||
Invalid Billing Address,Thuế Thạc sĩ
|
||||
Invalid Shipping Address,Để trả tiền
|
||||
Missing Currency Exchange Rates for {0},Quy tắc vận chuyển
|
||||
Name is required,{0} không thể mua được bằng Giỏ hàng
|
||||
Not Allowed,Giỏ hàng Thuế và phí Thạc sĩ
|
||||
Paid,Quy định vận chuyển Giỏ hàng
|
||||
Partially Billed,Bạn cần phải kích hoạt Giỏ hàng
|
||||
Partially Delivered,Địa chỉ thanh toán không hợp lệ
|
||||
Please specify a Price List which is valid for Territory,Mặc định Territory
|
||||
Please specify currency in Company,Giỏ hàng Vận chuyển Rule
|
||||
Please write something,Giỏ hàng Chức năng Giá
|
||||
Please write something in subject and message!,{0} {1} có một lãnh thổ chung {2}
|
||||
Price List,"<a href=""#Sales Browser/Customer Group""> Add / Edit </ a>"
|
||||
Price List not configured.,Một phần Giao
|
||||
Quotation Series,Giỏ hàng Thuế và phí Masters
|
||||
Shipping Rule,Này ! Đi trước và thêm một địa chỉ
|
||||
Shopping Cart,"<a href=""#Sales Browser/Territory""> Add / Edit </ a>"
|
||||
Shopping Cart Price List,Đã cập nhật
|
||||
Shopping Cart Price Lists,Danh sách giá không được cấu hình.
|
||||
Shopping Cart Settings,Mặc định khách hàng Nhóm
|
||||
Shopping Cart Shipping Rule,Bạn cần phải đăng nhập để xem giỏ hàng của bạn.
|
||||
Shopping Cart Shipping Rules,Không phép
|
||||
Shopping Cart Taxes and Charges Master,Công ty
|
||||
Shopping Cart Taxes and Charges Masters,Địa chỉ Vận chuyển không hợp lệ
|
||||
Something went wrong!,Bạn không được phép trả lời vé này.
|
||||
Something went wrong.,Đi trước và thêm một cái gì đó vào giỏ hàng của bạn.
|
||||
Tax Master,Giao
|
||||
To Pay,Thanh toán
|
||||
Updated,Xin vui lòng viết một cái gì đó
|
||||
You are not allowed to reply to this ticket.,Vui lòng xác định Bảng giá có giá trị trong lãnh thổ
|
||||
You need to be logged in to view your cart.,Giỏ hàng
|
||||
You need to enable Shopping Cart,Giỏ hàng mua sắm thiết lập
|
||||
{0} cannot be purchased using Shopping Cart,Lập hóa đơn
|
||||
{0} is required,Cho phép Giỏ hàng
|
||||
{0} {1} has a common territory {2},Yêu cầu nhập tên
|
||||
|
|
@ -3377,3 +3377,49 @@ website page link,网站页面的链接
|
||||
{0} {1} status is Unstopped,{0} {1}状态为开通
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}:成本中心是强制性的项目{2}
|
||||
{0}: {1} not found in Invoice Details table,{0}:{1}不是在发票明细表中找到
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group"">添加/编辑</a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory"">添加/编辑</a>"
|
||||
Billed,计费
|
||||
Company,公司
|
||||
Currency is required for Price List {0},货币需要价格表{0}
|
||||
Default Customer Group,默认用户组
|
||||
Default Territory,默认领地
|
||||
Delivered,交付
|
||||
Enable Shopping Cart,启用的购物车
|
||||
Go ahead and add something to your cart.,来吧,讲一下你的车。
|
||||
Hey! Go ahead and add an address,嘿!来吧,添加一个地址
|
||||
Invalid Billing Address,无效的帐单地址
|
||||
Invalid Shipping Address,无效的送货地址
|
||||
Missing Currency Exchange Rates for {0},缺少货币汇率的{0}
|
||||
Name is required,名称是必需的
|
||||
Not Allowed,不允许
|
||||
Paid,支付
|
||||
Partially Billed,部分帐单
|
||||
Partially Delivered,部分交付
|
||||
Please specify a Price List which is valid for Territory,请指定一个价格表,有效期为领地
|
||||
Please specify currency in Company,请公司指定的货币
|
||||
Please write something,请写东西
|
||||
Please write something in subject and message!,请写东西的主题和消息!
|
||||
Price List,价格表
|
||||
Price List not configured.,未配置价格表。
|
||||
Quotation Series,系列报价
|
||||
Shipping Rule,送货规则
|
||||
Shopping Cart,购物车
|
||||
Shopping Cart Price List,购物车价格表
|
||||
Shopping Cart Price Lists,购物车价目表
|
||||
Shopping Cart Settings,购物车设置
|
||||
Shopping Cart Shipping Rule,购物车运费规则
|
||||
Shopping Cart Shipping Rules,购物车运费规则
|
||||
Shopping Cart Taxes and Charges Master,购物车税收和收费硕士
|
||||
Shopping Cart Taxes and Charges Masters,购物车税收和收费硕士
|
||||
Something went wrong!,出事了!
|
||||
Something went wrong.,出事了。
|
||||
Tax Master,税务硕士
|
||||
To Pay,支付方式
|
||||
Updated,更新
|
||||
You are not allowed to reply to this ticket.,你不允许回复此票。
|
||||
You need to be logged in to view your cart.,您需要登录才能查看您的购物车。
|
||||
You need to enable Shopping Cart,您需要启用的购物车
|
||||
{0} cannot be purchased using Shopping Cart,{0}不能使用购物车购买
|
||||
{0} is required,{0}是必需的
|
||||
{0} {1} has a common territory {2},{0} {1}有一个共同的领土{2}
|
||||
|
|
@ -3377,3 +3377,49 @@ website page link,網站頁面的鏈接
|
||||
{0} {1} status is Unstopped,{0} {1}狀態為開通
|
||||
{0} {1}: Cost Center is mandatory for Item {2},{0} {1}:成本中心是強制性的項目{2}
|
||||
{0}: {1} not found in Invoice Details table,{0}:{1}不是在發票明細表中找到
|
||||
"<a href=""#Sales Browser/Customer Group"">Add / Edit</a>","<a href=""#Sales Browser/Customer Group"">添加/編輯</a>"
|
||||
"<a href=""#Sales Browser/Territory"">Add / Edit</a>","<a href=""#Sales Browser/Territory"">添加/編輯</a>"
|
||||
Billed,計費
|
||||
Company,公司
|
||||
Currency is required for Price List {0},貨幣需要價格表{0}
|
||||
Default Customer Group,默認用戶組
|
||||
Default Territory,默認領地
|
||||
Delivered,交付
|
||||
Enable Shopping Cart,啟用的購物車
|
||||
Go ahead and add something to your cart.,來吧,講一下你的車。
|
||||
Hey! Go ahead and add an address,嘿!來吧,添加一個地址
|
||||
Invalid Billing Address,無效的帳單地址
|
||||
Invalid Shipping Address,無效的送貨地址
|
||||
Missing Currency Exchange Rates for {0},缺少貨幣匯率的{0}
|
||||
Name is required,名稱是必需的
|
||||
Not Allowed,不允許
|
||||
Paid,支付
|
||||
Partially Billed,部分帳單
|
||||
Partially Delivered,部分交付
|
||||
Please specify a Price List which is valid for Territory,請指定一個價格表,有效期為領地
|
||||
Please specify currency in Company,請公司指定的貨幣
|
||||
Please write something,請寫東西
|
||||
Please write something in subject and message!,請寫東西的主題和消息!
|
||||
Price List,價格表
|
||||
Price List not configured.,未配置價格表。
|
||||
Quotation Series,系列報價
|
||||
Shipping Rule,送貨規則
|
||||
Shopping Cart,購物車
|
||||
Shopping Cart Price List,購物車價格表
|
||||
Shopping Cart Price Lists,購物車價目表
|
||||
Shopping Cart Settings,購物車設置
|
||||
Shopping Cart Shipping Rule,購物車運費規則
|
||||
Shopping Cart Shipping Rules,購物車運費規則
|
||||
Shopping Cart Taxes and Charges Master,購物車稅收和收費碩士
|
||||
Shopping Cart Taxes and Charges Masters,購物車稅收和收費碩士
|
||||
Something went wrong!,出事了!
|
||||
Something went wrong.,出事了。
|
||||
Tax Master,稅務碩士
|
||||
To Pay,支付方式
|
||||
Updated,更新
|
||||
You are not allowed to reply to this ticket.,你不允許回复此票。
|
||||
You need to be logged in to view your cart.,您需要登錄才能查看您的購物車。
|
||||
You need to enable Shopping Cart,您需要啟用的購物車
|
||||
{0} cannot be purchased using Shopping Cart,{0}不能使用購物車購買
|
||||
{0} is required,{0}是必需的
|
||||
{0} {1} has a common territory {2},{0} {1}有一個共同的領土{2}
|
||||
|
|
Loading…
x
Reference in New Issue
Block a user