mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-24 19:39:50 +00:00
Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f92f04bffc | ||
|
|
6592899741 | ||
|
|
06b27757ab | ||
|
|
e21e1ebae2 | ||
|
|
a26bb96d2d | ||
|
|
fbe1563101 | ||
|
|
47a3f639ed | ||
|
|
efb5bf2cfc | ||
|
|
385311c8a2 | ||
|
|
0788ee62c1 | ||
|
|
ec6267e82a | ||
|
|
db05ac2414 | ||
|
|
f862505bf9 | ||
|
|
ea6d7e9b09 | ||
|
|
8f782e71af | ||
|
|
dac204b1e3 | ||
|
|
9c786948d5 | ||
|
|
6f1795cb3d | ||
|
|
01b555edc7 | ||
|
|
20b01873ab | ||
|
|
43accf4c07 | ||
|
|
9239ed5c44 | ||
|
|
713e2b7b62 | ||
|
|
3b6dc141c6 | ||
|
|
e4fb7b1b2f | ||
|
|
9a1bcac576 | ||
|
|
e68b089187 | ||
|
|
d8a372587d | ||
|
|
f04ce3c5a6 | ||
|
|
50f8262ac7 |
@@ -2,7 +2,7 @@
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
|
||||
__version__ = '7.0.30'
|
||||
__version__ = '7.0.33'
|
||||
|
||||
def get_default_company(user=None):
|
||||
'''Get default company for user'''
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
"docstatus": 0,
|
||||
"doctype": "DocType",
|
||||
"document_type": "",
|
||||
"editable_grid": 1,
|
||||
"fields": [
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
@@ -65,24 +66,24 @@
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "monthly_distribution",
|
||||
"fieldname": "company",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 0,
|
||||
"label": "Monthly Distribution",
|
||||
"label": "Company",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Monthly Distribution",
|
||||
"options": "Company",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"reqd": 1,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
@@ -170,24 +171,25 @@
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "company",
|
||||
"depends_on": "eval:in_list([\"Stop\", \"Warn\"], doc.action_if_accumulated_monthly_budget_exceeded)",
|
||||
"fieldname": "monthly_distribution",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 0,
|
||||
"label": "Company",
|
||||
"label": "Monthly Distribution",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Company",
|
||||
"options": "Monthly Distribution",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 1,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
@@ -271,13 +273,14 @@
|
||||
"hide_heading": 0,
|
||||
"hide_toolbar": 0,
|
||||
"idx": 0,
|
||||
"image_view": 0,
|
||||
"in_create": 0,
|
||||
"in_dialog": 0,
|
||||
"is_submittable": 1,
|
||||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"modified": "2016-05-16 15:00:40.233685",
|
||||
"modified": "2016-08-18 14:46:02.653081",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Budget",
|
||||
|
||||
@@ -73,13 +73,14 @@ def validate_expense_against_budget(args):
|
||||
args.posting_date, args.fiscal_year, budget.budget_amount)
|
||||
|
||||
args["month_end_date"] = get_last_day(args.posting_date)
|
||||
|
||||
|
||||
compare_expense_with_budget(args, budget.cost_center,
|
||||
budget_amount, _("Accumulated Monthly"), monthly_action)
|
||||
|
||||
elif yearly_action in ["Stop", "Warn"]:
|
||||
compare_expense_with_budget(args, budget.cost_center,
|
||||
flt(budget.budget_amount), _("Annual"), yearly_action)
|
||||
if yearly_action in ("Stop", "Warn") and monthly_action != "Stop" \
|
||||
and yearly_action != monthly_action:
|
||||
compare_expense_with_budget(args, budget.cost_center,
|
||||
flt(budget.budget_amount), _("Annual"), yearly_action)
|
||||
|
||||
def compare_expense_with_budget(args, cost_center, budget_amount, action_for, action):
|
||||
actual_expense = get_actual_expense(args, cost_center)
|
||||
|
||||
@@ -252,17 +252,17 @@
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "bill_date",
|
||||
"fieldname": "due_date",
|
||||
"fieldtype": "Date",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 1,
|
||||
"in_list_view": 0,
|
||||
"label": "Supplier Invoice Date",
|
||||
"label": "Due Date",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"oldfieldname": "bill_date",
|
||||
"oldfieldname": "due_date",
|
||||
"oldfieldtype": "Date",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1,
|
||||
@@ -278,17 +278,17 @@
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"fieldname": "due_date",
|
||||
"fieldname": "bill_date",
|
||||
"fieldtype": "Date",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 1,
|
||||
"in_list_view": 0,
|
||||
"label": "Due Date",
|
||||
"label": "Supplier Invoice Date",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"oldfieldname": "due_date",
|
||||
"oldfieldname": "bill_date",
|
||||
"oldfieldtype": "Date",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1,
|
||||
@@ -3032,7 +3032,7 @@
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"menu_index": 0,
|
||||
"modified": "2016-08-10 02:45:28.746569",
|
||||
"modified": "2016-08-24 12:50:15.777689",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Purchase Invoice",
|
||||
|
||||
@@ -65,8 +65,8 @@ class SalesInvoice(SellingController):
|
||||
self.validate_fixed_asset()
|
||||
self.set_income_account_for_fixed_assets()
|
||||
|
||||
# if cint(self.is_pos):
|
||||
# self.validate_pos()
|
||||
if cint(self.is_pos):
|
||||
self.validate_pos()
|
||||
|
||||
if cint(self.update_stock):
|
||||
self.validate_dropship_item()
|
||||
@@ -219,6 +219,20 @@ class SalesInvoice(SellingController):
|
||||
timesheet.set_status()
|
||||
timesheet.save()
|
||||
|
||||
def on_update(self):
|
||||
self.set_paid_amount()
|
||||
|
||||
def set_paid_amount(self):
|
||||
paid_amount = 0.0
|
||||
base_paid_amount = 0.0
|
||||
for data in self.payments:
|
||||
data.base_amount = flt(data.amount*self.conversion_rate, self.precision("base_paid_amount"))
|
||||
paid_amount += data.amount
|
||||
base_paid_amount += data.base_amount
|
||||
|
||||
self.paid_amount = paid_amount
|
||||
self.base_paid_amount = base_paid_amount
|
||||
|
||||
def validate_time_sheets_are_submitted(self):
|
||||
for data in self.timesheets:
|
||||
if data.time_sheet:
|
||||
@@ -356,11 +370,8 @@ class SalesInvoice(SellingController):
|
||||
throw(_("Customer {0} does not belong to project {1}").format(self.customer,self.project))
|
||||
|
||||
def validate_pos(self):
|
||||
if not self.cash_bank_account and flt(self.paid_amount):
|
||||
frappe.throw(_("Cash or Bank Account is mandatory for making payment entry"))
|
||||
|
||||
if flt(self.paid_amount) + flt(self.write_off_amount) \
|
||||
- flt(self.grand_total) > 1/(10**(self.precision("grand_total") + 1)):
|
||||
- flt(self.grand_total) > 1/(10**(self.precision("grand_total") + 1)) and self.is_return:
|
||||
frappe.throw(_("""Paid amount + Write Off Amount can not be greater than Grand Total"""))
|
||||
|
||||
|
||||
@@ -381,8 +392,10 @@ class SalesInvoice(SellingController):
|
||||
if d.delivery_note:
|
||||
msgprint(_("Stock cannot be updated against Delivery Note {0}").format(d.delivery_note), raise_exception=1)
|
||||
|
||||
|
||||
def validate_write_off_account(self):
|
||||
if flt(self.write_off_amount) and not self.write_off_account:
|
||||
self.write_off_account = frappe.db.get_value('Company', self.company, 'write_off_account')
|
||||
|
||||
if flt(self.write_off_amount) and not self.write_off_account:
|
||||
msgprint(_("Please enter Write Off Account"), raise_exception=1)
|
||||
|
||||
@@ -586,35 +599,34 @@ class SalesInvoice(SellingController):
|
||||
gl_entries += super(SalesInvoice, self).get_gl_entries()
|
||||
|
||||
def make_pos_gl_entries(self, gl_entries):
|
||||
if cint(self.is_pos) and self.paid_amount:
|
||||
if cint(self.is_pos):
|
||||
for payment_mode in self.payments:
|
||||
if payment_mode.base_amount > 0:
|
||||
# POS, make payment entries
|
||||
gl_entries.append(
|
||||
self.get_gl_dict({
|
||||
"account": self.debit_to,
|
||||
"party_type": "Customer",
|
||||
"party": self.customer,
|
||||
"against": payment_mode.account,
|
||||
"credit": payment_mode.base_amount,
|
||||
"credit_in_account_currency": payment_mode.base_amount \
|
||||
if self.party_account_currency==self.company_currency \
|
||||
else payment_mode.amount,
|
||||
"against_voucher": self.return_against if cint(self.is_return) else self.name,
|
||||
"against_voucher_type": self.doctype,
|
||||
}, self.party_account_currency)
|
||||
)
|
||||
|
||||
payment_mode_account_currency = get_account_currency(payment_mode.account)
|
||||
gl_entries.append(
|
||||
self.get_gl_dict({
|
||||
"account": payment_mode.account,
|
||||
"against": self.customer,
|
||||
"debit": payment_mode.base_amount,
|
||||
"debit_in_account_currency": payment_mode.base_amount \
|
||||
if payment_mode_account_currency==self.company_currency else payment_mode.amount
|
||||
}, payment_mode_account_currency)
|
||||
)
|
||||
# POS, make payment entries
|
||||
gl_entries.append(
|
||||
self.get_gl_dict({
|
||||
"account": self.debit_to,
|
||||
"party_type": "Customer",
|
||||
"party": self.customer,
|
||||
"against": payment_mode.account,
|
||||
"credit": payment_mode.base_amount,
|
||||
"credit_in_account_currency": payment_mode.base_amount \
|
||||
if self.party_account_currency==self.company_currency \
|
||||
else payment_mode.amount,
|
||||
"against_voucher": self.return_against if cint(self.is_return) else self.name,
|
||||
"against_voucher_type": self.doctype,
|
||||
}, self.party_account_currency)
|
||||
)
|
||||
|
||||
payment_mode_account_currency = get_account_currency(payment_mode.account)
|
||||
gl_entries.append(
|
||||
self.get_gl_dict({
|
||||
"account": payment_mode.account,
|
||||
"against": self.customer,
|
||||
"debit": payment_mode.base_amount,
|
||||
"debit_in_account_currency": payment_mode.base_amount \
|
||||
if payment_mode_account_currency==self.company_currency else payment_mode.amount
|
||||
}, payment_mode_account_currency)
|
||||
)
|
||||
|
||||
def make_gle_for_change_amount(self, gl_entries):
|
||||
if cint(self.is_pos) and self.change_amount:
|
||||
|
||||
@@ -509,7 +509,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
this.remove_zero_qty_item();
|
||||
}
|
||||
|
||||
this.refresh();
|
||||
this.update_paid_amount_status(false)
|
||||
},
|
||||
|
||||
remove_zero_qty_item: function(){
|
||||
@@ -591,7 +591,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
if (!caught)
|
||||
this.add_new_item_to_grid();
|
||||
|
||||
this.refresh();
|
||||
this.update_paid_amount_status(false)
|
||||
},
|
||||
|
||||
add_new_item_to_grid: function() {
|
||||
@@ -616,6 +616,14 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
? this.item_serial_no[this.child.item_code][0] : '');
|
||||
},
|
||||
|
||||
update_paid_amount_status: function(update_paid_amount){
|
||||
if(this.name){
|
||||
update_paid_amount = update_paid_amount ? false : true;
|
||||
}
|
||||
|
||||
this.refresh(update_paid_amount);
|
||||
},
|
||||
|
||||
refresh: function(update_paid_amount) {
|
||||
var me = this;
|
||||
this.refresh_fields(update_paid_amount);
|
||||
@@ -623,6 +631,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
this.update_rate();
|
||||
this.set_primary_action();
|
||||
},
|
||||
|
||||
refresh_fields: function(update_paid_amount) {
|
||||
this.apply_pricing_rule();
|
||||
this.discount_amount_applied = false;
|
||||
@@ -698,7 +707,8 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
||||
|
||||
if (this.frm.doc.docstatus==0) {
|
||||
this.page.set_primary_action(__("Pay"), function() {
|
||||
me.validate()
|
||||
me.validate();
|
||||
me.update_paid_amount_status(true);
|
||||
me.create_invoice();
|
||||
me.make_payment();
|
||||
}, "octicon octicon-credit-card");
|
||||
|
||||
@@ -66,7 +66,8 @@ class ReceivablePayableReport(object):
|
||||
columns.append({
|
||||
"fieldname": "currency",
|
||||
"label": _("Currency"),
|
||||
"fieldtype": "Data",
|
||||
"fieldtype": "Link",
|
||||
"options": "Currency",
|
||||
"width": 100
|
||||
})
|
||||
if args.get("party_type") == "Customer":
|
||||
|
||||
@@ -34,7 +34,8 @@ class AccountsReceivableSummary(ReceivablePayableReport):
|
||||
columns.append({
|
||||
"fieldname": "currency",
|
||||
"label": _("Currency"),
|
||||
"fieldtype": "Data",
|
||||
"fieldtype": "Link",
|
||||
"options": "Currency",
|
||||
"width": 80
|
||||
})
|
||||
|
||||
|
||||
58
erpnext/change_log/v7/v7_0_0.md
Normal file
58
erpnext/change_log/v7/v7_0_0.md
Normal file
@@ -0,0 +1,58 @@
|
||||
#### New POS
|
||||
- Offline
|
||||
- Multiple Payment Modes
|
||||
- Standard documents cannot be edited in POS view
|
||||
|
||||
#### Payment Entry
|
||||
- Dedicated form for managing Payments
|
||||
- Designed for normal users who do not have accounting background
|
||||
|
||||
#### Request for Quotation
|
||||
- Updated workflow: Material Request -> **Request for Quotation** -> Supplier Quotation -> Purchase Order
|
||||
|
||||
#### Fixed Asset Management
|
||||
- Manage fixed asset records and their depreciation
|
||||
|
||||
#### Improved Navigation
|
||||
- Heatmaps
|
||||
- Centralized navigation from Masters like Item, Customer, Supplier, Employee etc.
|
||||
|
||||
#### Timesheets
|
||||
- New grid
|
||||
- Multiple time logs in one timesheets
|
||||
- Linked to Payroll and Billing
|
||||
|
||||
#### Graphs in Reports
|
||||
- Added graphs in some important reports like Balance Sheet, Accounts Receivable etc.
|
||||
|
||||
#### Sub-warehouse
|
||||
- Tree view for Warehouse
|
||||
|
||||
#### New Portal Design
|
||||
- New Homepage Design
|
||||
- Sidebar in Portal View
|
||||
- New Cart View
|
||||
|
||||
#### Collaborative Project Management
|
||||
- Web View
|
||||
- Customers/Suppliers can add/edit issues and view timesheets
|
||||
|
||||
#### Budget
|
||||
- Dedicated budget form
|
||||
- Budget can be assigned against Cost Center Group
|
||||
|
||||
#### Check Printing Format
|
||||
- Ability to customize Cheque Printing Format for any bank
|
||||
|
||||
#### Schools application is now part of ERPNext
|
||||
|
||||
#### Minor
|
||||
|
||||
- Selling Price calculation based on Margin defined in the Pricing Rule
|
||||
- Document flow-chart on Sales / Purchase Transactions
|
||||
- Domain specific desktop views
|
||||
- Add opening Stock and Rate while creating a new Item
|
||||
- Book payments and update stock directly from Purchase Invoice
|
||||
- List view for Products on Website
|
||||
- Features Setup is deprecated, settings moved to individual module setup views
|
||||
- Added Safety Stock to Item Master
|
||||
@@ -142,7 +142,7 @@ class StatusUpdater(Document):
|
||||
if item['reduce_by'] > .01:
|
||||
self.limits_crossed_error(args, item)
|
||||
|
||||
else:
|
||||
elif item[args['target_ref_field']]:
|
||||
self.check_overflow_with_tolerance(item, args)
|
||||
|
||||
def check_overflow_with_tolerance(self, item, args):
|
||||
|
||||
@@ -204,10 +204,10 @@ class StockController(AccountsController):
|
||||
from erpnext.stock.stock_ledger import make_sl_entries
|
||||
make_sl_entries(sl_entries, is_amended, allow_negative_stock, via_landed_cost_voucher)
|
||||
|
||||
def make_gl_entries_on_cancel(self):
|
||||
def make_gl_entries_on_cancel(self, repost_future_gle=True):
|
||||
if frappe.db.sql("""select name from `tabGL Entry` where voucher_type=%s
|
||||
and voucher_no=%s""", (self.doctype, self.name)):
|
||||
self.make_gl_entries()
|
||||
self.make_gl_entries(repost_future_gle)
|
||||
|
||||
def get_serialized_items(self):
|
||||
serialized_items = []
|
||||
@@ -261,7 +261,7 @@ def update_gl_entries_after(posting_date, posting_time, for_warehouses=None, for
|
||||
|
||||
future_stock_vouchers = get_future_stock_vouchers(posting_date, posting_time, for_warehouses, for_items)
|
||||
gle = get_voucherwise_gl_entries(future_stock_vouchers, posting_date)
|
||||
|
||||
|
||||
for voucher_type, voucher_no in future_stock_vouchers:
|
||||
existing_gle = gle.get((voucher_type, voucher_no), [])
|
||||
voucher_obj = frappe.get_doc(voucher_type, voucher_no)
|
||||
|
||||
@@ -420,8 +420,10 @@ class calculate_taxes_and_totals(object):
|
||||
# NOTE:
|
||||
# write_off_amount is only for POS Invoice
|
||||
# total_advance is only for non POS Invoice
|
||||
if self.doc.is_return:
|
||||
return
|
||||
if self.doc.doctype == "Sales Invoice":
|
||||
self.calculate_paid_amount()
|
||||
|
||||
if self.doc.is_return: return
|
||||
|
||||
self.doc.round_floats_in(self.doc, ["grand_total", "total_advance", "write_off_amount"])
|
||||
self._set_in_company_currency(self.doc, ['write_off_amount'])
|
||||
@@ -435,7 +437,6 @@ class calculate_taxes_and_totals(object):
|
||||
- flt(self.doc.base_write_off_amount), self.doc.precision("grand_total"))
|
||||
|
||||
if self.doc.doctype == "Sales Invoice":
|
||||
self.calculate_paid_amount()
|
||||
self.doc.round_floats_in(self.doc, ["paid_amount"])
|
||||
paid_amount = self.doc.paid_amount \
|
||||
if self.doc.party_account_currency == self.doc.currency else self.doc.base_paid_amount
|
||||
@@ -452,10 +453,9 @@ class calculate_taxes_and_totals(object):
|
||||
def calculate_paid_amount(self):
|
||||
paid_amount = base_paid_amount = 0.0
|
||||
for payment in self.doc.get('payments'):
|
||||
if flt(payment.amount) > 0:
|
||||
payment.base_amount = flt(payment.amount * self.doc.conversion_rate)
|
||||
paid_amount += payment.amount
|
||||
base_paid_amount += payment.base_amount
|
||||
payment.base_amount = flt(payment.amount * self.doc.conversion_rate)
|
||||
paid_amount += payment.amount
|
||||
base_paid_amount += payment.base_amount
|
||||
|
||||
self.doc.paid_amount = flt(paid_amount, self.doc.precision("paid_amount"))
|
||||
self.doc.base_paid_amount = flt(base_paid_amount, self.doc.precision("base_paid_amount"))
|
||||
@@ -471,7 +471,8 @@ class calculate_taxes_and_totals(object):
|
||||
|
||||
def calculate_write_off_amount(self):
|
||||
if flt(self.doc.change_amount) > 0:
|
||||
self.doc.write_off_amount = self.doc.grand_total - self.doc.paid_amount + self.doc.change_amount
|
||||
self.doc.write_off_amount = flt(self.doc.grand_total - self.doc.paid_amount + self.doc.change_amount,
|
||||
self.doc.precision("write_off_amount"))
|
||||
self.doc.base_write_off_amount = flt(self.doc.write_off_amount * self.doc.conversion_rate,
|
||||
self.doc.precision("base_write_off_amount"))
|
||||
|
||||
|
||||
@@ -2,13 +2,9 @@
|
||||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe.model.document import Document
|
||||
|
||||
class Operation(Document):
|
||||
def calculate_op_cost(self):
|
||||
if self.hour_rate and self.time_in_mins:
|
||||
self.operating_cost = flt(self.hour_rate) * flt(self.time_in_mins) / 60.0
|
||||
else :
|
||||
self.operating_cost = 0
|
||||
|
||||
def validate(self):
|
||||
if not self.description:
|
||||
self.description = self.name
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 1,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"reqd": 1,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
@@ -85,7 +85,7 @@
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 1,
|
||||
"report_hide": 0,
|
||||
"reqd": 1,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
@@ -539,7 +539,7 @@
|
||||
"issingle": 0,
|
||||
"istable": 1,
|
||||
"max_attachments": 0,
|
||||
"modified": "2016-07-11 03:28:04.235889",
|
||||
"modified": "2016-08-22 03:41:42.356833",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Manufacturing",
|
||||
"name": "Production Order Operation",
|
||||
|
||||
@@ -310,4 +310,5 @@ erpnext.patches.v7_0.set_material_request_type_in_item
|
||||
erpnext.patches.v7_0.rename_examination_to_assessment
|
||||
erpnext.patches.v7_0.set_portal_settings
|
||||
erpnext.patches.v7_0.repost_future_gle_for_purchase_invoice
|
||||
erpnext.patches.v7_0.fix_duplicate_icons
|
||||
erpnext.patches.v7_0.fix_duplicate_icons
|
||||
erpnext.patches.v7_0.repost_gle_for_pos_sales_return
|
||||
@@ -16,7 +16,6 @@ def execute():
|
||||
time_sheet = make_timesheet(data.production_order)
|
||||
args = get_timelog_data(data)
|
||||
add_timesheet_detail(time_sheet, args)
|
||||
time_sheet.docstatus = data.docstatus
|
||||
time_sheet.note = data.note
|
||||
time_sheet.company = company
|
||||
|
||||
@@ -25,6 +24,15 @@ def execute():
|
||||
time_sheet.calculate_total_amounts()
|
||||
time_sheet.flags.ignore_validate = True
|
||||
time_sheet.save(ignore_permissions=True)
|
||||
|
||||
# To ignore validate_mandatory_fields function
|
||||
if data.docstatus == 1:
|
||||
time_sheet.db_set("docstatus", 1)
|
||||
for d in time_sheet.get("time_logs"):
|
||||
d.db_set("docstatus", 1)
|
||||
time_sheet.update_production_order(time_sheet.name)
|
||||
time_sheet.update_task_and_project()
|
||||
|
||||
|
||||
def get_timelog_data(data):
|
||||
return {
|
||||
|
||||
@@ -9,12 +9,13 @@ def execute():
|
||||
frappe.reload_doc('website', 'doctype', 'portal_menu_item')
|
||||
frappe.reload_doc('buying', 'doctype', 'request_for_quotation')
|
||||
|
||||
if 'schools' in frappe.get_installed_apps():
|
||||
if frappe.db.exists("Module Def", "Academics") \
|
||||
and frappe.db.get_value("Module Def", "Academics", "app_name") == "schools":
|
||||
frappe.db.sql("""delete from `tabDesktop Icon`""")
|
||||
|
||||
if not frappe.db.exists('Module Def', 'Schools') and frappe.db.exists('Module Def', 'Academics'):
|
||||
frappe.rename_doc("Module Def", "Academics", "Schools")
|
||||
|
||||
|
||||
remove_from_installed_apps("schools")
|
||||
|
||||
def reload_doctypes_for_schools_icons():
|
||||
|
||||
@@ -9,6 +9,8 @@ from erpnext.controllers.stock_controller import get_warehouse_account, update_g
|
||||
def execute():
|
||||
if not cint(frappe.defaults.get_global_default("auto_accounting_for_stock")):
|
||||
return
|
||||
|
||||
frappe.reload_doc('accounts', 'doctype', 'sales_invoice')
|
||||
|
||||
frappe.reload_doctype("Purchase Invoice")
|
||||
wh_account = get_warehouse_account()
|
||||
|
||||
24
erpnext/patches/v7_0/repost_gle_for_pos_sales_return.py
Normal file
24
erpnext/patches/v7_0/repost_gle_for_pos_sales_return.py
Normal file
@@ -0,0 +1,24 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe.utils import cint, flt
|
||||
|
||||
def execute():
|
||||
frappe.reload_doctype("Sales Invoice")
|
||||
|
||||
for si in frappe.get_all("Sales Invoice", fields = ["name"],
|
||||
filters={"docstatus": 1, "is_pos": 1, "is_return": 1}):
|
||||
si_doc = frappe.get_doc("Sales Invoice", si.name)
|
||||
if len(si_doc.payments) > 0:
|
||||
si_doc.set_paid_amount()
|
||||
si_doc.flags.ignore_validate_update_after_submit = True
|
||||
si_doc.save()
|
||||
if si_doc.grand_total <= si_doc.paid_amount and si_doc.paid_amount < 0:
|
||||
delete_gle_for_voucher(si_doc.name)
|
||||
si_doc.run_method("make_gl_entries")
|
||||
|
||||
def delete_gle_for_voucher(voucher_no):
|
||||
frappe.db.sql("""delete from `tabGL Entry` where voucher_no = %(voucher_no)s""",
|
||||
{'voucher_no': voucher_no})
|
||||
@@ -532,6 +532,11 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
|
||||
// NOTE:
|
||||
// paid_amount and write_off_amount is only for POS Invoice
|
||||
// total_advance is only for non POS Invoice
|
||||
|
||||
if(this.frm.doc.doctype == "Sales Invoice" && this.frm.doc.is_return){
|
||||
this.calculate_paid_amount()
|
||||
}
|
||||
|
||||
if(this.frm.doc.is_return || this.frm.doc.docstatus > 0) return;
|
||||
|
||||
frappe.model.round_floats_in(this.frm.doc, ["grand_total", "total_advance", "write_off_amount"]);
|
||||
@@ -594,11 +599,9 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
|
||||
var me = this;
|
||||
var paid_amount = base_paid_amount = 0.0;
|
||||
$.each(this.frm.doc['payments'] || [], function(index, data){
|
||||
if(data.amount > -1){
|
||||
data.base_amount = flt(data.amount * me.frm.doc.conversion_rate);
|
||||
paid_amount += data.amount;
|
||||
base_paid_amount += data.base_amount;
|
||||
}
|
||||
data.base_amount = flt(data.amount * me.frm.doc.conversion_rate);
|
||||
paid_amount += data.amount;
|
||||
base_paid_amount += data.base_amount;
|
||||
})
|
||||
|
||||
this.frm.doc.paid_amount = flt(paid_amount, precision("paid_amount"));
|
||||
@@ -607,7 +610,7 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
|
||||
|
||||
calculate_change_amount: function(){
|
||||
this.frm.doc.change_amount = 0.0;
|
||||
if(this.frm.doc.paid_amount > this.frm.doc.grand_total){
|
||||
if(this.frm.doc.paid_amount > this.frm.doc.grand_total && !this.frm.doc.is_return){
|
||||
this.frm.doc.change_amount = flt(this.frm.doc.paid_amount - this.frm.doc.grand_total +
|
||||
this.frm.doc.write_off_amount, precision("change_amount"));
|
||||
}
|
||||
|
||||
@@ -112,15 +112,15 @@ erpnext.payments = erpnext.stock.StockController.extend({
|
||||
$(this.$body).find('.form-control').click(function(){
|
||||
me.idx = $(this).attr("idx");
|
||||
me.set_outstanding_amount();
|
||||
me.update_paid_amount();
|
||||
me.update_paid_amount(true);
|
||||
})
|
||||
|
||||
$(this.$body).find('.write_off_amount').change(function(){
|
||||
me.write_off_amount(flt($(this).val()));
|
||||
me.write_off_amount(flt($(this).val()), precision("write_off_amount"));
|
||||
})
|
||||
|
||||
$(this.$body).find('.change_amount').change(function(){
|
||||
me.change_amount(flt($(this).val()));
|
||||
me.change_amount(flt($(this).val()), precision("change_amount"));
|
||||
})
|
||||
},
|
||||
|
||||
@@ -139,7 +139,7 @@ erpnext.payments = erpnext.stock.StockController.extend({
|
||||
me.payment_val += $(this).text();
|
||||
me.selected_mode.val(format_number(me.payment_val, 2))
|
||||
me.idx = me.selected_mode.attr("idx")
|
||||
me.selected_mode.change()
|
||||
me.update_paid_amount()
|
||||
})
|
||||
|
||||
$(this.$body).find('.delete-btn').click(function(){
|
||||
@@ -177,31 +177,29 @@ erpnext.payments = erpnext.stock.StockController.extend({
|
||||
write_off_amount: function(write_off_amount) {
|
||||
var me = this;
|
||||
|
||||
if(this.frm.doc.paid_amount > 0){
|
||||
this.frm.doc.write_off_amount = write_off_amount;
|
||||
this.frm.doc.base_write_off_amount = flt(this.frm.doc.write_off_amount * this.frm.doc.conversion_rate,
|
||||
precision("base_write_off_amount"));
|
||||
this.calculate_outstanding_amount(false)
|
||||
this.show_amounts()
|
||||
}
|
||||
this.frm.doc.write_off_amount = flt(write_off_amount, precision("write_off_amount"));
|
||||
this.frm.doc.base_write_off_amount = flt(this.frm.doc.write_off_amount * this.frm.doc.conversion_rate,
|
||||
precision("base_write_off_amount"));
|
||||
this.calculate_outstanding_amount(false)
|
||||
this.show_amounts()
|
||||
},
|
||||
|
||||
change_amount: function(change_amount) {
|
||||
var me = this;
|
||||
|
||||
this.frm.doc.change_amount = change_amount;
|
||||
this.frm.doc.change_amount = flt(change_amount, precision("change_amount"));
|
||||
this.calculate_write_off_amount()
|
||||
this.show_amounts()
|
||||
},
|
||||
|
||||
update_paid_amount: function() {
|
||||
update_paid_amount: function(update_write_off) {
|
||||
var me = this;
|
||||
if(in_list(['change_amount', 'write_off_amount'], this.idx)){
|
||||
value = flt(me.selected_mode.val(), 2)
|
||||
value = me.selected_mode.val();
|
||||
if(me.idx == 'change_amount'){
|
||||
me.change_amount(value)
|
||||
} else{
|
||||
if(value == 0) {
|
||||
if(value == 0 && update_write_off) {
|
||||
value = me.frm.doc.outstanding_amount;
|
||||
}
|
||||
me.write_off_amount(value)
|
||||
@@ -226,9 +224,9 @@ erpnext.payments = erpnext.stock.StockController.extend({
|
||||
|
||||
show_amounts: function(){
|
||||
var me = this;
|
||||
$(this.$body).find(".write_off_amount").val(format_number(this.frm.doc.write_off_amount, 2));
|
||||
$(this.$body).find(".write_off_amount").val(format_number(this.frm.doc.write_off_amount, precision("write_off_amount")));
|
||||
$(this.$body).find('.paid_amount').text(format_currency(this.frm.doc.paid_amount, this.frm.doc.currency));
|
||||
$(this.$body).find('.change_amount').val(format_number(this.frm.doc.change_amount, 2))
|
||||
$(this.$body).find('.change_amount').val(format_number(this.frm.doc.change_amount, precision("change_amount")))
|
||||
$(this.$body).find('.outstanding_amount').text(format_currency(this.frm.doc.outstanding_amount, this.frm.doc.currency))
|
||||
this.update_invoice();
|
||||
}
|
||||
|
||||
@@ -12,6 +12,9 @@ frappe.ui.form.on('Delivery Note', 'onload', function(frm) {
|
||||
return (doc.docstatus==1 || doc.qty<=doc.actual_qty) ? "green" : "orange"
|
||||
})
|
||||
|
||||
erpnext.queries.setup_queries(frm, "Warehouse", function() {
|
||||
return erpnext.queries.warehouse(frm.doc);
|
||||
});
|
||||
})
|
||||
|
||||
erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend({
|
||||
|
||||
@@ -84,7 +84,7 @@ class LandedCostVoucher(Document):
|
||||
self.update_landed_cost()
|
||||
|
||||
def update_landed_cost(self):
|
||||
for d in self.get("items"):
|
||||
for d in self.get("purchase_receipts"):
|
||||
doc = frappe.get_doc(d.receipt_document_type, d.receipt_document)
|
||||
|
||||
# set landed cost voucher amount in pr item
|
||||
@@ -103,7 +103,7 @@ class LandedCostVoucher(Document):
|
||||
# update stock & gl entries for cancelled state of PR
|
||||
doc.docstatus = 2
|
||||
doc.update_stock_ledger(allow_negative_stock=True, via_landed_cost_voucher=True)
|
||||
doc.make_gl_entries_on_cancel()
|
||||
doc.make_gl_entries_on_cancel(repost_future_gle=False)
|
||||
|
||||
|
||||
# update stock & gl entries for submit state of PR
|
||||
|
||||
@@ -44,7 +44,7 @@ erpnext.SupportAnalytics = frappe.views.GridReportWithPlot.extend({
|
||||
var std_columns = [
|
||||
{id: "_check", name: __("Plot"), field: "_check", width: 30,
|
||||
formatter: this.check_formatter},
|
||||
{id: "status", name: __("Status"), field: "status", width: 100},
|
||||
{id: "name", name: __("Status"), field: "name", width: 100},
|
||||
];
|
||||
this.make_date_range_columns();
|
||||
this.columns = std_columns.concat(this.columns);
|
||||
@@ -54,14 +54,14 @@ erpnext.SupportAnalytics = frappe.views.GridReportWithPlot.extend({
|
||||
// add Opening, Closing, Totals rows
|
||||
// if filtered by account and / or voucher
|
||||
var me = this;
|
||||
var total_tickets = {status:"All Tickets", "id": "all-tickets",
|
||||
var total_tickets = {name:"All Tickets", "id": "all-tickets",
|
||||
checked:true};
|
||||
var days_to_close = {status:"Days to Close", "id":"days-to-close",
|
||||
var days_to_close = {name:"Days to Close", "id":"days-to-close",
|
||||
checked:false};
|
||||
var total_closed = {};
|
||||
var hours_to_close = {status:"Hours to Close", "id":"hours-to-close",
|
||||
var hours_to_close = {name:"Hours to Close", "id":"hours-to-close",
|
||||
checked:false};
|
||||
var hours_to_respond = {status:"Hours to Respond", "id":"hours-to-respond",
|
||||
var hours_to_respond = {name:"Hours to Respond", "id":"hours-to-respond",
|
||||
checked:false};
|
||||
var total_responded = {};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user