Website Listing
This commit is contained in:
parent
a1da88a3d3
commit
f9fc04ce8e
@ -134,9 +134,6 @@ class SalesInvoice(SellingController):
|
|||||||
where name=`tabSales Invoice Item`.parent and ifnull(update_stock, 0) = 1)"""
|
where name=`tabSales Invoice Item`.parent and ifnull(update_stock, 0) = 1)"""
|
||||||
})
|
})
|
||||||
|
|
||||||
def get_portal_page(self):
|
|
||||||
return "invoice" if self.docstatus==1 else None
|
|
||||||
|
|
||||||
def set_missing_values(self, for_validate=False):
|
def set_missing_values(self, for_validate=False):
|
||||||
self.set_pos_fields(for_validate)
|
self.set_pos_fields(for_validate)
|
||||||
|
|
||||||
@ -576,6 +573,13 @@ class SalesInvoice(SellingController):
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_list_context(context=None):
|
||||||
|
from erpnext.controllers.website_list_for_contact import get_list_context
|
||||||
|
list_context = get_list_context(context)
|
||||||
|
list_context["title"] = _("My Invoices")
|
||||||
|
return list_context
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_bank_cash_account(mode_of_payment, company):
|
def get_bank_cash_account(mode_of_payment, company):
|
||||||
account = frappe.db.get_value("Mode of Payment Account", {"parent": mode_of_payment, "company": company}, \
|
account = frappe.db.get_value("Mode of Payment Account", {"parent": mode_of_payment, "company": company}, \
|
||||||
|
@ -288,4 +288,3 @@ class BuyingController(StockController):
|
|||||||
if not d.conversion_factor:
|
if not d.conversion_factor:
|
||||||
frappe.throw(_("Row {0}: Conversion Factor is mandatory"))
|
frappe.throw(_("Row {0}: Conversion Factor is mandatory"))
|
||||||
d.stock_qty = flt(d.qty) * flt(d.conversion_factor)
|
d.stock_qty = flt(d.qty) * flt(d.conversion_factor)
|
||||||
|
|
||||||
|
78
erpnext/controllers/website_list_for_contact.py
Normal file
78
erpnext/controllers/website_list_for_contact.py
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
# Copyright (c) 2015, 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 frappe import _
|
||||||
|
from frappe.utils import flt
|
||||||
|
from frappe.utils.user import is_website_user
|
||||||
|
|
||||||
|
def get_list_context(context=None):
|
||||||
|
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"""))),
|
||||||
|
"row_template": "templates/includes/transaction_row.html",
|
||||||
|
"get_list": get_transaction_list
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_transaction_list(doctype, txt=None, filters=None, limit_start=0, limit_page_length=20):
|
||||||
|
from frappe.templates.pages.list import get_list
|
||||||
|
user = frappe.session.user
|
||||||
|
|
||||||
|
if user != "Guest" and is_website_user(user):
|
||||||
|
# find party for this contact
|
||||||
|
customers, suppliers = get_customers_suppliers(doctype, user)
|
||||||
|
if customers:
|
||||||
|
return post_process(get_list(doctype, txt, filters=[(doctype, "customer", "in", customers)],
|
||||||
|
limit_start=limit_start, limit_page_length=limit_page_length, ignore_permissions=True))
|
||||||
|
|
||||||
|
elif suppliers:
|
||||||
|
return post_process(get_list(doctype, txt, filters=[(doctype, "supplier", "in", suppliers)],
|
||||||
|
limit_start=limit_start, limit_page_length=limit_page_length, ignore_permissions=True))
|
||||||
|
|
||||||
|
else:
|
||||||
|
return []
|
||||||
|
|
||||||
|
return post_process(get_list(doctype, txt, filters, limit_start, limit_page_length))
|
||||||
|
|
||||||
|
def post_process(result):
|
||||||
|
for r in result:
|
||||||
|
r.status_percent = 0
|
||||||
|
r.status_display = []
|
||||||
|
|
||||||
|
if r.get("per_billed"):
|
||||||
|
r.status_percent += flt(r.per_billed)
|
||||||
|
r.status_display.append(_("Billed") if r.per_billed==100 else _("{0}% Billed").format(r.per_billed))
|
||||||
|
|
||||||
|
if r.get("per_delivered"):
|
||||||
|
r.status_percent += flt(r.per_delivered)
|
||||||
|
r.status_display.append(_("Delivered") if r.per_delivered==100 else _("{0}% Delivered").format(r.per_delivered))
|
||||||
|
|
||||||
|
r.status_display = ", ".join(r.status_display)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def get_customers_suppliers(doctype, user):
|
||||||
|
meta = frappe.get_meta(doctype)
|
||||||
|
contacts = frappe.get_all("Contact", fields=["customer", "supplier", "email_id"],
|
||||||
|
filters={"email_id": user})
|
||||||
|
|
||||||
|
customers = [c.customer for c in contacts if c.customer] if meta.get_field("customer") else None
|
||||||
|
suppliers = [c.supplier for c in contacts if c.supplier] if meta.get_field("supplier") else None
|
||||||
|
|
||||||
|
return customers, suppliers
|
||||||
|
|
||||||
|
def has_website_permission(doc, ptype, user, verbose=False):
|
||||||
|
doctype = doc.doctype
|
||||||
|
customers, suppliers = get_customers_suppliers(doctype, user)
|
||||||
|
if customers:
|
||||||
|
return frappe.get_all(doctype, filters=[(doctype, "customer", "in", customers),
|
||||||
|
(doctype, "name", "=", doc.name)]) and True or False
|
||||||
|
elif suppliers:
|
||||||
|
return frappe.get_all(doctype, filters=[(doctype, "suppliers", "in", suppliers),
|
||||||
|
(doctype, "name", "=", doc.name)]) and True or False
|
||||||
|
else:
|
||||||
|
return False
|
@ -20,7 +20,28 @@ notification_config = "erpnext.startup.notifications.get_notification_config"
|
|||||||
|
|
||||||
on_session_creation = "erpnext.shopping_cart.utils.set_cart_count"
|
on_session_creation = "erpnext.shopping_cart.utils.set_cart_count"
|
||||||
on_logout = "erpnext.shopping_cart.utils.clear_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"]
|
|
||||||
|
# website
|
||||||
|
update_website_context = "erpnext.shopping_cart.utils.update_website_context"
|
||||||
|
my_account_context = "erpnext.shopping_cart.utils.update_my_account_context"
|
||||||
|
|
||||||
|
website_route_rules = [
|
||||||
|
{"from_route": "/orders", "to_route": "Sales Order"},
|
||||||
|
{"from_route": "/orders/<name>", "to_route": "print", "defaults": {"doctype": "Sales Order"}},
|
||||||
|
{"from_route": "/invoices", "to_route": "Sales Invoice"},
|
||||||
|
{"from_route": "/invoices/<name>", "to_route": "print", "defaults": {"doctype": "Sales Invoice"}},
|
||||||
|
{"from_route": "/shipments", "to_route": "Delivery Note"},
|
||||||
|
{"from_route": "/shipments/<name>", "to_route": "print", "defaults": {"doctype": "Delivery Note"}},
|
||||||
|
{"from_route": "/issues", "to_route": "Issue"},
|
||||||
|
{"from_route": "/issues/<name>", "to_route": "print", "defaults": {"doctype": "Issue"}},
|
||||||
|
{"from_route": "/addresses", "to_route": "Address"},
|
||||||
|
]
|
||||||
|
|
||||||
|
has_website_permission = {
|
||||||
|
"Sales Order": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
|
"Sales Invoice": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
|
"Delivery Note": "erpnext.controllers.website_list_for_contact.has_website_permission"
|
||||||
|
}
|
||||||
|
|
||||||
dump_report_map = "erpnext.startup.report_data_map.data_map"
|
dump_report_map = "erpnext.startup.report_data_map.data_map"
|
||||||
|
|
||||||
|
@ -204,7 +204,7 @@ class ProductionOrder(Document):
|
|||||||
|
|
||||||
if holiday_list not in self.holidays:
|
if holiday_list not in self.holidays:
|
||||||
holiday_list_days = [getdate(d[0]) for d in frappe.get_all("Holiday", fields=["holiday_date"],
|
holiday_list_days = [getdate(d[0]) for d in frappe.get_all("Holiday", fields=["holiday_date"],
|
||||||
filters={"parent": holiday_list}, order_by="holiday_date", limit_page_length=0, as_list=1)]
|
filters={"parent": holiday_list}, order_by="holiday_date", as_list=1)]
|
||||||
|
|
||||||
self.holidays[holiday_list] = holiday_list_days
|
self.holidays[holiday_list] = holiday_list_days
|
||||||
|
|
||||||
|
@ -48,7 +48,6 @@
|
|||||||
.pos-item-image {
|
.pos-item-image {
|
||||||
padding-bottom: 100%;
|
padding-bottom: 100%;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-position: center;
|
|
||||||
border: 1px solid transparent;
|
border: 1px solid transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ from __future__ import unicode_literals
|
|||||||
import frappe
|
import frappe
|
||||||
import frappe.utils
|
import frappe.utils
|
||||||
from frappe.utils import cstr, flt, getdate, comma_and
|
from frappe.utils import cstr, flt, getdate, comma_and
|
||||||
from frappe import _ , msgprint
|
from frappe import _
|
||||||
from frappe.model.mapper import get_mapped_doc
|
from frappe.model.mapper import get_mapped_doc
|
||||||
|
|
||||||
from erpnext.controllers.selling_controller import SellingController
|
from erpnext.controllers.selling_controller import SellingController
|
||||||
@ -231,8 +231,12 @@ class SalesOrder(SellingController):
|
|||||||
def on_update(self):
|
def on_update(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def get_portal_page(self):
|
@staticmethod
|
||||||
return "order" if self.docstatus==1 else None
|
def get_list_context(context=None):
|
||||||
|
from erpnext.controllers.website_list_for_contact import get_list_context
|
||||||
|
list_context = get_list_context(context)
|
||||||
|
list_context["title"] = _("My Orders")
|
||||||
|
return list_context
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_material_request(source_name, target_doc=None):
|
def make_material_request(source_name, target_doc=None):
|
||||||
|
@ -12,9 +12,11 @@ from frappe.website.doctype.website_slideshow.website_slideshow import get_slide
|
|||||||
|
|
||||||
class ItemGroup(NestedSet, WebsiteGenerator):
|
class ItemGroup(NestedSet, WebsiteGenerator):
|
||||||
nsm_parent_field = 'parent_item_group'
|
nsm_parent_field = 'parent_item_group'
|
||||||
condition_field = "show_in_website"
|
website = frappe._dict(
|
||||||
template = "templates/generators/item_group.html"
|
condition_field = "show_in_website",
|
||||||
parent_website_route_field = "parent_item_group"
|
template = "templates/generators/item_group.html",
|
||||||
|
parent_website_route_field = "parent_item_group"
|
||||||
|
)
|
||||||
|
|
||||||
def autoname(self):
|
def autoname(self):
|
||||||
self.name = self.item_group_name
|
self.name = self.item_group_name
|
||||||
|
@ -8,9 +8,12 @@ from frappe.website.website_generator import WebsiteGenerator
|
|||||||
from erpnext.utilities.address_and_contact import load_address_and_contact
|
from erpnext.utilities.address_and_contact import load_address_and_contact
|
||||||
|
|
||||||
class SalesPartner(WebsiteGenerator):
|
class SalesPartner(WebsiteGenerator):
|
||||||
page_title_field = "partner_name"
|
website = frappe._dict(
|
||||||
condition_field = "show_in_website"
|
page_title_field = "partner_name",
|
||||||
template = "templates/generators/sales_partner.html"
|
condition_field = "show_in_website",
|
||||||
|
template = "templates/generators/sales_partner.html"
|
||||||
|
)
|
||||||
|
|
||||||
def onload(self):
|
def onload(self):
|
||||||
"""Load address and contacts in `__onload`"""
|
"""Load address and contacts in `__onload`"""
|
||||||
load_address_and_contact(self, "sales_partner")
|
load_address_and_contact(self, "sales_partner")
|
||||||
|
@ -6,7 +6,6 @@ import frappe
|
|||||||
|
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.utils import nowdate
|
from frappe.utils import nowdate
|
||||||
from frappe.templates.pages.style_settings import default_properties
|
|
||||||
|
|
||||||
class website_maker(object):
|
class website_maker(object):
|
||||||
def __init__(self, company, tagline, user):
|
def __init__(self, company, tagline, user):
|
||||||
@ -14,7 +13,6 @@ class website_maker(object):
|
|||||||
self.tagline = tagline
|
self.tagline = tagline
|
||||||
self.user = user
|
self.user = user
|
||||||
self.make_web_page()
|
self.make_web_page()
|
||||||
self.make_style_settings()
|
|
||||||
self.make_website_settings()
|
self.make_website_settings()
|
||||||
self.make_blog()
|
self.make_blog()
|
||||||
|
|
||||||
@ -34,12 +32,6 @@ class website_maker(object):
|
|||||||
})
|
})
|
||||||
}).insert()
|
}).insert()
|
||||||
|
|
||||||
def make_style_settings(self):
|
|
||||||
style_settings = frappe.get_doc("Style Settings", "Style Settings")
|
|
||||||
style_settings.update(default_properties)
|
|
||||||
style_settings.apply_style = 1
|
|
||||||
style_settings.save()
|
|
||||||
|
|
||||||
def make_website_settings(self):
|
def make_website_settings(self):
|
||||||
# update in home page in settings
|
# update in home page in settings
|
||||||
website_settings = frappe.get_doc("Website Settings", "Website Settings")
|
website_settings = frappe.get_doc("Website Settings", "Website Settings")
|
||||||
|
@ -5,7 +5,7 @@ from __future__ import unicode_literals
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.utils import get_fullname, flt
|
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
|
from erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings import check_shopping_cart_enabled, get_default_territory
|
||||||
|
|
||||||
# TODO
|
# TODO
|
||||||
# validate stock of each item in Website Warehouse or have a list of possible warehouses in Shopping Cart Settings
|
# validate stock of each item in Website Warehouse or have a list of possible warehouses in Shopping Cart Settings
|
||||||
@ -17,7 +17,7 @@ def get_quotation(user=None):
|
|||||||
if user == "Guest":
|
if user == "Guest":
|
||||||
raise frappe.PermissionError
|
raise frappe.PermissionError
|
||||||
|
|
||||||
is_shopping_cart_enabled()
|
check_shopping_cart_enabled()
|
||||||
party = get_party(user)
|
party = get_party(user)
|
||||||
values = {
|
values = {
|
||||||
"order_type": "Shopping Cart",
|
"order_type": "Shopping Cart",
|
||||||
|
@ -158,10 +158,13 @@ def get_shopping_cart_settings():
|
|||||||
|
|
||||||
return frappe.local.shopping_cart_settings
|
return frappe.local.shopping_cart_settings
|
||||||
|
|
||||||
|
def is_cart_enabled():
|
||||||
|
return get_shopping_cart_settings().enabled
|
||||||
|
|
||||||
def get_default_territory():
|
def get_default_territory():
|
||||||
return get_shopping_cart_settings().default_territory
|
return get_shopping_cart_settings().default_territory
|
||||||
|
|
||||||
def is_shopping_cart_enabled():
|
def check_shopping_cart_enabled():
|
||||||
if not get_shopping_cart_settings().enabled:
|
if not get_shopping_cart_settings().enabled:
|
||||||
frappe.throw(_("You need to enable Shopping Cart"), ShoppingCartSetupError)
|
frappe.throw(_("You need to enable Shopping Cart"), ShoppingCartSetupError)
|
||||||
|
|
||||||
|
@ -4,8 +4,10 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
|
from frappe import _
|
||||||
import frappe.defaults
|
import frappe.defaults
|
||||||
from frappe.utils import cint
|
from frappe.utils import cint
|
||||||
|
from erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings import is_cart_enabled
|
||||||
|
|
||||||
def show_cart_count():
|
def show_cart_count():
|
||||||
if (frappe.db.get_default("shopping_cart_enabled") and
|
if (frappe.db.get_default("shopping_cart_enabled") and
|
||||||
@ -16,32 +18,32 @@ def show_cart_count():
|
|||||||
|
|
||||||
def set_cart_count(login_manager):
|
def set_cart_count(login_manager):
|
||||||
if show_cart_count():
|
if show_cart_count():
|
||||||
from .shopping_cart.cart import set_cart_count
|
from erpnext.shopping_cart.cart import set_cart_count
|
||||||
set_cart_count()
|
set_cart_count()
|
||||||
|
|
||||||
def clear_cart_count(login_manager):
|
def clear_cart_count(login_manager):
|
||||||
if show_cart_count():
|
if show_cart_count():
|
||||||
frappe.local.cookie_manager.delete_cookie("cart_count")
|
frappe.local.cookie_manager.delete_cookie("cart_count")
|
||||||
|
|
||||||
def update_website_context(context):
|
def update_website_params(context):
|
||||||
post_login = []
|
cart_enabled = is_cart_enabled()
|
||||||
cart_enabled = cint(frappe.db.get_default("shopping_cart_enabled"))
|
|
||||||
context["shopping_cart_enabled"] = cart_enabled
|
context["shopping_cart_enabled"] = cart_enabled
|
||||||
|
|
||||||
if cart_enabled:
|
if cart_enabled:
|
||||||
post_login += [
|
post_login = [
|
||||||
{"label": "Cart", "url": "cart", "icon": "icon-shopping-cart", "class": "cart-count"},
|
{"label": _("Cart"), "url": "cart", "class": "cart-count"},
|
||||||
{"class": "divider"}
|
{"class": "divider"}
|
||||||
]
|
]
|
||||||
|
context["post_login"] = post_login + context.get("post_login", [])
|
||||||
|
|
||||||
post_login += [
|
def update_my_account_context(context):
|
||||||
{"label": "User", "url": "user", "icon": "icon-user"},
|
if is_cart_enabled():
|
||||||
{"label": "Addresses", "url": "addresses", "icon": "icon-map-marker"},
|
context["my_account_list"].append({"label": _("Cart"), "url": "cart"})
|
||||||
{"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", [])
|
context["my_account_list"].extend([
|
||||||
|
{"label": _("Orders"), "url": "orders"},
|
||||||
|
{"label": _("Invoices"), "url": "invoices"},
|
||||||
|
{"label": _("Shipments"), "url": "shipments"},
|
||||||
|
{"label": _("Issues"), "url": "tickets"},
|
||||||
|
{"label": _("Addresses"), "url": "addresses"},
|
||||||
|
])
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
# 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
|
|
||||||
|
|
||||||
def update_website_context(context):
|
|
||||||
if not context.get("favicon"):
|
|
||||||
context["favicon"] = "app/images/favicon.ico"
|
|
@ -75,9 +75,6 @@ class DeliveryNote(SellingController):
|
|||||||
for f in fieldname:
|
for f in fieldname:
|
||||||
toggle_print_hide(self.meta if key == "parent" else item_meta, f)
|
toggle_print_hide(self.meta if key == "parent" else item_meta, f)
|
||||||
|
|
||||||
def get_portal_page(self):
|
|
||||||
return "shipment" if self.docstatus==1 else None
|
|
||||||
|
|
||||||
def set_actual_qty(self):
|
def set_actual_qty(self):
|
||||||
for d in self.get('items'):
|
for d in self.get('items'):
|
||||||
if d.item_code and d.warehouse:
|
if d.item_code and d.warehouse:
|
||||||
@ -288,6 +285,13 @@ class DeliveryNote(SellingController):
|
|||||||
}
|
}
|
||||||
update_bin(args)
|
update_bin(args)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_list_context(context=None):
|
||||||
|
from erpnext.controllers.website_list_for_contact import get_list_context
|
||||||
|
list_context = get_list_context(context)
|
||||||
|
list_context["title"] = _("My Shipments")
|
||||||
|
return list_context
|
||||||
|
|
||||||
def get_invoiced_qty_map(delivery_note):
|
def get_invoiced_qty_map(delivery_note):
|
||||||
"""returns a map: {dn_detail: invoiced_qty}"""
|
"""returns a map: {dn_detail: invoiced_qty}"""
|
||||||
invoiced_qty_map = {}
|
invoiced_qty_map = {}
|
||||||
|
@ -16,10 +16,12 @@ class DuplicateVariant(frappe.ValidationError): pass
|
|||||||
class ItemTemplateCannotHaveStock(frappe.ValidationError): pass
|
class ItemTemplateCannotHaveStock(frappe.ValidationError): pass
|
||||||
|
|
||||||
class Item(WebsiteGenerator):
|
class Item(WebsiteGenerator):
|
||||||
page_title_field = "item_name"
|
website = frappe._dict(
|
||||||
condition_field = "show_in_website"
|
page_title_field = "item_name",
|
||||||
template = "templates/generators/item.html"
|
condition_field = "show_in_website",
|
||||||
parent_website_route_field = "item_group"
|
template = "templates/generators/item.html",
|
||||||
|
parent_website_route_field = "item_group",
|
||||||
|
)
|
||||||
|
|
||||||
def onload(self):
|
def onload(self):
|
||||||
super(Item, self).onload()
|
super(Item, self).onload()
|
||||||
@ -82,6 +84,8 @@ class Item(WebsiteGenerator):
|
|||||||
if self.slideshow:
|
if self.slideshow:
|
||||||
context.update(get_slideshow(self))
|
context.update(get_slideshow(self))
|
||||||
|
|
||||||
|
context["parents"] = self.get_parents(context)
|
||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
def check_warehouse_is_set_for_stock_item(self):
|
def check_warehouse_is_set_for_stock_item(self):
|
||||||
|
@ -7,14 +7,12 @@ from frappe import _
|
|||||||
|
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe.utils import now
|
from frappe.utils import now
|
||||||
|
from frappe.utils.user import is_website_user
|
||||||
|
|
||||||
class Issue(Document):
|
class Issue(Document):
|
||||||
def get_feed(self):
|
def get_feed(self):
|
||||||
return "{0}: {1}".format(_(self.status), self.subject)
|
return "{0}: {1}".format(_(self.status), self.subject)
|
||||||
|
|
||||||
def get_portal_page(self):
|
|
||||||
return "ticket"
|
|
||||||
|
|
||||||
def set_sender(self, sender):
|
def set_sender(self, sender):
|
||||||
"""Will be called by **Communication** when the Issue is created from an incoming email."""
|
"""Will be called by **Communication** when the Issue is created from an incoming email."""
|
||||||
self.raised_by = sender
|
self.raised_by = sender
|
||||||
@ -50,6 +48,24 @@ class Issue(Document):
|
|||||||
# if no date, it should be set as None and not a blank string "", as per mysql strict config
|
# if no date, it should be set as None and not a blank string "", as per mysql strict config
|
||||||
self.resolution_date = None
|
self.resolution_date = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_list_context(context=None):
|
||||||
|
return {
|
||||||
|
"title": _("My Issues"),
|
||||||
|
"get_list": get_issue_list
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_issue_list(doctype, txt, filters, limit_start, limit_page_length=20):
|
||||||
|
from frappe.templates.pages.list import get_list
|
||||||
|
user = frappe.session.user
|
||||||
|
ignore_permissions = False
|
||||||
|
if is_website_user(user):
|
||||||
|
if not filters: filters = []
|
||||||
|
filters.append(("Issue", "raised_by", "=", user))
|
||||||
|
ignore_permissions = True
|
||||||
|
|
||||||
|
return get_list(doctype, txt, filters, limit_start, limit_page_length, ignore_permissions=ignore_permissions)
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def set_status(name, status):
|
def set_status(name, status):
|
||||||
st = frappe.get_doc("Issue", name)
|
st = frappe.get_doc("Issue", name)
|
||||||
|
@ -36,3 +36,36 @@ $(function() {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block style %}
|
||||||
|
<style>
|
||||||
|
.product-link {
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-image-wrapper {
|
||||||
|
max-width: 300px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-image {
|
||||||
|
width: 100%;
|
||||||
|
height: 0;
|
||||||
|
padding-bottom: 100%;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
background-size: cover;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-image.missing-image {
|
||||||
|
border: 1px dashed {{ border_color or "#d1d8dd" }};
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-text {
|
||||||
|
padding: 15px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
{% endblock %}
|
||||||
|
@ -1,14 +1,8 @@
|
|||||||
<div class="col-sm-3">
|
<a class="product-link" href="{{ route or page_name }}">
|
||||||
<div style="height: 120px; overflow: hidden;">
|
<div class="col-sm-2 product-image-wrapper">
|
||||||
<a href="{{ route or page_name }}">
|
<div class="product-image {% if not website_image -%}missing-image{%- endif %}"
|
||||||
{%- if website_image -%}
|
{% if website_image -%} style="background-image: url({{ website_image }});" {%- endif %}>
|
||||||
<img class="product-image" style="width: 80%; margin: auto;" src="{{ website_image }}">
|
</div>
|
||||||
{%- else -%}
|
<div class="product-text small">{{ item_name }}</div>
|
||||||
{% include 'templates/includes/product_missing_image.html' %}
|
|
||||||
{%- endif -%}
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div style="height: 100px; overflow: hidden; font-size: 80%;">
|
</a>
|
||||||
<div style="margin-bottom: 2px;"><a href="{{ route or page_name }}">{{ item_name }}</a></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
@ -1,85 +0,0 @@
|
|||||||
<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.base_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, 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, currency=doc.currency) }}</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{%- endif %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- no-sidebar -->
|
|
@ -1,30 +0,0 @@
|
|||||||
<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 = format_currency(doc.grand_total, 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)s</div>\
|
|
||||||
<div class="col-md-3 text-right text-muted">%(creation)s</div>\
|
|
||||||
</div>\
|
|
||||||
</a>', doc)).appendTo($list);
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- no-sidebar -->
|
|
30
erpnext/templates/includes/transaction_row.html
Normal file
30
erpnext/templates/includes/transaction_row.html
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
{% set doc = frappe.get_doc(doc) %}
|
||||||
|
<a class="website-list-row" href="/{{ pathname }}/{{ doc.name }}" no-pjax>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-6 col-xs-7">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-9">{{ doc.customer or doc.supplier }}</div>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
{%- if doc.status_percent > 0 -%}
|
||||||
|
{%- if doc.status_percent % 100 == 0 -%}
|
||||||
|
<span class="indicator green">{{ doc.status_display }}</span>
|
||||||
|
{%- else -%}
|
||||||
|
<span class="indicator orange">{{ doc.status_display }}</span>
|
||||||
|
{%- endif -%}
|
||||||
|
{%- elif doc.status -%}
|
||||||
|
<span class="indicator">{{ doc.status }}</span>
|
||||||
|
{%- endif -%}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-2 col-xs-5 text-right">
|
||||||
|
{{ doc.get_formatted("grand_total") }}
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-2 text-muted text-right">
|
||||||
|
{{ doc.name }}
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-2 small text-muted text-right" title="{{ frappe.utils.format_datetime(doc.creation, "medium") }}">
|
||||||
|
{{ frappe.utils.pretty_date(doc.creation) }}</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
@ -1,51 +0,0 @@
|
|||||||
<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="text-muted progress">{{ _("Loading") }}...</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 -->
|
|
@ -1,6 +0,0 @@
|
|||||||
{% block title %} {{ doc.name }} {% endblock %}
|
|
||||||
|
|
||||||
{% block header %}<h2>{{ doc.name }}</h2>{% endblock %}
|
|
||||||
|
|
||||||
{% block content%}{% include "templates/includes/sale.html" %}{% endblock %}
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
|||||||
# 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 erpnext.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"))
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
|||||||
{% block title %} {{ title }} {% endblock %}
|
|
||||||
|
|
||||||
{% block header %}<h2>{{ title }}</h2>{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}{% include "templates/includes/sales_transactions.html" %}{% endblock %}
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
|||||||
# 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.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": "erpnext.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 erpnext.templates.utils import get_transaction_list
|
|
||||||
from erpnext.templates.pages.invoice import modify_status
|
|
||||||
invoices = get_transaction_list("Sales Invoice", start, ["outstanding_amount"])
|
|
||||||
for d in invoices:
|
|
||||||
modify_status(d)
|
|
||||||
return invoices
|
|
@ -1,6 +0,0 @@
|
|||||||
{% block title %} {{ doc.name }} {% endblock %}
|
|
||||||
|
|
||||||
{% block header %}<h2>{{ doc.name }}</h2>{% endblock %}
|
|
||||||
|
|
||||||
{% block content%}{% include "templates/includes/sale.html" %}{% endblock %}
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
|||||||
# 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 erpnext.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))
|
|
@ -1,5 +0,0 @@
|
|||||||
{% block title %} {{ title }} {% endblock %}
|
|
||||||
|
|
||||||
{% block header %}<h2>{{ title }}</h2>{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}{% include "templates/includes/sales_transactions.html" %}{% endblock %}
|
|
@ -1,30 +0,0 @@
|
|||||||
# 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.templates.utils import get_currency_context, get_transaction_list
|
|
||||||
from erpnext.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": "erpnext.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
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
|||||||
{% block title %} {{ doc.name }} {% endblock %}
|
|
||||||
|
|
||||||
{% block header %}<h2>{{ doc.name }}</h2>{% endblock %}
|
|
||||||
|
|
||||||
{% block content%}{% include "templates/includes/sale.html" %}{% endblock %}
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
|||||||
# 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.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
|
|
@ -1,5 +0,0 @@
|
|||||||
{% block title %} {{ title }} {% endblock %}
|
|
||||||
|
|
||||||
{% block header %}<h2>{{ title }}</h2>{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}{% include "templates/includes/sales_transactions.html" %}{% endblock %}
|
|
@ -1,25 +0,0 @@
|
|||||||
# 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.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": "erpnext.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 erpnext.templates.utils import get_transaction_list
|
|
||||||
return get_transaction_list("Delivery Note", start)
|
|
@ -21,47 +21,3 @@ def send_message(subject="Website Query", message="", sender="", status="Open"):
|
|||||||
"sent_or_received": "Received"
|
"sent_or_received": "Received"
|
||||||
})
|
})
|
||||||
comm.insert(ignore_permissions=True)
|
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
|
|
||||||
%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 }
|
|
||||||
|
@ -47,7 +47,7 @@ class TransactionBase(StatusUpdater):
|
|||||||
"ref_type": self.doctype,
|
"ref_type": self.doctype,
|
||||||
"ref_name": self.name
|
"ref_name": self.name
|
||||||
})
|
})
|
||||||
|
|
||||||
event.insert(ignore_permissions=True)
|
event.insert(ignore_permissions=True)
|
||||||
|
|
||||||
if frappe.db.exists("User", self.contact_by):
|
if frappe.db.exists("User", self.contact_by):
|
||||||
@ -87,6 +87,7 @@ class TransactionBase(StatusUpdater):
|
|||||||
if prevdoc_values[field] is not None:
|
if prevdoc_values[field] is not None:
|
||||||
self.validate_value(field, condition, prevdoc_values[field], doc)
|
self.validate_value(field, condition, prevdoc_values[field], doc)
|
||||||
|
|
||||||
|
|
||||||
def delete_events(ref_type, ref_name):
|
def delete_events(ref_type, ref_name):
|
||||||
frappe.delete_doc("Event", frappe.db.sql_list("""select name from `tabEvent`
|
frappe.delete_doc("Event", frappe.db.sql_list("""select name from `tabEvent`
|
||||||
where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)
|
where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user