Merge branch 'master' into develop

This commit is contained in:
Rohit Waghchaure 2018-01-19 13:29:57 +05:30
commit c987500e08
12 changed files with 239 additions and 81 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.10' __version__ = '10.0.11'
def get_default_company(user=None): def get_default_company(user=None):
'''Get default company for user''' '''Get default company for user'''

View File

@ -23,10 +23,10 @@ frappe.query_reports["Accounts Receivable Summary"] = {
"options": "Customer Group" "options": "Customer Group"
}, },
{ {
"fieldname":"credit_days_based_on", "fieldname":"payment_terms_template",
"label": __("Credit Days Based On"), "label": __("Payment Terms Template"),
"fieldtype": "Select", "fieldtype": "Link",
"options": "\nFixed Days\nLast Day of the Next Month" "options": "Payment Terms Template"
}, },
{ {
"fieldtype": "Break", "fieldtype": "Break",

View File

@ -19,36 +19,66 @@
<tr> <tr>
<th style="width: 15%">{%= __("Date") %}</th> <th style="width: 15%">{%= __("Date") %}</th>
<th style="width: 15%">{%= __("Ref") %}</th> <th style="width: 15%">{%= __("Ref") %}</th>
<th style="width: 40%">{%= __("Party") %}</th> <th style="width: 25%">{%= __("Party") %}</th>
<th style="width: 15%">{%= __("Debit") %}</th> <th style="width: 15%">{%= __("Debit") %}</th>
<th style="width: 15%">{%= __("Credit") %}</th> <th style="width: 15%">{%= __("Credit") %}</th>
<th style="width: 15%">{%= __("Balance") %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for(var i=0, l=data.length; i<l; i++) { %} {% for(var i=0, l=data.length; i<l; i++) { %}
<tr> <tr>
{% if(data[i][__("Posting Date")]) { %} {% if(data[i].posting_date) { %}
<td>{%= dateutil.str_to_user(data[i][__("Posting Date")]) %}</td> <td>{%= dateutil.str_to_user(data[i].posting_date) %}</td>
<td>{%= data[i][__("Voucher Type")] %} <td>{%= data[i].voucher_type %}
<br>{%= data[i][__("Voucher No")] %}</td> <br>{%= data[i].voucher_no %}</td>
<td> <td>
{% if(!(filters.party || filters.account)) { %} {% if(!(filters.party || filters.account)) { %}
{%= data[i][__("Party")] || data[i][__("Account")] %} {%= data[i].party || data[i].account %}
<br> <br>
{% } %} {% } %}
{{ __("Against") }}: {%= data[i][__("Against Account")] %} {{ __("Against") }}: {%= data[i].against %}
<br>{%= __("Remarks") %}: {%= data[i][__("Remarks")] %}</td> <br>{%= __("Remarks") %}: {%= data[i].remarks %}
<td style="text-align: right">{%= format_currency(data[i][__("Debit")]) %}</td> {% if(data[i].bill_no) { %}
<td style="text-align: right">{%= format_currency(data[i][__("Credit")]) %}</td> <br>{%= __("Supplier Invoice No") %}: {%= data[i].bill_no %}
{% } %}
</td>
{% if(filters.print_in_account_currency) { %}
<td style="text-align: right">
{%= format_currency(data[i].debit_in_account_currency, data[i].account_currency) %}
</td>
<td style="text-align: right">
{%= format_currency(data[i].credit_in_account_currency, data[i].account_currency) %}
</td>
{% } else { %}
<td style="text-align: right">
{%= format_currency(data[i].debit) %}</td>
<td style="text-align: right">
{%= format_currency(data[i].credit) %}</td>
{% } %}
{% } else { %} {% } else { %}
<td></td> <td></td>
<td></td> <td></td>
<td><b>{%= frappe.format(data[i][__("Account")], {fieldtype: "Link"}) || "&nbsp;" %}</b></td> <td><b>{%= frappe.format(data[i].account, {fieldtype: "Link"}) || "&nbsp;" %}</b></td>
<td style="text-align: right"> {% if(filters.print_in_account_currency) { %}
{%= data[i][__("Account")] && format_currency(data[i][__("Debit")]) %}</td> <td style="text-align: right">
<td style="text-align: right"> {%= data[i].account && format_currency(data[i].debit_in_account_currency, data[i].account_currency) %}</td>
{%= data[i][__("Account")] && format_currency(data[i][__("Credit")]) %}</td> <td style="text-align: right">
{%= data[i].account && format_currency(data[i].credit_in_account_currency, data[i].account_currency) %}</td>
{% } else { %}
<td style="text-align: right">
{%= data[i].account && format_currency(data[i].debit) %}
</td>
<td style="text-align: right">
{%= data[i].account && format_currency(data[i].credit) %}
</td>
{% } %}
{% } %}
{% if(filters.print_in_account_currency) { %}
<td style="text-align: right">{%= data[i].balance_in_account_currency %}</td>
{% } else { %}
<td style="text-align: right">{%= data[i].balance %}</td>
{% } %} {% } %}
</tr> </tr>
{% } %} {% } %}

View File

@ -105,6 +105,11 @@ frappe.query_reports["General Ledger"] = {
"fieldname":"group_by_account", "fieldname":"group_by_account",
"label": __("Group by Account"), "label": __("Group by Account"),
"fieldtype": "Check", "fieldtype": "Check",
},
{
"fieldname":"print_in_account_currency",
"label": __("Print in Account Currency"),
"fieldtype": "Check",
} }
] ]
} }

View File

@ -3,12 +3,17 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import frappe import frappe
from frappe.utils import getdate, cstr, flt from frappe.utils import getdate, cstr, flt, fmt_money
from frappe import _, _dict from frappe import _, _dict
from erpnext.accounts.utils import get_account_currency from erpnext.accounts.utils import get_account_currency
def execute(filters=None): def execute(filters=None):
account_details = {} account_details = {}
if filters and filters.get('print_in_account_currency') and \
not filters.get('account'):
frappe.throw(_("Select an account to print in account currency"))
for acc in frappe.db.sql("""select name, is_group from tabAccount""", as_dict=1): for acc in frappe.db.sql("""select name, is_group from tabAccount""", as_dict=1):
account_details.setdefault(acc.name, acc) account_details.setdefault(acc.name, acc)
@ -76,28 +81,6 @@ def set_account_currency(filters):
return filters return filters
def get_columns(filters):
columns = [
_("Posting Date") + ":Date:90", _("Account") + ":Link/Account:200",
_("Debit") + ":Float:100", _("Credit") + ":Float:100"
]
if filters.get("show_in_account_currency"):
columns += [
_("Debit") + " (" + filters.account_currency + ")" + ":Float:100",
_("Credit") + " (" + filters.account_currency + ")" + ":Float:100"
]
columns += [
_("Voucher Type") + "::120", _("Voucher No") + ":Dynamic Link/"+_("Voucher Type")+":160",
_("Against Account") + "::120", _("Party Type") + "::80", _("Party") + "::150",
_("Project") + ":Link/Project:100", _("Cost Center") + ":Link/Cost Center:100",
_("Against Voucher Type") + "::120", _("Against Voucher") + ":Dynamic Link/"+_("Against Voucher Type")+":160",
_("Remarks") + "::400"
]
return columns
def get_result(filters, account_details): def get_result(filters, account_details):
gl_entries = get_gl_entries(filters) gl_entries = get_gl_entries(filters)
@ -193,24 +176,6 @@ def get_data_with_opening_closing(filters, account_details, gl_entries):
# closing # closing
data.append(totals.closing) data.append(totals.closing)
#total closing
total_closing = totals.total_closing
total_debit = totals.closing.get('debit', 0)
total_credit = totals.closing.get('credit', 0)
debit_in_account_currency = totals.closing.get('debit_in_account_currency', 0)
credit_in_account_currency = totals.closing.get('credit_in_account_currency', 0)
total_amount = total_debit - total_credit
if total_amount > 0:
total_closing['debit'] = total_amount
total_closing['debit_in_account_currency'] = debit_in_account_currency - credit_in_account_currency
else:
total_closing['credit'] = abs(total_amount)
total_closing['credit_in_account_currency'] = abs(debit_in_account_currency - credit_in_account_currency)
data.append(totals.total_closing)
return data return data
def get_totals_dict(): def get_totals_dict():
@ -225,8 +190,7 @@ def get_totals_dict():
return _dict( return _dict(
opening = _get_debit_credit_dict(_('Opening')), opening = _get_debit_credit_dict(_('Opening')),
total = _get_debit_credit_dict(_('Total')), total = _get_debit_credit_dict(_('Total')),
closing = _get_debit_credit_dict(_('Closing (Opening + Total)')), closing = _get_debit_credit_dict(_('Closing (Opening + Total)'))
total_closing = _get_debit_credit_dict(_('Closing Balance (Dr - Cr)'))
) )
def initialize_gle_map(gl_entries): def initialize_gle_map(gl_entries):
@ -270,17 +234,164 @@ def get_accountwise_gle(filters, gl_entries, gle_map):
return totals, entries return totals, entries
def get_result_as_list(data, filters): def get_result_as_list(data, filters):
result = [] balance, balance_in_account_currency = 0, 0
inv_details = get_supplier_invoice_details()
for d in data: for d in data:
row = [d.get("posting_date"), d.get("account"), d.get("debit"), d.get("credit")] if not d.posting_date:
balance, balance_in_account_currency = 0, 0
balance, label = get_balance(d, balance, 'debit', 'credit')
d['balance'] = '{0} {1}'.format(fmt_money(abs(balance)), label)
if filters.get("show_in_account_currency"): if filters.get("show_in_account_currency"):
row += [d.get("debit_in_account_currency"), d.get("credit_in_account_currency")] balance_in_account_currency, label = get_balance(d, balance_in_account_currency,
'debit_in_account_currency', 'credit_in_account_currency')
d['balance_in_account_currency'] = '{0} {1}'.format(fmt_money(abs(balance_in_account_currency)), label)
else:
d['debit_in_account_currency'] = d.get('debit', 0)
d['credit_in_account_currency'] = d.get('credit', 0)
d['balance_in_account_currency'] = d.get('balance')
row += [d.get("voucher_type"), d.get("voucher_no"), d.get("against"), d['account_currency'] = filters.account_currency
d.get("party_type"), d.get("party"), d.get("project"), d.get("cost_center"), d.get("against_voucher_type"), d.get("against_voucher"), d.get("remarks") d['bill_no'] = inv_details.get(d.against_voucher, '')
]
result.append(row) return data
return result def get_supplier_invoice_details():
inv_details = {}
for d in frappe.db.sql(""" select name, bill_no from `tabPurchase Invoice`
where docstatus = 1 and bill_no is not null and bill_no != '' """, as_dict=1):
inv_details[d.name] = d.bill_no
return inv_details
def get_balance(row, balance, debit_field, credit_field):
balance += (row.get(debit_field, 0) - row.get(credit_field, 0))
label = 'DR' if balance > 0 else 'CR'
return balance, label
def get_columns(filters):
columns = [
{
"label": _("Posting Date"),
"fieldname": "posting_date",
"fieldtype": "Date",
"width": 90
},
{
"label": _("Account"),
"fieldname": "account",
"fieldtype": "Link",
"options": "Account",
"width": 180
},
{
"label": _("Debit"),
"fieldname": "debit",
"fieldtype": "Float",
"width": 100
},
{
"label": _("Credit"),
"fieldname": "credit",
"fieldtype": "Float",
"width": 100
},
{
"label": _("Balance"),
"fieldname": "balance",
"fieldtype": "Data",
"width": 100
}
]
if filters.get("show_in_account_currency"):
columns.extend([
{
"label": _("Debit") + " (" + filters.account_currency + ")",
"fieldname": "debit_in_account_currency",
"fieldtype": "Float",
"width": 100
},
{
"label": _("Credit") + " (" + filters.account_currency + ")",
"fieldname": "credit_in_account_currency",
"fieldtype": "Float",
"width": 100
},
{
"label": _("Balance") + " (" + filters.account_currency + ")",
"fieldname": "balance_in_account_currency",
"fieldtype": "Data",
"width": 100
}
])
columns.extend([
{
"label": _("Voucher Type"),
"fieldname": "voucher_type",
"width": 120
},
{
"label": _("Voucher No"),
"fieldname": "voucher_no",
"fieldtype": "Dynamic Link",
"options": "voucher_type",
"width": 180
},
{
"label": _("Against Account"),
"fieldname": "against",
"width": 120
},
{
"label": _("Party Type"),
"fieldname": "party_type",
"width": 100
},
{
"label": _("Party"),
"fieldname": "party",
"width": 100
},
{
"label": _("Project"),
"options": "Project",
"fieldname": "project",
"width": 100
},
{
"label": _("Cost Center"),
"options": "Cost Center",
"fieldname": "cost_center",
"width": 100
},
{
"label": _("Against Voucher Type"),
"fieldname": "against_voucher_type",
"width": 100
},
{
"label": _("Against Voucher"),
"fieldname": "against_voucher",
"fieldtype": "Dynamic Link",
"options": "against_voucher_type",
"width": 100
},
{
"label": _("Supplier Invoice No"),
"fieldname": "bill_no",
"fieldtype": "Data",
"width": 100
},
{
"label": _("Remarks"),
"fieldname": "remarks",
"width": 400
}
])
return columns

View File

@ -52,7 +52,7 @@ def get_sales_payment_data(filters, columns):
return data return data
def get_conditions(filters): def get_conditions(filters):
conditions = "" conditions = "1=1"
if filters.get("from_date"): conditions += "a.posting_date >= %(from_date)s" if filters.get("from_date"): conditions += "a.posting_date >= %(from_date)s"
if filters.get("to_date"): conditions += " and a.posting_date <= %(to_date)s" if filters.get("to_date"): conditions += " and a.posting_date <= %(to_date)s"
if filters.get("company"): conditions += " and a.company=%(company)s" if filters.get("company"): conditions += " and a.company=%(company)s"

View File

@ -30,10 +30,10 @@ frappe.ui.form.on("Purchase Order", {
return erpnext.queries.warehouse(frm.doc); return erpnext.queries.warehouse(frm.doc);
}); });
frappe.db.get_value('Buying Settings', {name: 'Buying Settings'}, 'disable_fetch_last_purchase_rate', (r) => { if (frm.doc.__onload) {
value = r && cint(r.disable_fetch_last_purchase_rate); frm.toggle_display('get_last_purchase_rate',
frm.toggle_display('get_last_purchase_rate', !value); frm.doc.__onload.disable_fetch_last_purchase_rate);
}); }
frm.set_indicator_formatter('item_code', frm.set_indicator_formatter('item_code',
function(doc) { return (doc.qty<=doc.received_qty) ? "green" : "orange" }) function(doc) { return (doc.qty<=doc.received_qty) ? "green" : "orange" })

View File

@ -34,6 +34,12 @@ class PurchaseOrder(BuyingController):
'overflow_type': 'order' 'overflow_type': 'order'
}] }]
def onload(self):
super(PurchaseOrder, self).onload()
self.set_onload('disable_fetch_last_purchase_rate',
cint(frappe.db.get_single_value("Buying Settings", "disable_fetch_last_purchase_rate")))
def validate(self): def validate(self):
super(PurchaseOrder, self).validate() super(PurchaseOrder, self).validate()

View File

@ -310,6 +310,7 @@ class ProductionPlanningTool(Document):
} }
""" """
item_list = [] item_list = []
precision = frappe.get_precision("BOM Item", "stock_qty")
for bom, so_wise_qty in bom_dict.items(): for bom, so_wise_qty in bom_dict.items():
bom_wise_item_details = {} bom_wise_item_details = {}
@ -334,8 +335,9 @@ class ProductionPlanningTool(Document):
for item, item_details in bom_wise_item_details.items(): for item, item_details in bom_wise_item_details.items():
for so_qty in so_wise_qty: for so_qty in so_wise_qty:
item_list.append([item, flt(item_details.qty) * so_qty[1], item_details.description, item_list.append([item, flt(flt(item_details.qty) * so_qty[1], precision),
item_details.stock_uom, item_details.min_order_qty, so_qty[0]]) item_details.description, item_details.stock_uom, item_details.min_order_qty,
so_qty[0]])
self.make_items_dict(item_list) self.make_items_dict(item_list)

View File

@ -16,7 +16,7 @@ def execute():
else: else:
company = frappe.db.get_single_value('Global Defaults', 'default_company') company = frappe.db.get_single_value('Global Defaults', 'default_company')
time_sheet = make_timesheet(data.production_order) time_sheet = make_timesheet(data.production_order, company)
args = get_timelog_data(data) args = get_timelog_data(data)
add_timesheet_detail(time_sheet, args) add_timesheet_detail(time_sheet, args)
if data.docstatus == 2: if data.docstatus == 2:

View File

@ -216,6 +216,10 @@ input[type=number]::-webkit-outer-spin-button {
} }
.grand-total-value { .grand-total-value {
font-size: 24px; font-size: 18px;
} }
}
.rounded-total-value {
font-size: 18px;
} }

View File

@ -40,7 +40,7 @@ def create_customers(args_data):
@frappe.whitelist() @frappe.whitelist()
def create_letterhead(args_data): def create_letterhead(args_data):
args = json.loads(args_data) args = json.loads(args_data)
letterhead = args.get("letterhead") letterhead = args.get("letterhead").encode('utf-8')
if letterhead: if letterhead:
try: try:
frappe.get_doc({ frappe.get_doc({