mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-19 13:09:17 +00:00
Merge branch 'v12-pre-release' into version-12
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__ = '12.20.0'
|
__version__ = '12.21.0'
|
||||||
|
|
||||||
def get_default_company(user=None):
|
def get_default_company(user=None):
|
||||||
'''Get default company for user'''
|
'''Get default company for user'''
|
||||||
|
|||||||
21
erpnext/change_log/v12/v12_21_0.md
Normal file
21
erpnext/change_log/v12/v12_21_0.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
## Version 12.21.0 Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
### Fixes & Enhancements
|
||||||
|
|
||||||
|
- Incorrect qty calculated for sub-contracted raw materials in purchase receipt ([#25443](https://github.com/frappe/erpnext/pull/25443))
|
||||||
|
- Update cost center in the item table fetched from POS Profile in v12 ([#25612](https://github.com/frappe/erpnext/pull/25612))
|
||||||
|
- Total stock summary report not working ([#25552](https://github.com/frappe/erpnext/pull/25552))
|
||||||
|
- Timeout error while loading warehouse tree ([#25693](https://github.com/frappe/erpnext/pull/25693))
|
||||||
|
- RCM rounding precision ([#25410](https://github.com/frappe/erpnext/pull/25410))
|
||||||
|
- Change subcontracted item display ([#25426](https://github.com/frappe/erpnext/pull/25426))
|
||||||
|
- Remove invalid changes added due to merge conflict ([#25437](https://github.com/frappe/erpnext/pull/25437))
|
||||||
|
- Add document type field for e-invoicing (Italy) ([#25420](https://github.com/frappe/erpnext/pull/25420))
|
||||||
|
- Issue in project custom status ([#25453](https://github.com/frappe/erpnext/pull/25453))
|
||||||
|
- Employee Separation ([#25504](https://github.com/frappe/erpnext/pull/25504))
|
||||||
|
- State code for Other Territory ([#25422](https://github.com/frappe/erpnext/pull/25422))
|
||||||
|
- Remove invalid changes added due to merge conflict ([#25405](https://github.com/frappe/erpnext/pull/25405))
|
||||||
|
- Check for None in item.schedule_date before setting ([#25589](https://github.com/frappe/erpnext/pull/25589))
|
||||||
|
- Can't multiply sequence by non-int of type 'float' ([#25385](https://github.com/frappe/erpnext/pull/25385))
|
||||||
|
- Filter using purpose, make requested changes ([#25388](https://github.com/frappe/erpnext/pull/25388))
|
||||||
|
- Purchase from registered composition dealer ([#25419](https://github.com/frappe/erpnext/pull/25419))
|
||||||
@@ -295,6 +295,9 @@ class BuyingController(StockController):
|
|||||||
for raw_material in transferred_raw_materials + non_stock_items:
|
for raw_material in transferred_raw_materials + non_stock_items:
|
||||||
rm_item_key = (raw_material.rm_item_code, item.item_code, item.purchase_order)
|
rm_item_key = (raw_material.rm_item_code, item.item_code, item.purchase_order)
|
||||||
raw_material_data = backflushed_raw_materials_map.get(rm_item_key, {})
|
raw_material_data = backflushed_raw_materials_map.get(rm_item_key, {})
|
||||||
|
if not raw_material_data and raw_material.get('batch_nos'):
|
||||||
|
backflushed_raw_materials_map.setdefault(rm_item_key, {'consumed_batch': {}})
|
||||||
|
raw_material_data = backflushed_raw_materials_map.get(rm_item_key, {})
|
||||||
|
|
||||||
consumed_qty = raw_material_data.get('qty', 0)
|
consumed_qty = raw_material_data.get('qty', 0)
|
||||||
consumed_serial_nos = raw_material_data.get('serial_no', '')
|
consumed_serial_nos = raw_material_data.get('serial_no', '')
|
||||||
@@ -336,6 +339,7 @@ class BuyingController(StockController):
|
|||||||
self.append_raw_material_to_be_backflushed(item, raw_material, qty)
|
self.append_raw_material_to_be_backflushed(item, raw_material, qty)
|
||||||
|
|
||||||
def append_raw_material_to_be_backflushed(self, fg_item_doc, raw_material_data, qty):
|
def append_raw_material_to_be_backflushed(self, fg_item_doc, raw_material_data, qty):
|
||||||
|
qty = flt(qty, fg_item_doc.precision('qty'))
|
||||||
rm = self.append('supplied_items', {})
|
rm = self.append('supplied_items', {})
|
||||||
rm.update(raw_material_data)
|
rm.update(raw_material_data)
|
||||||
|
|
||||||
@@ -793,9 +797,10 @@ class BuyingController(StockController):
|
|||||||
if not self.get("items"):
|
if not self.get("items"):
|
||||||
return
|
return
|
||||||
|
|
||||||
earliest_schedule_date = min([d.schedule_date for d in self.get("items")])
|
if any(d.schedule_date for d in self.get("items")):
|
||||||
if earliest_schedule_date:
|
# Select earliest schedule_date.
|
||||||
self.schedule_date = earliest_schedule_date
|
self.schedule_date = min(d.schedule_date for d in self.get("items")
|
||||||
|
if d.schedule_date is not None)
|
||||||
|
|
||||||
if self.schedule_date:
|
if self.schedule_date:
|
||||||
for d in self.get('items'):
|
for d in self.get('items'):
|
||||||
@@ -1073,6 +1078,6 @@ def get_batches_with_qty(item_code, fg_item, required_qty, transferred_batch_qty
|
|||||||
if backflushed_batches.get(row.get('batch'), 0) > 0:
|
if backflushed_batches.get(row.get('batch'), 0) > 0:
|
||||||
backflushed_batches[row.get('batch')] += row.get('qty')
|
backflushed_batches[row.get('batch')] += row.get('qty')
|
||||||
else:
|
else:
|
||||||
backflushed_batches[row.get('batch')] = row.get('qty')
|
backflushed_batches.setdefault(row.get('batch'), row.get('qty'))
|
||||||
|
|
||||||
return available_batches
|
return available_batches
|
||||||
|
|||||||
@@ -1,626 +1,177 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"actions": [],
|
||||||
"allow_guest_to_view": 0,
|
"autoname": "HR-EMP-SEP-.YYYY.-.#####",
|
||||||
"allow_import": 0,
|
"creation": "2018-05-10 02:29:16.740490",
|
||||||
"allow_rename": 0,
|
"doctype": "DocType",
|
||||||
"autoname": "HR-EMP-SEP-.YYYY.-.#####",
|
"editable_grid": 1,
|
||||||
"beta": 0,
|
"engine": "InnoDB",
|
||||||
"creation": "2018-05-10 02:29:16.740490",
|
"field_order": [
|
||||||
"custom": 0,
|
"employee",
|
||||||
"docstatus": 0,
|
"employee_name",
|
||||||
"doctype": "DocType",
|
"department",
|
||||||
"document_type": "",
|
"designation",
|
||||||
"editable_grid": 1,
|
"employee_grade",
|
||||||
"engine": "InnoDB",
|
"column_break_7",
|
||||||
|
"company",
|
||||||
|
"boarding_status",
|
||||||
|
"resignation_letter_date",
|
||||||
|
"project",
|
||||||
|
"table_for_activity",
|
||||||
|
"employee_separation_template",
|
||||||
|
"activities",
|
||||||
|
"notify_users_by_email",
|
||||||
|
"section_break_14",
|
||||||
|
"exit_interview",
|
||||||
|
"amended_from"
|
||||||
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "employee",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"label": "Employee",
|
||||||
"bold": 0,
|
"options": "Employee",
|
||||||
"collapsible": 0,
|
"reqd": 1
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "employee",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Employee",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Employee",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fetch_from": "employee.employee_name",
|
|
||||||
"fieldname": "employee_name",
|
|
||||||
"fieldtype": "Data",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Employee Name",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fetch_from": "employee.resignation_letter_date",
|
|
||||||
"fieldname": "resignation_letter_date",
|
|
||||||
"fieldtype": "Date",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Resignation Letter Date",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 1,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "boarding_status",
|
|
||||||
"fieldtype": "Select",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Status",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "\nPending\nIn Process\nCompleted",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fetch_from": "employee.employee_name",
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "employee_name",
|
||||||
"allow_bulk_edit": 0,
|
"fieldtype": "Data",
|
||||||
"allow_in_quick_entry": 0,
|
"in_list_view": 1,
|
||||||
"allow_in_quick_entry": 0,
|
"label": "Employee Name",
|
||||||
"allow_in_quick_entry": 0,
|
"read_only": 1
|
||||||
"allow_on_submit": 1,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "notify_users_by_email",
|
|
||||||
"fieldtype": "Check",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Notify users by email",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "column_break_7",
|
|
||||||
"fieldtype": "Column Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "employee_separation_template",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Employee Separation Template",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Employee Separation Template",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fetch_from": "employee.company",
|
|
||||||
"fieldname": "company",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Company",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Company",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fetch_from": "employee.resignation_letter_date",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldname": "resignation_letter_date",
|
||||||
"allow_on_submit": 0,
|
"fieldtype": "Date",
|
||||||
"bold": 0,
|
"in_list_view": 1,
|
||||||
"collapsible": 0,
|
"label": "Resignation Letter Date",
|
||||||
"columns": 0,
|
"read_only": 1
|
||||||
"fieldname": "project",
|
},
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Project",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Project",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 1,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_on_submit": 1,
|
||||||
"allow_in_quick_entry": 0,
|
"fieldname": "boarding_status",
|
||||||
"allow_on_submit": 0,
|
"fieldtype": "Select",
|
||||||
"bold": 0,
|
"label": "Status",
|
||||||
"collapsible": 0,
|
"options": "\nPending\nIn Process\nCompleted",
|
||||||
"columns": 0,
|
"reqd": 1
|
||||||
"fetch_from": "employee.department",
|
},
|
||||||
"fieldname": "department",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Department",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Department",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_on_submit": 1,
|
||||||
"allow_in_quick_entry": 0,
|
"default": "0",
|
||||||
"allow_on_submit": 0,
|
"fieldname": "notify_users_by_email",
|
||||||
"bold": 0,
|
"fieldtype": "Check",
|
||||||
"collapsible": 0,
|
"label": "Notify users by email"
|
||||||
"columns": 0,
|
},
|
||||||
"fetch_from": "employee.designation",
|
|
||||||
"fieldname": "designation",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Designation",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Designation",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "column_break_7",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Column Break"
|
||||||
"allow_on_submit": 0,
|
},
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fetch_from": "employee.grade",
|
|
||||||
"fieldname": "employee_grade",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Employee Grade",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Employee Grade",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "employee_separation_template",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"label": "Employee Separation Template",
|
||||||
"bold": 0,
|
"options": "Employee Separation Template"
|
||||||
"collapsible": 0,
|
},
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "table_for_activity",
|
|
||||||
"fieldtype": "Section Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fetch_from": "employee.company",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldname": "company",
|
||||||
"allow_on_submit": 1,
|
"fieldtype": "Link",
|
||||||
"bold": 0,
|
"label": "Company",
|
||||||
"collapsible": 0,
|
"options": "Company",
|
||||||
"columns": 0,
|
"reqd": 1
|
||||||
"fieldname": "activities",
|
},
|
||||||
"fieldtype": "Table",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Activities",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Employee Boarding Activity",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "project",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"label": "Project",
|
||||||
"bold": 0,
|
"options": "Project",
|
||||||
"collapsible": 0,
|
"read_only": 1
|
||||||
"columns": 0,
|
},
|
||||||
"fieldname": "section_break_14",
|
|
||||||
"fieldtype": "Section Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fetch_from": "employee.department",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldname": "department",
|
||||||
"allow_on_submit": 0,
|
"fieldtype": "Link",
|
||||||
"bold": 0,
|
"in_list_view": 1,
|
||||||
"collapsible": 0,
|
"label": "Department",
|
||||||
"columns": 0,
|
"options": "Department",
|
||||||
"fieldname": "exit_interview",
|
"read_only": 1
|
||||||
"fieldtype": "Text Editor",
|
},
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Exit Interview Summary",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fetch_from": "employee.designation",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldname": "designation",
|
||||||
"allow_on_submit": 0,
|
"fieldtype": "Link",
|
||||||
"bold": 0,
|
"in_list_view": 1,
|
||||||
"collapsible": 0,
|
"label": "Designation",
|
||||||
"columns": 0,
|
"options": "Designation",
|
||||||
"fieldname": "amended_from",
|
"read_only": 1
|
||||||
"fieldtype": "Link",
|
},
|
||||||
"hidden": 0,
|
{
|
||||||
"ignore_user_permissions": 0,
|
"fetch_from": "employee.grade",
|
||||||
"ignore_xss_filter": 0,
|
"fieldname": "employee_grade",
|
||||||
"in_filter": 0,
|
"fieldtype": "Link",
|
||||||
"in_global_search": 0,
|
"label": "Employee Grade",
|
||||||
"in_list_view": 0,
|
"options": "Employee Grade",
|
||||||
"in_standard_filter": 0,
|
"read_only": 1
|
||||||
"label": "Amended From",
|
},
|
||||||
"length": 0,
|
{
|
||||||
"no_copy": 1,
|
"fieldname": "table_for_activity",
|
||||||
"options": "Employee Separation",
|
"fieldtype": "Section Break",
|
||||||
"permlevel": 0,
|
"label": "Separation Activities"
|
||||||
"print_hide": 1,
|
},
|
||||||
"print_hide_if_no_value": 0,
|
{
|
||||||
"read_only": 1,
|
"allow_on_submit": 1,
|
||||||
"remember_last_selected_value": 0,
|
"fieldname": "activities",
|
||||||
"report_hide": 0,
|
"fieldtype": "Table",
|
||||||
"reqd": 0,
|
"label": "Activities",
|
||||||
"search_index": 0,
|
"options": "Employee Boarding Activity"
|
||||||
"set_only_once": 0,
|
},
|
||||||
"translatable": 0,
|
{
|
||||||
"unique": 0
|
"fieldname": "section_break_14",
|
||||||
|
"fieldtype": "Section Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "exit_interview",
|
||||||
|
"fieldtype": "Text Editor",
|
||||||
|
"label": "Exit Interview Summary"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "amended_from",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Amended From",
|
||||||
|
"no_copy": 1,
|
||||||
|
"options": "Employee Separation",
|
||||||
|
"print_hide": 1,
|
||||||
|
"read_only": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"has_web_view": 0,
|
"is_submittable": 1,
|
||||||
"hide_heading": 0,
|
"links": [],
|
||||||
"hide_toolbar": 0,
|
"modified": "2021-04-28 15:58:36.020196",
|
||||||
"idx": 0,
|
"modified_by": "Administrator",
|
||||||
"image_view": 0,
|
"module": "HR",
|
||||||
"in_create": 0,
|
"name": "Employee Separation",
|
||||||
"is_submittable": 1,
|
"owner": "Administrator",
|
||||||
"issingle": 0,
|
|
||||||
"istable": 0,
|
|
||||||
"max_attachments": 0,
|
|
||||||
"modified": "2019-08-03 16:15:39.025898",
|
|
||||||
"modified_by": "Administrator",
|
|
||||||
"module": "HR",
|
|
||||||
"name": "Employee Separation",
|
|
||||||
"name_case": "",
|
|
||||||
"owner": "Administrator",
|
|
||||||
"permissions": [
|
"permissions": [
|
||||||
{
|
{
|
||||||
"amend": 1,
|
"amend": 1,
|
||||||
"cancel": 1,
|
"cancel": 1,
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
"email": 1,
|
"email": 1,
|
||||||
"export": 1,
|
"export": 1,
|
||||||
"if_owner": 0,
|
"print": 1,
|
||||||
"import": 0,
|
"read": 1,
|
||||||
"permlevel": 0,
|
"report": 1,
|
||||||
"print": 1,
|
"role": "System Manager",
|
||||||
"read": 1,
|
"share": 1,
|
||||||
"report": 1,
|
"submit": 1,
|
||||||
"role": "System Manager",
|
|
||||||
"set_user_permissions": 0,
|
|
||||||
"share": 1,
|
|
||||||
"submit": 1,
|
|
||||||
"write": 1
|
"write": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"quick_entry": 1,
|
"quick_entry": 1,
|
||||||
"read_only": 0,
|
"sort_field": "modified",
|
||||||
"read_only_onload": 0,
|
"sort_order": "DESC",
|
||||||
"show_name_in_global_search": 0,
|
"title_field": "employee_name",
|
||||||
"sort_field": "modified",
|
"track_changes": 1
|
||||||
"sort_order": "DESC",
|
|
||||||
"title_field": "employee_name",
|
|
||||||
"track_changes": 1,
|
|
||||||
"track_seen": 0,
|
|
||||||
"track_views": 0
|
|
||||||
}
|
}
|
||||||
@@ -18,7 +18,7 @@ class TestEmployeeSeparation(unittest.TestCase):
|
|||||||
'activity_name': 'Deactivate Employee',
|
'activity_name': 'Deactivate Employee',
|
||||||
'role': 'HR User'
|
'role': 'HR User'
|
||||||
})
|
})
|
||||||
separation.status = 'Pending'
|
separation.boarding_status = 'Pending'
|
||||||
separation.insert()
|
separation.insert()
|
||||||
separation.submit()
|
separation.submit()
|
||||||
self.assertEqual(separation.docstatus, 1)
|
self.assertEqual(separation.docstatus, 1)
|
||||||
|
|||||||
@@ -32,13 +32,15 @@ class EmployeeBoardingController(Document):
|
|||||||
project_name += self.job_applicant
|
project_name += self.job_applicant
|
||||||
else:
|
else:
|
||||||
project_name += self.employee
|
project_name += self.employee
|
||||||
|
|
||||||
project = frappe.get_doc({
|
project = frappe.get_doc({
|
||||||
"doctype": "Project",
|
"doctype": "Project",
|
||||||
"project_name": project_name,
|
"project_name": project_name,
|
||||||
"expected_start_date": self.date_of_joining if self.doctype == "Employee Onboarding" else self.resignation_letter_date,
|
"expected_start_date": self.date_of_joining if self.doctype == "Employee Onboarding" else self.resignation_letter_date,
|
||||||
"department": self.department,
|
"department": self.department,
|
||||||
"company": self.company
|
"company": self.company
|
||||||
}).insert(ignore_permissions=True)
|
}).insert(ignore_permissions=True, ignore_mandatory=True)
|
||||||
|
|
||||||
self.db_set("project", project.name)
|
self.db_set("project", project.name)
|
||||||
self.db_set("boarding_status", "Pending")
|
self.db_set("boarding_status", "Pending")
|
||||||
self.reload()
|
self.reload()
|
||||||
|
|||||||
@@ -684,3 +684,4 @@ erpnext.patches.v12_0.add_state_code_for_ladakh
|
|||||||
erpnext.patches.v12_0.create_taxable_value_field
|
erpnext.patches.v12_0.create_taxable_value_field
|
||||||
erpnext.patches.v12_0.purchase_receipt_status
|
erpnext.patches.v12_0.purchase_receipt_status
|
||||||
erpnext.patches.v12_0.add_company_link_to_einvoice_settings
|
erpnext.patches.v12_0.add_company_link_to_einvoice_settings
|
||||||
|
erpnext.patches.v12_0.add_document_type_field_for_italy_einvoicing
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
company = frappe.get_all('Company', filters = {'country': 'Italy'})
|
||||||
|
if not company:
|
||||||
|
return
|
||||||
|
|
||||||
|
custom_fields = {
|
||||||
|
'Sales Invoice': [
|
||||||
|
dict(fieldname='type_of_document', label='Type of Document',
|
||||||
|
fieldtype='Select', insert_after='customer_fiscal_code',
|
||||||
|
options='\nTD01\nTD02\nTD03\nTD04\nTD05\nTD06\nTD16\nTD17\nTD18\nTD19\nTD20\nTD21\nTD22\nTD23\nTD24\nTD25\nTD26\nTD27'),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
create_custom_fields(custom_fields, update=True)
|
||||||
@@ -125,9 +125,6 @@ class Project(Document):
|
|||||||
if self.percent_complete == 100:
|
if self.percent_complete == 100:
|
||||||
self.status = "Completed"
|
self.status = "Completed"
|
||||||
|
|
||||||
else:
|
|
||||||
self.status = "Open"
|
|
||||||
|
|
||||||
def update_costing(self):
|
def update_costing(self):
|
||||||
from_time_sheet = frappe.db.sql("""select
|
from_time_sheet = frappe.db.sql("""select
|
||||||
sum(costing_amount) as costing_amount,
|
sum(costing_amount) as costing_amount,
|
||||||
|
|||||||
@@ -694,7 +694,7 @@ erpnext.utils.map_current_doc = function(opts) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
frappe.form.link_formatters['Item'] = function(value, doc) {
|
frappe.form.link_formatters['Item'] = function(value, doc) {
|
||||||
if (doc && value && doc.item_name && doc.item_name !== value) {
|
if (doc && value && doc.item_name && doc.item_name !== value && doc.item_code === value) {
|
||||||
return value + ': ' + doc.item_name;
|
return value + ': ' + doc.item_name;
|
||||||
} else if (!value && doc.doctype && doc.item_name) {
|
} else if (!value && doc.doctype && doc.item_name) {
|
||||||
// format blank value in child table
|
// format blank value in child table
|
||||||
|
|||||||
@@ -109,7 +109,7 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{__("Suppliies made to Composition Taxable Persons")}}</td>
|
<td>{{__("Supplies made to Composition Taxable Persons")}}</td>
|
||||||
<td class="right">
|
<td class="right">
|
||||||
{% for row in data.inter_sup.comp_details %}
|
{% for row in data.inter_sup.comp_details %}
|
||||||
{% if row %}
|
{% if row %}
|
||||||
|
|||||||
@@ -172,7 +172,6 @@ class GSTR3BReport(Document):
|
|||||||
self.json_output = frappe.as_json(self.report_dict)
|
self.json_output = frappe.as_json(self.report_dict)
|
||||||
|
|
||||||
def set_inward_nil_exempt(self, inward_nil_exempt):
|
def set_inward_nil_exempt(self, inward_nil_exempt):
|
||||||
|
|
||||||
self.report_dict["inward_sup"]["isup_details"][0]["inter"] = flt(inward_nil_exempt.get("gst").get("inter"), 2)
|
self.report_dict["inward_sup"]["isup_details"][0]["inter"] = flt(inward_nil_exempt.get("gst").get("inter"), 2)
|
||||||
self.report_dict["inward_sup"]["isup_details"][0]["intra"] = flt(inward_nil_exempt.get("gst").get("intra"), 2)
|
self.report_dict["inward_sup"]["isup_details"][0]["intra"] = flt(inward_nil_exempt.get("gst").get("intra"), 2)
|
||||||
self.report_dict["inward_sup"]["isup_details"][1]["inter"] = flt(inward_nil_exempt.get("non_gst").get("inter"), 2)
|
self.report_dict["inward_sup"]["isup_details"][1]["inter"] = flt(inward_nil_exempt.get("non_gst").get("inter"), 2)
|
||||||
@@ -238,7 +237,6 @@ class GSTR3BReport(Document):
|
|||||||
self.report_dict[supply_type][supply_category]["txval"] += flt(txval, 2)
|
self.report_dict[supply_type][supply_category]["txval"] += flt(txval, 2)
|
||||||
|
|
||||||
def set_inter_state_supply(self, inter_state_supply):
|
def set_inter_state_supply(self, inter_state_supply):
|
||||||
|
|
||||||
osup_det = self.report_dict["sup_details"]["osup_det"]
|
osup_det = self.report_dict["sup_details"]["osup_det"]
|
||||||
|
|
||||||
for key, value in iteritems(inter_state_supply):
|
for key, value in iteritems(inter_state_supply):
|
||||||
@@ -353,10 +351,18 @@ class GSTR3BReport(Document):
|
|||||||
inward_nil_exempt = frappe.db.sql(""" select p.place_of_supply, sum(i.base_amount) as base_amount,
|
inward_nil_exempt = frappe.db.sql(""" select p.place_of_supply, sum(i.base_amount) as base_amount,
|
||||||
i.is_nil_exempt, i.is_non_gst from `tabPurchase Invoice` p , `tabPurchase Invoice Item` i
|
i.is_nil_exempt, i.is_non_gst from `tabPurchase Invoice` p , `tabPurchase Invoice Item` i
|
||||||
where p.docstatus = 1 and p.name = i.parent
|
where p.docstatus = 1 and p.name = i.parent
|
||||||
|
and p.gst_category != 'Registered Composition'
|
||||||
and (i.is_nil_exempt = 1 or i.is_non_gst = 1) and
|
and (i.is_nil_exempt = 1 or i.is_non_gst = 1) and
|
||||||
month(p.posting_date) = %s and year(p.posting_date) = %s and p.company = %s and p.company_gstin = %s
|
month(p.posting_date) = %s and year(p.posting_date) = %s and p.company = %s and p.company_gstin = %s
|
||||||
group by p.place_of_supply, i.is_nil_exempt, i.is_non_gst""", (self.month_no, self.year, self.company, self.gst_details.get("gstin")), as_dict=1)
|
group by p.place_of_supply, i.is_nil_exempt, i.is_non_gst""", (self.month_no, self.year, self.company, self.gst_details.get("gstin")), as_dict=1)
|
||||||
|
|
||||||
|
inward_nil_exempt += frappe.db.sql("""SELECT sum(base_net_total) as base_amount, gst_category, place_of_supply
|
||||||
|
FROM `tabPurchase Invoice`
|
||||||
|
WHERE docstatus = 1 and gst_category = 'Registered Composition'
|
||||||
|
and month(posting_date) = %s and year(posting_date) = %s
|
||||||
|
and company = %s and company_gstin = %s
|
||||||
|
group by place_of_supply""", (self.month_no, self.year, self.company, self.gst_details.get("gstin")), as_dict=1)
|
||||||
|
|
||||||
inward_nil_exempt_details = {
|
inward_nil_exempt_details = {
|
||||||
"gst": {
|
"gst": {
|
||||||
"intra": 0.0,
|
"intra": 0.0,
|
||||||
@@ -370,9 +376,11 @@ class GSTR3BReport(Document):
|
|||||||
|
|
||||||
for d in inward_nil_exempt:
|
for d in inward_nil_exempt:
|
||||||
if d.place_of_supply:
|
if d.place_of_supply:
|
||||||
if d.is_nil_exempt == 1 and state == d.place_of_supply.split("-")[1]:
|
if (d.is_nil_exempt == 1 or d.get('gst_category') == 'Registered Composition') \
|
||||||
|
and state == d.place_of_supply.split("-")[1]:
|
||||||
inward_nil_exempt_details["gst"]["intra"] += d.base_amount
|
inward_nil_exempt_details["gst"]["intra"] += d.base_amount
|
||||||
elif d.is_nil_exempt == 1 and state != d.place_of_supply.split("-")[1]:
|
elif (d.is_nil_exempt == 1 or d.get('gst_category') == 'Registered Composition') \
|
||||||
|
and state != d.place_of_supply.split("-")[1]:
|
||||||
inward_nil_exempt_details["gst"]["inter"] += d.base_amount
|
inward_nil_exempt_details["gst"]["inter"] += d.base_amount
|
||||||
elif d.is_non_gst == 1 and state == d.place_of_supply.split("-")[1]:
|
elif d.is_non_gst == 1 and state == d.place_of_supply.split("-")[1]:
|
||||||
inward_nil_exempt_details["non_gst"]["intra"] += d.base_amount
|
inward_nil_exempt_details["non_gst"]["intra"] += d.base_amount
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class TestGSTR3BReport(unittest.TestCase):
|
|||||||
self.assertEqual(output["sup_details"]["osup_zero"]["iamt"], 18),
|
self.assertEqual(output["sup_details"]["osup_zero"]["iamt"], 18),
|
||||||
self.assertEqual(output["inter_sup"]["unreg_details"][0]["iamt"], 18),
|
self.assertEqual(output["inter_sup"]["unreg_details"][0]["iamt"], 18),
|
||||||
self.assertEqual(output["sup_details"]["osup_nil_exmp"]["txval"], 100),
|
self.assertEqual(output["sup_details"]["osup_nil_exmp"]["txval"], 100),
|
||||||
self.assertEqual(output["inward_sup"]["isup_details"][0]["inter"], 250)
|
self.assertEqual(output["inward_sup"]["isup_details"][0]["intra"], 250)
|
||||||
self.assertEqual(output["itc_elg"]["itc_avl"][4]["samt"], 22.50)
|
self.assertEqual(output["itc_elg"]["itc_avl"][4]["samt"], 22.50)
|
||||||
self.assertEqual(output["itc_elg"]["itc_avl"][4]["camt"], 22.50)
|
self.assertEqual(output["itc_elg"]["itc_avl"][4]["camt"], 22.50)
|
||||||
|
|
||||||
@@ -190,6 +190,19 @@ def create_purchase_invoices():
|
|||||||
|
|
||||||
pi1.submit()
|
pi1.submit()
|
||||||
|
|
||||||
|
pi2 = make_purchase_invoice(company="_Test Company GST",
|
||||||
|
customer = '_Test Registered Supplier',
|
||||||
|
currency = 'INR',
|
||||||
|
item = 'Milk',
|
||||||
|
warehouse = 'Finished Goods - _GST',
|
||||||
|
expense_account = 'Cost of Goods Sold - _GST',
|
||||||
|
cost_center = 'Main - _GST',
|
||||||
|
rate=250,
|
||||||
|
qty=1,
|
||||||
|
do_not_save=1
|
||||||
|
)
|
||||||
|
pi2.submit()
|
||||||
|
|
||||||
def make_suppliers():
|
def make_suppliers():
|
||||||
|
|
||||||
if not frappe.db.exists("Supplier", "_Test Registered Supplier"):
|
if not frappe.db.exists("Supplier", "_Test Registered Supplier"):
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ state_numbers = {
|
|||||||
"Mizoram": "15",
|
"Mizoram": "15",
|
||||||
"Nagaland": "13",
|
"Nagaland": "13",
|
||||||
"Odisha": "21",
|
"Odisha": "21",
|
||||||
"Other Territory": "98",
|
"Other Territory": "97",
|
||||||
"Pondicherry": "34",
|
"Pondicherry": "34",
|
||||||
"Punjab": "03",
|
"Punjab": "03",
|
||||||
"Rajasthan": "08",
|
"Rajasthan": "08",
|
||||||
|
|||||||
@@ -755,9 +755,9 @@ def update_totals(gst_tax, base_gst_tax, doc):
|
|||||||
if not doc.is_rounded_total_disabled():
|
if not doc.is_rounded_total_disabled():
|
||||||
doc.rounded_total = round_based_on_smallest_currency_fraction(doc.grand_total,
|
doc.rounded_total = round_based_on_smallest_currency_fraction(doc.grand_total,
|
||||||
doc.currency, doc.precision("rounded_total"))
|
doc.currency, doc.precision("rounded_total"))
|
||||||
doc.base_rounded_total += doc.rounded_total * doc.conversion_rate
|
doc.base_rounded_total = doc.rounded_total * doc.conversion_rate
|
||||||
|
|
||||||
doc.rounding_adjustment += flt(doc.rounded_total - doc.grand_total,
|
doc.rounding_adjustment = flt(doc.rounded_total - doc.grand_total,
|
||||||
doc.precision("rounding_adjustment"))
|
doc.precision("rounding_adjustment"))
|
||||||
doc.base_rounding_adjustment = doc.rounding_adjustment * doc.conversion_rate
|
doc.base_rounding_adjustment = doc.rounding_adjustment * doc.conversion_rate
|
||||||
|
|
||||||
|
|||||||
@@ -142,6 +142,9 @@ def make_custom_fields(update=True):
|
|||||||
dict(fieldname='customer_fiscal_code', label='Customer Fiscal Code',
|
dict(fieldname='customer_fiscal_code', label='Customer Fiscal Code',
|
||||||
fieldtype='Data', insert_after='cb_e_invoicing_reference', read_only=1,
|
fieldtype='Data', insert_after='cb_e_invoicing_reference', read_only=1,
|
||||||
fetch_from="customer.fiscal_code"),
|
fetch_from="customer.fiscal_code"),
|
||||||
|
dict(fieldname='type_of_document', label='Type of Document',
|
||||||
|
fieldtype='Select', insert_after='customer_fiscal_code',
|
||||||
|
options='\nTD01\nTD02\nTD03\nTD04\nTD05\nTD06\nTD16\nTD17\nTD18\nTD19\nTD20\nTD21\nTD22\nTD23\nTD24\nTD25\nTD26\nTD27'),
|
||||||
],
|
],
|
||||||
'Purchase Invoice Item': invoice_item_fields,
|
'Purchase Invoice Item': invoice_item_fields,
|
||||||
'Sales Order Item': invoice_item_fields,
|
'Sales Order Item': invoice_item_fields,
|
||||||
|
|||||||
@@ -57,11 +57,12 @@ def prepare_invoice(invoice, progressive_number):
|
|||||||
invoice.company_address_data = company_address
|
invoice.company_address_data = company_address
|
||||||
|
|
||||||
#Set invoice type
|
#Set invoice type
|
||||||
if invoice.is_return and invoice.return_against:
|
if not invoice.type_of_document:
|
||||||
invoice.type_of_document = "TD04" #Credit Note (Nota di Credito)
|
if invoice.is_return and invoice.return_against:
|
||||||
invoice.return_against_unamended = get_unamended_name(frappe.get_doc("Sales Invoice", invoice.return_against))
|
invoice.type_of_document = "TD04" #Credit Note (Nota di Credito)
|
||||||
else:
|
invoice.return_against_unamended = get_unamended_name(frappe.get_doc("Sales Invoice", invoice.return_against))
|
||||||
invoice.type_of_document = "TD01" #Sales Invoice (Fattura)
|
else:
|
||||||
|
invoice.type_of_document = "TD01" #Sales Invoice (Fattura)
|
||||||
|
|
||||||
#set customer information
|
#set customer information
|
||||||
invoice.customer_data = frappe.get_doc("Customer", invoice.customer)
|
invoice.customer_data = frappe.get_doc("Customer", invoice.customer)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class Gstr2Report(Gstr1Report):
|
|||||||
for inv, items_based_on_rate in self.items_based_on_tax_rate.items():
|
for inv, items_based_on_rate in self.items_based_on_tax_rate.items():
|
||||||
invoice_details = self.invoices.get(inv)
|
invoice_details = self.invoices.get(inv)
|
||||||
for rate, items in items_based_on_rate.items():
|
for rate, items in items_based_on_rate.items():
|
||||||
if rate:
|
if rate or invoice_details.get('gst_category') == 'Registered Composition':
|
||||||
if inv not in self.igst_invoices:
|
if inv not in self.igst_invoices:
|
||||||
rate = rate / 2
|
rate = rate / 2
|
||||||
row, taxable_value = self.get_row_data_for_invoice(inv, invoice_details, rate, items)
|
row, taxable_value = self.get_row_data_for_invoice(inv, invoice_details, rate, items)
|
||||||
@@ -86,7 +86,7 @@ class Gstr2Report(Gstr1Report):
|
|||||||
conditions += opts[1]
|
conditions += opts[1]
|
||||||
|
|
||||||
if self.filters.get("type_of_business") == "B2B":
|
if self.filters.get("type_of_business") == "B2B":
|
||||||
conditions += "and ifnull(gst_category, '') in ('Registered Regular', 'Deemed Export', 'SEZ') and is_return != 1 "
|
conditions += "and ifnull(gst_category, '') in ('Registered Regular', 'Deemed Export', 'SEZ', 'Registered Composition') and is_return != 1 "
|
||||||
|
|
||||||
elif self.filters.get("type_of_business") == "CDNR":
|
elif self.filters.get("type_of_business") == "CDNR":
|
||||||
conditions += """ and is_return = 1 """
|
conditions += """ and is_return = 1 """
|
||||||
|
|||||||
@@ -3,8 +3,9 @@
|
|||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe, erpnext
|
import frappe, erpnext
|
||||||
from frappe.utils import cint, nowdate
|
from frappe.utils import cint, flt
|
||||||
from frappe import throw, _
|
from frappe import throw, _
|
||||||
|
from collections import defaultdict
|
||||||
from frappe.utils.nestedset import NestedSet
|
from frappe.utils.nestedset import NestedSet
|
||||||
from erpnext.stock import get_warehouse_account
|
from erpnext.stock import get_warehouse_account
|
||||||
from frappe.contacts.address_and_contact import load_address_and_contact
|
from frappe.contacts.address_and_contact import load_address_and_contact
|
||||||
@@ -29,7 +30,6 @@ class Warehouse(NestedSet):
|
|||||||
self.set_onload('account', account)
|
self.set_onload('account', account)
|
||||||
load_address_and_contact(self)
|
load_address_and_contact(self)
|
||||||
|
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
self.update_nsm_model()
|
self.update_nsm_model()
|
||||||
|
|
||||||
@@ -140,8 +140,6 @@ class Warehouse(NestedSet):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_children(doctype, parent=None, company=None, is_root=False):
|
def get_children(doctype, parent=None, company=None, is_root=False):
|
||||||
from erpnext.stock.utils import get_stock_value_from_bin
|
|
||||||
|
|
||||||
if is_root:
|
if is_root:
|
||||||
parent = ""
|
parent = ""
|
||||||
|
|
||||||
@@ -154,13 +152,48 @@ def get_children(doctype, parent=None, company=None, is_root=False):
|
|||||||
|
|
||||||
warehouses = frappe.get_list(doctype, fields=fields, filters=filters, order_by='name')
|
warehouses = frappe.get_list(doctype, fields=fields, filters=filters, order_by='name')
|
||||||
|
|
||||||
|
company_currency = ''
|
||||||
|
if company:
|
||||||
|
company_currency = frappe.get_cached_value('Company', company, 'default_currency')
|
||||||
|
|
||||||
|
warehouse_wise_value = get_warehouse_wise_stock_value(company)
|
||||||
|
|
||||||
# return warehouses
|
# return warehouses
|
||||||
for wh in warehouses:
|
for wh in warehouses:
|
||||||
wh["balance"] = get_stock_value_from_bin(warehouse=wh.value)
|
wh["balance"] = warehouse_wise_value.get(wh.value)
|
||||||
if company:
|
if company_currency:
|
||||||
wh["company_currency"] = frappe.db.get_value('Company', company, 'default_currency')
|
wh["company_currency"] = company_currency
|
||||||
return warehouses
|
return warehouses
|
||||||
|
|
||||||
|
def get_warehouse_wise_stock_value(company):
|
||||||
|
warehouses = frappe.get_all('Warehouse',
|
||||||
|
fields = ['name', 'parent_warehouse'], filters = {'company': company})
|
||||||
|
parent_warehouse = {d.name : d.parent_warehouse for d in warehouses}
|
||||||
|
|
||||||
|
filters = {'warehouse': ('in', [data.name for data in warehouses])}
|
||||||
|
bin_data = frappe.get_all('Bin', fields = ['sum(stock_value) as stock_value', 'warehouse'],
|
||||||
|
filters = filters, group_by = 'warehouse')
|
||||||
|
|
||||||
|
warehouse_wise_stock_value = defaultdict(float)
|
||||||
|
for row in bin_data:
|
||||||
|
if not row.stock_value:
|
||||||
|
continue
|
||||||
|
|
||||||
|
warehouse_wise_stock_value[row.warehouse] = row.stock_value
|
||||||
|
update_value_in_parent_warehouse(warehouse_wise_stock_value,
|
||||||
|
parent_warehouse, row.warehouse, row.stock_value)
|
||||||
|
|
||||||
|
return warehouse_wise_stock_value
|
||||||
|
|
||||||
|
def update_value_in_parent_warehouse(warehouse_wise_stock_value, parent_warehouse_dict, warehouse, stock_value):
|
||||||
|
parent_warehouse = parent_warehouse_dict.get(warehouse)
|
||||||
|
if not parent_warehouse:
|
||||||
|
return
|
||||||
|
|
||||||
|
warehouse_wise_stock_value[parent_warehouse] += flt(stock_value)
|
||||||
|
update_value_in_parent_warehouse(warehouse_wise_stock_value, parent_warehouse_dict,
|
||||||
|
parent_warehouse, stock_value)
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def add_node():
|
def add_node():
|
||||||
from frappe.desk.treeview import make_tree_args
|
from frappe.desk.treeview import make_tree_args
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ frappe.treeview_settings['Warehouse'] = {
|
|||||||
onrender: function(node) {
|
onrender: function(node) {
|
||||||
if (node.data && node.data.balance!==undefined) {
|
if (node.data && node.data.balance!==undefined) {
|
||||||
$('<span class="balance-area pull-right text-muted small">'
|
$('<span class="balance-area pull-right text-muted small">'
|
||||||
+ format_currency(Math.abs(node.data.balance), node.data.company_currency)
|
+ format_currency((node.data.balance), node.data.company_currency)
|
||||||
+ '</span>').insertBefore(node.$ul);
|
+ '</span>').insertBefore(node.$ul);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ def get_item_details(args, doc=None, for_validate=False, overwrite_warehouse=Tru
|
|||||||
get_price_list_rate(args, item, out)
|
get_price_list_rate(args, item, out)
|
||||||
|
|
||||||
if args.customer and cint(args.is_pos):
|
if args.customer and cint(args.is_pos):
|
||||||
out.update(get_pos_profile_item_details(args.company, args))
|
out.update(get_pos_profile_item_details(args.company, args, update_data=True))
|
||||||
|
|
||||||
if out.get("warehouse"):
|
if out.get("warehouse"):
|
||||||
out.update(get_bin_details(args.item_code, out.warehouse))
|
out.update(get_bin_details(args.item_code, out.warehouse))
|
||||||
@@ -104,7 +104,7 @@ def get_item_details(args, doc=None, for_validate=False, overwrite_warehouse=Tru
|
|||||||
get_gross_profit(out)
|
get_gross_profit(out)
|
||||||
if args.doctype == 'Material Request':
|
if args.doctype == 'Material Request':
|
||||||
out.rate = args.rate or out.price_list_rate
|
out.rate = args.rate or out.price_list_rate
|
||||||
out.amount = flt(args.qty * out.rate)
|
out.amount = flt(args.qty) * flt(out.rate)
|
||||||
|
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|||||||
@@ -55,19 +55,32 @@ def get_item_info(filters):
|
|||||||
|
|
||||||
|
|
||||||
def get_consumed_items(condition):
|
def get_consumed_items(condition):
|
||||||
|
purpose_to_exclude = [
|
||||||
|
"Material Transfer for Manufacture",
|
||||||
|
"Material Transfer",
|
||||||
|
"Send to Subcontractor"
|
||||||
|
]
|
||||||
|
|
||||||
|
condition += """
|
||||||
|
and (
|
||||||
|
purpose is NULL
|
||||||
|
or purpose not in ({})
|
||||||
|
)
|
||||||
|
""".format(', '.join(["'{}'".format(p) for p in purpose_to_exclude]))
|
||||||
|
condition = condition.replace("posting_date", "sle.posting_date")
|
||||||
|
|
||||||
consumed_items = frappe.db.sql("""
|
consumed_items = frappe.db.sql("""
|
||||||
select item_code, abs(sum(actual_qty)) as consumed_qty
|
select item_code, abs(sum(actual_qty)) as consumed_qty
|
||||||
from `tabStock Ledger Entry`
|
from `tabStock Ledger Entry` as sle left join `tabStock Entry` as se
|
||||||
where actual_qty < 0
|
on sle.voucher_no = se.name
|
||||||
|
where
|
||||||
|
actual_qty < 0
|
||||||
and voucher_type not in ('Delivery Note', 'Sales Invoice')
|
and voucher_type not in ('Delivery Note', 'Sales Invoice')
|
||||||
%s
|
%s
|
||||||
group by item_code
|
group by item_code
|
||||||
""" % condition, as_dict=1)
|
""" % condition, as_dict=1)
|
||||||
|
|
||||||
consumed_items_map = {}
|
consumed_items_map = {item.item_code : item.consumed_qty for item in consumed_items}
|
||||||
for item in consumed_items:
|
|
||||||
consumed_items_map.setdefault(item.item_code, item.consumed_qty)
|
|
||||||
|
|
||||||
return consumed_items_map
|
return consumed_items_map
|
||||||
|
|
||||||
def get_delivered_items(condition):
|
def get_delivered_items(condition):
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ def get_total_stock(filters):
|
|||||||
INNER JOIN `tabWarehouse` warehouse
|
INNER JOIN `tabWarehouse` warehouse
|
||||||
ON warehouse.name = ledger.warehouse
|
ON warehouse.name = ledger.warehouse
|
||||||
WHERE
|
WHERE
|
||||||
actual_qty != 0 %s""" % (columns, conditions))
|
ledger.actual_qty != 0 %s""" % (columns, conditions))
|
||||||
|
|
||||||
def validate_filters(filters):
|
def validate_filters(filters):
|
||||||
if filters.get("group_by") == 'Company' and \
|
if filters.get("group_by") == 'Company' and \
|
||||||
|
|||||||
Reference in New Issue
Block a user