Enhancements to Supplier Portal (#19221)
* fix: Add Purchase Order to portal * fix: Create Customer or Supplier on first login Based on default role set in Portal Settings, a Customer or Supplier will be created when the user logs in for the first time. * fix: Styling for transaction_row * fix: Styling for RFQ page * fix: Add Purchase Invoice route - Make Purchase Invoice from PO * fix: minor - Admissions for Student role - Remove print statement
This commit is contained in:
parent
a00c98bea7
commit
38ac7f7350
@ -880,6 +880,17 @@ class PurchaseInvoice(BuyingController):
|
|||||||
# calculate totals again after applying TDS
|
# calculate totals again after applying TDS
|
||||||
self.calculate_taxes_and_totals()
|
self.calculate_taxes_and_totals()
|
||||||
|
|
||||||
|
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.update({
|
||||||
|
'show_sidebar': True,
|
||||||
|
'show_search': True,
|
||||||
|
'no_breadcrumbs': True,
|
||||||
|
'title': _('Purchase Invoices'),
|
||||||
|
})
|
||||||
|
return list_context
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_debit_note(source_name, target_doc=None):
|
def make_debit_note(source_name, target_doc=None):
|
||||||
from erpnext.controllers.sales_and_purchase_return import make_return_doc
|
from erpnext.controllers.sales_and_purchase_return import make_return_doc
|
||||||
|
@ -386,7 +386,21 @@ def make_purchase_receipt(source_name, target_doc=None):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_purchase_invoice(source_name, target_doc=None):
|
def make_purchase_invoice(source_name, target_doc=None):
|
||||||
|
return get_mapped_purchase_invoice(source_name, target_doc)
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def make_purchase_invoice_from_portal(purchase_order_name):
|
||||||
|
doc = get_mapped_purchase_invoice(purchase_order_name, ignore_permissions=True)
|
||||||
|
if doc.contact_email != frappe.session.user:
|
||||||
|
frappe.throw(_('Not Permitted'), frappe.PermissionError)
|
||||||
|
doc.save()
|
||||||
|
frappe.db.commit()
|
||||||
|
frappe.response['type'] = 'redirect'
|
||||||
|
frappe.response.location = '/purchase-invoices/' + doc.name
|
||||||
|
|
||||||
|
def get_mapped_purchase_invoice(source_name, target_doc=None, ignore_permissions=False):
|
||||||
def postprocess(source, target):
|
def postprocess(source, target):
|
||||||
|
target.flags.ignore_permissions = ignore_permissions
|
||||||
set_missing_values(source, target)
|
set_missing_values(source, target)
|
||||||
#Get the advance paid Journal Entries in Purchase Invoice Advance
|
#Get the advance paid Journal Entries in Purchase Invoice Advance
|
||||||
|
|
||||||
@ -437,7 +451,8 @@ def make_purchase_invoice(source_name, target_doc=None):
|
|||||||
"add_if_empty": True
|
"add_if_empty": True
|
||||||
}
|
}
|
||||||
|
|
||||||
doc = get_mapped_doc("Purchase Order", source_name, fields, target_doc, postprocess)
|
doc = get_mapped_doc("Purchase Order", source_name, fields,
|
||||||
|
target_doc, postprocess, ignore_permissions=ignore_permissions)
|
||||||
|
|
||||||
return doc
|
return doc
|
||||||
|
|
||||||
@ -501,6 +516,17 @@ def get_item_details(items):
|
|||||||
|
|
||||||
return item_details
|
return item_details
|
||||||
|
|
||||||
|
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.update({
|
||||||
|
'show_sidebar': True,
|
||||||
|
'show_search': True,
|
||||||
|
'no_breadcrumbs': True,
|
||||||
|
'title': _('Purchase Orders'),
|
||||||
|
})
|
||||||
|
return list_context
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def update_status(status, name):
|
def update_status(status, name):
|
||||||
po = frappe.get_doc("Purchase Order", name)
|
po = frappe.get_doc("Purchase Order", name)
|
||||||
|
@ -25,7 +25,7 @@ def get_transaction_list(doctype, txt=None, filters=None, limit_start=0, limit_p
|
|||||||
|
|
||||||
if not filters: filters = []
|
if not filters: filters = []
|
||||||
|
|
||||||
if doctype == 'Supplier Quotation':
|
if doctype in ['Supplier Quotation', 'Purchase Invoice']:
|
||||||
filters.append((doctype, 'docstatus', '<', 2))
|
filters.append((doctype, 'docstatus', '<', 2))
|
||||||
else:
|
else:
|
||||||
filters.append((doctype, 'docstatus', '=', 1))
|
filters.append((doctype, 'docstatus', '=', 1))
|
||||||
@ -175,4 +175,4 @@ def get_customer_field_name(doctype):
|
|||||||
if doctype == 'Quotation':
|
if doctype == 'Quotation':
|
||||||
return 'party_name'
|
return 'party_name'
|
||||||
else:
|
else:
|
||||||
return 'customer'
|
return 'customer'
|
||||||
|
@ -45,7 +45,10 @@ update_and_get_user_progress = "erpnext.utilities.user_progress_utils.update_def
|
|||||||
leaderboards = "erpnext.startup.leaderboard.get_leaderboards"
|
leaderboards = "erpnext.startup.leaderboard.get_leaderboards"
|
||||||
|
|
||||||
|
|
||||||
on_session_creation = "erpnext.shopping_cart.utils.set_cart_count"
|
on_session_creation = [
|
||||||
|
"erpnext.portal.utils.create_customer_or_supplier",
|
||||||
|
"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"
|
||||||
|
|
||||||
treeviews = ['Account', 'Cost Center', 'Warehouse', 'Item Group', 'Customer Group', 'Sales Person', 'Territory', 'Assessment Group', 'Department']
|
treeviews = ['Account', 'Cost Center', 'Warehouse', 'Item Group', 'Customer Group', 'Sales Person', 'Territory', 'Assessment Group', 'Department']
|
||||||
@ -102,6 +105,20 @@ website_route_rules = [
|
|||||||
"parents": [{"label": _("Supplier Quotation"), "route": "supplier-quotations"}]
|
"parents": [{"label": _("Supplier Quotation"), "route": "supplier-quotations"}]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{"from_route": "/purchase-orders", "to_route": "Purchase Order"},
|
||||||
|
{"from_route": "/purchase-orders/<path:name>", "to_route": "order",
|
||||||
|
"defaults": {
|
||||||
|
"doctype": "Purchase Order",
|
||||||
|
"parents": [{"label": _("Purchase Order"), "route": "purchase-orders"}]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{"from_route": "/purchase-invoices", "to_route": "Purchase Invoice"},
|
||||||
|
{"from_route": "/purchase-invoices/<path:name>", "to_route": "order",
|
||||||
|
"defaults": {
|
||||||
|
"doctype": "Purchase Invoice",
|
||||||
|
"parents": [{"label": _("Purchase Invoice"), "route": "purchase-invoices"}]
|
||||||
|
}
|
||||||
|
},
|
||||||
{"from_route": "/quotations", "to_route": "Quotation"},
|
{"from_route": "/quotations", "to_route": "Quotation"},
|
||||||
{"from_route": "/quotations/<path:name>", "to_route": "order",
|
{"from_route": "/quotations/<path:name>", "to_route": "order",
|
||||||
"defaults": {
|
"defaults": {
|
||||||
@ -148,6 +165,8 @@ standard_portal_menu_items = [
|
|||||||
{"title": _("Projects"), "route": "/project", "reference_doctype": "Project"},
|
{"title": _("Projects"), "route": "/project", "reference_doctype": "Project"},
|
||||||
{"title": _("Request for Quotations"), "route": "/rfq", "reference_doctype": "Request for Quotation", "role": "Supplier"},
|
{"title": _("Request for Quotations"), "route": "/rfq", "reference_doctype": "Request for Quotation", "role": "Supplier"},
|
||||||
{"title": _("Supplier Quotation"), "route": "/supplier-quotations", "reference_doctype": "Supplier Quotation", "role": "Supplier"},
|
{"title": _("Supplier Quotation"), "route": "/supplier-quotations", "reference_doctype": "Supplier Quotation", "role": "Supplier"},
|
||||||
|
{"title": _("Purchase Orders"), "route": "/purchase-orders", "reference_doctype": "Purchase Order", "role": "Supplier"},
|
||||||
|
{"title": _("Purchase Invoices"), "route": "/purchase-invoices", "reference_doctype": "Purchase Invoice", "role": "Supplier"},
|
||||||
{"title": _("Quotations"), "route": "/quotations", "reference_doctype": "Quotation", "role":"Customer"},
|
{"title": _("Quotations"), "route": "/quotations", "reference_doctype": "Quotation", "role":"Customer"},
|
||||||
{"title": _("Orders"), "route": "/orders", "reference_doctype": "Sales Order", "role":"Customer"},
|
{"title": _("Orders"), "route": "/orders", "reference_doctype": "Sales Order", "role":"Customer"},
|
||||||
{"title": _("Invoices"), "route": "/invoices", "reference_doctype": "Sales Invoice", "role":"Customer"},
|
{"title": _("Invoices"), "route": "/invoices", "reference_doctype": "Sales Invoice", "role":"Customer"},
|
||||||
@ -160,8 +179,8 @@ standard_portal_menu_items = [
|
|||||||
{"title": _("Patient Appointment"), "route": "/patient-appointments", "reference_doctype": "Patient Appointment", "role":"Patient"},
|
{"title": _("Patient Appointment"), "route": "/patient-appointments", "reference_doctype": "Patient Appointment", "role":"Patient"},
|
||||||
{"title": _("Fees"), "route": "/fees", "reference_doctype": "Fees", "role":"Student"},
|
{"title": _("Fees"), "route": "/fees", "reference_doctype": "Fees", "role":"Student"},
|
||||||
{"title": _("Newsletter"), "route": "/newsletters", "reference_doctype": "Newsletter"},
|
{"title": _("Newsletter"), "route": "/newsletters", "reference_doctype": "Newsletter"},
|
||||||
{"title": _("Admission"), "route": "/admissions", "reference_doctype": "Student Admission"},
|
{"title": _("Admission"), "route": "/admissions", "reference_doctype": "Student Admission", "role": "Student"},
|
||||||
{"title": _("Certification"), "route": "/certification", "reference_doctype": "Certification Application"},
|
{"title": _("Certification"), "route": "/certification", "reference_doctype": "Certification Application", "role": "Non Profit Portal User"},
|
||||||
{"title": _("Material Request"), "route": "/material-requests", "reference_doctype": "Material Request", "role": "Customer"},
|
{"title": _("Material Request"), "route": "/material-requests", "reference_doctype": "Material Request", "role": "Customer"},
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -181,6 +200,8 @@ has_website_permission = {
|
|||||||
"Quotation": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
"Quotation": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
"Sales Invoice": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
"Sales Invoice": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
"Supplier Quotation": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
"Supplier Quotation": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
|
"Purchase Order": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
|
"Purchase Invoice": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
"Material Request": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
"Material Request": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
"Delivery Note": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
"Delivery Note": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
"Issue": "erpnext.support.doctype.issue.issue.has_website_permission",
|
"Issue": "erpnext.support.doctype.issue.issue.has_website_permission",
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
|
from erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings import get_shopping_cart_settings
|
||||||
|
from erpnext.shopping_cart.cart import get_debtors_account
|
||||||
|
from frappe.utils.nestedset import get_root_of
|
||||||
|
|
||||||
def set_default_role(doc, method):
|
def set_default_role(doc, method):
|
||||||
'''Set customer, supplier, student, guardian based on email'''
|
'''Set customer, supplier, student, guardian based on email'''
|
||||||
@ -21,3 +24,88 @@ def set_default_role(doc, method):
|
|||||||
doc.add_roles('Student')
|
doc.add_roles('Student')
|
||||||
elif frappe.get_value('Guardian', dict(email_address=doc.email)) and 'Guardian' not in roles:
|
elif frappe.get_value('Guardian', dict(email_address=doc.email)) and 'Guardian' not in roles:
|
||||||
doc.add_roles('Guardian')
|
doc.add_roles('Guardian')
|
||||||
|
|
||||||
|
def create_customer_or_supplier():
|
||||||
|
'''Based on the default Role (Customer, Supplier), create a Customer / Supplier.
|
||||||
|
Called on_session_creation hook.
|
||||||
|
'''
|
||||||
|
user = frappe.session.user
|
||||||
|
|
||||||
|
if frappe.db.get_value('User', user, 'user_type') != 'Website User':
|
||||||
|
return
|
||||||
|
|
||||||
|
user_roles = frappe.get_roles()
|
||||||
|
portal_settings = frappe.get_single('Portal Settings')
|
||||||
|
default_role = portal_settings.default_role
|
||||||
|
|
||||||
|
if default_role not in ['Customer', 'Supplier']:
|
||||||
|
return
|
||||||
|
|
||||||
|
# create customer / supplier if the user has that role
|
||||||
|
if portal_settings.default_role and portal_settings.default_role in user_roles:
|
||||||
|
doctype = portal_settings.default_role
|
||||||
|
else:
|
||||||
|
doctype = None
|
||||||
|
|
||||||
|
if not doctype:
|
||||||
|
return
|
||||||
|
|
||||||
|
if party_exists(doctype, user):
|
||||||
|
return
|
||||||
|
|
||||||
|
party = frappe.new_doc(doctype)
|
||||||
|
fullname = frappe.utils.get_fullname(user)
|
||||||
|
|
||||||
|
if doctype == 'Customer':
|
||||||
|
cart_settings = get_shopping_cart_settings()
|
||||||
|
|
||||||
|
if cart_settings.enable_checkout:
|
||||||
|
debtors_account = get_debtors_account(cart_settings)
|
||||||
|
else:
|
||||||
|
debtors_account = ''
|
||||||
|
|
||||||
|
party.update({
|
||||||
|
"customer_name": fullname,
|
||||||
|
"customer_type": "Individual",
|
||||||
|
"customer_group": cart_settings.default_customer_group,
|
||||||
|
"territory": get_root_of("Territory")
|
||||||
|
})
|
||||||
|
|
||||||
|
if debtors_account:
|
||||||
|
party.update({
|
||||||
|
"accounts": [{
|
||||||
|
"company": cart_settings.company,
|
||||||
|
"account": debtors_account
|
||||||
|
}]
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
party.update({
|
||||||
|
"supplier_name": fullname,
|
||||||
|
"supplier_group": "All Supplier Groups",
|
||||||
|
"supplier_type": "Individual"
|
||||||
|
})
|
||||||
|
|
||||||
|
party.flags.ignore_mandatory = True
|
||||||
|
party.insert(ignore_permissions=True)
|
||||||
|
|
||||||
|
contact = frappe.new_doc("Contact")
|
||||||
|
contact.update({
|
||||||
|
"first_name": fullname,
|
||||||
|
"email_id": user
|
||||||
|
})
|
||||||
|
contact.append('links', dict(link_doctype=doctype, link_name=party.name))
|
||||||
|
contact.flags.ignore_mandatory = True
|
||||||
|
contact.insert(ignore_permissions=True)
|
||||||
|
|
||||||
|
return party
|
||||||
|
|
||||||
|
|
||||||
|
def party_exists(doctype, user):
|
||||||
|
contact_name = frappe.db.get_value("Contact", {"email_id": user})
|
||||||
|
|
||||||
|
if contact_name:
|
||||||
|
contact = frappe.get_doc('Contact', contact_name)
|
||||||
|
doctypes = [d.link_doctype for d in contact.links]
|
||||||
|
return doctype in doctypes
|
||||||
|
|
||||||
|
return False
|
||||||
|
@ -51,3 +51,30 @@
|
|||||||
width: 24px;
|
width: 24px;
|
||||||
height: 24px;
|
height: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.website-list .result {
|
||||||
|
margin-top: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result {
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.transaction-list-item {
|
||||||
|
padding: 1rem 0;
|
||||||
|
border-top: 1px solid $border-color;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
a.transaction-item-link {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
text-decoration: none;
|
||||||
|
opacity: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-indent: -9999px;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -3,13 +3,13 @@
|
|||||||
{% for d in doc.items %}
|
{% for d in doc.items %}
|
||||||
<div class="rfq-item">
|
<div class="rfq-item">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-5 col-xs-12" style="margin-bottom: 10px;margin-top: 5px;">
|
<div class="col-sm-5 col-12" style="margin-bottom: 10px;margin-top: 5px;">
|
||||||
{{ item_name_and_description(d, doc) }}
|
{{ item_name_and_description(d, doc) }}
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="col-sm-2 col-xs-2" style="margin-bottom: 10px;">
|
<!-- <div class="col-sm-2 col-2" style="margin-bottom: 10px;">
|
||||||
<textarea type="text" style="margin-top: 5px;" class="input-with-feedback form-control rfq-offer_detail" ></textarea>
|
<textarea type="text" style="margin-top: 5px;" class="input-with-feedback form-control rfq-offer_detail" ></textarea>
|
||||||
</div> -->
|
</div> -->
|
||||||
<div class="col-sm-2 col-xs-4 text-right">
|
<div class="col-sm-2 col-4 text-right">
|
||||||
<input type="text" class="form-control text-right rfq-qty" style="margin-top: 5px;display: inline-block"
|
<input type="text" class="form-control text-right rfq-qty" style="margin-top: 5px;display: inline-block"
|
||||||
value = "{{ d.get_formatted('qty') }}"
|
value = "{{ d.get_formatted('qty') }}"
|
||||||
data-idx="{{ d.idx }}">
|
data-idx="{{ d.idx }}">
|
||||||
@ -17,14 +17,14 @@
|
|||||||
{{_("UOM") + ":"+ d.uom}}
|
{{_("UOM") + ":"+ d.uom}}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2 col-xs-4 text-right">
|
<div class="col-sm-2 col-4 text-right">
|
||||||
<input type="text" class="form-control text-right rfq-rate"
|
<input type="text" class="form-control text-right rfq-rate"
|
||||||
style="margin-top: 5px;display: inline-block" value="0.00"
|
style="margin-top: 5px;display: inline-block" value="0.00"
|
||||||
data-idx="{{ d.idx }}">
|
data-idx="{{ d.idx }}">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3 col-xs-4 text-right" style="padding-top: 9px;">
|
<div class="col-sm-3 col-4 text-right" style="padding-top: 9px;">
|
||||||
{{doc.currency_symbol}} <span class="rfq-amount" data-idx="{{ d.idx }}">0.00</span>
|
{{doc.currency_symbol}} <span class="rfq-amount" data-idx="{{ d.idx }}">0.00</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
{% from "erpnext/templates/includes/macros.html" import product_image_square %}
|
{% from "erpnext/templates/includes/macros.html" import product_image_square, product_image %}
|
||||||
|
|
||||||
{% macro item_name_and_description(d, doc) %}
|
{% macro item_name_and_description(d, doc) %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-4 col-sm-2 order-image-col">
|
<div class="col-3">
|
||||||
<div class="order-image">
|
{{ product_image(d.image) }}
|
||||||
{{ product_image_square(d.image) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-8 col-sm-10">
|
<div class="col-9">
|
||||||
{{ d.item_code }}
|
{{ d.item_code }}
|
||||||
<p class="text-muted small">{{ d.description }}</p>
|
<p class="text-muted small">{{ d.description }}</p>
|
||||||
{% set supplier_part_no = frappe.db.get_value("Item Supplier", {'parent': d.item_code, 'supplier': doc.supplier}, "supplier_part_no") %}
|
{% set supplier_part_no = frappe.db.get_value("Item Supplier", {'parent': d.item_code, 'supplier': doc.supplier}, "supplier_part_no") %}
|
||||||
|
@ -1,22 +1,21 @@
|
|||||||
<div class="web-list-item transaction-list-item">
|
<div class="web-list-item transaction-list-item">
|
||||||
<a href="/{{ pathname }}/{{ doc.name }}">
|
<div class="row">
|
||||||
<div class="row">
|
<div class="col-sm-4">
|
||||||
<div class="col-sm-4" style='margin-top: -3px;'>
|
<span class="indicator small {{ doc.indicator_color or ("blue" if doc.docstatus==1 else "darkgrey") }}">
|
||||||
<span class="indicator small {{ doc.indicator_color or ("blue" if doc.docstatus==1 else "darkgrey") }}">
|
{{ doc.name }}</span>
|
||||||
{{ doc.name }}</span>
|
<div class="small text-muted transaction-time"
|
||||||
<div class="small text-muted transaction-time"
|
title="{{ frappe.utils.format_datetime(doc.modified, "medium") }}">
|
||||||
title="{{ frappe.utils.format_datetime(doc.modified, "medium") }}">
|
{{ frappe.utils.global_date_format(doc.modified) }}
|
||||||
{{ frappe.utils.global_date_format(doc.modified) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-5">
|
|
||||||
<div class="small text-muted items-preview ellipsis ellipsis-width">
|
|
||||||
{{ doc.items_preview }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-3 text-right bold">
|
|
||||||
{{ doc.get_formatted("grand_total") }}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
<div class="col-sm-5">
|
||||||
|
<div class="small text-muted items-preview ellipsis ellipsis-width">
|
||||||
|
{{ doc.items_preview }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-3 text-right bold">
|
||||||
|
{{ doc.get_formatted("grand_total") }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="transaction-item-link" href="/{{ pathname }}/{{ doc.name }}">Link</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -12,7 +12,22 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block header_actions %}
|
{% block header_actions %}
|
||||||
<a href='/printview?doctype={{ doc.doctype}}&name={{ doc.name }}&format={{ print_format }}' target="_blank" rel="noopener noreferrer">{{ _("Print") }}</a>
|
<div class="dropdown">
|
||||||
|
<button class="btn btn-outline-secondary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
||||||
|
<span>{{ _('Actions') }}</span>
|
||||||
|
<b class="caret"></b>
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu dropdown-menu-right" role="menu">
|
||||||
|
{% if doc.doctype == 'Purchase Order' %}
|
||||||
|
<a class="dropdown-item" href="/api/method/erpnext.buying.doctype.purchase_order.purchase_order.make_purchase_invoice_from_portal?purchase_order_name={{ doc.name }}" data-action="make_purchase_invoice">{{ _("Make Purchase Invoice") }}</a>
|
||||||
|
{% endif %}
|
||||||
|
<a class="dropdown-item" href='/printview?doctype={{ doc.doctype}}&name={{ doc.name }}&format={{ print_format }}'
|
||||||
|
target="_blank" rel="noopener noreferrer">
|
||||||
|
{{ _("Print") }}
|
||||||
|
</a>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block page_content %}
|
{% block page_content %}
|
||||||
@ -34,7 +49,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="small my-3">
|
<p class="small my-3">
|
||||||
{%- set party_name = doc.supplier_name if doc.doctype == 'Supplier Quotation' else doc.customer_name %}
|
{%- set party_name = doc.supplier_name if doc.doctype in ['Supplier Quotation', 'Purchase Invoice', 'Purchase Order'] else doc.customer_name %}
|
||||||
<b>{{ party_name }}</b>
|
<b>{{ party_name }}</b>
|
||||||
|
|
||||||
{% if doc.contact_display and doc.contact_display != party_name %}
|
{% if doc.contact_display and doc.contact_display != party_name %}
|
||||||
@ -172,4 +187,4 @@
|
|||||||
currency: '{{ doc.currency }}'
|
currency: '{{ doc.currency }}'
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -5,7 +5,9 @@ frappe.ready(function(){
|
|||||||
|
|
||||||
var loyalty_points_input = document.getElementById("loyalty-point-to-redeem");
|
var loyalty_points_input = document.getElementById("loyalty-point-to-redeem");
|
||||||
var loyalty_points_status = document.getElementById("loyalty-points-status");
|
var loyalty_points_status = document.getElementById("loyalty-points-status");
|
||||||
loyalty_points_input.onblur = apply_loyalty_points;
|
if (loyalty_points_input) {
|
||||||
|
loyalty_points_input.onblur = apply_loyalty_points;
|
||||||
|
}
|
||||||
|
|
||||||
function apply_loyalty_points() {
|
function apply_loyalty_points() {
|
||||||
var loyalty_points = parseInt(loyalty_points_input.value);
|
var loyalty_points = parseInt(loyalty_points_input.value);
|
||||||
@ -37,4 +39,4 @@ frappe.ready(function(){
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -22,10 +22,10 @@
|
|||||||
|
|
||||||
{% block page_content %}
|
{% block page_content %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-6">
|
<div class="col-6">
|
||||||
<div class="rfq-supplier">{{ doc.supplier }}</div>
|
<div class="rfq-supplier">{{ doc.supplier }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-6 text-muted text-right h6">
|
<div class="col-6 text-muted text-right h6">
|
||||||
{{ doc.get_formatted("transaction_date") }}
|
{{ doc.get_formatted("transaction_date") }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -33,16 +33,16 @@
|
|||||||
<div id="order-container">
|
<div id="order-container">
|
||||||
<div id="rfq-items">
|
<div id="rfq-items">
|
||||||
<div class="row cart-item-header">
|
<div class="row cart-item-header">
|
||||||
<div class="col-sm-5 col-xs-12">
|
<div class="col-sm-5 col-12">
|
||||||
{{ _("Items") }}
|
{{ _("Items") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2 col-xs-4 text-right">
|
<div class="col-sm-2 col-4 text-right">
|
||||||
{{ _("Qty") }}
|
{{ _("Qty") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2 col-xs-4 text-right">
|
<div class="col-sm-2 col-4 text-right">
|
||||||
{{ _("Rate") }}
|
{{ _("Rate") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3 col-xs-4 text-right">
|
<div class="col-sm-3 col-4 text-right">
|
||||||
{{ _("Amount") }}
|
{{ _("Amount") }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -55,30 +55,29 @@
|
|||||||
</div>
|
</div>
|
||||||
{% if doc.items %}
|
{% if doc.items %}
|
||||||
<div class="row grand-total-row">
|
<div class="row grand-total-row">
|
||||||
<div class="col-xs-9 text-right">{{ _("Grand Total") }}</div>
|
<div class="col-9 text-right">{{ _("Grand Total") }}</div>
|
||||||
<div class="col-xs-3 text-right">
|
<div class="col-3 text-right">
|
||||||
{{doc.currency_symbol}} <span class="tax-grand-total">0.0</span>
|
{{doc.currency_symbol}} <span class="tax-grand-total">0.0</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="row terms">
|
<div class="row terms">
|
||||||
<div class="col-xs-6">
|
<div class="col-6">
|
||||||
<br><br>
|
<br><br>
|
||||||
<p class="text-muted small">{{ _("Notes: ") }}</p>
|
<p class="text-muted small">{{ _("Notes: ") }}</p>
|
||||||
<textarea class="form-control terms-feedback" style="height: 100px;"></textarea>
|
<textarea class="form-control terms-feedback" style="height: 100px;"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<div class="row mt-5">
|
||||||
<div class="row">
|
<div class="col-12">
|
||||||
<div class="result">
|
<p class="text-muted small">{{ _("Quotations: ") }}</p>
|
||||||
<div class="col-xs-12">
|
{% if doc.rfq_links %}
|
||||||
<p class="text-muted small">{{ _("Quotations: ") }}</p>
|
<div class="result">
|
||||||
{% if doc.rfq_links %}
|
|
||||||
{% for d in doc.rfq_links %}
|
{% for d in doc.rfq_links %}
|
||||||
<div class="web-list-item transaction-list-item quotations" idx="{{d.name}}">
|
<div class="web-list-item transaction-list-item quotations" idx="{{d.name}}">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<span class="indicator darkgrey"><a href="/quotations/{{d.name}}">{{d.name}}</a></span>
|
<span class="indicator darkgrey">{{d.name}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3">
|
<div class="col-sm-3">
|
||||||
<span class="small darkgrey">{{d.status}}</span>
|
<span class="small darkgrey">{{d.status}}</span>
|
||||||
@ -87,10 +86,11 @@
|
|||||||
<span class="small darkgrey">{{d.transaction_date}}</span>
|
<span class="small darkgrey">{{d.transaction_date}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<a class="transaction-item-link" href="/quotations/{{d.name}}">Link</a>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
</div>
|
||||||
</div>
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user