Fixed merge conflict

This commit is contained in:
Nabin Hait 2018-01-17 18:56:02 +05:30
commit 570e29d5e7
14 changed files with 67 additions and 68 deletions

View File

@ -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.0.9' __version__ = '10.0.10'
def get_default_company(user=None): def get_default_company(user=None):
'''Get default company for user''' '''Get default company for user'''

View File

@ -142,7 +142,7 @@ class SalesInvoice(SellingController):
self.update_time_sheet(self.name) self.update_time_sheet(self.name)
self.update_current_month_sales() update_company_current_month_sales(self.company)
self.update_project() self.update_project()
def validate_pos_paid_amount(self): def validate_pos_paid_amount(self):
@ -181,16 +181,9 @@ class SalesInvoice(SellingController):
self.make_gl_entries_on_cancel() self.make_gl_entries_on_cancel()
frappe.db.set(self, 'status', 'Cancelled') frappe.db.set(self, 'status', 'Cancelled')
self.update_current_month_sales() update_company_current_month_sales(self.company)
self.update_project() self.update_project()
def update_current_month_sales(self):
if frappe.flags.in_test:
update_company_current_month_sales(self.company)
else:
frappe.enqueue('erpnext.setup.doctype.company.company.update_company_current_month_sales',
company=self.company)
def update_status_updater_args(self): def update_status_updater_args(self):
if cint(self.update_stock): if cint(self.update_stock):
self.status_updater.extend([{ self.status_updater.extend([{
@ -675,28 +668,28 @@ class SalesInvoice(SellingController):
# income account gl entries # income account gl entries
for item in self.get("items"): for item in self.get("items"):
if flt(item.base_net_amount): if flt(item.base_net_amount):
account_currency = get_account_currency(item.income_account)
gl_entries.append(
self.get_gl_dict({
"account": item.income_account,
"against": self.customer,
"credit": item.base_net_amount,
"credit_in_account_currency": item.base_net_amount \
if account_currency==self.company_currency else item.net_amount,
"cost_center": item.cost_center
}, account_currency)
)
if item.is_fixed_asset: if item.is_fixed_asset:
asset = frappe.get_doc("Asset", item.asset) asset = frappe.get_doc("Asset", item.asset)
fixed_asset_gl_entries = get_gl_entries_on_asset_disposal(asset, is_sale=True) fixed_asset_gl_entries = get_gl_entries_on_asset_disposal(asset, item.base_net_amount)
for gle in fixed_asset_gl_entries: for gle in fixed_asset_gl_entries:
gle["against"] = self.customer gle["against"] = self.customer
gl_entries.append(self.get_gl_dict(gle)) gl_entries.append(self.get_gl_dict(gle))
asset.db_set("disposal_date", self.posting_date) asset.db_set("disposal_date", self.posting_date)
asset.set_status("Sold" if self.docstatus==1 else None) asset.set_status("Sold" if self.docstatus==1 else None)
else:
account_currency = get_account_currency(item.income_account)
gl_entries.append(
self.get_gl_dict({
"account": item.income_account,
"against": self.customer,
"credit": item.base_net_amount,
"credit_in_account_currency": item.base_net_amount \
if account_currency==self.company_currency else item.net_amount,
"cost_center": item.cost_center
}, account_currency)
)
# expense account gl entries # expense account gl entries
if cint(self.update_stock) and \ if cint(self.update_stock) and \

View File

@ -6,7 +6,6 @@ import frappe
from frappe import _, scrub from frappe import _, scrub
from erpnext.stock.utils import get_incoming_rate from erpnext.stock.utils import get_incoming_rate
from erpnext.controllers.queries import get_match_cond from erpnext.controllers.queries import get_match_cond
from erpnext.stock.stock_ledger import get_valuation_rate
from frappe.utils import flt from frappe.utils import flt
@ -248,6 +247,7 @@ class GrossProfitGenerator(object):
return 0.0 return 0.0
def get_average_buying_rate(self, row, item_code): def get_average_buying_rate(self, row, item_code):
args = row
if not item_code in self.average_buying_rate: if not item_code in self.average_buying_rate:
if item_code in self.non_stock_items: if item_code in self.non_stock_items:
self.average_buying_rate[item_code] = flt(frappe.db.sql(""" self.average_buying_rate[item_code] = flt(frappe.db.sql("""
@ -255,14 +255,14 @@ class GrossProfitGenerator(object):
from `tabPurchase Invoice Item` from `tabPurchase Invoice Item`
where item_code = %s and docstatus=1""", item_code)[0][0]) where item_code = %s and docstatus=1""", item_code)[0][0])
else: else:
row.voucher_type = row.parenttype args.update({
row.voucher_no = row.parent 'voucher_type': row.parenttype,
average_buying_rate = get_incoming_rate(row) 'voucher_no': row.parent,
if not average_buying_rate: 'allow_zero_valuation': True,
average_buying_rate = get_valuation_rate(item_code, row.warehouse, 'company': self.filters.company
row.parenttype, row.parent, allow_zero_rate=row.allow_zero_valuation, })
currency=self.filters.currency, company=self.filters.company)
average_buying_rate = get_incoming_rate(args)
self.average_buying_rate[item_code] = flt(average_buying_rate) self.average_buying_rate[item_code] = flt(average_buying_rate)
return self.average_buying_rate[item_code] return self.average_buying_rate[item_code]
@ -311,8 +311,7 @@ class GrossProfitGenerator(object):
`tabSales Invoice Item`.brand, `tabSales Invoice Item`.dn_detail, `tabSales Invoice Item`.brand, `tabSales Invoice Item`.dn_detail,
`tabSales Invoice Item`.delivery_note, `tabSales Invoice Item`.stock_qty as qty, `tabSales Invoice Item`.delivery_note, `tabSales Invoice Item`.stock_qty as qty,
`tabSales Invoice Item`.base_net_rate, `tabSales Invoice Item`.base_net_amount, `tabSales Invoice Item`.base_net_rate, `tabSales Invoice Item`.base_net_amount,
`tabSales Invoice Item`.name as "item_row", `tabSales Invoice`.is_return, `tabSales Invoice Item`.name as "item_row", `tabSales Invoice`.is_return
`tabSales Invoice Item`.allow_zero_valuation_rate as "allow_zero_valuation"
{sales_person_cols} {sales_person_cols}
from from
`tabSales Invoice` inner join `tabSales Invoice Item` `tabSales Invoice` inner join `tabSales Invoice Item`

View File

@ -51,9 +51,6 @@ class Asset(Document):
if not self.get(field): if not self.get(field):
self.set(field, value) self.set(field, value)
self.value_after_depreciation = (flt(self.gross_purchase_amount) -
flt(self.opening_accumulated_depreciation))
def validate_asset_values(self): def validate_asset_values(self):
if flt(self.expected_value_after_useful_life) >= flt(self.gross_purchase_amount): if flt(self.expected_value_after_useful_life) >= flt(self.gross_purchase_amount):
frappe.throw(_("Expected Value After Useful Life must be less than Gross Purchase Amount")) frappe.throw(_("Expected Value After Useful Life must be less than Gross Purchase Amount"))
@ -61,7 +58,10 @@ class Asset(Document):
if not flt(self.gross_purchase_amount): if not flt(self.gross_purchase_amount):
frappe.throw(_("Gross Purchase Amount is mandatory"), frappe.MandatoryError) frappe.throw(_("Gross Purchase Amount is mandatory"), frappe.MandatoryError)
if not self.is_existing_asset and self.calculate_depreciation: if not self.calculate_depreciation:
return
if not self.is_existing_asset:
self.opening_accumulated_depreciation = 0 self.opening_accumulated_depreciation = 0
self.number_of_depreciations_booked = 0 self.number_of_depreciations_booked = 0
if not self.next_depreciation_date: if not self.next_depreciation_date:
@ -81,6 +81,9 @@ class Asset(Document):
if cint(self.number_of_depreciations_booked) > cint(self.total_number_of_depreciations): if cint(self.number_of_depreciations_booked) > cint(self.total_number_of_depreciations):
frappe.throw(_("Number of Depreciations Booked cannot be greater than Total Number of Depreciations")) frappe.throw(_("Number of Depreciations Booked cannot be greater than Total Number of Depreciations"))
self.value_after_depreciation = (flt(self.gross_purchase_amount) -
flt(self.opening_accumulated_depreciation))
if self.next_depreciation_date and getdate(self.next_depreciation_date) < getdate(nowdate()): if self.next_depreciation_date and getdate(self.next_depreciation_date) < getdate(nowdate()):
frappe.msgprint(_("Next Depreciation Date is entered as past date"), title=_('Warning'), indicator='red') frappe.msgprint(_("Next Depreciation Date is entered as past date"), title=_('Warning'), indicator='red')
@ -106,12 +109,13 @@ class Asset(Document):
n * cint(self.frequency_of_depreciation)) n * cint(self.frequency_of_depreciation))
depreciation_amount = self.get_depreciation_amount(value_after_depreciation) depreciation_amount = self.get_depreciation_amount(value_after_depreciation)
value_after_depreciation -= flt(depreciation_amount) if depreciation_amount:
value_after_depreciation -= flt(depreciation_amount)
self.append("schedules", { self.append("schedules", {
"schedule_date": schedule_date, "schedule_date": schedule_date,
"depreciation_amount": depreciation_amount "depreciation_amount": depreciation_amount
}) })
def set_accumulated_depreciation(self): def set_accumulated_depreciation(self):
accumulated_depreciation = flt(self.opening_accumulated_depreciation) accumulated_depreciation = flt(self.opening_accumulated_depreciation)

View File

@ -151,13 +151,11 @@ def restore_asset(asset_name):
asset.set_status() asset.set_status()
@frappe.whitelist() @frappe.whitelist()
def get_gl_entries_on_asset_disposal(asset, is_sale=False): def get_gl_entries_on_asset_disposal(asset, selling_amount=0):
fixed_asset_account, accumulated_depr_account, depr_expense_account = get_depreciation_accounts(asset) fixed_asset_account, accumulated_depr_account, depr_expense_account = get_depreciation_accounts(asset)
accumulated_depr_amount = flt(asset.gross_purchase_amount) - flt(asset.value_after_depreciation) disposal_account, depreciation_cost_center = get_disposal_account_and_cost_center(asset.company)
expense_account, cost_center = get_disposal_account_and_cost_center(asset.company) accumulated_depr_amount = flt(asset.gross_purchase_amount) - flt(asset.value_after_depreciation)
if is_sale:
expense_account = depr_expense_account
gl_entries = [ gl_entries = [
{ {
@ -172,12 +170,14 @@ def get_gl_entries_on_asset_disposal(asset, is_sale=False):
} }
] ]
if flt(asset.value_after_depreciation): profit_amount = flt(selling_amount) - flt(asset.value_after_depreciation)
if profit_amount:
debit_or_credit = "debit" if profit_amount < 0 else "credit"
gl_entries.append({ gl_entries.append({
"account": expense_account, "account": disposal_account,
"cost_center": cost_center, "cost_center": depreciation_cost_center,
"debit": flt(asset.value_after_depreciation), debit_or_credit: abs(profit_amount),
"debit_in_account_currency": flt(asset.value_after_depreciation) debit_or_credit + "_in_account_currency": abs(profit_amount)
}) })
return gl_entries return gl_entries

View File

@ -234,9 +234,8 @@ class TestAsset(unittest.TestCase):
expected_gle = ( expected_gle = (
("_Test Accumulated Depreciations - _TC", 30000.0, 0.0), ("_Test Accumulated Depreciations - _TC", 30000.0, 0.0),
("_Test Depreciations - _TC", 70000.0, 0.0),
("_Test Fixed Asset - _TC", 0.0, 100000.0), ("_Test Fixed Asset - _TC", 0.0, 100000.0),
("_Test Gain/Loss on Asset Disposal - _TC", 0.0, 25000.0), ("_Test Gain/Loss on Asset Disposal - _TC", 45000.0, 0.0),
("Debtors - _TC", 25000.0, 0.0) ("Debtors - _TC", 25000.0, 0.0)
) )

View File

@ -666,7 +666,7 @@ class AccountsController(TransactionBase):
self.remove(item) self.remove(item)
def set_payment_schedule(self): def set_payment_schedule(self):
posting_date = self.get("posting_date") or self.get("transaction_date") posting_date = self.get("bill_date") or self.get("posting_date") or self.get("transaction_date")
date = self.get("due_date") date = self.get("due_date")
due_date = date or posting_date due_date = date or posting_date
grand_total = self.get("rounded_total") or self.grand_total grand_total = self.get("rounded_total") or self.grand_total

View File

@ -549,7 +549,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
final_message = final_message + message1; final_message = final_message + message1;
} }
if (this.frm.doc.payment_schedule.length) { if ((this.frm.doc.payment_schedule || []).length) {
message2 = "Payment Schedule Table"; message2 = "Payment Schedule Table";
if (message1.length !== 0) message2 = " and " + message2; if (message1.length !== 0) message2 = " and " + message2;
final_message = final_message + message2; final_message = final_message + message2;
@ -1262,11 +1262,13 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
var me = this; var me = this;
const doc = this.frm.doc; const doc = this.frm.doc;
if(doc.payment_terms_template && doc.doctype !== 'Delivery Note') { if(doc.payment_terms_template && doc.doctype !== 'Delivery Note') {
var posting_date = doc.bill_date || doc.posting_date || doc.transaction_date;
frappe.call({ frappe.call({
method: "erpnext.controllers.accounts_controller.get_payment_terms", method: "erpnext.controllers.accounts_controller.get_payment_terms",
args: { args: {
terms_template: doc.payment_terms_template, terms_template: doc.payment_terms_template,
posting_date: doc.posting_date || doc.transaction_date, posting_date: posting_date,
grand_total: doc.rounded_total || doc.grand_total grand_total: doc.rounded_total || doc.grand_total
}, },
callback: function(r) { callback: function(r) {

View File

@ -146,7 +146,8 @@ class Customer(TransactionBase):
frappe.throw(_("A Customer Group exists with same name please change the Customer name or rename the Customer Group"), frappe.NameError) frappe.throw(_("A Customer Group exists with same name please change the Customer name or rename the Customer Group"), frappe.NameError)
def validate_credit_limit_on_change(self): def validate_credit_limit_on_change(self):
if self.get("__islocal") or self.credit_limit == frappe.db.get_value("Customer", self.name, "credit_limit"): if self.get("__islocal") or not self.credit_limit \
or self.credit_limit == frappe.db.get_value("Customer", self.name, "credit_limit"):
return return
for company in frappe.get_all("Company"): for company in frappe.get_all("Company"):

View File

@ -82,8 +82,8 @@ erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({
get_query_filters: { get_query_filters: {
status: ["not in", ["Lost", "Closed"]], status: ["not in", ["Lost", "Closed"]],
company: me.frm.doc.company, company: me.frm.doc.company,
// cannot set enquiry_type as setter, as the fieldname is order_type // cannot set opportunity_type as setter, as the fieldname is order_type
enquiry_type: me.frm.doc.order_type, opportunity_type: me.frm.doc.order_type,
} }
}) })
}, __("Get items from"), "btn-default"); }, __("Get items from"), "btn-default");

View File

@ -287,7 +287,9 @@ class Company(Document):
frappe.db.sql("delete from tabBOM where company=%s", self.name) frappe.db.sql("delete from tabBOM where company=%s", self.name)
for dt in ("BOM Operation", "BOM Item", "BOM Scrap Item", "BOM Explosion Item"): for dt in ("BOM Operation", "BOM Item", "BOM Scrap Item", "BOM Explosion Item"):
frappe.db.sql("delete from `tab%s` where parent in (%s)""" frappe.db.sql("delete from `tab%s` where parent in (%s)"""
% (dt, ', '.join(['%s']*len(boms))), tuple(boms), debug=1) % (dt, ', '.join(['%s']*len(boms))), tuple(boms))
frappe.db.sql("delete from tabEmployee where company=%s", self.name)
@frappe.whitelist() @frappe.whitelist()
def enqueue_replace_abbr(company, old, new): def enqueue_replace_abbr(company, old, new):
@ -356,7 +358,6 @@ def update_company_current_month_sales(company):
monthly_total = results[0]['total'] if len(results) > 0 else 0 monthly_total = results[0]['total'] if len(results) > 0 else 0
frappe.db.set_value("Company", company, "total_monthly_sales", monthly_total) frappe.db.set_value("Company", company, "total_monthly_sales", monthly_total)
frappe.db.commit()
def update_company_monthly_sales(company): def update_company_monthly_sales(company):
'''Cache past year monthly sales of every company based on sales invoices''' '''Cache past year monthly sales of every company based on sales invoices'''
@ -367,7 +368,6 @@ def update_company_monthly_sales(company):
"posting_date", filter_str, "sum") "posting_date", filter_str, "sum")
frappe.db.set_value("Company", company, "sales_monthly_history", json.dumps(month_to_value_dict)) frappe.db.set_value("Company", company, "sales_monthly_history", json.dumps(month_to_value_dict))
frappe.db.commit()
def cache_companies_monthly_sales_history(): def cache_companies_monthly_sales_history():
companies = [d['name'] for d in frappe.get_list("Company")] companies = [d['name'] for d in frappe.get_list("Company")]

View File

@ -170,6 +170,8 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten
d.description = item.description; d.description = item.description;
d.warehouse = values.warehouse; d.warehouse = values.warehouse;
d.uom = item.stock_uom; d.uom = item.stock_uom;
d.stock_uom = item.stock_uom;
d.conversion_factor = 1;
d.qty = item.qty; d.qty = item.qty;
}); });
} }
@ -282,4 +284,4 @@ function set_schedule_date(frm) {
if(frm.doc.schedule_date){ if(frm.doc.schedule_date){
erpnext.utils.copy_value_in_all_row(frm.doc, frm.doc.doctype, frm.doc.name, "items", "schedule_date"); erpnext.utils.copy_value_in_all_row(frm.doc, frm.doc.doctype, frm.doc.name, "items", "schedule_date");
} }
} }

View File

@ -144,10 +144,9 @@ def get_incoming_rate(args):
if not in_rate: if not in_rate:
voucher_no = args.get('voucher_no') or args.get('name') voucher_no = args.get('voucher_no') or args.get('name')
in_rate = get_valuation_rate(args.get('item_code'), args.get('warehouse'), in_rate = get_valuation_rate(args.get('item_code'), args.get('warehouse'),
args.get('voucher_type'), voucher_no, args.get('allow_zero_valuation'), args.get('voucher_type'), voucher_no, args.get('allow_zero_valuation'),
currency=erpnext.get_company_currency(args.get('company'))) currency=erpnext.get_company_currency(args.get('company')), company=args.get('company'))
return in_rate return in_rate

View File

@ -1,7 +1,7 @@
<div class="row"> <div class="row">
{% if doc.flags.show_inclusive_tax_in_print %} {% if doc.flags.show_inclusive_tax_in_print %}
<div class="col-xs-5 {%- if doc._align_labels_right %} text-right{%- endif -%}"> <div class="col-xs-5 {%- if doc._align_labels_right %} text-right{%- endif -%}">
<label>{{ _("Total Excl. Tax") }}</label></div> <label>{{ _("Total (Without Tax)") }}</label></div>
<div class="col-xs-7 text-right"> <div class="col-xs-7 text-right">
{{ doc.get_formatted("net_total", doc) }} {{ doc.get_formatted("net_total", doc) }}
</div> </div>
@ -12,4 +12,4 @@
{{ doc.get_formatted("total", doc) }} {{ doc.get_formatted("total", doc) }}
</div> </div>
{% endif %} {% endif %}
</div> </div>