Merge branch 'staging' into develop
This commit is contained in:
commit
fe1f532bc0
@ -5,7 +5,7 @@ import frappe
|
|||||||
from erpnext.hooks import regional_overrides
|
from erpnext.hooks import regional_overrides
|
||||||
from frappe.utils import getdate
|
from frappe.utils import getdate
|
||||||
|
|
||||||
__version__ = '10.1.72'
|
__version__ = '10.1.73'
|
||||||
|
|
||||||
def get_default_company(user=None):
|
def get_default_company(user=None):
|
||||||
'''Get default company for user'''
|
'''Get default company for user'''
|
||||||
|
|||||||
@ -226,7 +226,7 @@ class PurchaseInvoice(BuyingController):
|
|||||||
item.expense_account = warehouse_account[item.warehouse]["account"]
|
item.expense_account = warehouse_account[item.warehouse]["account"]
|
||||||
else:
|
else:
|
||||||
item.expense_account = stock_not_billed_account
|
item.expense_account = stock_not_billed_account
|
||||||
|
|
||||||
elif not item.expense_account and for_validate:
|
elif not item.expense_account and for_validate:
|
||||||
throw(_("Expense account is mandatory for item {0}").format(item.item_code or item.item_name))
|
throw(_("Expense account is mandatory for item {0}").format(item.item_code or item.item_name))
|
||||||
|
|
||||||
@ -379,7 +379,7 @@ class PurchaseInvoice(BuyingController):
|
|||||||
return gl_entries
|
return gl_entries
|
||||||
|
|
||||||
def make_supplier_gl_entry(self, gl_entries):
|
def make_supplier_gl_entry(self, gl_entries):
|
||||||
# Checked both rounding_adjustment and rounded_total
|
# Checked both rounding_adjustment and rounded_total
|
||||||
# because rounded_total had value even before introcution of posting GLE based on rounded total
|
# because rounded_total had value even before introcution of posting GLE based on rounded total
|
||||||
grand_total = self.rounded_total if (self.rounding_adjustment and self.rounded_total) else self.grand_total
|
grand_total = self.rounded_total if (self.rounding_adjustment and self.rounded_total) else self.grand_total
|
||||||
|
|
||||||
@ -859,7 +859,8 @@ def make_stock_entry(source_name, target_doc=None):
|
|||||||
"Purchase Invoice Item": {
|
"Purchase Invoice Item": {
|
||||||
"doctype": "Stock Entry Detail",
|
"doctype": "Stock Entry Detail",
|
||||||
"field_map": {
|
"field_map": {
|
||||||
"stock_qty": "transfer_qty"
|
"stock_qty": "transfer_qty",
|
||||||
|
"batch_no": "batch_no"
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}, target_doc)
|
}, target_doc)
|
||||||
|
|||||||
@ -189,7 +189,7 @@ class ShareTransfer(Document):
|
|||||||
if (shareholder == 'from_shareholder') else self.to_folio_no;
|
if (shareholder == 'from_shareholder') else self.to_folio_no;
|
||||||
doc.save()
|
doc.save()
|
||||||
else:
|
else:
|
||||||
if doc.folio_no != (self.from_folio_no if (shareholder == 'from_shareholder') else self.to_folio_no):
|
if doc.folio_no and doc.folio_no != (self.from_folio_no if (shareholder == 'from_shareholder') else self.to_folio_no):
|
||||||
frappe.throw(_('The folio numbers are not matching'))
|
frappe.throw(_('The folio numbers are not matching'))
|
||||||
|
|
||||||
def autoname_folio(self, shareholder, is_company=False):
|
def autoname_folio(self, shareholder, is_company=False):
|
||||||
|
|||||||
@ -79,7 +79,8 @@ class TestShareTransfer(unittest.TestCase):
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
for d in share_transfers:
|
for d in share_transfers:
|
||||||
frappe.get_doc(d).submit()
|
st = frappe.get_doc(d)
|
||||||
|
st.submit()
|
||||||
|
|
||||||
def test_invalid_share_transfer(self):
|
def test_invalid_share_transfer(self):
|
||||||
doc = frappe.get_doc({
|
doc = frappe.get_doc({
|
||||||
|
|||||||
@ -335,7 +335,7 @@ def get_due_date_from_template(template_name, posting_date, bill_date):
|
|||||||
|
|
||||||
def validate_due_date(posting_date, due_date, party_type, party, company=None, bill_date=None, template_name=None):
|
def validate_due_date(posting_date, due_date, party_type, party, company=None, bill_date=None, template_name=None):
|
||||||
if getdate(due_date) < getdate(posting_date):
|
if getdate(due_date) < getdate(posting_date):
|
||||||
frappe.throw(_("Due Date cannot be before Posting Date"))
|
frappe.throw(_("Due Date cannot be before Posting / Supplier Invoice Date"))
|
||||||
else:
|
else:
|
||||||
if not template_name: return
|
if not template_name: return
|
||||||
|
|
||||||
|
|||||||
@ -194,7 +194,7 @@
|
|||||||
{% if(!filters.show_pdc_in_print) { %}
|
{% if(!filters.show_pdc_in_print) { %}
|
||||||
<td style="text-align: right">
|
<td style="text-align: right">
|
||||||
{%= format_currency(data[i]["paid_amount"], data[i]["currency"]) %}</td>
|
{%= format_currency(data[i]["paid_amount"], data[i]["currency"]) %}</td>
|
||||||
<td style="text-align: right">{%= report.report_name === "Accounts Receivable" ? format_currency(data[i]["credit_note"], data[i]["currency"]) : format_currency(data[i]["Debit Note"], data[i]["currency"]) %} </td>
|
<td style="text-align: right">{%= report.report_name === "Accounts Receivable" ? format_currency(data[i]["credit_note"], data[i]["currency"]) : format_currency(data[i]["debit_note"], data[i]["currency"]) %} </td>
|
||||||
{% } %}
|
{% } %}
|
||||||
<td style="text-align: right">
|
<td style="text-align: right">
|
||||||
{%= format_currency(data[i]["outstanding_amount"], data[i]["currency"]) %}</td>
|
{%= format_currency(data[i]["outstanding_amount"], data[i]["currency"]) %}</td>
|
||||||
|
|||||||
@ -22,7 +22,7 @@ class AccountsReceivableSummary(ReceivablePayableReport):
|
|||||||
columns += [ args.get("party_type") + " Name::140"]
|
columns += [ args.get("party_type") + " Name::140"]
|
||||||
|
|
||||||
credit_debit_label = "Credit Note Amt" if args.get('party_type') == 'Customer' else "Debit Note Amt"
|
credit_debit_label = "Credit Note Amt" if args.get('party_type') == 'Customer' else "Debit Note Amt"
|
||||||
|
|
||||||
columns += [{
|
columns += [{
|
||||||
"label": _("Total Invoiced Amt"),
|
"label": _("Total Invoiced Amt"),
|
||||||
"fieldname": "total_invoiced_amt",
|
"fieldname": "total_invoiced_amt",
|
||||||
@ -107,7 +107,7 @@ class AccountsReceivableSummary(ReceivablePayableReport):
|
|||||||
"options": "Supplier Group",
|
"options": "Supplier Group",
|
||||||
"width": 80
|
"width": 80
|
||||||
}]
|
}]
|
||||||
|
|
||||||
columns.append({
|
columns.append({
|
||||||
"fieldname": "currency",
|
"fieldname": "currency",
|
||||||
"label": _("Currency"),
|
"label": _("Currency"),
|
||||||
@ -138,7 +138,7 @@ class AccountsReceivableSummary(ReceivablePayableReport):
|
|||||||
row += [self.get_territory(party), self.get_customer_group(party)]
|
row += [self.get_territory(party), self.get_customer_group(party)]
|
||||||
if args.get("party_type") == "Supplier":
|
if args.get("party_type") == "Supplier":
|
||||||
row += [self.get_supplier_group(party)]
|
row += [self.get_supplier_group(party)]
|
||||||
|
|
||||||
row.append(party_dict.currency)
|
row.append(party_dict.currency)
|
||||||
data.append(row)
|
data.append(row)
|
||||||
|
|
||||||
@ -162,7 +162,7 @@ class AccountsReceivableSummary(ReceivablePayableReport):
|
|||||||
for k in list(party_total[d.party]):
|
for k in list(party_total[d.party]):
|
||||||
if k != "currency":
|
if k != "currency":
|
||||||
party_total[d.party][k] += flt(d.get(k, 0))
|
party_total[d.party][k] += flt(d.get(k, 0))
|
||||||
|
|
||||||
party_total[d.party].currency = d.currency
|
party_total[d.party].currency = d.currency
|
||||||
|
|
||||||
return party_total
|
return party_total
|
||||||
|
|||||||
@ -16,8 +16,6 @@ def execute(filters=None):
|
|||||||
return [], []
|
return [], []
|
||||||
|
|
||||||
account_details = {}
|
account_details = {}
|
||||||
if not filters.get("group_by"):
|
|
||||||
filters['group_by'] = _('Group by Voucher (Consolidated)')
|
|
||||||
|
|
||||||
if filters and filters.get('print_in_account_currency') and \
|
if filters and filters.get('print_in_account_currency') and \
|
||||||
not filters.get('account'):
|
not filters.get('account'):
|
||||||
|
|||||||
@ -236,7 +236,7 @@ class GrossProfitGenerator(object):
|
|||||||
previous_stock_value = len(my_sle) > i+1 and \
|
previous_stock_value = len(my_sle) > i+1 and \
|
||||||
flt(my_sle[i+1].stock_value) or 0.0
|
flt(my_sle[i+1].stock_value) or 0.0
|
||||||
if previous_stock_value:
|
if previous_stock_value:
|
||||||
return previous_stock_value - flt(sle.stock_value)
|
return (previous_stock_value - flt(sle.stock_value)) * flt(row.qty) / abs(flt(sle.qty))
|
||||||
else:
|
else:
|
||||||
return flt(row.qty) * self.get_average_buying_rate(row, item_code)
|
return flt(row.qty) * self.get_average_buying_rate(row, item_code)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -231,6 +231,13 @@ def get_columns():
|
|||||||
"options": "Account",
|
"options": "Account",
|
||||||
"width": 300
|
"width": 300
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "currency",
|
||||||
|
"label": _("Currency"),
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"options": "Currency",
|
||||||
|
"hidden": 1
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "opening_debit",
|
"fieldname": "opening_debit",
|
||||||
"label": _("Opening (Dr)"),
|
"label": _("Opening (Dr)"),
|
||||||
@ -272,13 +279,6 @@ def get_columns():
|
|||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"options": "currency",
|
"options": "currency",
|
||||||
"width": 120
|
"width": 120
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "currency",
|
|
||||||
"label": _("Currency"),
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"options": "Currency",
|
|
||||||
"hidden": 1
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@ -57,6 +57,8 @@ class AccountsController(TransactionBase):
|
|||||||
_('{0} is blocked so this transaction cannot proceed'.format(supplier_name)), raise_exception=1)
|
_('{0} is blocked so this transaction cannot proceed'.format(supplier_name)), raise_exception=1)
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
|
|
||||||
|
self.validate_qty_is_not_zero()
|
||||||
if self.get("_action") and self._action != "update_after_submit":
|
if self.get("_action") and self._action != "update_after_submit":
|
||||||
self.set_missing_values(for_validate=True)
|
self.set_missing_values(for_validate=True)
|
||||||
|
|
||||||
@ -179,7 +181,7 @@ class AccountsController(TransactionBase):
|
|||||||
validate_due_date(self.posting_date, self.due_date,
|
validate_due_date(self.posting_date, self.due_date,
|
||||||
"Customer", self.customer, self.company, self.payment_terms_template)
|
"Customer", self.customer, self.company, self.payment_terms_template)
|
||||||
elif self.doctype == "Purchase Invoice":
|
elif self.doctype == "Purchase Invoice":
|
||||||
validate_due_date(self.posting_date, self.due_date,
|
validate_due_date(self.bill_date or self.posting_date, self.due_date,
|
||||||
"Supplier", self.supplier, self.company, self.bill_date, self.payment_terms_template)
|
"Supplier", self.supplier, self.company, self.bill_date, self.payment_terms_template)
|
||||||
|
|
||||||
def set_price_list_currency(self, buying_or_selling):
|
def set_price_list_currency(self, buying_or_selling):
|
||||||
@ -359,6 +361,11 @@ class AccountsController(TransactionBase):
|
|||||||
|
|
||||||
return gl_dict
|
return gl_dict
|
||||||
|
|
||||||
|
def validate_qty_is_not_zero(self):
|
||||||
|
for item in self.items:
|
||||||
|
if not item.qty:
|
||||||
|
frappe.throw("Item quantity can not be zero")
|
||||||
|
|
||||||
def validate_account_currency(self, account, account_currency=None):
|
def validate_account_currency(self, account, account_currency=None):
|
||||||
valid_currency = [self.company_currency]
|
valid_currency = [self.company_currency]
|
||||||
if self.get("currency") and self.currency != self.company_currency:
|
if self.get("currency") and self.currency != self.company_currency:
|
||||||
@ -405,7 +412,8 @@ class AccountsController(TransactionBase):
|
|||||||
if d.against_order:
|
if d.against_order:
|
||||||
allocated_amount = flt(d.amount)
|
allocated_amount = flt(d.amount)
|
||||||
else:
|
else:
|
||||||
allocated_amount = min(self.grand_total - advance_allocated, d.amount)
|
amount = self.rounded_total or self.grand_total
|
||||||
|
allocated_amount = min(amount - advance_allocated, d.amount)
|
||||||
advance_allocated += flt(allocated_amount)
|
advance_allocated += flt(allocated_amount)
|
||||||
|
|
||||||
self.append("advances", {
|
self.append("advances", {
|
||||||
|
|||||||
@ -12,6 +12,7 @@ from erpnext.buying.utils import validate_for_items, update_last_purchase_rate
|
|||||||
from erpnext.stock.stock_ledger import get_valuation_rate
|
from erpnext.stock.stock_ledger import get_valuation_rate
|
||||||
from erpnext.stock.doctype.stock_entry.stock_entry import get_used_alternative_items
|
from erpnext.stock.doctype.stock_entry.stock_entry import get_used_alternative_items
|
||||||
from erpnext.stock.doctype.serial_no.serial_no import get_auto_serial_nos, auto_make_serial_nos, get_serial_nos
|
from erpnext.stock.doctype.serial_no.serial_no import get_auto_serial_nos, auto_make_serial_nos, get_serial_nos
|
||||||
|
from frappe.contacts.doctype.address.address import get_address_display
|
||||||
|
|
||||||
from erpnext.accounts.doctype.budget.budget import validate_expense_against_budget
|
from erpnext.accounts.doctype.budget.budget import validate_expense_against_budget
|
||||||
from erpnext.controllers.stock_controller import StockController
|
from erpnext.controllers.stock_controller import StockController
|
||||||
@ -42,6 +43,7 @@ class BuyingController(StockController):
|
|||||||
self.set_qty_as_per_stock_uom()
|
self.set_qty_as_per_stock_uom()
|
||||||
self.validate_stock_or_nonstock_items()
|
self.validate_stock_or_nonstock_items()
|
||||||
self.validate_warehouse()
|
self.validate_warehouse()
|
||||||
|
self.set_supplier_address()
|
||||||
|
|
||||||
if self.doctype=="Purchase Invoice":
|
if self.doctype=="Purchase Invoice":
|
||||||
self.validate_purchase_receipt_if_update_stock()
|
self.validate_purchase_receipt_if_update_stock()
|
||||||
@ -113,6 +115,16 @@ class BuyingController(StockController):
|
|||||||
if not d.cost_center and lc_voucher_data and lc_voucher_data[0][1]:
|
if not d.cost_center and lc_voucher_data and lc_voucher_data[0][1]:
|
||||||
d.db_set('cost_center', lc_voucher_data[0][1])
|
d.db_set('cost_center', lc_voucher_data[0][1])
|
||||||
|
|
||||||
|
def set_supplier_address(self):
|
||||||
|
address_dict = {
|
||||||
|
'supplier_address': 'address_display',
|
||||||
|
'shipping_address': 'shipping_address_display'
|
||||||
|
}
|
||||||
|
|
||||||
|
for address_field, address_display_field in address_dict.items():
|
||||||
|
if self.get(address_field):
|
||||||
|
self.set(address_display_field, get_address_display(self.get(address_field)))
|
||||||
|
|
||||||
def set_total_in_words(self):
|
def set_total_in_words(self):
|
||||||
from frappe.utils import money_in_words
|
from frappe.utils import money_in_words
|
||||||
if self.meta.get_field("base_in_words"):
|
if self.meta.get_field("base_in_words"):
|
||||||
|
|||||||
@ -9,6 +9,7 @@ from erpnext.stock.get_item_details import get_bin_details
|
|||||||
from erpnext.stock.utils import get_incoming_rate
|
from erpnext.stock.utils import get_incoming_rate
|
||||||
from erpnext.stock.get_item_details import get_conversion_factor
|
from erpnext.stock.get_item_details import get_conversion_factor
|
||||||
from erpnext.stock.doctype.item.item import get_item_defaults, set_item_default
|
from erpnext.stock.doctype.item.item import get_item_defaults, set_item_default
|
||||||
|
from frappe.contacts.doctype.address.address import get_address_display
|
||||||
|
|
||||||
from erpnext.controllers.stock_controller import StockController
|
from erpnext.controllers.stock_controller import StockController
|
||||||
|
|
||||||
@ -16,7 +17,7 @@ class SellingController(StockController):
|
|||||||
def __setup__(self):
|
def __setup__(self):
|
||||||
if hasattr(self, "taxes"):
|
if hasattr(self, "taxes"):
|
||||||
self.flags.print_taxes_with_zero_amount = cint(frappe.db.get_single_value("Print Settings",
|
self.flags.print_taxes_with_zero_amount = cint(frappe.db.get_single_value("Print Settings",
|
||||||
"print_taxes_with_zero_amount"))
|
"print_taxes_with_zero_amount"))
|
||||||
self.flags.show_inclusive_tax_in_print = self.is_inclusive_tax()
|
self.flags.show_inclusive_tax_in_print = self.is_inclusive_tax()
|
||||||
|
|
||||||
self.print_templates = {
|
self.print_templates = {
|
||||||
@ -41,7 +42,9 @@ class SellingController(StockController):
|
|||||||
self.validate_selling_price()
|
self.validate_selling_price()
|
||||||
self.set_qty_as_per_stock_uom()
|
self.set_qty_as_per_stock_uom()
|
||||||
self.set_po_nos()
|
self.set_po_nos()
|
||||||
|
self.set_gross_profit()
|
||||||
set_default_income_account_for_item(self)
|
set_default_income_account_for_item(self)
|
||||||
|
self.set_customer_address()
|
||||||
|
|
||||||
def set_missing_values(self, for_validate=False):
|
def set_missing_values(self, for_validate=False):
|
||||||
|
|
||||||
@ -348,6 +351,23 @@ class SellingController(StockController):
|
|||||||
if po_nos and po_nos[0].get('po_no'):
|
if po_nos and po_nos[0].get('po_no'):
|
||||||
self.po_no = ', '.join(list(set([d.po_no for d in po_nos if d.po_no])))
|
self.po_no = ', '.join(list(set([d.po_no for d in po_nos if d.po_no])))
|
||||||
|
|
||||||
|
def set_gross_profit(self):
|
||||||
|
if self.doctype == "Sales Order":
|
||||||
|
for item in self.items:
|
||||||
|
item.gross_profit = flt(((item.base_rate - item.valuation_rate) * item.stock_qty), self.precision("amount", item))
|
||||||
|
|
||||||
|
|
||||||
|
def set_customer_address(self):
|
||||||
|
address_dict = {
|
||||||
|
'customer_address': 'address_display',
|
||||||
|
'shipping_address_name': 'shipping_address',
|
||||||
|
'company_address': 'company_address_display'
|
||||||
|
}
|
||||||
|
|
||||||
|
for address_field, address_display_field in address_dict.items():
|
||||||
|
if self.get(address_field):
|
||||||
|
self.set(address_display_field, get_address_display(self.get(address_field)))
|
||||||
|
|
||||||
def validate_items(self):
|
def validate_items(self):
|
||||||
# validate items to see if they have is_sales_item enabled
|
# validate items to see if they have is_sales_item enabled
|
||||||
from erpnext.controllers.buying_controller import validate_item_type
|
from erpnext.controllers.buying_controller import validate_item_type
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_events_in_timeline": 0,
|
||||||
"allow_guest_to_view": 0,
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
"allow_rename": 0,
|
"allow_rename": 0,
|
||||||
@ -991,39 +992,6 @@
|
|||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"default": "0",
|
|
||||||
"fieldname": "paid_amount",
|
|
||||||
"fieldtype": "Currency",
|
|
||||||
"hidden": 1,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Paid Amount",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 1,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 1,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_in_quick_entry": 0,
|
"allow_in_quick_entry": 0,
|
||||||
@ -1360,7 +1328,7 @@
|
|||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"menu_index": 0,
|
"menu_index": 0,
|
||||||
"modified": "2018-08-21 14:44:48.968839",
|
"modified": "2018-11-26 20:42:14.467284",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Education",
|
"module": "Education",
|
||||||
"name": "Fees",
|
"name": "Fees",
|
||||||
|
|||||||
@ -112,7 +112,10 @@ def get_fee_list(doctype, txt, filters, limit_start, limit_page_length=20, order
|
|||||||
user = frappe.session.user
|
user = frappe.session.user
|
||||||
student = frappe.db.sql("select name from `tabStudent` where student_email_id= %s", user)
|
student = frappe.db.sql("select name from `tabStudent` where student_email_id= %s", user)
|
||||||
if student:
|
if student:
|
||||||
return frappe. db.sql('''select name, program, due_date, paid_amount, outstanding_amount, grand_total from `tabFees`
|
return frappe. db.sql('''
|
||||||
|
select name, program, due_date, grand_total - outstanding_amount as paid_amount,
|
||||||
|
outstanding_amount, grand_total, currency
|
||||||
|
from `tabFees`
|
||||||
where student= %s and docstatus=1
|
where student= %s and docstatus=1
|
||||||
order by due_date asc limit {0} , {1}'''
|
order by due_date asc limit {0} , {1}'''
|
||||||
.format(limit_start, limit_page_length), student, as_dict = True)
|
.format(limit_start, limit_page_length), student, as_dict = True)
|
||||||
|
|||||||
@ -120,3 +120,16 @@ var btn_invoice_registration = function (frm) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
frappe.ui.form.on('Patient Relation', {
|
||||||
|
patient_relation_add: function(frm){
|
||||||
|
frm.fields_dict['patient_relation'].grid.get_field('patient').get_query = function(frm){
|
||||||
|
var patient_list = [];
|
||||||
|
if(!frm.doc.__islocal) patient_list.push(frm.doc.name);
|
||||||
|
$.each(frm.doc.patient_relation, function(idx, val){
|
||||||
|
if (val.patient) patient_list.push(val.patient);
|
||||||
|
});
|
||||||
|
return { filters: [['Patient', 'name', 'not in', patient_list]] };
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
@ -12,7 +12,7 @@ app_license = "GNU General Public License (v3)"
|
|||||||
source_link = "https://github.com/frappe/erpnext"
|
source_link = "https://github.com/frappe/erpnext"
|
||||||
|
|
||||||
develop_version = '12.x.x-develop'
|
develop_version = '12.x.x-develop'
|
||||||
staging_version = '11.0.3-beta.24'
|
staging_version = '11.0.3-beta.25'
|
||||||
|
|
||||||
error_report_email = "support@erpnext.com"
|
error_report_email = "support@erpnext.com"
|
||||||
|
|
||||||
|
|||||||
@ -36,10 +36,13 @@ class EmployeeBenefitClaim(Document):
|
|||||||
frappe.throw(_("Maximum benefit amount of employee {0} exceeds {1}").format(self.employee, max_benefits))
|
frappe.throw(_("Maximum benefit amount of employee {0} exceeds {1}").format(self.employee, max_benefits))
|
||||||
|
|
||||||
def validate_max_benefit_for_component(self, payroll_period):
|
def validate_max_benefit_for_component(self, payroll_period):
|
||||||
claimed_amount = self.claimed_amount
|
if self.max_amount_eligible:
|
||||||
claimed_amount += get_previous_claimed_amount(self.employee, payroll_period, component = self.earning_component)
|
claimed_amount = self.claimed_amount
|
||||||
if claimed_amount > self.max_amount_eligible:
|
claimed_amount += get_previous_claimed_amount(self.employee,
|
||||||
frappe.throw(_("Maximum amount eligible for the component {0} exceeds {1}").format(self.earning_component, self.max_amount_eligible))
|
payroll_period, component = self.earning_component)
|
||||||
|
if claimed_amount > self.max_amount_eligible:
|
||||||
|
frappe.throw(_("Maximum amount eligible for the component {0} exceeds {1}")
|
||||||
|
.format(self.earning_component, self.max_amount_eligible))
|
||||||
|
|
||||||
def validate_non_pro_rata_benefit_claim(self, max_benefits, payroll_period):
|
def validate_non_pro_rata_benefit_claim(self, max_benefits, payroll_period):
|
||||||
claimed_amount = self.claimed_amount
|
claimed_amount = self.claimed_amount
|
||||||
|
|||||||
@ -3,7 +3,9 @@
|
|||||||
|
|
||||||
frappe.ui.form.on('Holiday List', {
|
frappe.ui.form.on('Holiday List', {
|
||||||
refresh: function(frm) {
|
refresh: function(frm) {
|
||||||
frm.set_value('total_holidays', frm.doc.holidays.length);
|
if (frm.doc.holidays) {
|
||||||
|
frm.set_value('total_holidays', frm.doc.holidays.length);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
from_date: function(frm) {
|
from_date: function(frm) {
|
||||||
if (frm.doc.from_date && !frm.doc.to_date) {
|
if (frm.doc.from_date && !frm.doc.to_date) {
|
||||||
|
|||||||
@ -14,7 +14,7 @@ frappe.ui.form.on("Job Offer", {
|
|||||||
|
|
||||||
refresh: function (frm) {
|
refresh: function (frm) {
|
||||||
if ((!frm.doc.__islocal) && (frm.doc.status == 'Accepted')
|
if ((!frm.doc.__islocal) && (frm.doc.status == 'Accepted')
|
||||||
&& (frm.doc.docstatus === 1) && (!frm.doc.__onload.employee)) {
|
&& (frm.doc.docstatus === 1) && (!frm.doc.__onload || !frm.doc.__onload.employee)) {
|
||||||
frm.add_custom_button(__('Make Employee'),
|
frm.add_custom_button(__('Make Employee'),
|
||||||
function () {
|
function () {
|
||||||
erpnext.job_offer.make_employee(frm);
|
erpnext.job_offer.make_employee(frm);
|
||||||
@ -22,7 +22,7 @@ frappe.ui.form.on("Job Offer", {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(frm.doc.__onload.employee) {
|
if(frm.doc.__onload && frm.doc.__onload.employee) {
|
||||||
frm.add_custom_button(__('Show Employee'),
|
frm.add_custom_button(__('Show Employee'),
|
||||||
function () {
|
function () {
|
||||||
frappe.set_route("Form", "Employee", frm.doc.__onload.employee);
|
frappe.set_route("Form", "Employee", frm.doc.__onload.employee);
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
frappe.listview_settings['Leave Application'] = {
|
frappe.listview_settings['Leave Application'] = {
|
||||||
add_fields: ["leave_type", "employee", "employee_name", "total_leave_days", "from_date", "to_date"]
|
add_fields: ["leave_type", "employee", "employee_name", "total_leave_days", "from_date", "to_date"],
|
||||||
|
get_indicator: function (doc) {
|
||||||
|
if (doc.status === "Approved") {
|
||||||
|
return [__("Approved"), "green", "status,=,Approved"];
|
||||||
|
} else if (doc.status === "Rejected") {
|
||||||
|
return [__("Rejected"), "red", "status,=,Rejected"];
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -177,7 +177,7 @@ var calculate_earning_total = function(doc, dt, dn, reset_amount) {
|
|||||||
if(cint(tbl[i].depends_on_lwp) == 1) {
|
if(cint(tbl[i].depends_on_lwp) == 1) {
|
||||||
tbl[i].amount = Math.round(tbl[i].default_amount)*(flt(doc.payment_days) /
|
tbl[i].amount = Math.round(tbl[i].default_amount)*(flt(doc.payment_days) /
|
||||||
cint(doc.total_working_days)*100)/100;
|
cint(doc.total_working_days)*100)/100;
|
||||||
} else if(reset_amount) {
|
} else if(reset_amount && tbl[i].default_amount) {
|
||||||
tbl[i].amount = tbl[i].default_amount;
|
tbl[i].amount = tbl[i].default_amount;
|
||||||
}
|
}
|
||||||
if(!tbl[i].do_not_include_in_total) {
|
if(!tbl[i].do_not_include_in_total) {
|
||||||
@ -198,7 +198,7 @@ var calculate_ded_total = function(doc, dt, dn, reset_amount) {
|
|||||||
for(var i = 0; i < tbl.length; i++){
|
for(var i = 0; i < tbl.length; i++){
|
||||||
if(cint(tbl[i].depends_on_lwp) == 1) {
|
if(cint(tbl[i].depends_on_lwp) == 1) {
|
||||||
tbl[i].amount = Math.round(tbl[i].default_amount)*(flt(doc.payment_days)/cint(doc.total_working_days)*100)/100;
|
tbl[i].amount = Math.round(tbl[i].default_amount)*(flt(doc.payment_days)/cint(doc.total_working_days)*100)/100;
|
||||||
} else if(reset_amount) {
|
} else if(reset_amount && tbl[i].default_amount) {
|
||||||
tbl[i].amount = tbl[i].default_amount;
|
tbl[i].amount = tbl[i].default_amount;
|
||||||
}
|
}
|
||||||
if(!tbl[i].do_not_include_in_total) {
|
if(!tbl[i].do_not_include_in_total) {
|
||||||
|
|||||||
@ -26,6 +26,7 @@ class TestSalarySlip(unittest.TestCase):
|
|||||||
self.make_holiday_list()
|
self.make_holiday_list()
|
||||||
|
|
||||||
frappe.db.set_value("Company", erpnext.get_default_company(), "default_holiday_list", "Salary Slip Test Holiday List")
|
frappe.db.set_value("Company", erpnext.get_default_company(), "default_holiday_list", "Salary Slip Test Holiday List")
|
||||||
|
frappe.db.set_value("HR Settings", None, "email_salary_slip_to_employee", 0)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0)
|
frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0)
|
||||||
|
|||||||
@ -10,7 +10,8 @@
|
|||||||
"rate": 5000.0,
|
"rate": 5000.0,
|
||||||
"uom": "_Test UOM",
|
"uom": "_Test UOM",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
"source_warehouse": "_Test Warehouse - _TC"
|
"source_warehouse": "_Test Warehouse - _TC",
|
||||||
|
"allow_transfer_for_manufacture": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"amount": 2000.0,
|
"amount": 2000.0,
|
||||||
@ -21,7 +22,8 @@
|
|||||||
"rate": 1000.0,
|
"rate": 1000.0,
|
||||||
"uom": "_Test UOM",
|
"uom": "_Test UOM",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
"source_warehouse": "_Test Warehouse - _TC"
|
"source_warehouse": "_Test Warehouse - _TC",
|
||||||
|
"allow_transfer_for_manufacture": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"docstatus": 1,
|
"docstatus": 1,
|
||||||
@ -54,7 +56,8 @@
|
|||||||
"rate": 5000.0,
|
"rate": 5000.0,
|
||||||
"uom": "_Test UOM",
|
"uom": "_Test UOM",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
"source_warehouse": "_Test Warehouse - _TC"
|
"source_warehouse": "_Test Warehouse - _TC",
|
||||||
|
"allow_transfer_for_manufacture": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"amount": 2000.0,
|
"amount": 2000.0,
|
||||||
@ -65,7 +68,8 @@
|
|||||||
"rate": 1000.0,
|
"rate": 1000.0,
|
||||||
"uom": "_Test UOM",
|
"uom": "_Test UOM",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
"source_warehouse": "_Test Warehouse - _TC"
|
"source_warehouse": "_Test Warehouse - _TC",
|
||||||
|
"allow_transfer_for_manufacture": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"docstatus": 1,
|
"docstatus": 1,
|
||||||
@ -97,7 +101,8 @@
|
|||||||
"rate": 5000.0,
|
"rate": 5000.0,
|
||||||
"uom": "_Test UOM",
|
"uom": "_Test UOM",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
"source_warehouse": "_Test Warehouse - _TC"
|
"source_warehouse": "_Test Warehouse - _TC",
|
||||||
|
"allow_transfer_for_manufacture": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"amount": 3000.0,
|
"amount": 3000.0,
|
||||||
@ -109,7 +114,8 @@
|
|||||||
"rate": 1000.0,
|
"rate": 1000.0,
|
||||||
"uom": "_Test UOM",
|
"uom": "_Test UOM",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
"source_warehouse": "_Test Warehouse - _TC"
|
"source_warehouse": "_Test Warehouse - _TC",
|
||||||
|
"allow_transfer_for_manufacture": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"docstatus": 1,
|
"docstatus": 1,
|
||||||
@ -143,7 +149,8 @@
|
|||||||
"rate": 3000.0,
|
"rate": 3000.0,
|
||||||
"uom": "_Test UOM",
|
"uom": "_Test UOM",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
"source_warehouse": "_Test Warehouse - _TC"
|
"source_warehouse": "_Test Warehouse - _TC",
|
||||||
|
"allow_transfer_for_manufacture": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"docstatus": 1,
|
"docstatus": 1,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -13,3 +13,11 @@ class ManufacturingSettings(Document):
|
|||||||
def get_mins_between_operations():
|
def get_mins_between_operations():
|
||||||
return relativedelta(minutes=cint(frappe.db.get_single_value("Manufacturing Settings",
|
return relativedelta(minutes=cint(frappe.db.get_single_value("Manufacturing Settings",
|
||||||
"mins_between_operations")) or 10)
|
"mins_between_operations")) or 10)
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def is_material_consumption_enabled():
|
||||||
|
if not hasattr(frappe.local, 'material_consumption'):
|
||||||
|
frappe.local.material_consumption = cint(frappe.db.get_single_value('Manufacturing Settings',
|
||||||
|
'material_consumption'))
|
||||||
|
|
||||||
|
return frappe.local.material_consumption
|
||||||
@ -48,7 +48,7 @@ class TestProductionPlan(unittest.TestCase):
|
|||||||
filters = {'production_plan': pln.name}, as_list=1)
|
filters = {'production_plan': pln.name}, as_list=1)
|
||||||
|
|
||||||
self.assertTrue(len(work_orders), len(pln.po_items))
|
self.assertTrue(len(work_orders), len(pln.po_items))
|
||||||
|
|
||||||
for name in material_requests:
|
for name in material_requests:
|
||||||
mr = frappe.get_doc('Material Request', name[0])
|
mr = frappe.get_doc('Material Request', name[0])
|
||||||
mr.cancel()
|
mr.cancel()
|
||||||
@ -179,7 +179,7 @@ def create_production_plan(**args):
|
|||||||
mr_items = get_items_for_material_requests(pln.as_dict())
|
mr_items = get_items_for_material_requests(pln.as_dict())
|
||||||
for d in mr_items:
|
for d in mr_items:
|
||||||
pln.append('mr_items', d)
|
pln.append('mr_items', d)
|
||||||
|
|
||||||
if not args.do_not_save:
|
if not args.do_not_save:
|
||||||
pln.insert()
|
pln.insert()
|
||||||
if not args.do_not_submit:
|
if not args.do_not_submit:
|
||||||
@ -197,7 +197,7 @@ def make_bom(**args):
|
|||||||
'quantity': args.quantity or 1,
|
'quantity': args.quantity or 1,
|
||||||
'company': args.company or '_Test Company'
|
'company': args.company or '_Test Company'
|
||||||
})
|
})
|
||||||
|
|
||||||
for item in args.raw_materials:
|
for item in args.raw_materials:
|
||||||
item_doc = frappe.get_doc('Item', item)
|
item_doc = frappe.get_doc('Item', item)
|
||||||
|
|
||||||
@ -206,8 +206,8 @@ def make_bom(**args):
|
|||||||
'qty': 1,
|
'qty': 1,
|
||||||
'uom': item_doc.stock_uom,
|
'uom': item_doc.stock_uom,
|
||||||
'stock_uom': item_doc.stock_uom,
|
'stock_uom': item_doc.stock_uom,
|
||||||
'rate': item_doc.valuation_rate or args.rate
|
'rate': item_doc.valuation_rate or args.rate,
|
||||||
})
|
})
|
||||||
|
|
||||||
bom.insert(ignore_permissions=True)
|
bom.insert(ignore_permissions=True)
|
||||||
bom.submit()
|
bom.submit()
|
||||||
@ -292,6 +292,7 @@ class TestWorkOrder(unittest.TestCase):
|
|||||||
make_bom(item=fg_item, rate=1000, raw_materials = ['_Test FG Item', '_Test FG Non Stock Item'])
|
make_bom(item=fg_item, rate=1000, raw_materials = ['_Test FG Item', '_Test FG Non Stock Item'])
|
||||||
|
|
||||||
wo = make_wo_order_test_record(production_item = fg_item)
|
wo = make_wo_order_test_record(production_item = fg_item)
|
||||||
|
|
||||||
se = frappe.get_doc(make_stock_entry(wo.name, "Material Transfer for Manufacture", 1))
|
se = frappe.get_doc(make_stock_entry(wo.name, "Material Transfer for Manufacture", 1))
|
||||||
se.insert()
|
se.insert()
|
||||||
se.submit()
|
se.submit()
|
||||||
|
|||||||
@ -568,10 +568,10 @@ erpnext.patches.v11_0.remove_land_unit_icon
|
|||||||
erpnext.patches.v11_0.add_default_dispatch_notification_template
|
erpnext.patches.v11_0.add_default_dispatch_notification_template
|
||||||
erpnext.patches.v11_0.add_market_segments
|
erpnext.patches.v11_0.add_market_segments
|
||||||
erpnext.patches.v11_0.add_sales_stages
|
erpnext.patches.v11_0.add_sales_stages
|
||||||
execute:frappe.delete_doc("Page", "Sales Analytics")
|
execute:frappe.delete_doc("Page", "sales-analytics")
|
||||||
execute:frappe.delete_doc("Page", "Purchase Analytics")
|
execute:frappe.delete_doc("Page", "purchase-analytics")
|
||||||
execute:frappe.delete_doc("Page", "Stock Analytics")
|
execute:frappe.delete_doc("Page", "stock-analytics")
|
||||||
execute:frappe.delete_doc("Page", "Production Analytics")
|
execute:frappe.delete_doc("Page", "production-analytics")
|
||||||
erpnext.patches.v11_0.ewaybill_fields_gst_india #2018-11-13
|
erpnext.patches.v11_0.ewaybill_fields_gst_india #2018-11-13
|
||||||
erpnext.patches.v11_0.drop_column_max_days_allowed
|
erpnext.patches.v11_0.drop_column_max_days_allowed
|
||||||
erpnext.patches.v11_0.change_healthcare_desktop_icons
|
erpnext.patches.v11_0.change_healthcare_desktop_icons
|
||||||
|
|||||||
@ -80,15 +80,15 @@ frappe.ui.form.on("Task", {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
is_group: function(frm) {
|
is_group: function (frm) {
|
||||||
frappe.call({
|
frappe.call({
|
||||||
method:"erpnext.projects.doctype.task.task.check_if_child_exists",
|
method: "erpnext.projects.doctype.task.task.check_if_child_exists",
|
||||||
args: {
|
args: {
|
||||||
name: frm.doc.name
|
name: frm.doc.name
|
||||||
},
|
},
|
||||||
callback: function(r){
|
callback: function (r) {
|
||||||
if(r.message){
|
if (r.message.length > 0) {
|
||||||
frappe.msgprint(__('Cannot convert it to non-group. Child Tasks exist.'));
|
frappe.msgprint(__(`Cannot convert it to non-group. The following child Tasks exist: ${r.message.join(", ")}.`));
|
||||||
frm.reload_doc();
|
frm.reload_doc();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,12 +2,15 @@
|
|||||||
# License: GNU General Public License v3. See license.txt
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe, json
|
|
||||||
|
|
||||||
from frappe.utils import getdate, date_diff, add_days, cstr
|
import json
|
||||||
|
|
||||||
|
import frappe
|
||||||
from frappe import _, throw
|
from frappe import _, throw
|
||||||
|
from frappe.utils import add_days, cstr, date_diff, get_link_to_form, getdate
|
||||||
from frappe.utils.nestedset import NestedSet
|
from frappe.utils.nestedset import NestedSet
|
||||||
|
|
||||||
|
|
||||||
class CircularReferenceError(frappe.ValidationError): pass
|
class CircularReferenceError(frappe.ValidationError): pass
|
||||||
|
|
||||||
class Task(NestedSet):
|
class Task(NestedSet):
|
||||||
@ -157,8 +160,10 @@ class Task(NestedSet):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def check_if_child_exists(name):
|
def check_if_child_exists(name):
|
||||||
return frappe.db.sql("""select name from `tabTask`
|
child_tasks = frappe.get_all("Task", filters={"parent_task": name})
|
||||||
where parent_task = %s""", name)
|
child_tasks = [get_link_to_form("Task", task.name) for task in child_tasks]
|
||||||
|
return child_tasks
|
||||||
|
|
||||||
|
|
||||||
def get_project(doctype, txt, searchfield, start, page_len, filters):
|
def get_project(doctype, txt, searchfield, start, page_len, filters):
|
||||||
from erpnext.controllers.queries import get_match_cond
|
from erpnext.controllers.queries import get_match_cond
|
||||||
@ -241,4 +246,4 @@ def add_multiple_tasks(data, parent):
|
|||||||
new_task.insert()
|
new_task.insert()
|
||||||
|
|
||||||
def on_doctype_update():
|
def on_doctype_update():
|
||||||
frappe.db.add_index("Task", ["lft", "rgt"])
|
frappe.db.add_index("Task", ["lft", "rgt"])
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_events_in_timeline": 0,
|
||||||
"allow_guest_to_view": 0,
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
"allow_rename": 0,
|
"allow_rename": 0,
|
||||||
@ -444,39 +445,6 @@
|
|||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "start_date",
|
|
||||||
"fieldtype": "Date",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 1,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "User",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "User",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 1,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_in_quick_entry": 0,
|
"allow_in_quick_entry": 0,
|
||||||
@ -1032,7 +1000,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-08-28 14:44:32.912004",
|
"modified": "2018-11-15 07:58:42.629845",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Projects",
|
"module": "Projects",
|
||||||
"name": "Timesheet",
|
"name": "Timesheet",
|
||||||
|
|||||||
@ -346,6 +346,11 @@ body[data-route="pos"] .btn-more {
|
|||||||
body[data-route="pos"] .collapse-btn {
|
body[data-route="pos"] .collapse-btn {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
body[data-route="pos"] .page-actions {
|
||||||
|
max-width: 110px;
|
||||||
|
}
|
||||||
|
}
|
||||||
.price-info {
|
.price-info {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
|
|||||||
@ -33,7 +33,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
|||||||
item.margin_rate_or_amount = 0;
|
item.margin_rate_or_amount = 0;
|
||||||
item.rate_with_margin = 0;
|
item.rate_with_margin = 0;
|
||||||
}
|
}
|
||||||
item.base_rate_with_margin = item.rate_with_margin * flt(this.frm.doc.conversion_rate);
|
item.base_rate_with_margin = item.rate_with_margin * flt(frm.doc.conversion_rate);
|
||||||
|
|
||||||
cur_frm.cscript.set_gross_profit(item);
|
cur_frm.cscript.set_gross_profit(item);
|
||||||
cur_frm.cscript.calculate_taxes_and_totals();
|
cur_frm.cscript.calculate_taxes_and_totals();
|
||||||
@ -185,6 +185,12 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
is_return: function() {
|
||||||
|
if(!this.frm.doc.is_return && this.frm.doc.return_against) {
|
||||||
|
this.frm.set_value('return_against', '');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
setup_quality_inspection: function() {
|
setup_quality_inspection: function() {
|
||||||
if(!in_list(["Delivery Note", "Sales Invoice", "Purchase Receipt", "Purchase Invoice"], this.frm.doc.doctype)) {
|
if(!in_list(["Delivery Note", "Sales Invoice", "Purchase Receipt", "Purchase Invoice"], this.frm.doc.doctype)) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -44,8 +44,8 @@ erpnext.timesheet.timer = function(frm, row, timestamp=0) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
erpnext.timesheet.control_timer = function(frm, dialog, row, timestamp=0) {
|
erpnext.timesheet.control_timer = function(frm, dialog, row, timestamp=0) {
|
||||||
var $btn_start = $(".playpause .btn-start");
|
var $btn_start = dialog.$wrapper.find(".playpause .btn-start");
|
||||||
var $btn_complete = $(".playpause .btn-complete");
|
var $btn_complete = dialog.$wrapper.find(".playpause .btn-complete");
|
||||||
var interval = null;
|
var interval = null;
|
||||||
var currentIncrement = timestamp;
|
var currentIncrement = timestamp;
|
||||||
var initialised = row ? true : false;
|
var initialised = row ? true : false;
|
||||||
|
|||||||
@ -350,12 +350,17 @@ def set_tax_withholding_category(company):
|
|||||||
|
|
||||||
def set_tds_account(docs, company):
|
def set_tds_account(docs, company):
|
||||||
abbr = frappe.get_value("Company", company, "abbr")
|
abbr = frappe.get_value("Company", company, "abbr")
|
||||||
docs.extend([
|
parent_account = frappe.db.get_value("Account", filters = {"account_name": "Duties and Taxes", "company": company})
|
||||||
{
|
if parent_account:
|
||||||
"doctype": "Account", "account_name": "TDS Payable", "account_type": "Tax",
|
docs.extend([
|
||||||
"parent_account": "Duties and Taxes - {0}".format(abbr), "company": company
|
{
|
||||||
}
|
"doctype": "Account",
|
||||||
])
|
"account_name": "TDS Payable",
|
||||||
|
"account_type": "Tax",
|
||||||
|
"parent_account": parent_account,
|
||||||
|
"company": company
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
def get_tds_details(accounts, fiscal_year):
|
def get_tds_details(accounts, fiscal_year):
|
||||||
# bootstrap default tax withholding sections
|
# bootstrap default tax withholding sections
|
||||||
|
|||||||
@ -32,7 +32,6 @@ class SalesOrder(SellingController):
|
|||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
super(SalesOrder, self).validate()
|
super(SalesOrder, self).validate()
|
||||||
|
|
||||||
self.validate_order_type()
|
self.validate_order_type()
|
||||||
self.validate_delivery_date()
|
self.validate_delivery_date()
|
||||||
self.validate_proj_cust()
|
self.validate_proj_cust()
|
||||||
@ -347,9 +346,11 @@ class SalesOrder(SellingController):
|
|||||||
|
|
||||||
delivered_qty += item.delivered_qty
|
delivered_qty += item.delivered_qty
|
||||||
tot_qty += item.qty
|
tot_qty += item.qty
|
||||||
|
|
||||||
self.db_set("per_delivered", flt(delivered_qty/tot_qty) * 100,
|
if tot_qty != 0:
|
||||||
update_modified=False)
|
self.db_set("per_delivered", flt(delivered_qty/tot_qty) * 100,
|
||||||
|
update_modified=False)
|
||||||
|
|
||||||
|
|
||||||
def set_indicator(self):
|
def set_indicator(self):
|
||||||
"""Set indicator for portal"""
|
"""Set indicator for portal"""
|
||||||
|
|||||||
@ -6,8 +6,7 @@
|
|||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"doctype": "Report",
|
"doctype": "Report",
|
||||||
"idx": 0,
|
"idx": 0,
|
||||||
"is_standard": "Yes",
|
"is_standard": "Yes",
|
||||||
"letter_head": "Test",
|
|
||||||
"modified": "2018-06-01 09:39:39.604944",
|
"modified": "2018-06-01 09:39:39.604944",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Selling",
|
"module": "Selling",
|
||||||
@ -30,4 +29,4 @@
|
|||||||
"role": "Accounts User"
|
"role": "Accounts User"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -67,23 +67,17 @@ frappe.query_reports["Sales Analytics"] = {
|
|||||||
reqd: 1
|
reqd: 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"formatter": function(value, row, column, data) {
|
|
||||||
if(!value){
|
|
||||||
value = 0
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
},
|
|
||||||
get_datatable_options(options) {
|
get_datatable_options(options) {
|
||||||
return Object.assign(options, {
|
return Object.assign(options, {
|
||||||
checkboxColumn: true,
|
checkboxColumn: true,
|
||||||
events: {
|
events: {
|
||||||
onCheckRow: function(data) {
|
onCheckRow: function(data) {
|
||||||
row_name = data[2].content;
|
row_name = data[2].content;
|
||||||
row_values = data.slice(5).map(function (column) {
|
length = data.length
|
||||||
|
row_values = data.slice(4,length-1).map(function (column) {
|
||||||
return column.content;
|
return column.content;
|
||||||
})
|
})
|
||||||
|
entry = {
|
||||||
entry = {
|
|
||||||
'name':row_name,
|
'name':row_name,
|
||||||
'values':row_values
|
'values':row_values
|
||||||
}
|
}
|
||||||
@ -109,12 +103,12 @@ frappe.query_reports["Sales Analytics"] = {
|
|||||||
labels: raw_data.labels,
|
labels: raw_data.labels,
|
||||||
datasets: new_datasets
|
datasets: new_datasets
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
frappe.query_report.chart.update(new_data)
|
frappe.query_report.chart.update(new_data)
|
||||||
},200)
|
},200)
|
||||||
|
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
frappe.query_report.chart.draw(true);
|
frappe.query_report.chart.draw(true);
|
||||||
}, 800)
|
}, 800)
|
||||||
|
|||||||
@ -166,7 +166,7 @@ class Analytics(object):
|
|||||||
for entity, period_data in iteritems(self.entity_periodic_data):
|
for entity, period_data in iteritems(self.entity_periodic_data):
|
||||||
row = {
|
row = {
|
||||||
"entity": entity,
|
"entity": entity,
|
||||||
"entity_name": self.entity_names.get(entity)
|
"entity_name": self.entity_names.get(entity)
|
||||||
}
|
}
|
||||||
total = 0
|
total = 0
|
||||||
for dummy, end_date in self.periodic_daterange:
|
for dummy, end_date in self.periodic_daterange:
|
||||||
@ -177,7 +177,7 @@ class Analytics(object):
|
|||||||
|
|
||||||
row["total"] = total
|
row["total"] = total
|
||||||
self.data.append(row)
|
self.data.append(row)
|
||||||
|
|
||||||
def get_rows_by_group(self):
|
def get_rows_by_group(self):
|
||||||
self.get_periodic_data()
|
self.get_periodic_data()
|
||||||
out = []
|
out = []
|
||||||
@ -185,7 +185,7 @@ class Analytics(object):
|
|||||||
for d in reversed(self.group_entries):
|
for d in reversed(self.group_entries):
|
||||||
row = {
|
row = {
|
||||||
"entity": d.name,
|
"entity": d.name,
|
||||||
"indent": self.depth_map.get(d.name)
|
"indent": self.depth_map.get(d.name)
|
||||||
}
|
}
|
||||||
total = 0
|
total = 0
|
||||||
for dummy, end_date in self.periodic_daterange:
|
for dummy, end_date in self.periodic_daterange:
|
||||||
@ -275,7 +275,8 @@ class Analytics(object):
|
|||||||
self.parent_child_map = frappe._dict(frappe.db.sql(""" select name, supplier_group from `tabSupplier`"""))
|
self.parent_child_map = frappe._dict(frappe.db.sql(""" select name, supplier_group from `tabSupplier`"""))
|
||||||
|
|
||||||
def get_chart_data(self):
|
def get_chart_data(self):
|
||||||
labels = [d.get("label") for d in self.columns[3:]]
|
length = len(self.columns)
|
||||||
|
labels = [d.get("label") for d in self.columns[2:length-1]]
|
||||||
self.chart = {
|
self.chart = {
|
||||||
"data": {
|
"data": {
|
||||||
'labels': labels,
|
'labels': labels,
|
||||||
|
|||||||
@ -8,19 +8,23 @@ from erpnext.selling.report.sales_analytics.sales_analytics import execute
|
|||||||
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
|
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
|
||||||
|
|
||||||
class TestAnalytics(unittest.TestCase):
|
class TestAnalytics(unittest.TestCase):
|
||||||
|
def test_sales_analytics(self):
|
||||||
|
frappe.db.sql("delete from `tabSales Order` where company='_Test Company 2'")
|
||||||
|
|
||||||
def tearDown(self):
|
create_sales_orders()
|
||||||
frappe.db.sql(""" DELETE FROM `tabSales Order` """)
|
|
||||||
|
|
||||||
def test_by_entity(self):
|
self.compare_result_for_customer()
|
||||||
create_sales_order()
|
self.compare_result_for_customer_group()
|
||||||
|
self.compare_result_for_customer_based_on_quantity()
|
||||||
|
|
||||||
|
|
||||||
|
def compare_result_for_customer(self):
|
||||||
filters = {
|
filters = {
|
||||||
'doc_type': 'Sales Order',
|
'doc_type': 'Sales Order',
|
||||||
'range': 'Monthly',
|
'range': 'Monthly',
|
||||||
'to_date': '2018-03-31',
|
'to_date': '2018-03-31',
|
||||||
'tree_type': 'Customer',
|
'tree_type': 'Customer',
|
||||||
'company': '_Test Company',
|
'company': '_Test Company 2',
|
||||||
'from_date': '2017-04-01',
|
'from_date': '2017-04-01',
|
||||||
'value_quantity': 'Value'
|
'value_quantity': 'Value'
|
||||||
}
|
}
|
||||||
@ -45,23 +49,6 @@ class TestAnalytics(unittest.TestCase):
|
|||||||
"mar": 0.0,
|
"mar": 0.0,
|
||||||
"total":2000.0
|
"total":2000.0
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"entity": "_Test Customer 3",
|
|
||||||
"entity_name": "_Test Customer 3",
|
|
||||||
"apr": 0.0,
|
|
||||||
"may": 0.0,
|
|
||||||
"jun": 2000.0,
|
|
||||||
"jul": 1000.0,
|
|
||||||
"aug": 0.0,
|
|
||||||
"sep": 0.0,
|
|
||||||
"oct": 0.0,
|
|
||||||
"nov": 0.0,
|
|
||||||
"dec": 0.0,
|
|
||||||
"jan": 0.0,
|
|
||||||
"feb": 0.0,
|
|
||||||
"mar": 0.0,
|
|
||||||
"total": 3000.0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"entity": "_Test Customer 2",
|
"entity": "_Test Customer 2",
|
||||||
"entity_name": "_Test Customer 2",
|
"entity_name": "_Test Customer 2",
|
||||||
@ -78,106 +65,67 @@ class TestAnalytics(unittest.TestCase):
|
|||||||
"feb": 0.0,
|
"feb": 0.0,
|
||||||
"mar": 0.0,
|
"mar": 0.0,
|
||||||
"total":2500.0
|
"total":2500.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"entity": "_Test Customer 3",
|
||||||
|
"entity_name": "_Test Customer 3",
|
||||||
|
"apr": 0.0,
|
||||||
|
"may": 0.0,
|
||||||
|
"jun": 2000.0,
|
||||||
|
"jul": 1000.0,
|
||||||
|
"aug": 0.0,
|
||||||
|
"sep": 0.0,
|
||||||
|
"oct": 0.0,
|
||||||
|
"nov": 0.0,
|
||||||
|
"dec": 0.0,
|
||||||
|
"jan": 0.0,
|
||||||
|
"feb": 0.0,
|
||||||
|
"mar": 0.0,
|
||||||
|
"total": 3000.0
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
self.assertEqual(expected_data, report[1])
|
result = sorted(report[1], key=lambda k: k['entity'])
|
||||||
|
self.assertEqual(expected_data, result)
|
||||||
def test_by_group(self):
|
|
||||||
create_sales_order()
|
|
||||||
|
|
||||||
|
def compare_result_for_customer_group(self):
|
||||||
filters = {
|
filters = {
|
||||||
'doc_type': 'Sales Order',
|
'doc_type': 'Sales Order',
|
||||||
'range': 'Monthly',
|
'range': 'Monthly',
|
||||||
'to_date': '2018-03-31',
|
'to_date': '2018-03-31',
|
||||||
'tree_type': 'Customer Group',
|
'tree_type': 'Customer Group',
|
||||||
'company': '_Test Company',
|
'company': '_Test Company 2',
|
||||||
'from_date': '2017-04-01',
|
'from_date': '2017-04-01',
|
||||||
'value_quantity': 'Value'
|
'value_quantity': 'Value'
|
||||||
}
|
}
|
||||||
|
|
||||||
report = execute(filters)
|
report = execute(filters)
|
||||||
|
|
||||||
expected_data = [
|
expected_first_row = {
|
||||||
{
|
"entity": "All Customer Groups",
|
||||||
"entity": "All Customer Groups",
|
"indent": 0,
|
||||||
"indent": 0,
|
"apr": 0.0,
|
||||||
"apr": 0.0,
|
"may": 0.0,
|
||||||
"may": 0.0,
|
"jun": 2000.0,
|
||||||
"jun": 2000.0,
|
"jul": 1000.0,
|
||||||
"jul": 1000.0,
|
"aug": 0.0,
|
||||||
"aug": 0.0,
|
"sep": 1500.0,
|
||||||
"sep": 1500.0,
|
"oct": 1000.0,
|
||||||
"oct": 1000.0,
|
"nov": 0.0,
|
||||||
"nov": 0.0,
|
"dec": 0.0,
|
||||||
"dec": 0.0,
|
"jan": 0.0,
|
||||||
"jan": 0.0,
|
"feb": 2000.0,
|
||||||
"feb": 2000.0,
|
"mar": 0.0,
|
||||||
"mar": 0.0,
|
"total":7500.0
|
||||||
"total":7500.0
|
}
|
||||||
},
|
self.assertEqual(expected_first_row, report[1][0])
|
||||||
{
|
|
||||||
"entity": "Individual",
|
|
||||||
"indent": 1,
|
|
||||||
"apr": 0.0,
|
|
||||||
"may": 0.0,
|
|
||||||
"jun": 0.0,
|
|
||||||
"jul": 0.0,
|
|
||||||
"aug": 0.0,
|
|
||||||
"sep": 0.0,
|
|
||||||
"oct": 0.0,
|
|
||||||
"nov": 0.0,
|
|
||||||
"dec": 0.0,
|
|
||||||
"jan": 0.0,
|
|
||||||
"feb": 0.0,
|
|
||||||
"mar": 0.0,
|
|
||||||
"total": 0.0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"entity": "_Test Customer Group",
|
|
||||||
"indent": 1,
|
|
||||||
"apr": 0.0,
|
|
||||||
"may": 0.0,
|
|
||||||
"jun": 0.0,
|
|
||||||
"jul": 0.0,
|
|
||||||
"aug": 0.0,
|
|
||||||
"sep": 0.0,
|
|
||||||
"oct": 0.0,
|
|
||||||
"nov": 0.0,
|
|
||||||
"dec": 0.0,
|
|
||||||
"jan": 0.0,
|
|
||||||
"feb": 0.0,
|
|
||||||
"mar": 0.0,
|
|
||||||
"total":0.0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"entity": "_Test Customer Group 1",
|
|
||||||
"indent": 1,
|
|
||||||
"apr": 0.0,
|
|
||||||
"may": 0.0,
|
|
||||||
"jun": 0.0,
|
|
||||||
"jul": 0.0,
|
|
||||||
"aug": 0.0,
|
|
||||||
"sep": 0.0,
|
|
||||||
"oct": 0.0,
|
|
||||||
"nov": 0.0,
|
|
||||||
"dec": 0.0,
|
|
||||||
"jan": 0.0,
|
|
||||||
"feb": 0.0,
|
|
||||||
"mar": 0.0,
|
|
||||||
"total":0.0
|
|
||||||
}
|
|
||||||
]
|
|
||||||
self.assertEqual(expected_data, report[1])
|
|
||||||
|
|
||||||
def test_by_quantity(self):
|
|
||||||
create_sales_order()
|
|
||||||
|
|
||||||
|
def compare_result_for_customer_based_on_quantity(self):
|
||||||
filters = {
|
filters = {
|
||||||
'doc_type': 'Sales Order',
|
'doc_type': 'Sales Order',
|
||||||
'range': 'Monthly',
|
'range': 'Monthly',
|
||||||
'to_date': '2018-03-31',
|
'to_date': '2018-03-31',
|
||||||
'tree_type': 'Customer',
|
'tree_type': 'Customer',
|
||||||
'company': '_Test Company',
|
'company': '_Test Company 2',
|
||||||
'from_date': '2017-04-01',
|
'from_date': '2017-04-01',
|
||||||
'value_quantity': 'Quantity'
|
'value_quantity': 'Quantity'
|
||||||
}
|
}
|
||||||
@ -202,23 +150,6 @@ class TestAnalytics(unittest.TestCase):
|
|||||||
"mar": 0.0,
|
"mar": 0.0,
|
||||||
"total":20.0
|
"total":20.0
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"entity": "_Test Customer 3",
|
|
||||||
"entity_name": "_Test Customer 3",
|
|
||||||
"apr": 0.0,
|
|
||||||
"may": 0.0,
|
|
||||||
"jun": 20.0,
|
|
||||||
"jul": 10.0,
|
|
||||||
"aug": 0.0,
|
|
||||||
"sep": 0.0,
|
|
||||||
"oct": 0.0,
|
|
||||||
"nov": 0.0,
|
|
||||||
"dec": 0.0,
|
|
||||||
"jan": 0.0,
|
|
||||||
"feb": 0.0,
|
|
||||||
"mar": 0.0,
|
|
||||||
"total": 30.0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"entity": "_Test Customer 2",
|
"entity": "_Test Customer 2",
|
||||||
"entity_name": "_Test Customer 2",
|
"entity_name": "_Test Customer 2",
|
||||||
@ -235,16 +166,63 @@ class TestAnalytics(unittest.TestCase):
|
|||||||
"feb": 0.0,
|
"feb": 0.0,
|
||||||
"mar": 0.0,
|
"mar": 0.0,
|
||||||
"total":25.0
|
"total":25.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"entity": "_Test Customer 3",
|
||||||
|
"entity_name": "_Test Customer 3",
|
||||||
|
"apr": 0.0,
|
||||||
|
"may": 0.0,
|
||||||
|
"jun": 20.0,
|
||||||
|
"jul": 10.0,
|
||||||
|
"aug": 0.0,
|
||||||
|
"sep": 0.0,
|
||||||
|
"oct": 0.0,
|
||||||
|
"nov": 0.0,
|
||||||
|
"dec": 0.0,
|
||||||
|
"jan": 0.0,
|
||||||
|
"feb": 0.0,
|
||||||
|
"mar": 0.0,
|
||||||
|
"total": 30.0
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
self.assertEqual(expected_data, report[1])
|
result = sorted(report[1], key=lambda k: k['entity'])
|
||||||
|
self.assertEqual(expected_data, result)
|
||||||
|
|
||||||
def create_sales_order():
|
def create_sales_orders():
|
||||||
frappe.set_user("Administrator")
|
frappe.set_user("Administrator")
|
||||||
|
|
||||||
make_sales_order(qty=10, customer = "_Test Customer 1", transaction_date='2018-02-10')
|
make_sales_order(company="_Test Company 2", qty=10,
|
||||||
make_sales_order(qty=10, customer = "_Test Customer 1", transaction_date='2018-02-15')
|
customer = "_Test Customer 1",
|
||||||
make_sales_order(qty=15, customer = "_Test Customer 2", transaction_date='2017-09-23')
|
transaction_date = '2018-02-10',
|
||||||
make_sales_order(qty=10, customer = "_Test Customer 2", transaction_date='2017-10-10')
|
warehouse = 'Finished Goods - _TC2',
|
||||||
make_sales_order(qty=20, customer = "_Test Customer 3", transaction_date='2017-06-15')
|
currency = 'EUR')
|
||||||
make_sales_order(qty=10, customer = "_Test Customer 3", transaction_date='2017-07-10')
|
|
||||||
|
make_sales_order(company="_Test Company 2",
|
||||||
|
qty=10, customer = "_Test Customer 1",
|
||||||
|
transaction_date = '2018-02-15',
|
||||||
|
warehouse = 'Finished Goods - _TC2',
|
||||||
|
currency = 'EUR')
|
||||||
|
|
||||||
|
make_sales_order(company = "_Test Company 2",
|
||||||
|
qty=10, customer = "_Test Customer 2",
|
||||||
|
transaction_date = '2017-10-10',
|
||||||
|
warehouse='Finished Goods - _TC2',
|
||||||
|
currency = 'EUR')
|
||||||
|
|
||||||
|
make_sales_order(company="_Test Company 2",
|
||||||
|
qty=15, customer = "_Test Customer 2",
|
||||||
|
transaction_date='2017-09-23',
|
||||||
|
warehouse='Finished Goods - _TC2',
|
||||||
|
currency = 'EUR')
|
||||||
|
|
||||||
|
make_sales_order(company="_Test Company 2",
|
||||||
|
qty=20, customer = "_Test Customer 3",
|
||||||
|
transaction_date='2017-06-15',
|
||||||
|
warehouse='Finished Goods - _TC2',
|
||||||
|
currency = 'EUR')
|
||||||
|
|
||||||
|
make_sales_order(company="_Test Company 2",
|
||||||
|
qty=10, customer = "_Test Customer 3",
|
||||||
|
transaction_date='2017-07-10',
|
||||||
|
warehouse='Finished Goods - _TC2',
|
||||||
|
currency = 'EUR')
|
||||||
|
|||||||
@ -363,7 +363,8 @@ def replace_abbr(company, old, new):
|
|||||||
for d in doc:
|
for d in doc:
|
||||||
_rename_record(d)
|
_rename_record(d)
|
||||||
|
|
||||||
for dt in ["Warehouse", "Account", "Cost Center"]:
|
for dt in ["Warehouse", "Account", "Cost Center", "Department", "Location",
|
||||||
|
"Sales Taxes and Charges Template", "Purchase Taxes and Charges Template"]:
|
||||||
_rename_records(dt)
|
_rename_records(dt)
|
||||||
frappe.db.commit()
|
frappe.db.commit()
|
||||||
|
|
||||||
|
|||||||
@ -57,6 +57,7 @@
|
|||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
"show_in_website": 1,
|
"show_in_website": 1,
|
||||||
"website_warehouse": "_Test Warehouse - _TC",
|
"website_warehouse": "_Test Warehouse - _TC",
|
||||||
|
"gst_hsn_code": "999800",
|
||||||
"item_defaults": [{
|
"item_defaults": [{
|
||||||
"company": "_Test Company",
|
"company": "_Test Company",
|
||||||
"default_warehouse": "_Test Warehouse - _TC",
|
"default_warehouse": "_Test Warehouse - _TC",
|
||||||
@ -78,6 +79,7 @@
|
|||||||
"item_group": "_Test Item Group Desktops",
|
"item_group": "_Test Item Group Desktops",
|
||||||
"item_name": "_Test Item Home Desktop 100",
|
"item_name": "_Test Item Home Desktop 100",
|
||||||
"valuation_rate": 100,
|
"valuation_rate": 100,
|
||||||
|
"gst_hsn_code": "999800",
|
||||||
"item_defaults": [{
|
"item_defaults": [{
|
||||||
"company": "_Test Company",
|
"company": "_Test Company",
|
||||||
"default_warehouse": "_Test Warehouse - _TC",
|
"default_warehouse": "_Test Warehouse - _TC",
|
||||||
@ -107,6 +109,7 @@
|
|||||||
"item_group": "_Test Item Group Desktops",
|
"item_group": "_Test Item Group Desktops",
|
||||||
"item_name": "_Test Item Home Desktop 200",
|
"item_name": "_Test Item Home Desktop 200",
|
||||||
"stock_uom": "_Test UOM 1",
|
"stock_uom": "_Test UOM 1",
|
||||||
|
"gst_hsn_code": "999800",
|
||||||
"item_defaults": [{
|
"item_defaults": [{
|
||||||
"company": "_Test Company",
|
"company": "_Test Company",
|
||||||
"default_warehouse": "_Test Warehouse - _TC",
|
"default_warehouse": "_Test Warehouse - _TC",
|
||||||
@ -128,6 +131,7 @@
|
|||||||
"item_group": "_Test Item Group Desktops",
|
"item_group": "_Test Item Group Desktops",
|
||||||
"item_name": "_Test Product Bundle Item",
|
"item_name": "_Test Product Bundle Item",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
|
"gst_hsn_code": "999800",
|
||||||
"item_defaults": [{
|
"item_defaults": [{
|
||||||
"company": "_Test Company",
|
"company": "_Test Company",
|
||||||
"default_warehouse": "_Test Warehouse - _TC",
|
"default_warehouse": "_Test Warehouse - _TC",
|
||||||
@ -149,6 +153,7 @@
|
|||||||
"item_group": "_Test Item Group Desktops",
|
"item_group": "_Test Item Group Desktops",
|
||||||
"item_name": "_Test FG Item",
|
"item_name": "_Test FG Item",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
|
"gst_hsn_code": "999800",
|
||||||
"item_defaults": [{
|
"item_defaults": [{
|
||||||
"company": "_Test Company",
|
"company": "_Test Company",
|
||||||
"default_warehouse": "_Test Warehouse - _TC",
|
"default_warehouse": "_Test Warehouse - _TC",
|
||||||
@ -170,6 +175,7 @@
|
|||||||
"item_group": "_Test Item Group Desktops",
|
"item_group": "_Test Item Group Desktops",
|
||||||
"item_name": "_Test Non Stock Item",
|
"item_name": "_Test Non Stock Item",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
|
"gst_hsn_code": "999800",
|
||||||
"item_defaults": [{
|
"item_defaults": [{
|
||||||
"company": "_Test Company",
|
"company": "_Test Company",
|
||||||
"default_warehouse": "_Test Warehouse - _TC",
|
"default_warehouse": "_Test Warehouse - _TC",
|
||||||
@ -191,6 +197,7 @@
|
|||||||
"item_group": "_Test Item Group Desktops",
|
"item_group": "_Test Item Group Desktops",
|
||||||
"item_name": "_Test Serialized Item",
|
"item_name": "_Test Serialized Item",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
|
"gst_hsn_code": "999800",
|
||||||
"item_defaults": [{
|
"item_defaults": [{
|
||||||
"company": "_Test Company",
|
"company": "_Test Company",
|
||||||
"default_warehouse": "_Test Warehouse - _TC",
|
"default_warehouse": "_Test Warehouse - _TC",
|
||||||
@ -213,6 +220,7 @@
|
|||||||
"item_name": "_Test Serialized Item With Series",
|
"item_name": "_Test Serialized Item With Series",
|
||||||
"serial_no_series": "ABCD.#####",
|
"serial_no_series": "ABCD.#####",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
|
"gst_hsn_code": "999800",
|
||||||
"item_defaults": [{
|
"item_defaults": [{
|
||||||
"company": "_Test Company",
|
"company": "_Test Company",
|
||||||
"default_warehouse": "_Test Warehouse - _TC",
|
"default_warehouse": "_Test Warehouse - _TC",
|
||||||
@ -234,6 +242,7 @@
|
|||||||
"item_group": "_Test Item Group Desktops",
|
"item_group": "_Test Item Group Desktops",
|
||||||
"item_name": "_Test Item Home Desktop Manufactured",
|
"item_name": "_Test Item Home Desktop Manufactured",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
|
"gst_hsn_code": "999800",
|
||||||
"item_defaults": [{
|
"item_defaults": [{
|
||||||
"company": "_Test Company",
|
"company": "_Test Company",
|
||||||
"default_warehouse": "_Test Warehouse - _TC",
|
"default_warehouse": "_Test Warehouse - _TC",
|
||||||
@ -255,6 +264,7 @@
|
|||||||
"item_group": "_Test Item Group Desktops",
|
"item_group": "_Test Item Group Desktops",
|
||||||
"item_name": "_Test FG Item 2",
|
"item_name": "_Test FG Item 2",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
|
"gst_hsn_code": "999800",
|
||||||
"item_defaults": [{
|
"item_defaults": [{
|
||||||
"company": "_Test Company",
|
"company": "_Test Company",
|
||||||
"default_warehouse": "_Test Warehouse - _TC",
|
"default_warehouse": "_Test Warehouse - _TC",
|
||||||
@ -276,6 +286,7 @@
|
|||||||
"item_group": "_Test Item Group Desktops",
|
"item_group": "_Test Item Group Desktops",
|
||||||
"item_name": "_Test Variant Item",
|
"item_name": "_Test Variant Item",
|
||||||
"stock_uom": "_Test UOM",
|
"stock_uom": "_Test UOM",
|
||||||
|
"gst_hsn_code": "999800",
|
||||||
"has_variants": 1,
|
"has_variants": 1,
|
||||||
"item_defaults": [{
|
"item_defaults": [{
|
||||||
"company": "_Test Company",
|
"company": "_Test Company",
|
||||||
@ -312,6 +323,7 @@
|
|||||||
"item_group": "_Test Item Group",
|
"item_group": "_Test Item Group",
|
||||||
"item_name": "_Test Item Warehouse Group Wise Reorder",
|
"item_name": "_Test Item Warehouse Group Wise Reorder",
|
||||||
"apply_warehouse_wise_reorder_level": 1,
|
"apply_warehouse_wise_reorder_level": 1,
|
||||||
|
"gst_hsn_code": "999800",
|
||||||
"item_defaults": [{
|
"item_defaults": [{
|
||||||
"company": "_Test Company",
|
"company": "_Test Company",
|
||||||
"default_warehouse": "_Test Warehouse Group-C1 - _TC",
|
"default_warehouse": "_Test Warehouse Group-C1 - _TC",
|
||||||
|
|||||||
@ -53,8 +53,9 @@ def update_packing_list_item(doc, packing_item_code, qty, main_item_row, descrip
|
|||||||
pi.qty = flt(qty)
|
pi.qty = flt(qty)
|
||||||
pi.description = description
|
pi.description = description
|
||||||
if not pi.warehouse:
|
if not pi.warehouse:
|
||||||
pi.warehouse = (main_item_row.warehouse
|
pi.warehouse = (main_item_row.warehouse if ((doc.get('is_pos')
|
||||||
if (doc.get('is_pos') or not item.default_warehouse) else item.default_warehouse)
|
or not item.default_warehouse) and main_item_row.warehouse) else item.default_warehouse)
|
||||||
|
|
||||||
if not pi.batch_no:
|
if not pi.batch_no:
|
||||||
pi.batch_no = cstr(main_item_row.get("batch_no"))
|
pi.batch_no = cstr(main_item_row.get("batch_no"))
|
||||||
if not pi.target_warehouse:
|
if not pi.target_warehouse:
|
||||||
|
|||||||
@ -199,12 +199,15 @@ frappe.ui.form.on('Stock Entry', {
|
|||||||
},
|
},
|
||||||
|
|
||||||
validate_purpose_consumption: function(frm) {
|
validate_purpose_consumption: function(frm) {
|
||||||
frappe.model.get_value('Manufacturing Settings', {'name': 'Manufacturing Settings'}, 'material_consumption', function(d) {
|
frappe.call({
|
||||||
if (d.material_consumption==0 && frm.doc.purpose=="Material Consumption for Manufacture") {
|
method: "erpnext.manufacturing.doctype.manufacturing_settings.manufacturing_settings.is_material_consumption_enabled",
|
||||||
|
}).then(r => {
|
||||||
|
if (cint(r.message) == 0
|
||||||
|
&& frm.doc.purpose=="Material Consumption for Manufacture") {
|
||||||
frm.set_value("purpose", 'Manufacture');
|
frm.set_value("purpose", 'Manufacture');
|
||||||
frappe.throw(__('Material Consumption is not set in Manufacturing Settings.'));
|
frappe.throw(__('Material Consumption is not set in Manufacturing Settings.'));
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
company: function(frm) {
|
company: function(frm) {
|
||||||
|
|||||||
@ -594,22 +594,21 @@ def get_pos_profile(company, pos_profile=None, user=None):
|
|||||||
if not user:
|
if not user:
|
||||||
user = frappe.session['user']
|
user = frappe.session['user']
|
||||||
|
|
||||||
pos_profile = frappe.db.sql("""select pf.*
|
pos_profile = frappe.db.sql("""SELECT pf.*
|
||||||
from
|
FROM
|
||||||
`tabPOS Profile` pf, `tabPOS Profile User` pfu
|
`tabPOS Profile` pf LEFT JOIN `tabPOS Profile User` pfu
|
||||||
where
|
ON
|
||||||
pfu.parent = pf.name and pfu.user = %s and pf.company = %s
|
|
||||||
and pf.disabled = 0 and pfu.default=1""", (user, company), as_dict=1)
|
|
||||||
|
|
||||||
if not pos_profile:
|
|
||||||
pos_profile = frappe.db.sql("""select pf.*
|
|
||||||
from
|
|
||||||
`tabPOS Profile` pf left join `tabPOS Profile User` pfu
|
|
||||||
on
|
|
||||||
pf.name = pfu.parent
|
pf.name = pfu.parent
|
||||||
where
|
WHERE
|
||||||
ifnull(pfu.user, '') = '' and pf.company = %s
|
(
|
||||||
and pf.disabled = 0""", (company), as_dict=1)
|
(pfu.user = %(user)s AND pf.company = %(company)s AND pfu.default=1)
|
||||||
|
OR (pfu.user = %(user)s AND pfu.default=1)
|
||||||
|
OR (ifnull(pfu.user, '') = '' AND pf.company = %(company)s)
|
||||||
|
) AND pf.disabled = 0
|
||||||
|
""", {
|
||||||
|
'user': user,
|
||||||
|
'company': company
|
||||||
|
}, as_dict=1)
|
||||||
|
|
||||||
return pos_profile and pos_profile[0] or None
|
return pos_profile and pos_profile[0] or None
|
||||||
|
|
||||||
|
|||||||
@ -88,10 +88,9 @@ frappe.query_reports["Stock Analytics"] = {
|
|||||||
events: {
|
events: {
|
||||||
onCheckRow: function(data) {
|
onCheckRow: function(data) {
|
||||||
row_name = data[2].content;
|
row_name = data[2].content;
|
||||||
row_values = data.slice(6).map(function (column) {
|
row_values = data.slice(7).map(function (column) {
|
||||||
return column.content;
|
return column.content;
|
||||||
})
|
})
|
||||||
|
|
||||||
entry = {
|
entry = {
|
||||||
'name':row_name,
|
'name':row_name,
|
||||||
'values':row_values
|
'values':row_values
|
||||||
@ -118,12 +117,12 @@ frappe.query_reports["Stock Analytics"] = {
|
|||||||
labels: raw_data.labels,
|
labels: raw_data.labels,
|
||||||
datasets: new_datasets
|
datasets: new_datasets
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
frappe.query_report.chart.update(new_data)
|
frappe.query_report.chart.update(new_data)
|
||||||
},200)
|
},200)
|
||||||
|
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
frappe.query_report.chart.draw(true);
|
frappe.query_report.chart.draw(true);
|
||||||
}, 800)
|
}, 800)
|
||||||
|
|||||||
@ -167,13 +167,11 @@ def get_data(filters):
|
|||||||
return data
|
return data
|
||||||
|
|
||||||
def get_chart_data(columns):
|
def get_chart_data(columns):
|
||||||
labels = [d.get("label") for d in columns[4:]]
|
labels = [d.get("label") for d in columns[5:]]
|
||||||
chart = {
|
chart = {
|
||||||
"data": {
|
"data": {
|
||||||
'labels': labels,
|
'labels': labels,
|
||||||
'datasets':[
|
'datasets':[]
|
||||||
{ "values": ['0' for d in columns[4:]] }
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
chart["type"] = "line"
|
chart["type"] = "line"
|
||||||
|
|||||||
@ -7,7 +7,8 @@ frappe.query_reports["Stock Projected Qty"] = {
|
|||||||
"fieldname":"company",
|
"fieldname":"company",
|
||||||
"label": __("Company"),
|
"label": __("Company"),
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"options": "Company"
|
"options": "Company",
|
||||||
|
"default": frappe.defaults.get_user_default("Company")
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname":"warehouse",
|
"fieldname":"warehouse",
|
||||||
|
|||||||
@ -178,7 +178,11 @@ class update_entries_after(object):
|
|||||||
# rounding as per precision
|
# rounding as per precision
|
||||||
self.stock_value = flt(self.stock_value, self.precision)
|
self.stock_value = flt(self.stock_value, self.precision)
|
||||||
|
|
||||||
stock_value_difference = self.stock_value - self.prev_stock_value
|
if self.prev_stock_value < 0 and self.stock_value >= 0:
|
||||||
|
stock_value_difference = sle.actual_qty * self.valuation_rate
|
||||||
|
else:
|
||||||
|
stock_value_difference = self.stock_value - self.prev_stock_value
|
||||||
|
|
||||||
self.prev_stock_value = self.stock_value
|
self.prev_stock_value = self.stock_value
|
||||||
|
|
||||||
# update current sle
|
# update current sle
|
||||||
|
|||||||
@ -5,13 +5,13 @@
|
|||||||
{{ doc.program }}
|
{{ doc.program }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-2">
|
<div class="col-xs-2">
|
||||||
{{ doc.get_formatted("total_amount") }}
|
{{ frappe.utils.fmt_money(doc.grand_total, currency=doc.currency) }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-2">
|
<div class="col-xs-2">
|
||||||
{{ doc.get_formatted("paid_amount") }}
|
{{ frappe.utils.fmt_money(doc.paid_amount, currency=doc.currency) }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-2">
|
<div class="col-xs-2">
|
||||||
{{ doc.get_formatted("outstanding_amount") }}
|
{{ frappe.utils.fmt_money(doc.outstanding_amount, currency=doc.currency) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user