Merge branch 'hotfix'
This commit is contained in:
commit
c32f8eb0cb
@ -5,7 +5,7 @@ import frappe
|
||||
from erpnext.hooks import regional_overrides
|
||||
from frappe.utils import getdate
|
||||
|
||||
__version__ = '11.1.18'
|
||||
__version__ = '11.1.19'
|
||||
|
||||
def get_default_company(user=None):
|
||||
'''Get default company for user'''
|
||||
@ -144,4 +144,15 @@ def is_member():
|
||||
last_membership = get_last_membership()
|
||||
if last_membership and getdate(last_membership.to_date) > getdate():
|
||||
return True
|
||||
return False
|
||||
return False
|
||||
|
||||
def check_branch_compatibility_with_frappe():
|
||||
from frappe.utils.change_log import get_versions
|
||||
versions = get_versions()
|
||||
frappe_branch = versions["frappe"]["branch"]
|
||||
erpnext_branch = versions["erpnext"]["branch"]
|
||||
|
||||
if frappe_branch in ("hotfix", "master") and erpnext_branch == "develop":
|
||||
raise frappe.IncompatibleApp("Frappe is on branch: {} and ERPNext is on branch: {}".format(frappe_branch, erpnext_branch))
|
||||
if erpnext_branch in ("hotfix", "master") and frappe_branch == "develop":
|
||||
raise frappe.IncompatibleApp("Frappe is on branch: {} and ERPNext is on branch: {}".format(frappe_branch, erpnext_branch))
|
||||
|
@ -6,6 +6,7 @@ import frappe, erpnext
|
||||
from frappe import _
|
||||
from frappe.utils import flt, fmt_money, getdate, formatdate
|
||||
from frappe.model.document import Document
|
||||
from frappe.model.meta import get_field_precision
|
||||
from erpnext.accounts.party import validate_party_gle_currency, validate_party_frozen_disabled
|
||||
from erpnext.accounts.utils import get_account_currency
|
||||
from erpnext.accounts.utils import get_fiscal_year
|
||||
@ -56,7 +57,7 @@ class GLEntry(Document):
|
||||
.format(self.voucher_type, self.voucher_no, self.account))
|
||||
|
||||
# Zero value transaction is not allowed
|
||||
if not (flt(self.debit) or flt(self.credit)):
|
||||
if not (flt(self.debit, self.precision("debit")) or flt(self.credit, self.precision("credit"))):
|
||||
frappe.throw(_("{0} {1}: Either debit or credit amount is required for {2}")
|
||||
.format(self.voucher_type, self.voucher_no, self.account))
|
||||
|
||||
@ -216,17 +217,23 @@ def validate_frozen_account(account, adv_adj=None):
|
||||
def update_against_account(voucher_type, voucher_no):
|
||||
entries = frappe.db.get_all("GL Entry",
|
||||
filters={"voucher_type": voucher_type, "voucher_no": voucher_no},
|
||||
fields=["name", "party", "against", "debit", "credit", "account"])
|
||||
fields=["name", "party", "against", "debit", "credit", "account", "company"])
|
||||
|
||||
if not entries:
|
||||
return
|
||||
company_currency = erpnext.get_company_currency(entries[0].company)
|
||||
precision = get_field_precision(frappe.get_meta("GL Entry")
|
||||
.get_field("debit"), company_currency)
|
||||
|
||||
accounts_debited, accounts_credited = [], []
|
||||
for d in entries:
|
||||
if flt(d.debit > 0): accounts_debited.append(d.party or d.account)
|
||||
if flt(d.credit) > 0: accounts_credited.append(d.party or d.account)
|
||||
if flt(d.debit, precision) > 0: accounts_debited.append(d.party or d.account)
|
||||
if flt(d.credit, precision) > 0: accounts_credited.append(d.party or d.account)
|
||||
|
||||
for d in entries:
|
||||
if flt(d.debit > 0):
|
||||
if flt(d.debit, precision) > 0:
|
||||
new_against = ", ".join(list(set(accounts_credited)))
|
||||
if flt(d.credit > 0):
|
||||
if flt(d.credit, precision) > 0:
|
||||
new_against = ", ".join(list(set(accounts_debited)))
|
||||
|
||||
if d.against != new_against:
|
||||
|
@ -232,6 +232,13 @@ frappe.ui.form.on('Payment Entry', {
|
||||
},
|
||||
|
||||
party_type: function(frm) {
|
||||
|
||||
let party_types = Object.keys(frappe.boot.party_account_types);
|
||||
if(frm.doc.party_type && !party_types.includes(frm.doc.party_type)){
|
||||
frm.set_value("party_type", "");
|
||||
frappe.throw(__("Party can only be one of "+ party_types.join(", ")));
|
||||
}
|
||||
|
||||
if(frm.doc.party) {
|
||||
$.each(["party", "party_balance", "paid_from", "paid_to",
|
||||
"paid_from_account_currency", "paid_from_account_balance",
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -749,7 +749,7 @@ def get_outstanding_on_journal_entry(name):
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_reference_details(reference_doctype, reference_name, party_account_currency):
|
||||
total_amount = outstanding_amount = exchange_rate = None
|
||||
total_amount = outstanding_amount = exchange_rate = bill_no = None
|
||||
ref_doc = frappe.get_doc(reference_doctype, reference_name)
|
||||
company_currency = ref_doc.get("company_currency") or erpnext.get_company_currency(ref_doc.company)
|
||||
|
||||
@ -783,6 +783,7 @@ def get_reference_details(reference_doctype, reference_name, party_account_curre
|
||||
|
||||
if reference_doctype in ("Sales Invoice", "Purchase Invoice"):
|
||||
outstanding_amount = ref_doc.get("outstanding_amount")
|
||||
bill_no = ref_doc.get("bill_no")
|
||||
elif reference_doctype == "Expense Claim":
|
||||
outstanding_amount = flt(ref_doc.get("total_sanctioned_amount")) \
|
||||
- flt(ref_doc.get("total_amount+reimbursed")) - flt(ref_doc.get("total_advance_amount"))
|
||||
@ -799,7 +800,8 @@ def get_reference_details(reference_doctype, reference_name, party_account_curre
|
||||
"due_date": ref_doc.get("due_date"),
|
||||
"total_amount": total_amount,
|
||||
"outstanding_amount": outstanding_amount,
|
||||
"exchange_rate": exchange_rate
|
||||
"exchange_rate": exchange_rate,
|
||||
"bill_no": bill_no
|
||||
})
|
||||
|
||||
|
||||
|
@ -468,7 +468,7 @@ cur_frm.fields_dict["items"].grid.get_field("cost_center").get_query = function(
|
||||
|
||||
cur_frm.cscript.cost_center = function(doc, cdt, cdn){
|
||||
var d = locals[cdt][cdn];
|
||||
if(d.idx == 1 && d.cost_center){
|
||||
if(d.cost_center){
|
||||
var cl = doc.items || [];
|
||||
for(var i = 0; i < cl.length; i++){
|
||||
if(!cl[i].cost_center) cl[i].cost_center = d.cost_center;
|
||||
|
@ -107,26 +107,28 @@
|
||||
<thead>
|
||||
<tr>
|
||||
{% if(report.report_name === "Accounts Receivable" || report.report_name === "Accounts Payable") { %}
|
||||
<th style="width: 7%">{%= __("Date") %}</th>
|
||||
<th style="width: 7%">{%= __("Age (Days)") %}</th>
|
||||
<th style="width: 13%">{%= __("Reference") %}</th>
|
||||
{% if(report.report_name === "Accounts Receivable") { %}
|
||||
<th style="width: 10%">{%= __("Sales Person") %}</th>
|
||||
<th style="width: 9%">{%= __("Date") %}</th>
|
||||
<th style="width: 5%">{%= __("Age (Days)") %}</th>
|
||||
|
||||
{% if(report.report_name === "Accounts Receivable" && filters.show_sales_person_in_print) { %}
|
||||
<th style="width: 16%">{%= __("Reference") %}</th>
|
||||
<th style="width: 10%">{%= __("Sales Person") %}</th>
|
||||
{% } else { %}
|
||||
<th style="width: 26%">{%= __("Reference") %}</th>
|
||||
{% } %}
|
||||
{% if(!filters.show_pdc_in_print) { %}
|
||||
<th style="width: 20%">{%= (filters.customer || filters.supplier) ? __("Remarks"): __("Party") %}</th>
|
||||
<th style="width: 20%">{%= (filters.customer || filters.supplier) ? __("Remarks"): __("Party") %}</th>
|
||||
{% } %}
|
||||
<th style="width: 10%; text-align: right">{%= __("Invoiced Amount") %}</th>
|
||||
{% if(!filters.show_pdc_in_print) { %}
|
||||
<th style="width: 10%; text-align: right">{%= __("Paid Amount") %}</th>
|
||||
<th style="width: 10%; text-align: right">{%= report.report_name === "Accounts Receivable" ? __('Credit Note') : __('Debit Note') %}</th>
|
||||
{% } %}
|
||||
<th style="width: 15%; text-align: right">{%= __("Outstanding Amount") %}</th>
|
||||
<th style="width: 10%; text-align: right">{%= __("Outstanding Amount") %}</th>
|
||||
{% if(filters.show_pdc_in_print) { %}
|
||||
{% if(report.report_name === "Accounts Receivable") { %}
|
||||
<th style="width: 10%">{%= __("Customer LPO No.") %}</th>
|
||||
{% } %}
|
||||
<th style="width: 10%">{%= __("PDC/LC Date") %}</th>
|
||||
<th style="width: 10%">{%= __("PDC/LC Ref") %}</th>
|
||||
<th style="width: 10%">{%= __("PDC/LC Amount") %}</th>
|
||||
<th style="width: 10%">{%= __("Remaining Balance") %}</th>
|
||||
@ -155,7 +157,7 @@
|
||||
{%= data[i]["voucher_no"] %}
|
||||
</td>
|
||||
|
||||
{% if(report.report_name === "Accounts Receivable") { %}
|
||||
{% if(report.report_name === "Accounts Receivable" && filters.show_sales_person_in_print) { %}
|
||||
<td>{%= data[i]["sales_person"] %}</td>
|
||||
{% } %}
|
||||
|
||||
@ -195,7 +197,6 @@
|
||||
<td style="text-align: right">
|
||||
{%= data[i]["po_no"] %}</td>
|
||||
{% } %}
|
||||
<td style="text-align: right">{%= frappe.datetime.str_to_user(data[i][("pdc/lc_date")]) %}</td>
|
||||
<td style="text-align: right">{%= data[i][("pdc/lc_ref")] %}</td>
|
||||
<td style="text-align: right">{%= format_currency(data[i][("pdc/lc_amount")], data[i]["currency"]) %}</td>
|
||||
<td style="text-align: right">{%= format_currency(data[i][("remaining_balance")], data[i]["currency"]) %}</td>
|
||||
@ -226,7 +227,6 @@
|
||||
<td style="text-align: right">
|
||||
{%= data[i][__("Customer LPO")] %}</td>
|
||||
{% } %}
|
||||
<td style="text-align: right">{%= frappe.datetime.str_to_user(data[i][__("PDC/LC Date")]) %}</td>
|
||||
<td style="text-align: right">{%= data[i][("pdc/lc_ref")] %}</td>
|
||||
<td style="text-align: right">{%= format_currency(data[i][("pdc/lc_amount")], data[i]["currency"]) %}</td>
|
||||
<td style="text-align: right">{%= format_currency(data[i][("remaining_balance")], data[i]["currency"]) %}</td>
|
||||
|
@ -102,14 +102,19 @@ frappe.query_reports["Accounts Receivable"] = {
|
||||
"fieldtype": "Link",
|
||||
"options": "Sales Person"
|
||||
},
|
||||
{
|
||||
"fieldname":"based_on_payment_terms",
|
||||
"label": __("Based On Payment Terms"),
|
||||
"fieldtype": "Check",
|
||||
},
|
||||
{
|
||||
"fieldname":"show_pdc_in_print",
|
||||
"label": __("Show PDC in Print"),
|
||||
"fieldtype": "Check",
|
||||
},
|
||||
{
|
||||
"fieldname":"based_on_payment_terms",
|
||||
"label": __("Based On Payment Terms"),
|
||||
"fieldname":"show_sales_person_in_print",
|
||||
"label": __("Show Sales Person in Print"),
|
||||
"fieldtype": "Check",
|
||||
},
|
||||
{
|
||||
|
@ -4,7 +4,7 @@
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
import erpnext
|
||||
from frappe import _
|
||||
from frappe import _, scrub
|
||||
from frappe.utils import getdate, nowdate
|
||||
from six import iteritems, itervalues
|
||||
|
||||
@ -14,6 +14,9 @@ class PartyLedgerSummaryReport(object):
|
||||
self.filters.from_date = getdate(self.filters.from_date or nowdate())
|
||||
self.filters.to_date = getdate(self.filters.to_date or nowdate())
|
||||
|
||||
if not self.filters.get("company"):
|
||||
self.filters["company"] = frappe.db.get_single_value('Global Defaults', 'default_company')
|
||||
|
||||
def run(self, args):
|
||||
if self.filters.from_date > self.filters.to_date:
|
||||
frappe.throw(_("From Date must be before To Date"))
|
||||
@ -21,10 +24,9 @@ class PartyLedgerSummaryReport(object):
|
||||
self.filters.party_type = args.get("party_type")
|
||||
self.party_naming_by = frappe.db.get_value(args.get("naming_by")[0], None, args.get("naming_by")[1])
|
||||
|
||||
discount_account_field = "discount_allowed_account" if self.filters.party_type == "Customer" \
|
||||
else "discount_received_account"
|
||||
self.round_off_account, self.write_off_account, self.discount_account = frappe.get_cached_value('Company',
|
||||
self.filters.company, ["round_off_account", "write_off_account", discount_account_field])
|
||||
self.get_gl_entries()
|
||||
self.get_return_invoices()
|
||||
self.get_party_adjustment_amounts()
|
||||
|
||||
columns = self.get_columns()
|
||||
data = self.get_data()
|
||||
@ -48,7 +50,6 @@ class PartyLedgerSummaryReport(object):
|
||||
})
|
||||
|
||||
credit_or_debit_note = "Credit Note" if self.filters.party_type == "Customer" else "Debit Note"
|
||||
discount_allowed_or_received = "Discount Allowed" if self.filters.party_type == "Customer" else "Discount Received"
|
||||
|
||||
columns += [
|
||||
{
|
||||
@ -79,27 +80,19 @@ class PartyLedgerSummaryReport(object):
|
||||
"options": "currency",
|
||||
"width": 120
|
||||
},
|
||||
{
|
||||
"label": _(discount_allowed_or_received),
|
||||
"fieldname": "discount_amount",
|
||||
]
|
||||
|
||||
for account in self.party_adjustment_accounts:
|
||||
columns.append({
|
||||
"label": account,
|
||||
"fieldname": "adj_" + scrub(account),
|
||||
"fieldtype": "Currency",
|
||||
"options": "currency",
|
||||
"width": 120
|
||||
},
|
||||
{
|
||||
"label": _("Write Off Amount"),
|
||||
"fieldname": "write_off_amount",
|
||||
"fieldtype": "Currency",
|
||||
"options": "currency",
|
||||
"width": 120
|
||||
},
|
||||
{
|
||||
"label": _("Other Adjustments"),
|
||||
"fieldname": "adjustment_amount",
|
||||
"fieldtype": "Currency",
|
||||
"options": "currency",
|
||||
"width": 120
|
||||
},
|
||||
"width": 120,
|
||||
"is_adjustment": 1
|
||||
})
|
||||
|
||||
columns += [
|
||||
{
|
||||
"label": _("Closing Balance"),
|
||||
"fieldname": "closing_balance",
|
||||
@ -119,17 +112,10 @@ class PartyLedgerSummaryReport(object):
|
||||
return columns
|
||||
|
||||
def get_data(self):
|
||||
if not self.filters.get("company"):
|
||||
self.filters["company"] = frappe.db.get_single_value('Global Defaults', 'default_company')
|
||||
|
||||
company_currency = frappe.get_cached_value('Company', self.filters.get("company"), "default_currency")
|
||||
invoice_dr_or_cr = "debit" if self.filters.party_type == "Customer" else "credit"
|
||||
reverse_dr_or_cr = "credit" if self.filters.party_type == "Customer" else "debit"
|
||||
|
||||
self.get_gl_entries()
|
||||
self.get_return_invoices()
|
||||
self.get_party_adjustment_amounts()
|
||||
|
||||
self.party_data = frappe._dict({})
|
||||
for gle in self.gl_entries:
|
||||
self.party_data.setdefault(gle.party, frappe._dict({
|
||||
@ -146,7 +132,7 @@ class PartyLedgerSummaryReport(object):
|
||||
amount = gle.get(invoice_dr_or_cr) - gle.get(reverse_dr_or_cr)
|
||||
self.party_data[gle.party].closing_balance += amount
|
||||
|
||||
if gle.posting_date < self.filters.from_date:
|
||||
if gle.posting_date < self.filters.from_date or gle.is_opening == "Yes":
|
||||
self.party_data[gle.party].opening_balance += amount
|
||||
else:
|
||||
if amount > 0:
|
||||
@ -161,9 +147,10 @@ class PartyLedgerSummaryReport(object):
|
||||
if row.opening_balance or row.invoiced_amount or row.paid_amount or row.return_amount or row.closing_amount:
|
||||
total_party_adjustment = sum([amount for amount in itervalues(self.party_adjustment_details.get(party, {}))])
|
||||
row.paid_amount -= total_party_adjustment
|
||||
row.discount_amount = self.party_adjustment_details.get(party, {}).get(self.discount_account, 0)
|
||||
row.write_off_amount = self.party_adjustment_details.get(party, {}).get(self.write_off_account, 0)
|
||||
row.adjustment_amount = total_party_adjustment - row.discount_amount - row.write_off_amount
|
||||
|
||||
adjustments = self.party_adjustment_details.get(party, {})
|
||||
for account in self.party_adjustment_accounts:
|
||||
row["adj_" + scrub(account)] = adjustments.get(account, 0)
|
||||
|
||||
out.append(row)
|
||||
|
||||
@ -182,7 +169,7 @@ class PartyLedgerSummaryReport(object):
|
||||
self.gl_entries = frappe.db.sql("""
|
||||
select
|
||||
gle.posting_date, gle.party, gle.voucher_type, gle.voucher_no, gle.against_voucher_type,
|
||||
gle.against_voucher, gle.debit, gle.credit {join_field}
|
||||
gle.against_voucher, gle.debit, gle.credit, gle.is_opening {join_field}
|
||||
from `tabGL Entry` gle
|
||||
{join}
|
||||
where
|
||||
@ -254,9 +241,10 @@ class PartyLedgerSummaryReport(object):
|
||||
|
||||
def get_party_adjustment_amounts(self):
|
||||
conditions = self.prepare_conditions()
|
||||
income_or_expense = "Expense" if self.filters.party_type == "Customer" else "Income"
|
||||
income_or_expense = "Expense Account" if self.filters.party_type == "Customer" else "Income Account"
|
||||
invoice_dr_or_cr = "debit" if self.filters.party_type == "Customer" else "credit"
|
||||
reverse_dr_or_cr = "credit" if self.filters.party_type == "Customer" else "debit"
|
||||
round_off_account = frappe.get_cached_value('Company', self.filters.company, "round_off_account")
|
||||
|
||||
gl_entries = frappe.db.sql("""
|
||||
select
|
||||
@ -267,7 +255,7 @@ class PartyLedgerSummaryReport(object):
|
||||
docstatus < 2
|
||||
and (voucher_type, voucher_no) in (
|
||||
select voucher_type, voucher_no from `tabGL Entry` gle, `tabAccount` acc
|
||||
where acc.name = gle.account and acc.root_type = '{income_or_expense}'
|
||||
where acc.name = gle.account and acc.account_type = '{income_or_expense}'
|
||||
and gle.posting_date between %(from_date)s and %(to_date)s and gle.docstatus < 2
|
||||
) and (voucher_type, voucher_no) in (
|
||||
select voucher_type, voucher_no from `tabGL Entry` gle
|
||||
@ -277,6 +265,7 @@ class PartyLedgerSummaryReport(object):
|
||||
""".format(conditions=conditions, income_or_expense=income_or_expense), self.filters, as_dict=True)
|
||||
|
||||
self.party_adjustment_details = {}
|
||||
self.party_adjustment_accounts = set()
|
||||
adjustment_voucher_entries = {}
|
||||
for gle in gl_entries:
|
||||
adjustment_voucher_entries.setdefault((gle.voucher_type, gle.voucher_no), [])
|
||||
@ -288,12 +277,12 @@ class PartyLedgerSummaryReport(object):
|
||||
has_irrelevant_entry = False
|
||||
|
||||
for gle in voucher_gl_entries:
|
||||
if gle.account == self.round_off_account:
|
||||
if gle.account == round_off_account:
|
||||
continue
|
||||
elif gle.party:
|
||||
parties.setdefault(gle.party, 0)
|
||||
parties[gle.party] += gle.get(reverse_dr_or_cr) - gle.get(invoice_dr_or_cr)
|
||||
elif frappe.get_cached_value("Account", gle.account, "root_type") == income_or_expense:
|
||||
elif frappe.get_cached_value("Account", gle.account, "account_type") == income_or_expense:
|
||||
accounts.setdefault(gle.account, 0)
|
||||
accounts[gle.account] += gle.get(invoice_dr_or_cr) - gle.get(reverse_dr_or_cr)
|
||||
else:
|
||||
@ -303,11 +292,13 @@ class PartyLedgerSummaryReport(object):
|
||||
if len(parties) == 1:
|
||||
party = parties.keys()[0]
|
||||
for account, amount in iteritems(accounts):
|
||||
self.party_adjustment_accounts.add(account)
|
||||
self.party_adjustment_details.setdefault(party, {})
|
||||
self.party_adjustment_details[party].setdefault(account, 0)
|
||||
self.party_adjustment_details[party][account] += amount
|
||||
elif len(accounts) == 1 and not has_irrelevant_entry:
|
||||
account = accounts.keys()[0]
|
||||
self.party_adjustment_accounts.add(account)
|
||||
for party, amount in iteritems(parties):
|
||||
self.party_adjustment_details.setdefault(party, {})
|
||||
self.party_adjustment_details[party].setdefault(account, 0)
|
||||
|
@ -54,8 +54,10 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum
|
||||
delivery_note, d.income_account, d.cost_center, d.stock_qty, d.stock_uom
|
||||
]
|
||||
|
||||
row += [(d.base_net_rate * d.qty)/d.stock_qty, d.base_net_amount] \
|
||||
if d.stock_uom != d.uom and d.stock_qty != 0 else [d.base_net_rate, d.base_net_amount]
|
||||
if d.stock_uom != d.uom and d.stock_qty:
|
||||
row += [(d.base_net_rate * d.qty)/d.stock_qty, d.base_net_amount]
|
||||
else:
|
||||
row += [d.base_net_rate, d.base_net_amount]
|
||||
|
||||
total_tax = 0
|
||||
for tax in tax_columns:
|
||||
@ -108,13 +110,13 @@ def get_conditions(filters):
|
||||
conditions += """ and exists(select name from `tabSales Invoice Payment`
|
||||
where parent=`tabSales Invoice`.name
|
||||
and ifnull(`tabSales Invoice Payment`.mode_of_payment, '') = %(mode_of_payment)s)"""
|
||||
|
||||
|
||||
if filters.get("warehouse"):
|
||||
conditions += """ and exists(select name from `tabSales Invoice Item`
|
||||
where parent=`tabSales Invoice`.name
|
||||
and ifnull(`tabSales Invoice Item`.warehouse, '') = %(warehouse)s)"""
|
||||
|
||||
|
||||
|
||||
if filters.get("brand"):
|
||||
conditions += """ and exists(select name from `tabSales Invoice Item`
|
||||
where parent=`tabSales Invoice`.name
|
||||
@ -131,10 +133,10 @@ def get_conditions(filters):
|
||||
def get_items(filters, additional_query_columns):
|
||||
conditions = get_conditions(filters)
|
||||
match_conditions = frappe.build_match_conditions("Sales Invoice")
|
||||
|
||||
|
||||
if match_conditions:
|
||||
match_conditions = " and {0} ".format(match_conditions)
|
||||
|
||||
|
||||
if additional_query_columns:
|
||||
additional_query_columns = ', ' + ', '.join(additional_query_columns)
|
||||
|
||||
|
@ -55,12 +55,15 @@ def get_result(filters):
|
||||
supplier = supplier_map[d]
|
||||
|
||||
tds_doc = tds_docs[supplier.tax_withholding_category]
|
||||
account = [i.account for i in tds_doc.accounts if i.company == filters.company][0]
|
||||
account_list = [i.account for i in tds_doc.accounts if i.company == filters.company]
|
||||
|
||||
if account_list:
|
||||
account = account_list[0]
|
||||
|
||||
for k in gle_map[d]:
|
||||
if k.party == supplier_map[d] and k.credit > 0:
|
||||
total_amount_credited += k.credit
|
||||
elif k.account == account and k.credit > 0:
|
||||
elif account_list and k.account == account and k.credit > 0:
|
||||
tds_deducted = k.credit
|
||||
total_amount_credited += k.credit
|
||||
|
||||
|
@ -2,8 +2,9 @@
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
import frappe, erpnext
|
||||
from frappe import _
|
||||
from frappe.model.meta import get_field_precision
|
||||
from frappe.utils import flt, get_datetime, format_datetime
|
||||
|
||||
class StockOverReturnError(frappe.ValidationError): pass
|
||||
@ -116,6 +117,10 @@ def validate_quantity(doc, args, ref, valid_items, already_returned_items):
|
||||
|
||||
already_returned_data = already_returned_items.get(args.item_code) or {}
|
||||
|
||||
company_currency = erpnext.get_company_currency(doc.company)
|
||||
stock_qty_precision = get_field_precision(frappe.get_meta(doc.doctype + " Item")
|
||||
.get_field("stock_qty"), company_currency)
|
||||
|
||||
for column in fields:
|
||||
returned_qty = flt(already_returned_data.get(column, 0)) if len(already_returned_data) > 0 else 0
|
||||
|
||||
@ -126,7 +131,7 @@ def validate_quantity(doc, args, ref, valid_items, already_returned_items):
|
||||
reference_qty = ref.get(column) * ref.get("conversion_factor", 1.0)
|
||||
current_stock_qty = args.get(column) * args.get("conversion_factor", 1.0)
|
||||
|
||||
max_returnable_qty = flt(reference_qty) - returned_qty
|
||||
max_returnable_qty = flt(reference_qty, stock_qty_precision) - returned_qty
|
||||
label = column.replace('_', ' ').title()
|
||||
|
||||
if reference_qty:
|
||||
@ -135,7 +140,7 @@ def validate_quantity(doc, args, ref, valid_items, already_returned_items):
|
||||
elif returned_qty >= reference_qty and args.get(column):
|
||||
frappe.throw(_("Item {0} has already been returned")
|
||||
.format(args.item_code), StockOverReturnError)
|
||||
elif abs(current_stock_qty) > max_returnable_qty:
|
||||
elif abs(flt(current_stock_qty, stock_qty_precision)) > max_returnable_qty:
|
||||
frappe.throw(_("Row # {0}: Cannot return more than {1} for Item {2}")
|
||||
.format(args.idx, max_returnable_qty, args.item_code), StockOverReturnError)
|
||||
|
||||
|
@ -162,6 +162,8 @@ def create_item_code(amazon_item_json, sku):
|
||||
igroup.parent_item_group = mws_settings.item_group
|
||||
igroup.insert()
|
||||
|
||||
item.append("item_defaults", {'company':mws_settings.company})
|
||||
|
||||
item.insert(ignore_permissions=True)
|
||||
create_item_price(amazon_item_json, item.item_code)
|
||||
|
||||
@ -213,7 +215,7 @@ def get_orders(after_date):
|
||||
fulfillment_channels=["MFN", "AFN"],
|
||||
lastupdatedafter=after_date,
|
||||
orderstatus=statuses,
|
||||
max_results='20')
|
||||
max_results='50')
|
||||
|
||||
while True:
|
||||
orders_list = []
|
||||
@ -432,8 +434,8 @@ def get_order_items(market_place_order_id):
|
||||
return final_order_items
|
||||
|
||||
def get_item_code(order_item):
|
||||
asin = order_item.ASIN
|
||||
item_code = frappe.db.get_value("Item", {"amazon_item_code": asin}, "item_code")
|
||||
sku = order_item.SellerSKU
|
||||
item_code = frappe.db.get_value("Item", {"item_code": sku}, "item_code")
|
||||
if item_code:
|
||||
return item_code
|
||||
|
||||
@ -451,11 +453,16 @@ def get_charges_and_fees(market_place_order_id):
|
||||
shipment_item_list = return_as_list(shipment_event.ShipmentEvent.ShipmentItemList.ShipmentItem)
|
||||
|
||||
for shipment_item in shipment_item_list:
|
||||
charges = return_as_list(shipment_item.ItemChargeList.ChargeComponent)
|
||||
fees = return_as_list(shipment_item.ItemFeeList.FeeComponent)
|
||||
charges, fees = []
|
||||
|
||||
if 'ItemChargeList' in shipment_item.keys():
|
||||
charges = return_as_list(shipment_item.ItemChargeList.ChargeComponent)
|
||||
|
||||
if 'ItemFeeList' in shipment_item.keys():
|
||||
fees = return_as_list(shipment_item.ItemFeeList.FeeComponent)
|
||||
|
||||
for charge in charges:
|
||||
if(charge.ChargeType != "Principal"):
|
||||
if(charge.ChargeType != "Principal") and float(charge.ChargeAmount.CurrencyAmount) != 0:
|
||||
charge_account = get_account(charge.ChargeType)
|
||||
charges_fees.get("charges").append({
|
||||
"charge_type":"Actual",
|
||||
@ -465,13 +472,14 @@ def get_charges_and_fees(market_place_order_id):
|
||||
})
|
||||
|
||||
for fee in fees:
|
||||
fee_account = get_account(fee.FeeType)
|
||||
charges_fees.get("fees").append({
|
||||
"charge_type":"Actual",
|
||||
"account_head": fee_account,
|
||||
"tax_amount": fee.FeeAmount.CurrencyAmount,
|
||||
"description": fee.FeeType + " for " + shipment_item.SellerSKU
|
||||
})
|
||||
if float(fee.FeeAmount.CurrencyAmount) != 0:
|
||||
fee_account = get_account(fee.FeeType)
|
||||
charges_fees.get("fees").append({
|
||||
"charge_type":"Actual",
|
||||
"account_head": fee_account,
|
||||
"tax_amount": fee.FeeAmount.CurrencyAmount,
|
||||
"description": fee.FeeType + " for " + shipment_item.SellerSKU
|
||||
})
|
||||
|
||||
return charges_fees
|
||||
|
||||
|
@ -65,7 +65,7 @@ class WoocommerceSettings(Document):
|
||||
if not frappe.get_value("Item Group",{"name": "WooCommerce Products"}):
|
||||
item_group = frappe.new_doc("Item Group")
|
||||
item_group.item_group_name = "WooCommerce Products"
|
||||
item_group.parent_item_group = "All Item Groups"
|
||||
item_group.parent_item_group = _("All Item Groups")
|
||||
item_group.save()
|
||||
|
||||
|
||||
|
@ -27,6 +27,8 @@ doctype_js = {
|
||||
|
||||
welcome_email = "erpnext.setup.utils.welcome_email"
|
||||
|
||||
connect = "erpnext.check_branch_compatibility_with_frappe"
|
||||
|
||||
# setup wizard
|
||||
setup_wizard_requires = "assets/erpnext/js/setup_wizard.js"
|
||||
setup_wizard_stages = "erpnext.setup.setup_wizard.setup_wizard.get_setup_stages"
|
||||
|
@ -512,7 +512,7 @@ def add_department_leaves(events, start, end, employee, company):
|
||||
department_employees = frappe.db.sql_list("""select name from tabEmployee where department=%s
|
||||
and company=%s""", (department, company))
|
||||
|
||||
filter_conditions = "employee in (\"%s\")" % '", "'.join(department_employees)
|
||||
filter_conditions = " and employee in (\"%s\")" % '", "'.join(department_employees)
|
||||
add_leaves(events, start, end, filter_conditions=filter_conditions)
|
||||
|
||||
def add_leaves(events, start, end, filter_conditions=None):
|
||||
|
@ -571,7 +571,7 @@ execute:frappe.delete_doc_if_exists("Page", "sales-analytics")
|
||||
execute:frappe.delete_doc_if_exists("Page", "purchase-analytics")
|
||||
execute:frappe.delete_doc_if_exists("Page", "stock-analytics")
|
||||
execute:frappe.delete_doc_if_exists("Page", "production-analytics")
|
||||
erpnext.patches.v11_0.ewaybill_fields_gst_india #2018-11-13 #2019-01-09
|
||||
erpnext.patches.v11_0.ewaybill_fields_gst_india #2018-11-13 #2019-01-09 #2019-04-01
|
||||
erpnext.patches.v11_0.drop_column_max_days_allowed
|
||||
erpnext.patches.v11_0.change_healthcare_desktop_icons
|
||||
erpnext.patches.v10_0.update_user_image_in_employee
|
||||
@ -589,3 +589,4 @@ erpnext.patches.v11_0.remove_barcodes_field_from_copy_fields_to_variants
|
||||
erpnext.patches.v10_0.item_barcode_childtable_migrate # 16-02-2019
|
||||
erpnext.patches.v11_0.make_italian_localization_fields # 26-03-2019
|
||||
erpnext.patches.v11_1.make_job_card_time_logs
|
||||
erpnext.patches.v11_1.set_variant_based_on
|
11
erpnext/patches/v11_1/set_variant_based_on.py
Normal file
11
erpnext/patches/v11_1/set_variant_based_on.py
Normal file
@ -0,0 +1,11 @@
|
||||
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
|
||||
def execute():
|
||||
frappe.db.sql("""update tabItem set variant_based_on = 'Item Attribute'
|
||||
where ifnull(variant_based_on, '') = ''
|
||||
and (has_variants=1 or ifnull(variant_of, '') != '')
|
||||
""")
|
@ -93,7 +93,7 @@ def add_print_formats():
|
||||
def make_custom_fields(update=True):
|
||||
hsn_sac_field = dict(fieldname='gst_hsn_code', label='HSN/SAC',
|
||||
fieldtype='Data', fetch_from='item_code.gst_hsn_code', insert_after='description',
|
||||
allow_on_submit=1, print_hide=1)
|
||||
allow_on_submit=1, print_hide=1, fetch_if_empty=1)
|
||||
invoice_gst_fields = [
|
||||
dict(fieldname='gst_section', label='GST Details', fieldtype='Section Break',
|
||||
insert_after='language', print_hide=1, collapsible=1),
|
||||
@ -243,6 +243,7 @@ def make_custom_fields(update=True):
|
||||
'Purchase Order Item': [hsn_sac_field],
|
||||
'Purchase Receipt Item': [hsn_sac_field],
|
||||
'Purchase Invoice Item': [hsn_sac_field],
|
||||
'Material Request Item': [hsn_sac_field],
|
||||
'Employee': [
|
||||
dict(fieldname='ifsc_code', label='IFSC Code',
|
||||
fieldtype='Data', insert_after='bank_ac_no', print_hide=1,
|
||||
|
@ -184,11 +184,7 @@
|
||||
<UnitaMisura>{{ item.stock_uom }}</UnitaMisura>
|
||||
<PrezzoUnitario>{{ format_float(item.price_list_rate or item.rate) }}</PrezzoUnitario>
|
||||
{{ render_discount_or_margin(item) }}
|
||||
{%- if (item.discount_amount or item.rate_with_margin) %}
|
||||
<PrezzoTotale>{{ format_float(item.net_amount) }}</PrezzoTotale>
|
||||
{%- else %}
|
||||
<PrezzoTotale>{{ format_float(item.amount) }}</PrezzoTotale>
|
||||
{%- endif %}
|
||||
<PrezzoTotale>{{ format_float(item.amount) }}</PrezzoTotale>
|
||||
<AliquotaIVA>{{ format_float(item.tax_rate) }}</AliquotaIVA>
|
||||
{%- if item.tax_exemption_reason %}
|
||||
<Natura>{{ item.tax_exemption_reason.split("-")[0] }}</Natura>
|
||||
|
@ -4,6 +4,7 @@ import frappe, json, os
|
||||
from frappe.utils import flt, cstr
|
||||
from erpnext.controllers.taxes_and_totals import get_itemised_tax
|
||||
from frappe import _
|
||||
from six import string_types
|
||||
from frappe.utils.file_manager import save_file, remove_file
|
||||
from frappe.desk.form.load import get_attachments
|
||||
from erpnext.regional.italy import state_codes
|
||||
@ -151,7 +152,7 @@ def get_invoice_summary(items, taxes):
|
||||
tax_amount=(reference_row.tax_amount * tax.rate) / 100,
|
||||
net_amount=reference_row.tax_amount,
|
||||
taxable_amount=reference_row.tax_amount,
|
||||
item_tax_rate="{}",
|
||||
item_tax_rate={tax.account_head: tax.rate},
|
||||
charges=True
|
||||
)
|
||||
)
|
||||
@ -159,10 +160,16 @@ def get_invoice_summary(items, taxes):
|
||||
#Check item tax rates if tax rate is zero.
|
||||
if tax.rate == 0:
|
||||
for item in items:
|
||||
item_tax_rate = json.loads(item.item_tax_rate)
|
||||
if tax.account_head in item_tax_rate:
|
||||
item_tax_rate = item.item_tax_rate
|
||||
if isinstance(item.item_tax_rate, string_types):
|
||||
item_tax_rate = json.loads(item.item_tax_rate)
|
||||
|
||||
if item_tax_rate and tax.account_head in item_tax_rate:
|
||||
key = cstr(item_tax_rate[tax.account_head])
|
||||
summary_data.setdefault(key, {"tax_amount": 0.0, "taxable_amount": 0.0, "tax_exemption_reason": "", "tax_exemption_law": ""})
|
||||
if key not in summary_data:
|
||||
summary_data.setdefault(key, {"tax_amount": 0.0, "taxable_amount": 0.0,
|
||||
"tax_exemption_reason": "", "tax_exemption_law": ""})
|
||||
|
||||
summary_data[key]["tax_amount"] += item.tax_amount
|
||||
summary_data[key]["taxable_amount"] += item.net_amount
|
||||
if key == "0.0":
|
||||
|
@ -446,16 +446,15 @@ erpnext.pos.PointOfSale = class PointOfSale {
|
||||
}
|
||||
|
||||
setup_company() {
|
||||
this.company = frappe.sys_defaults.company;
|
||||
return new Promise(resolve => {
|
||||
if(!this.company) {
|
||||
if(!frappe.sys_defaults.company) {
|
||||
frappe.prompt({fieldname:"company", options: "Company", fieldtype:"Link",
|
||||
label: __("Select Company"), reqd: 1}, (data) => {
|
||||
this.company = data.company;
|
||||
resolve(this.company);
|
||||
}, __("Select Company"));
|
||||
} else {
|
||||
resolve(this.company);
|
||||
resolve();
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -509,7 +508,9 @@ erpnext.pos.PointOfSale = class PointOfSale {
|
||||
}
|
||||
|
||||
set_pos_profile_data() {
|
||||
this.frm.doc.company = this.company;
|
||||
if (this.company) {
|
||||
this.frm.doc.company = this.company;
|
||||
}
|
||||
|
||||
return new Promise(resolve => {
|
||||
return this.frm.call({
|
||||
|
@ -377,7 +377,7 @@ def replace_abbr(company, old, new):
|
||||
for d in doc:
|
||||
_rename_record(d)
|
||||
|
||||
for dt in ["Warehouse", "Account", "Cost Center", "Department", "Location",
|
||||
for dt in ["Warehouse", "Account", "Cost Center", "Department",
|
||||
"Sales Taxes and Charges Template", "Purchase Taxes and Charges Template"]:
|
||||
_rename_records(dt)
|
||||
frappe.db.commit()
|
||||
|
@ -12,7 +12,6 @@ from frappe.website.render import clear_cache
|
||||
from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow
|
||||
from erpnext.shopping_cart.product_info import set_product_info_for_website
|
||||
from erpnext.utilities.product import get_qty_in_stock
|
||||
from frappe.utils.html_utils import clean_html
|
||||
|
||||
class ItemGroup(NestedSet, WebsiteGenerator):
|
||||
nsm_parent_field = 'parent_item_group'
|
||||
@ -27,7 +26,6 @@ class ItemGroup(NestedSet, WebsiteGenerator):
|
||||
|
||||
def validate(self):
|
||||
super(ItemGroup, self).validate()
|
||||
self.description = clean_html(self.description)
|
||||
self.make_route()
|
||||
|
||||
def on_update(self):
|
||||
|
@ -23,6 +23,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "name_and_description_section",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -57,6 +58,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "naming_series",
|
||||
"fieldtype": "Select",
|
||||
"hidden": 0,
|
||||
@ -91,6 +93,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"description": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "item_code",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
@ -127,6 +130,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "variant_of",
|
||||
"description": "If item is a variant of another item then description, image, pricing, taxes etc will be set from the template unless explicitly specified",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "variant_of",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -160,6 +164,7 @@
|
||||
"bold": 1,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "item_name",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
@ -195,6 +200,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"description": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "item_group",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -230,6 +236,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "is_item_from_hub",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -263,6 +270,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"description": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "stock_uom",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -298,6 +306,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "column_break0",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
@ -329,6 +338,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "disabled",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -361,6 +371,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "allow_alternative_item",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -395,6 +406,7 @@
|
||||
"columns": 0,
|
||||
"default": "1",
|
||||
"description": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "is_stock_item",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -431,6 +443,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"default": "1",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "include_item_in_manufacturing",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -464,6 +477,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:(doc.__islocal&&doc.is_stock_item && !doc.has_serial_no && !doc.has_batch_no)",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "opening_stock",
|
||||
"fieldtype": "Float",
|
||||
"hidden": 0,
|
||||
@ -497,6 +511,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "is_stock_item",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "valuation_rate",
|
||||
"fieldtype": "Currency",
|
||||
"hidden": 0,
|
||||
@ -530,6 +545,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:doc.__islocal",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "standard_rate",
|
||||
"fieldtype": "Currency",
|
||||
"hidden": 0,
|
||||
@ -562,6 +578,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "is_fixed_asset",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -595,6 +612,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "is_fixed_asset",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "asset_category",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -629,6 +647,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "is_fixed_asset",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "asset_naming_series",
|
||||
"fieldtype": "Select",
|
||||
"hidden": 0,
|
||||
@ -663,6 +682,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "eval:!doc.__islocal",
|
||||
"description": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "tolerance",
|
||||
"fieldtype": "Float",
|
||||
"hidden": 0,
|
||||
@ -697,6 +717,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "image",
|
||||
"fieldtype": "Attach Image",
|
||||
"hidden": 1,
|
||||
@ -730,6 +751,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "section_break_11",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -762,6 +784,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "brand",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -797,6 +820,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "description",
|
||||
"fieldtype": "Text Editor",
|
||||
"hidden": 0,
|
||||
@ -831,6 +855,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "sb_barcodes",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -863,6 +888,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "barcodes",
|
||||
"fieldtype": "Table",
|
||||
"hidden": 0,
|
||||
@ -898,6 +924,7 @@
|
||||
"collapsible_depends_on": "is_stock_item",
|
||||
"columns": 0,
|
||||
"depends_on": "is_stock_item",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "inventory_section",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -932,6 +959,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "shelf_life_in_days",
|
||||
"fieldtype": "Int",
|
||||
"hidden": 0,
|
||||
@ -966,6 +994,7 @@
|
||||
"columns": 0,
|
||||
"default": "2099-12-31",
|
||||
"depends_on": "is_stock_item",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "end_of_life",
|
||||
"fieldtype": "Date",
|
||||
"hidden": 0,
|
||||
@ -1001,6 +1030,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"default": "Purchase",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "default_material_request_type",
|
||||
"fieldtype": "Select",
|
||||
"hidden": 0,
|
||||
@ -1035,6 +1065,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "is_stock_item",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "valuation_method",
|
||||
"fieldtype": "Select",
|
||||
"hidden": 0,
|
||||
@ -1069,6 +1100,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "is_stock_item",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "column_break1",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
@ -1103,6 +1135,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:doc.is_stock_item",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "warranty_period",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
@ -1139,6 +1172,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "is_stock_item",
|
||||
"description": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "weight_per_unit",
|
||||
"fieldtype": "Float",
|
||||
"hidden": 0,
|
||||
@ -1172,6 +1206,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:doc.is_stock_item",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "weight_uom",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -1207,6 +1242,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "is_stock_item",
|
||||
"description": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "reorder_section",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -1242,6 +1278,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"description": "Will also apply for variants unless overrridden",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "reorder_levels",
|
||||
"fieldtype": "Table",
|
||||
"hidden": 0,
|
||||
@ -1276,6 +1313,7 @@
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "unit_of_measure_conversion",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -1310,6 +1348,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"description": "Will also apply for variants",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "uoms",
|
||||
"fieldtype": "Table",
|
||||
"hidden": 0,
|
||||
@ -1347,6 +1386,7 @@
|
||||
"collapsible_depends_on": "eval:doc.has_batch_no || doc.has_serial_no || doc.is_fixed_asset",
|
||||
"columns": 0,
|
||||
"depends_on": "eval:doc.is_stock_item || doc.is_fixed_asset",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "serial_nos_and_batches",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -1381,6 +1421,7 @@
|
||||
"columns": 0,
|
||||
"default": "",
|
||||
"depends_on": "eval:doc.is_stock_item",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "has_batch_no",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -1418,6 +1459,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "has_batch_no",
|
||||
"description": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "create_new_batch",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -1452,6 +1494,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "eval:doc.has_batch_no==1 && doc.create_new_batch==1",
|
||||
"description": "Example: ABCD.#####. If series is set and Batch No is not mentioned in transactions,then automatic batch number will be created based on this series. If you always want to explicitly mention Batch No for this item,leave this blank. Note: this setting will take priority over the Naming Series Prefix in Stock Settings.",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "batch_number_series",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
@ -1485,6 +1528,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "has_batch_no",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "has_expiry_date",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -1518,6 +1562,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "has_batch_no",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "retain_sample",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -1552,6 +1597,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "eval: (doc.retain_sample && doc.has_batch_no)",
|
||||
"description": "Maximum sample quantity that can be retained",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "sample_quantity",
|
||||
"fieldtype": "Int",
|
||||
"hidden": 0,
|
||||
@ -1584,6 +1630,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "column_break_37",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
@ -1618,6 +1665,7 @@
|
||||
"default": "",
|
||||
"depends_on": "eval:doc.is_stock_item || doc.is_fixed_asset",
|
||||
"description": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "has_serial_no",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -1655,6 +1703,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "eval:doc.is_stock_item || doc.is_fixed_asset",
|
||||
"description": "Example: ABCD.#####\nIf series is set and Serial No is not mentioned in transactions,then automatic serial number will be created based on this series. If you always want to explicitly mention Serial Nos for this item. leave this blank.",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "serial_no_series",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
@ -1689,6 +1738,7 @@
|
||||
"collapsible_depends_on": "attributes",
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "variants_section",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -1724,6 +1774,7 @@
|
||||
"default": "0",
|
||||
"depends_on": "eval:!doc.variant_of",
|
||||
"description": "If this item has variants,then it cannot be selected in sales orders etc.",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "has_variants",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -1759,6 +1810,7 @@
|
||||
"columns": 0,
|
||||
"default": "Item Attribute",
|
||||
"depends_on": "has_variants",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "variant_based_on",
|
||||
"fieldtype": "Select",
|
||||
"hidden": 0,
|
||||
@ -1781,7 +1833,7 @@
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 1,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
@ -1793,6 +1845,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:(doc.has_variants || doc.variant_of) && doc.variant_based_on==='Item Attribute'",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "attributes",
|
||||
"fieldtype": "Table",
|
||||
"hidden": 1,
|
||||
@ -1826,6 +1879,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "defaults",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -1858,6 +1912,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "item_defaults",
|
||||
"fieldtype": "Table",
|
||||
"hidden": 0,
|
||||
@ -1891,6 +1946,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "purchase_details",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -1926,6 +1982,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"default": "1",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "is_purchase_item",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -1958,6 +2015,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "purchase_uom",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -1994,6 +2052,7 @@
|
||||
"default": "0.00",
|
||||
"depends_on": "is_stock_item",
|
||||
"description": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "min_order_qty",
|
||||
"fieldtype": "Float",
|
||||
"hidden": 0,
|
||||
@ -2028,6 +2087,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "safety_stock",
|
||||
"fieldtype": "Float",
|
||||
"hidden": 0,
|
||||
@ -2060,6 +2120,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "purchase_details_cb",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
@ -2094,6 +2155,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"description": "Average time taken by the supplier to deliver",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "lead_time_days",
|
||||
"fieldtype": "Int",
|
||||
"hidden": 0,
|
||||
@ -2129,6 +2191,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "last_purchase_rate",
|
||||
"fieldtype": "Float",
|
||||
"hidden": 0,
|
||||
@ -2164,6 +2227,7 @@
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "supplier_details",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -2196,6 +2260,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "delivered_by_supplier",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -2229,6 +2294,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "manufacturer",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -2263,6 +2329,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "manufacturer_part_no",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
@ -2296,6 +2363,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "column_break2",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
@ -2331,6 +2399,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "supplier_items",
|
||||
"fieldtype": "Table",
|
||||
"hidden": 0,
|
||||
@ -2364,6 +2433,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "foreign_trade_details",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -2396,6 +2466,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "country_of_origin",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -2429,6 +2500,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "column_break_59",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
@ -2460,6 +2532,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "customs_tariff_number",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -2493,6 +2566,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "sales_details",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -2527,6 +2601,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "sales_uom",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -2561,6 +2636,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"default": "1",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "is_sales_item",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -2594,6 +2670,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "column_break3",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
@ -2629,6 +2706,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "max_discount",
|
||||
"fieldtype": "Float",
|
||||
"hidden": 0,
|
||||
@ -2663,6 +2741,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "deferred_revenue",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -2696,6 +2775,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "enable_deferred_revenue",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "deferred_revenue_account",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -2729,6 +2809,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "enable_deferred_revenue",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -2761,6 +2842,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "column_break_85",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
@ -2793,6 +2875,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "enable_deferred_revenue",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "no_of_months",
|
||||
"fieldtype": "Int",
|
||||
"hidden": 0,
|
||||
@ -2825,6 +2908,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "deferred_expense_section",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -2858,6 +2942,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "enable_deferred_expense",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "deferred_expense_account",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -2891,6 +2976,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "enable_deferred_expense",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -2923,6 +3009,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "column_break_88",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
@ -2955,6 +3042,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "enable_deferred_expense",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "no_of_months_exp",
|
||||
"fieldtype": "Int",
|
||||
"hidden": 0,
|
||||
@ -2987,6 +3075,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "customer_details",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -3021,6 +3110,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"description": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "customer_items",
|
||||
"fieldtype": "Table",
|
||||
"hidden": 0,
|
||||
@ -3054,6 +3144,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "item_tax_section_break",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -3089,6 +3180,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"description": "Will also apply for variants",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "taxes",
|
||||
"fieldtype": "Table",
|
||||
"hidden": 0,
|
||||
@ -3124,6 +3216,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "inspection_criteria",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -3159,6 +3252,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"default": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "inspection_required_before_purchase",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -3194,6 +3288,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "inspection_required_before_delivery",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -3227,6 +3322,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:(doc.inspection_required_before_purchase || doc.inspection_required_before_delivery)",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "quality_inspection_template",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -3261,6 +3357,7 @@
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"depends_on": "is_stock_item",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "manufacturing",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -3296,6 +3393,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "default_bom",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -3333,6 +3431,7 @@
|
||||
"columns": 0,
|
||||
"default": "",
|
||||
"description": "If subcontracted to a vendor",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "is_sub_contracted_item",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -3368,6 +3467,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "column_break_74",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
@ -3399,6 +3499,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "customer_code",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 1,
|
||||
@ -3431,6 +3532,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "website_section",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -3465,6 +3567,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:!doc.variant_of",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "show_in_website",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -3498,6 +3601,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "variant_of",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "show_variant_in_website",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -3531,6 +3635,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval: doc.show_in_website || doc.show_variant_in_website",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "route",
|
||||
"fieldtype": "Small Text",
|
||||
"hidden": 0,
|
||||
@ -3565,6 +3670,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "eval: doc.show_in_website || doc.show_variant_in_website",
|
||||
"description": "Items with higher weightage will be shown higher",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "weightage",
|
||||
"fieldtype": "Int",
|
||||
"hidden": 0,
|
||||
@ -3599,6 +3705,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "eval: doc.show_in_website || doc.show_variant_in_website",
|
||||
"description": "Show a slideshow at the top of the page",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "slideshow",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -3634,6 +3741,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "eval: doc.show_in_website || doc.show_variant_in_website",
|
||||
"description": "Item Image (if not slideshow)",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "website_image",
|
||||
"fieldtype": "Attach",
|
||||
"hidden": 0,
|
||||
@ -3667,6 +3775,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "thumbnail",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
@ -3699,6 +3808,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "cb72",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
@ -3732,6 +3842,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "eval: doc.show_in_website || doc.show_variant_in_website",
|
||||
"description": "Show \"In Stock\" or \"Not in Stock\" based on stock available in this warehouse.",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "website_warehouse",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -3767,6 +3878,7 @@
|
||||
"columns": 0,
|
||||
"depends_on": "eval: doc.show_in_website || doc.show_variant_in_website",
|
||||
"description": "List this Item in multiple groups on the website.",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "website_item_groups",
|
||||
"fieldtype": "Table",
|
||||
"hidden": 0,
|
||||
@ -3802,6 +3914,7 @@
|
||||
"collapsible_depends_on": "website_specifications",
|
||||
"columns": 0,
|
||||
"depends_on": "eval: doc.show_in_website || doc.show_variant_in_website",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "sb72",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -3835,6 +3948,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval: doc.show_in_website || doc.show_variant_in_website",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "copy_from_item_group",
|
||||
"fieldtype": "Button",
|
||||
"hidden": 0,
|
||||
@ -3868,6 +3982,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval: doc.show_in_website || doc.show_variant_in_website",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "website_specifications",
|
||||
"fieldtype": "Table",
|
||||
"hidden": 0,
|
||||
@ -3902,6 +4017,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval: doc.show_in_website || doc.show_variant_in_website",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "web_long_description",
|
||||
"fieldtype": "Text Editor",
|
||||
"hidden": 0,
|
||||
@ -3934,6 +4050,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "total_projected_qty",
|
||||
"fieldtype": "Float",
|
||||
"hidden": 1,
|
||||
@ -3967,6 +4084,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:(!doc.is_item_from_hub)",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "hub_publishing_sb",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
@ -4001,6 +4119,7 @@
|
||||
"columns": 0,
|
||||
"default": "0",
|
||||
"description": "Publish Item to hub.erpnext.com",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "publish_in_hub",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -4033,6 +4152,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "hub_category_to_publish",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
@ -4067,6 +4187,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"description": "Publish \"In Stock\" or \"Not in Stock\" on Hub based on stock available in this warehouse.",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "hub_warehouse",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
@ -4101,6 +4222,7 @@
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"default": "0",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "synced_with_hub",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
@ -4139,7 +4261,7 @@
|
||||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 1,
|
||||
"modified": "2019-02-16 17:43:56.039611",
|
||||
"modified": "2019-04-05 12:03:24.530849",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Stock",
|
||||
"name": "Item",
|
||||
|
@ -9,11 +9,11 @@ import erpnext
|
||||
import frappe
|
||||
import copy
|
||||
from erpnext.controllers.item_variant import (ItemVariantExistsError,
|
||||
copy_attributes_to_variant, get_variant, make_variant_item_code, validate_item_variant_attributes)
|
||||
copy_attributes_to_variant, get_variant, make_variant_item_code, validate_item_variant_attributes)
|
||||
from erpnext.setup.doctype.item_group.item_group import (get_parent_item_groups, invalidate_cache_for)
|
||||
from frappe import _, msgprint
|
||||
from frappe.utils import (cint, cstr, flt, formatdate, get_timestamp, getdate,
|
||||
now_datetime, random_string, strip)
|
||||
now_datetime, random_string, strip)
|
||||
from frappe.utils.html_utils import clean_html
|
||||
from frappe.website.doctype.website_slideshow.website_slideshow import \
|
||||
get_slideshow
|
||||
@ -49,9 +49,6 @@ class Item(WebsiteGenerator):
|
||||
|
||||
self.set_onload('stock_exists', self.stock_ledger_created())
|
||||
self.set_asset_naming_series()
|
||||
if self.is_fixed_asset:
|
||||
asset = self.asset_exists()
|
||||
self.set_onload("asset_exists", True if asset else False)
|
||||
|
||||
def set_asset_naming_series(self):
|
||||
if not hasattr(self, '_asset_naming_series'):
|
||||
@ -118,9 +115,9 @@ class Item(WebsiteGenerator):
|
||||
|
||||
self.validate_has_variants()
|
||||
self.validate_stock_exists_for_template_item()
|
||||
self.validate_asset_exists_for_serialized_asset()
|
||||
self.validate_attributes()
|
||||
self.validate_variant_attributes()
|
||||
self.validate_variant_based_on_change()
|
||||
self.validate_website_image()
|
||||
self.make_thumbnail()
|
||||
self.validate_fixed_asset()
|
||||
@ -128,6 +125,7 @@ class Item(WebsiteGenerator):
|
||||
self.validate_uom_conversion_factor()
|
||||
self.validate_item_defaults()
|
||||
self.update_defaults_from_item_group()
|
||||
self.validate_stock_for_has_batch_and_has_serial()
|
||||
|
||||
if not self.get("__islocal"):
|
||||
self.old_item_group = frappe.db.get_value(self.doctype, self.name, "item_group")
|
||||
@ -151,7 +149,7 @@ class Item(WebsiteGenerator):
|
||||
'''Add a new price'''
|
||||
if not price_list:
|
||||
price_list = (frappe.db.get_single_value('Selling Settings', 'selling_price_list')
|
||||
or frappe.db.get_value('Price List', _('Standard Selling')))
|
||||
or frappe.db.get_value('Price List', _('Standard Selling')))
|
||||
if price_list:
|
||||
item_price = frappe.get_doc({
|
||||
"doctype": "Item Price",
|
||||
@ -190,7 +188,7 @@ class Item(WebsiteGenerator):
|
||||
def make_route(self):
|
||||
if not self.route:
|
||||
return cstr(frappe.db.get_value('Item Group', self.item_group,
|
||||
'route')) + '/' + self.scrub((self.item_name if self.item_name else self.item_code) + '-' + random_string(5))
|
||||
'route')) + '/' + self.scrub((self.item_name if self.item_name else self.item_code) + '-' + random_string(5))
|
||||
|
||||
def validate_website_image(self):
|
||||
"""Validate if the website image is a public file"""
|
||||
@ -213,7 +211,7 @@ class Item(WebsiteGenerator):
|
||||
if not file_doc:
|
||||
if not auto_set_website_image:
|
||||
frappe.msgprint(_("Website Image {0} attached to Item {1} cannot be found")
|
||||
.format(self.website_image, self.name))
|
||||
.format(self.website_image, self.name))
|
||||
|
||||
self.website_image = None
|
||||
|
||||
@ -314,8 +312,8 @@ class Item(WebsiteGenerator):
|
||||
# load variants
|
||||
# also used in set_attribute_context
|
||||
context.variants = frappe.get_all("Item",
|
||||
filters={"variant_of": self.name, "show_variant_in_website": 1},
|
||||
order_by="name asc")
|
||||
filters={"variant_of": self.name, "show_variant_in_website": 1},
|
||||
order_by="name asc")
|
||||
|
||||
variant = frappe.form_dict.variant
|
||||
if not variant and context.variants:
|
||||
@ -326,7 +324,7 @@ class Item(WebsiteGenerator):
|
||||
context.variant = frappe.get_doc("Item", variant)
|
||||
|
||||
for fieldname in ("website_image", "web_long_description", "description",
|
||||
"website_specifications"):
|
||||
"website_specifications"):
|
||||
if context.variant.get(fieldname):
|
||||
value = context.variant.get(fieldname)
|
||||
if isinstance(value, list):
|
||||
@ -349,7 +347,7 @@ class Item(WebsiteGenerator):
|
||||
# load attributes
|
||||
for v in context.variants:
|
||||
v.attributes = frappe.get_all("Item Variant Attribute",
|
||||
fields=["attribute", "attribute_value"],
|
||||
fields=["attribute", "attribute_value"],
|
||||
filters={"parent": v.name})
|
||||
|
||||
for attr in v.attributes:
|
||||
@ -530,7 +528,7 @@ class Item(WebsiteGenerator):
|
||||
warehouse += [d.get("warehouse")]
|
||||
else:
|
||||
frappe.throw(_("Row {0}: An Reorder entry already exists for this warehouse {1}")
|
||||
.format(d.idx, d.warehouse), DuplicateReorderRows)
|
||||
.format(d.idx, d.warehouse), DuplicateReorderRows)
|
||||
|
||||
if d.warehouse_reorder_level and not d.warehouse_reorder_qty:
|
||||
frappe.throw(_("Row #{0}: Please set reorder quantity").format(d.idx))
|
||||
@ -550,7 +548,7 @@ class Item(WebsiteGenerator):
|
||||
def update_item_price(self):
|
||||
frappe.db.sql("""update `tabItem Price` set item_name=%s,
|
||||
item_description=%s, brand=%s where item_code=%s""",
|
||||
(self.item_name, self.description, self.brand, self.name))
|
||||
(self.item_name, self.description, self.brand, self.name))
|
||||
|
||||
def on_trash(self):
|
||||
super(Item, self).on_trash()
|
||||
@ -572,7 +570,7 @@ class Item(WebsiteGenerator):
|
||||
new_properties = [cstr(d) for d in frappe.db.get_value("Item", new_name, field_list)]
|
||||
if new_properties != [cstr(self.get(fld)) for fld in field_list]:
|
||||
frappe.throw(_("To merge, following properties must be same for both items")
|
||||
+ ": \n" + ", ".join([self.meta.get_label(fld) for fld in field_list]))
|
||||
+ ": \n" + ", ".join([self.meta.get_label(fld) for fld in field_list]))
|
||||
|
||||
def after_rename(self, old_name, new_name, merge):
|
||||
if self.route:
|
||||
@ -595,7 +593,7 @@ class Item(WebsiteGenerator):
|
||||
item_wise_tax_detail.pop(old_name)
|
||||
|
||||
frappe.db.set_value(dt, d.name, "item_wise_tax_detail",
|
||||
json.dumps(item_wise_tax_detail), update_modified=False)
|
||||
json.dumps(item_wise_tax_detail), update_modified=False)
|
||||
|
||||
def set_last_purchase_rate(self, new_name):
|
||||
last_purchase_rate = get_last_purchase_details(new_name).get("base_rate", 0)
|
||||
@ -623,7 +621,7 @@ class Item(WebsiteGenerator):
|
||||
self.set("website_specifications", [])
|
||||
if self.item_group:
|
||||
for label, desc in frappe.db.get_values("Item Website Specification",
|
||||
{"parent": self.item_group}, ["label", "description"]):
|
||||
{"parent": self.item_group}, ["label", "description"]):
|
||||
row = self.append("website_specifications")
|
||||
row.label = label
|
||||
row.description = desc
|
||||
@ -697,7 +695,7 @@ class Item(WebsiteGenerator):
|
||||
|
||||
def update_variants(self):
|
||||
if self.flags.dont_update_variants or \
|
||||
frappe.db.get_single_value('Item Variant Settings', 'do_not_update_variants'):
|
||||
frappe.db.get_single_value('Item Variant Settings', 'do_not_update_variants'):
|
||||
return
|
||||
if self.has_variants:
|
||||
variants = frappe.db.get_all("Item", fields=["item_code"], filters={"variant_of": self.name})
|
||||
@ -726,17 +724,10 @@ class Item(WebsiteGenerator):
|
||||
frappe.throw(
|
||||
_('Cannot change Attributes after stock transaction. Make a new Item and transfer stock to the new Item'))
|
||||
|
||||
def validate_asset_exists_for_serialized_asset(self):
|
||||
if (not self.get("__islocal") and self.asset_exists() and
|
||||
cint(self.has_serial_no) != cint(frappe.db.get_value('Item', self.name, 'has_serial_no'))):
|
||||
frappe.throw(_("Asset is already exists against the item {0}, you cannot change the has serial no value")
|
||||
.format(self.name))
|
||||
|
||||
def asset_exists(self):
|
||||
if not hasattr(self, '_asset_created'):
|
||||
self._asset_created = frappe.db.get_all("Asset",
|
||||
filters={"item_code": self.name, "docstatus": 1}, limit=1)
|
||||
return self._asset_created
|
||||
def validate_variant_based_on_change(self):
|
||||
if self.variant_of or (self.has_variants and frappe.get_all("Item", {"variant_of": self.name})):
|
||||
if self.variant_based_on != frappe.db.get_value("Item", self.name, "variant_based_on"):
|
||||
frappe.throw(_("Variant Based On cannot be changed"))
|
||||
|
||||
def validate_uom(self):
|
||||
if not self.get("__islocal"):
|
||||
@ -748,7 +739,7 @@ class Item(WebsiteGenerator):
|
||||
template_uom = frappe.db.get_value("Item", self.variant_of, "stock_uom")
|
||||
if template_uom != self.stock_uom:
|
||||
frappe.throw(_("Default Unit of Measure for Variant '{0}' must be same as in Template '{1}'")
|
||||
.format(self.stock_uom, template_uom))
|
||||
.format(self.stock_uom, template_uom))
|
||||
|
||||
def validate_uom_conversion_factor(self):
|
||||
if self.uoms:
|
||||
@ -758,10 +749,13 @@ class Item(WebsiteGenerator):
|
||||
d.conversion_factor = value
|
||||
|
||||
def validate_attributes(self):
|
||||
if not (self.has_variants or self.variant_of):
|
||||
return
|
||||
|
||||
if not self.variant_based_on:
|
||||
self.variant_based_on = 'Item Attribute'
|
||||
|
||||
if (self.has_variants or self.variant_of) and self.variant_based_on == 'Item Attribute':
|
||||
if self.variant_based_on == 'Item Attribute':
|
||||
attributes = []
|
||||
if not self.attributes:
|
||||
frappe.throw(_("Attribute table is mandatory"))
|
||||
@ -787,6 +781,11 @@ class Item(WebsiteGenerator):
|
||||
|
||||
validate_item_variant_attributes(self, args)
|
||||
|
||||
def validate_stock_for_has_batch_and_has_serial(self):
|
||||
if self.stock_ledger_created():
|
||||
for value in ["has_batch_no", "has_serial_no"]:
|
||||
if frappe.db.get_value("Item", self.name, value) != self.get_value(value):
|
||||
frappe.throw(_("Cannot change {0} as Stock Transaction for Item {1} exist.".format(value, self.name)))
|
||||
|
||||
def get_timeline_data(doctype, name):
|
||||
'''returns timeline data based on stock ledger entry'''
|
||||
@ -866,18 +865,18 @@ def get_last_purchase_details(item_code, doc_name=None, conversion_rate=1.0):
|
||||
limit 1""", (item_code, cstr(doc_name)), as_dict=1)
|
||||
|
||||
purchase_order_date = getdate(last_purchase_order and last_purchase_order[0].transaction_date
|
||||
or "1900-01-01")
|
||||
or "1900-01-01")
|
||||
purchase_receipt_date = getdate(last_purchase_receipt and
|
||||
last_purchase_receipt[0].posting_date or "1900-01-01")
|
||||
last_purchase_receipt[0].posting_date or "1900-01-01")
|
||||
|
||||
if (purchase_order_date > purchase_receipt_date) or \
|
||||
(last_purchase_order and not last_purchase_receipt):
|
||||
(last_purchase_order and not last_purchase_receipt):
|
||||
# use purchase order
|
||||
last_purchase = last_purchase_order[0]
|
||||
purchase_date = purchase_order_date
|
||||
|
||||
elif (purchase_receipt_date > purchase_order_date) or \
|
||||
(last_purchase_receipt and not last_purchase_order):
|
||||
(last_purchase_receipt and not last_purchase_order):
|
||||
# use purchase receipt
|
||||
last_purchase = last_purchase_receipt[0]
|
||||
purchase_date = purchase_receipt_date
|
||||
@ -907,7 +906,7 @@ def invalidate_cache_for_item(doc):
|
||||
invalidate_cache_for(doc, doc.item_group)
|
||||
|
||||
website_item_groups = list(set((doc.get("old_website_item_groups") or [])
|
||||
+ [d.item_group for d in doc.get({"doctype": "Website Item Group"}) if d.item_group]))
|
||||
+ [d.item_group for d in doc.get({"doctype": "Website Item Group"}) if d.item_group]))
|
||||
|
||||
for item_group in website_item_groups:
|
||||
invalidate_cache_for(doc, item_group)
|
||||
@ -922,7 +921,7 @@ def check_stock_uom_with_bin(item, stock_uom):
|
||||
|
||||
matched = True
|
||||
ref_uom = frappe.db.get_value("Stock Ledger Entry",
|
||||
{"item_code": item}, "stock_uom")
|
||||
{"item_code": item}, "stock_uom")
|
||||
|
||||
if ref_uom:
|
||||
if cstr(ref_uom) != cstr(stock_uom):
|
||||
@ -931,7 +930,7 @@ def check_stock_uom_with_bin(item, stock_uom):
|
||||
bin_list = frappe.db.sql("select * from tabBin where item_code=%s", item, as_dict=1)
|
||||
for bin in bin_list:
|
||||
if (bin.reserved_qty > 0 or bin.ordered_qty > 0 or bin.indented_qty > 0
|
||||
or bin.planned_qty > 0) and cstr(bin.stock_uom) != cstr(stock_uom):
|
||||
or bin.planned_qty > 0) and cstr(bin.stock_uom) != cstr(stock_uom):
|
||||
matched = False
|
||||
break
|
||||
|
||||
@ -1008,4 +1007,4 @@ def update_variants(variants, template, publish_progress=True):
|
||||
variant.save()
|
||||
count+=1
|
||||
if publish_progress:
|
||||
frappe.publish_progress(count*100/len(variants), title = _("Updating Variants..."))
|
||||
frappe.publish_progress(count*100/len(variants), title = _("Updating Variants..."))
|
||||
|
@ -51,6 +51,7 @@
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"description": "If blank, parent Warehouse Account or company default will be considered",
|
||||
"fieldname": "warehouse_name",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
@ -870,7 +871,7 @@
|
||||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"modified": "2018-08-29 06:26:48.647225",
|
||||
"modified": "2018-08-29 06:26:49.647225",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Stock",
|
||||
"name": "Warehouse",
|
||||
|
@ -606,28 +606,39 @@ def get_pos_profile_item_details(company, args, pos_profile=None, update_data=Fa
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_pos_profile(company, pos_profile=None, user=None):
|
||||
if pos_profile:
|
||||
return frappe.get_cached_doc('POS Profile', pos_profile)
|
||||
if pos_profile: return frappe.get_cached_doc('POS Profile', pos_profile)
|
||||
|
||||
if not user:
|
||||
user = frappe.session['user']
|
||||
|
||||
condition = "pfu.user = %(user)s AND pfu.default=1"
|
||||
if user and company:
|
||||
condition = "pfu.user = %(user)s AND pf.company = %(company)s AND pfu.default=1"
|
||||
|
||||
pos_profile = frappe.db.sql("""SELECT pf.*
|
||||
FROM
|
||||
`tabPOS Profile` pf LEFT JOIN `tabPOS Profile User` pfu
|
||||
ON
|
||||
pf.name = pfu.parent
|
||||
WHERE
|
||||
(
|
||||
(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
|
||||
""", {
|
||||
{cond} AND pf.disabled = 0
|
||||
""".format(cond = condition), {
|
||||
'user': user,
|
||||
'company': company
|
||||
}, as_dict=1)
|
||||
|
||||
if not pos_profile and company:
|
||||
pos_profile = frappe.db.sql("""SELECT pf.*
|
||||
FROM
|
||||
`tabPOS Profile` pf LEFT JOIN `tabPOS Profile User` pfu
|
||||
ON
|
||||
pf.name = pfu.parent
|
||||
WHERE
|
||||
pf.company = %(company)s AND pf.disabled = 0
|
||||
""", {
|
||||
'company': company
|
||||
}, as_dict=1)
|
||||
|
||||
return pos_profile and pos_profile[0] or None
|
||||
|
||||
def get_serial_nos_by_fifo(args, sales_order=None):
|
||||
|
Loading…
x
Reference in New Issue
Block a user