mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-13 02:01:21 +00:00
fix: Resolved merge conflict
This commit is contained in:
@@ -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__ = '13.0.1'
|
__version__ = '13.0.0-dev'
|
||||||
|
|
||||||
def get_default_company(user=None):
|
def get_default_company(user=None):
|
||||||
'''Get default company for user'''
|
'''Get default company for user'''
|
||||||
|
|||||||
7
erpnext/change_log/v13/v13.0.2.md
Normal file
7
erpnext/change_log/v13/v13.0.2.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
## Version 13.0.2 Release Notes
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- fix: frappe.whitelist for doc methods ([#25231](https://github.com/frappe/erpnext/pull/25231))
|
||||||
|
- fix: incorrect incoming rate for the sales return ([#25306](https://github.com/frappe/erpnext/pull/25306))
|
||||||
|
- fix(e-invoicing): validations & tax calculation fixes ([#25314](https://github.com/frappe/erpnext/pull/25314))
|
||||||
|
- fix: update scheduler check time ([#25295](https://github.com/frappe/erpnext/pull/25295))
|
||||||
@@ -5,6 +5,7 @@ from __future__ import unicode_literals
|
|||||||
import frappe, erpnext
|
import frappe, erpnext
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.model.meta import get_field_precision
|
from frappe.model.meta import get_field_precision
|
||||||
|
from erpnext.stock.utils import get_incoming_rate
|
||||||
from frappe.utils import flt, get_datetime, format_datetime
|
from frappe.utils import flt, get_datetime, format_datetime
|
||||||
|
|
||||||
class StockOverReturnError(frappe.ValidationError): pass
|
class StockOverReturnError(frappe.ValidationError): pass
|
||||||
@@ -389,10 +390,24 @@ def make_return_doc(doctype, source_name, target_doc=None):
|
|||||||
|
|
||||||
return doclist
|
return doclist
|
||||||
|
|
||||||
def get_rate_for_return(voucher_type, voucher_no, item_code, return_against=None, item_row=None, voucher_detail_no=None):
|
def get_rate_for_return(voucher_type, voucher_no, item_code, return_against=None,
|
||||||
|
item_row=None, voucher_detail_no=None, sle=None):
|
||||||
if not return_against:
|
if not return_against:
|
||||||
return_against = frappe.get_cached_value(voucher_type, voucher_no, "return_against")
|
return_against = frappe.get_cached_value(voucher_type, voucher_no, "return_against")
|
||||||
|
|
||||||
|
if not return_against and voucher_type == 'Sales Invoice' and sle:
|
||||||
|
return get_incoming_rate({
|
||||||
|
"item_code": sle.item_code,
|
||||||
|
"warehouse": sle.warehouse,
|
||||||
|
"posting_date": sle.get('posting_date'),
|
||||||
|
"posting_time": sle.get('posting_time'),
|
||||||
|
"qty": sle.actual_qty,
|
||||||
|
"serial_no": sle.get('serial_no'),
|
||||||
|
"company": sle.company,
|
||||||
|
"voucher_type": sle.voucher_type,
|
||||||
|
"voucher_no": sle.voucher_no
|
||||||
|
}, raise_error_if_no_rate=False)
|
||||||
|
|
||||||
return_against_item_field = get_return_against_item_fields(voucher_type)
|
return_against_item_field = get_return_against_item_fields(voucher_type)
|
||||||
|
|
||||||
filters = get_filters(voucher_type, voucher_no, voucher_detail_no,
|
filters = get_filters(voucher_type, voucher_no, voucher_detail_no,
|
||||||
|
|||||||
@@ -311,14 +311,16 @@ class SellingController(StockController):
|
|||||||
|
|
||||||
items = self.get("items") + (self.get("packed_items") or [])
|
items = self.get("items") + (self.get("packed_items") or [])
|
||||||
for d in items:
|
for d in items:
|
||||||
if not cint(self.get("is_return")):
|
if not self.get("return_against"):
|
||||||
# Get incoming rate based on original item cost based on valuation method
|
# Get incoming rate based on original item cost based on valuation method
|
||||||
|
qty = flt(d.get('stock_qty') or d.get('actual_qty'))
|
||||||
|
|
||||||
d.incoming_rate = get_incoming_rate({
|
d.incoming_rate = get_incoming_rate({
|
||||||
"item_code": d.item_code,
|
"item_code": d.item_code,
|
||||||
"warehouse": d.warehouse,
|
"warehouse": d.warehouse,
|
||||||
"posting_date": self.get('posting_date') or self.get('transaction_date'),
|
"posting_date": self.get('posting_date') or self.get('transaction_date'),
|
||||||
"posting_time": self.get('posting_time') or nowtime(),
|
"posting_time": self.get('posting_time') or nowtime(),
|
||||||
"qty": -1 * flt(d.get('stock_qty') or d.get('actual_qty')),
|
"qty": qty if cint(self.get("is_return")) else (-1 * qty),
|
||||||
"serial_no": d.get('serial_no'),
|
"serial_no": d.get('serial_no'),
|
||||||
"company": self.company,
|
"company": self.company,
|
||||||
"voucher_type": self.doctype,
|
"voucher_type": self.doctype,
|
||||||
|
|||||||
@@ -12,5 +12,5 @@ def execute():
|
|||||||
select dl.link_name from `tabAddress` a, `tabDynamic Link` dl
|
select dl.link_name from `tabAddress` a, `tabDynamic Link` dl
|
||||||
where a.gstin = %s and dl.parent = a.name and dl.link_doctype = 'Company'
|
where a.gstin = %s and dl.parent = a.name and dl.link_doctype = 'Company'
|
||||||
""", (creds.get('gstin')))
|
""", (creds.get('gstin')))
|
||||||
if company_name and len(company_name) == 1:
|
if company_name and len(company_name) > 0:
|
||||||
frappe.db.set_value('E Invoice User', creds.get('name'), 'company', company_name[0][0])
|
frappe.db.set_value('E Invoice User', creds.get('name'), 'company', company_name[0][0])
|
||||||
@@ -633,8 +633,6 @@ class SalarySlip(TransactionBase):
|
|||||||
|
|
||||||
if additional_salary:
|
if additional_salary:
|
||||||
component_row.default_amount = 0
|
component_row.default_amount = 0
|
||||||
component_row.additional_amount = amount
|
|
||||||
component_row.additional_salary = additional_salary.name
|
|
||||||
component_row.deduct_full_tax_on_selected_payroll_date = \
|
component_row.deduct_full_tax_on_selected_payroll_date = \
|
||||||
additional_salary.deduct_full_tax_on_selected_payroll_date
|
additional_salary.deduct_full_tax_on_selected_payroll_date
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -466,21 +466,24 @@ def make_einvoice(invoice):
|
|||||||
try:
|
try:
|
||||||
einvoice = safe_json_load(einvoice)
|
einvoice = safe_json_load(einvoice)
|
||||||
einvoice = santize_einvoice_fields(einvoice)
|
einvoice = santize_einvoice_fields(einvoice)
|
||||||
validate_totals(einvoice)
|
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
log_error(einvoice)
|
show_link_to_error_log(invoice, einvoice)
|
||||||
link_to_error_list = '<a href="List/Error Log/List?method=E Invoice Request Failed">Error Log</a>'
|
|
||||||
frappe.throw(
|
validate_totals(einvoice)
|
||||||
_('An error occurred while creating e-invoice for {}. Please check {} for more information.').format(
|
|
||||||
invoice.name, link_to_error_list),
|
|
||||||
title=_('E Invoice Creation Failed')
|
|
||||||
)
|
|
||||||
|
|
||||||
return einvoice
|
return einvoice
|
||||||
|
|
||||||
|
def show_link_to_error_log(invoice, einvoice):
|
||||||
|
err_log = log_error(einvoice)
|
||||||
|
link_to_error_log = get_link_to_form('Error Log', err_log.name, 'Error Log')
|
||||||
|
frappe.throw(
|
||||||
|
_('An error occurred while creating e-invoice for {}. Please check {} for more information.').format(
|
||||||
|
invoice.name, link_to_error_log),
|
||||||
|
title=_('E Invoice Creation Failed')
|
||||||
|
)
|
||||||
|
|
||||||
def log_error(data=None):
|
def log_error(data=None):
|
||||||
if not isinstance(data, dict):
|
if isinstance(data, six.string_types):
|
||||||
data = json.loads(data)
|
data = json.loads(data)
|
||||||
|
|
||||||
seperator = "--" * 50
|
seperator = "--" * 50
|
||||||
@@ -587,7 +590,7 @@ class GSPConnector():
|
|||||||
self.credentials = self.e_invoice_settings.credentials[0] if self.e_invoice_settings.credentials else None
|
self.credentials = self.e_invoice_settings.credentials[0] if self.e_invoice_settings.credentials else None
|
||||||
|
|
||||||
def get_seller_gstin(self):
|
def get_seller_gstin(self):
|
||||||
gstin = self.invoice.company_gstin or frappe.db.get_value('Address', self.invoice.company_address, 'gstin')
|
gstin = frappe.db.get_value('Address', self.invoice.company_address, 'gstin')
|
||||||
if not gstin:
|
if not gstin:
|
||||||
frappe.throw(_('Cannot retrieve Company GSTIN. Please select company address with valid GSTIN.'))
|
frappe.throw(_('Cannot retrieve Company GSTIN. Please select company address with valid GSTIN.'))
|
||||||
return gstin
|
return gstin
|
||||||
|
|||||||
@@ -372,7 +372,8 @@ class update_entries_after(object):
|
|||||||
elif sle.voucher_type in ("Purchase Receipt", "Purchase Invoice", "Delivery Note", "Sales Invoice"):
|
elif sle.voucher_type in ("Purchase Receipt", "Purchase Invoice", "Delivery Note", "Sales Invoice"):
|
||||||
if frappe.get_cached_value(sle.voucher_type, sle.voucher_no, "is_return"):
|
if frappe.get_cached_value(sle.voucher_type, sle.voucher_no, "is_return"):
|
||||||
from erpnext.controllers.sales_and_purchase_return import get_rate_for_return # don't move this import to top
|
from erpnext.controllers.sales_and_purchase_return import get_rate_for_return # don't move this import to top
|
||||||
rate = get_rate_for_return(sle.voucher_type, sle.voucher_no, sle.item_code, voucher_detail_no=sle.voucher_detail_no)
|
rate = get_rate_for_return(sle.voucher_type, sle.voucher_no, sle.item_code,
|
||||||
|
voucher_detail_no=sle.voucher_detail_no, sle = sle)
|
||||||
else:
|
else:
|
||||||
if sle.voucher_type in ("Purchase Receipt", "Purchase Invoice"):
|
if sle.voucher_type in ("Purchase Receipt", "Purchase Invoice"):
|
||||||
rate_field = "valuation_rate"
|
rate_field = "valuation_rate"
|
||||||
|
|||||||
Reference in New Issue
Block a user