Selaa lähdekoodia

Rebranded

master
Anoop 2 vuotta sitten
commit
976ecee926
100 muutettua tiedostoa jossa 10993 lisäystä ja 0 poistoa
  1. +9
    -0
      .deepsource.toml
  2. +8
    -0
      .gitignore
  3. +18
    -0
      MANIFEST.in
  4. +38
    -0
      README.md
  5. +63
    -0
      csf_tz/__init__.py
  6. +0
    -0
      csf_tz/after_sales_services/__init__.py
  7. +0
    -0
      csf_tz/after_sales_services/doctype/__init__.py
  8. +0
    -0
      csf_tz/after_sales_services/doctype/machine_strip_request/__init__.py
  9. +40
    -0
      csf_tz/after_sales_services/doctype/machine_strip_request/machine_strip_request.js
  10. +345
    -0
      csf_tz/after_sales_services/doctype/machine_strip_request/machine_strip_request.json
  11. +43
    -0
      csf_tz/after_sales_services/doctype/machine_strip_request/machine_strip_request.py
  12. +23
    -0
      csf_tz/after_sales_services/doctype/machine_strip_request/test_machine_strip_request.js
  13. +10
    -0
      csf_tz/after_sales_services/doctype/machine_strip_request/test_machine_strip_request.py
  14. +0
    -0
      csf_tz/after_sales_services/doctype/machine_strip_request_item/__init__.py
  15. +168
    -0
      csf_tz/after_sales_services/doctype/machine_strip_request_item/machine_strip_request_item.json
  16. +10
    -0
      csf_tz/after_sales_services/doctype/machine_strip_request_item/machine_strip_request_item.py
  17. +0
    -0
      csf_tz/after_sales_services/doctype/maintenance_schedule/__init__.py
  18. +8
    -0
      csf_tz/after_sales_services/doctype/maintenance_schedule/maintenance_schedule.js
  19. +826
    -0
      csf_tz/after_sales_services/doctype/maintenance_schedule/maintenance_schedule.json
  20. +10
    -0
      csf_tz/after_sales_services/doctype/maintenance_schedule/maintenance_schedule.py
  21. +23
    -0
      csf_tz/after_sales_services/doctype/maintenance_schedule/test_maintenance_schedule.js
  22. +10
    -0
      csf_tz/after_sales_services/doctype/maintenance_schedule/test_maintenance_schedule.py
  23. +32
    -0
      stallation_note_dashboard.py
  24. +0
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection/__init__.py
  25. +81
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection/pre_delivery_inspection.js
  26. +1065
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection/pre_delivery_inspection.json
  27. +41
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection/pre_delivery_inspection.py
  28. +12
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection/pre_delivery_inspection_dashboard.py
  29. +23
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection/test_pre_delivery_inspection.js
  30. +10
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection/test_pre_delivery_inspection.py
  31. +0
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection___old/__init__.py
  32. +8
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection___old/pre_delivery_inspection___old.js
  33. +435
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection___old/pre_delivery_inspection___old.json
  34. +10
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection___old/pre_delivery_inspection___old.py
  35. +23
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection___old/test_pre_delivery_inspection___old.js
  36. +10
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection___old/test_pre_delivery_inspection___old.py
  37. +0
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_details/__init__.py
  38. +199
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_details/pre_delivery_inspection_details.json
  39. +10
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_details/pre_delivery_inspection_details.py
  40. +0
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_old/__init__.py
  41. +8
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_old/pre_delivery_inspection_old.js
  42. +435
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_old/pre_delivery_inspection_old.json
  43. +10
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_old/pre_delivery_inspection_old.py
  44. +23
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_old/test_pre_delivery_inspection_old.js
  45. +10
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_old/test_pre_delivery_inspection_old.py
  46. +0
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_reading/__init__.py
  47. +270
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_reading/pre_delivery_inspection_reading.json
  48. +10
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_reading/pre_delivery_inspection_reading.py
  49. +0
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_template/__init__.py
  50. +8
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_template/pre_delivery_inspection_template.js
  51. +182
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_template/pre_delivery_inspection_template.json
  52. +10
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_template/pre_delivery_inspection_template.py
  53. +23
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_template/test_pre_delivery_inspection_template.js
  54. +10
    -0
      csf_tz/after_sales_services/doctype/pre_delivery_inspection_template/test_pre_delivery_inspection_template.py
  55. +0
    -0
      csf_tz/after_sales_services/doctype/reference_payment_table/__init__.py
  56. +317
    -0
      csf_tz/after_sales_services/doctype/reference_payment_table/reference_payment_table.json
  57. +48
    -0
      csf_tz/after_sales_services/doctype/reference_payment_table/reference_payment_table.py
  58. +0
    -0
      csf_tz/after_sales_services/doctype/requested_funds_accounts_table/__init__.py
  59. +1289
    -0
      csf_tz/after_sales_services/doctype/requested_funds_accounts_table/requested_funds_accounts_table.json
  60. +10
    -0
      csf_tz/after_sales_services/doctype/requested_funds_accounts_table/requested_funds_accounts_table.py
  61. +0
    -0
      csf_tz/after_sales_services/doctype/requested_funds_details/__init__.py
  62. +1257
    -0
      csf_tz/after_sales_services/doctype/requested_funds_details/requested_funds_details.json
  63. +10
    -0
      csf_tz/after_sales_services/doctype/requested_funds_details/requested_funds_details.py
  64. +0
    -0
      csf_tz/after_sales_services/doctype/requested_payments/__init__.py
  65. +611
    -0
      csf_tz/after_sales_services/doctype/requested_payments/requested_payments.js
  66. +755
    -0
      csf_tz/after_sales_services/doctype/requested_payments/requested_payments.json
  67. +516
    -0
      csf_tz/after_sales_services/doctype/requested_payments/requested_payments.py
  68. +18
    -0
      csf_tz/after_sales_services/doctype/requested_payments/requested_payments_dashboard.py
  69. +3
    -0
      csf_tz/after_sales_services/doctype/requested_payments/requested_payments_list.js
  70. +23
    -0
      csf_tz/after_sales_services/doctype/requested_payments/test_requested_payments.js
  71. +12
    -0
      csf_tz/after_sales_services/doctype/requested_payments/test_requested_payments.py
  72. +0
    -0
      csf_tz/after_sales_services/doctype/sales_test/__init__.py
  73. +8
    -0
      csf_tz/after_sales_services/doctype/sales_test/sales_test.js
  74. +92
    -0
      csf_tz/after_sales_services/doctype/sales_test/sales_test.json
  75. +10
    -0
      csf_tz/after_sales_services/doctype/sales_test/sales_test.py
  76. +23
    -0
      csf_tz/after_sales_services/doctype/sales_test/test_sales_test.js
  77. +10
    -0
      csf_tz/after_sales_services/doctype/sales_test/test_sales_test.py
  78. +0
    -0
      csf_tz/after_sales_services/report/__init__.py
  79. +0
    -0
      csf_tz/after_sales_services/report/delivery_note_report/__init__.py
  80. +30
    -0
      csf_tz/after_sales_services/report/delivery_note_report/delivery_note_report.js
  81. +40
    -0
      csf_tz/after_sales_services/report/delivery_note_report/delivery_note_report.json
  82. +144
    -0
      csf_tz/after_sales_services/report/delivery_note_report/delivery_note_report.py
  83. +0
    -0
      csf_tz/after_sales_services/report/installation_note_report/__init__.py
  84. +31
    -0
      csf_tz/after_sales_services/report/installation_note_report/installation_note_report.js
  85. +34
    -0
      csf_tz/after_sales_services/report/installation_note_report/installation_note_report.json
  86. +87
    -0
      csf_tz/after_sales_services/report/installation_note_report/installation_note_report.py
  87. +0
    -0
      csf_tz/after_sales_services/report/pre_delivery_inspection_report/__init__.py
  88. +31
    -0
      csf_tz/after_sales_services/report/pre_delivery_inspection_report/pre_delivery_inspection_report.js
  89. +34
    -0
      csf_tz/after_sales_services/report/pre_delivery_inspection_report/pre_delivery_inspection_report.json
  90. +113
    -0
      csf_tz/after_sales_services/report/pre_delivery_inspection_report/pre_delivery_inspection_report.py
  91. +0
    -0
      csf_tz/after_sales_services/report/technicians_performance_report/__init__.py
  92. +51
    -0
      csf_tz/after_sales_services/report/technicians_performance_report/technicians_performance_report.js
  93. +38
    -0
      csf_tz/after_sales_services/report/technicians_performance_report/technicians_performance_report.json
  94. +106
    -0
      csf_tz/after_sales_services/report/technicians_performance_report/technicians_performance_report.py
  95. +0
    -0
      csf_tz/after_sales_services/report/workshop_performance_report/__init__.py
  96. +39
    -0
      csf_tz/after_sales_services/report/workshop_performance_report/workshop_performance_report.js
  97. +38
    -0
      csf_tz/after_sales_services/report/workshop_performance_report/workshop_performance_report.json
  98. +102
    -0
      csf_tz/after_sales_services/report/workshop_performance_report/workshop_performance_report.py
  99. +449
    -0
      csf_tz/bank_api.py
  100. +4
    -0
      csf_tz/bench-restart.sh

+ 9
- 0
.deepsource.toml Näytä tiedosto

@@ -0,0 +1,9 @@
version = 1

[[analyzers]]
name = "python"
enabled = true

[analyzers.meta]
runtime_version = "3.x.x"


+ 8
- 0
.gitignore Näytä tiedosto

@@ -0,0 +1,8 @@
.DS_Store
*.pyc
*.egg-info
*.swp
tags
csf_tz/docs/current
node_modules
.vscode/

+ 18
- 0
MANIFEST.in Näytä tiedosto

@@ -0,0 +1,18 @@
include MANIFEST.in
include requirements.txt
include *.json
include *.md
include *.py
include *.txt
recursive-include csf_tz *.css
recursive-include csf_tz *.csv
recursive-include csf_tz *.html
recursive-include csf_tz *.ico
recursive-include csf_tz *.js
recursive-include csf_tz *.json
recursive-include csf_tz *.md
recursive-include csf_tz *.png
recursive-include csf_tz *.py
recursive-include csf_tz *.svg
recursive-include csf_tz *.txt
recursive-exclude csf_tz *.pyc

+ 38
- 0
README.md Näytä tiedosto

@@ -0,0 +1,38 @@
## CSF TZ

Country Specific Functionality Tanzania

It includes modules for:
### Tanzanian Specific Customizations
- The functionality that is related to Tanzania business environment.
- It also allows easy tax compliance and helps to ensure that necessary automation are in place.
- It also has features such as polling sites for Vehicle Fines and Parking Tickets based on Vehicles defined in the system.
- Open Invoice Exchange Rate Revaluation for companies that have lots of open invoices in foreign currency
- Electronic Fiscal Device definition and EFD Z Report reconciliation for statutory compliance
- Special Closing Balance for retro creation of manfucture entries based on new stock taking done
- Piecework based additional salary assignment
- Simple Expense Record registration for Branch managers or non-accountants

### After Sales Service
- Doctypes for After Sales Service for companies who wish to use it.

### Clearing and Forwarding
- Tanzanian specific Clearing and Forwarding doctypes.

### Fleet Management
- Tanzanian specific Fleet Management doctypes.

### Workshop
- Tanzanian specific company Workshop doctypes.

### Utilities for productivity
- Set visibility of documennts so that users are only shown specific documents based on access rights set
- Automatic add dependant permissions for a doctype granted access rights
- Enhanced Bank Clearance (to be deprecated once InfluxERP gets these features)
- Enhanced Payment Reconciliation for managing student invoices (to be deprecated once InfluxERP gets these features)



#### License

GPL

+ 63
- 0
csf_tz/__init__.py Näytä tiedosto

@@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import os
import importlib

import frappe

__version__ = "2.1.0"

patches_loaded = False
app_name = "csf_tz"


def load_monkey_patches():
"""
Loads all modules present in monkey_patches to override some logic
in InfluxERP / InfluxERP. Returns if patches have already been loaded earlier.
"""
global patches_loaded

if patches_loaded:
return

patches_loaded = True

if app_name not in frappe.get_installed_apps():
return

for module_name in os.listdir(frappe.get_app_path(app_name, "monkey_patches")):
if not module_name.endswith(".py") or module_name == "__init__.py":
continue

importlib.import_module(app_name + ".monkey_patches." + module_name[:-3])


old_get_hooks = frappe.get_hooks


def get_hooks(*args, **kwargs):
load_monkey_patches()
return old_get_hooks(*args, **kwargs)


frappe.get_hooks = get_hooks

old_connect = frappe.connect


def connect(*args, **kwargs):
"""
Patches frappe.connect to load monkey patches once a connection is
established with the database.
"""

old_connect(*args, **kwargs)
load_monkey_patches()


frappe.connect = connect


def console(*data):
frappe.publish_realtime("out_to_console", data, user=frappe.session.user)

+ 0
- 0
csf_tz/after_sales_services/__init__.py Näytä tiedosto


+ 0
- 0
csf_tz/after_sales_services/doctype/__init__.py Näytä tiedosto


+ 0
- 0
csf_tz/after_sales_services/doctype/machine_strip_request/__init__.py Näytä tiedosto


+ 40
- 0
csf_tz/after_sales_services/doctype/machine_strip_request/machine_strip_request.js Näytä tiedosto

@@ -0,0 +1,40 @@
// Copyright (c) 2020, InfluxERP
// For license information, please see license.txt

frappe.ui.form.on('Machine Strip Request', {
refresh: function(frm) {
frm.set_query("stripped_serial_no", function(doc){
return{
"filters": {
"item_code": doc.stripped_item_code,
"delivery_document_type": ''
}
}
})
frm.set_query("target_serial_no", function(doc){
return{
"filters": {
"item_code": doc.target_item_code,
"delivery_document_type": ''
}
}
})
//Make job card button
if (frm.doc.docstatus == 1){
frm.add_custom_button(__('Make Job Card'),
function() {
frm.events.make_job_card();
}
);
}
},
make_job_card: function() {
frappe.model.open_mapped_doc({
method: "erpnext.after_sales_services.doctype.machine_strip_request.machine_strip_request.make_job_card",
frm: cur_frm
})
}
});

+ 345
- 0
csf_tz/after_sales_services/doctype/machine_strip_request/machine_strip_request.json Näytä tiedosto

@@ -0,0 +1,345 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "MSREQ.###",
"beta": 0,
"creation": "2020-03-26 16:21:57.534696",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "stripped_item_code",
"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": "Stripped Machine Item Code",
"length": 0,
"no_copy": 0,
"options": "Item",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "stripped_serial_no",
"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": "Stripped Machine Serial No",
"length": 0,
"no_copy": 0,
"options": "Serial No",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "target_item_code",
"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": "Target Machine Item Code",
"length": 0,
"no_copy": 0,
"options": "Item",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "target_serial_no",
"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": "Target Machine Serial No",
"length": 0,
"no_copy": 0,
"options": "Serial No",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_4",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "stripping_reason",
"fieldtype": "Text",
"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": "Stripping Reason",
"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": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_items",
"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": "Items to be Stripped",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "stripped_items",
"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": "Stripped Items",
"length": 0,
"no_copy": 0,
"options": "Machine Strip Request Item",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "amended_from",
"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": "Amended From",
"length": 0,
"no_copy": 1,
"options": "Machine Strip Request",
"permlevel": 0,
"print_hide": 1,
"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
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 1,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2020-03-26 20:00:57.771866",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Machine Strip Request",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 1,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 1,
"write": 1
}
],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

+ 43
- 0
csf_tz/after_sales_services/doctype/machine_strip_request/machine_strip_request.py Näytä tiedosto

@@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2020, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.model.document import Document
from frappe.model.mapper import get_mapped_doc
from frappe import _

class MachineStripRequest(Document):
pass



@frappe.whitelist()
def make_job_card(source_name, target_doc=None, ignore_permissions=False):
def postprocess(source, doc):
doc.job_type = "Machine Parts Strip"
doc.append('items', {
"item_code": source.stripped_item_code,
"requested_for": 'Serial No',
"serial_number": source.stripped_serial_no
})
doc.append('items', {
"item_code": source.target_item_code,
"requested_for": 'Serial No',
"serial_number": source.target_serial_no
})
description = 'Parts strip job from {} {} to {} {} for items: \n'.format(source.stripped_item_code, source.stripped_serial_no, source.target_item_code, source.target_serial_no)
for item in source.stripped_items:
description += '{} {} {} \n'.format(item.item, item.qty, item.uom)
doc.job_description = description
docs = get_mapped_doc("Machine Strip Request", source_name, {
"Machine Strip Request": {
"doctype": "Job Card",
"field_map": {
"name": "machine_strip_request"
},
}
}, target_doc, postprocess, ignore_permissions=ignore_permissions)
return docs

+ 23
- 0
csf_tz/after_sales_services/doctype/machine_strip_request/test_machine_strip_request.js Näytä tiedosto

@@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line

QUnit.test("test: Machine Strip Request", function (assert) {
let done = assert.async();

// number of asserts
assert.expect(1);

frappe.run_serially([
// insert a new Machine Strip Request
() => frappe.tests.make('Machine Strip Request', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);

});

+ 10
- 0
csf_tz/after_sales_services/doctype/machine_strip_request/test_machine_strip_request.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2020, InfluxERP
# See license.txt
from __future__ import unicode_literals

import frappe
import unittest

class TestMachineStripRequest(unittest.TestCase):
pass

+ 0
- 0
csf_tz/after_sales_services/doctype/machine_strip_request_item/__init__.py Näytä tiedosto


+ 168
- 0
csf_tz/after_sales_services/doctype/machine_strip_request_item/machine_strip_request_item.json Näytä tiedosto

@@ -0,0 +1,168 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"creation": "2020-03-26 17:19:39.031613",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "item",
"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": "Item",
"length": 0,
"no_copy": 0,
"options": "Item",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "item_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": "Item Name",
"length": 0,
"no_copy": 0,
"options": "item.item_name",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "uom",
"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": "UOM",
"length": 0,
"no_copy": 0,
"options": "item.stock_uom",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "qty",
"fieldtype": "Float",
"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": "Quantity",
"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": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2020-03-26 17:19:39.031613",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Machine Strip Request Item",
"name_case": "",
"owner": "Administrator",
"permissions": [],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

+ 10
- 0
csf_tz/after_sales_services/doctype/machine_strip_request_item/machine_strip_request_item.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2020, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.model.document import Document

class MachineStripRequestItem(Document):
pass

+ 0
- 0
csf_tz/after_sales_services/doctype/maintenance_schedule/__init__.py Näytä tiedosto


+ 8
- 0
csf_tz/after_sales_services/doctype/maintenance_schedule/maintenance_schedule.js Näytä tiedosto

@@ -0,0 +1,8 @@
// Copyright (c) 2018, InfluxERP
// For license information, please see license.txt

frappe.ui.form.on('Maintenance Schedule', {
refresh: function(frm) {

}
});

+ 826
- 0
csf_tz/after_sales_services/doctype/maintenance_schedule/maintenance_schedule.json Näytä tiedosto

@@ -0,0 +1,826 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "naming_series:",
"beta": 0,
"creation": "2013-01-10 16:34:30",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "Document",
"editable_grid": 0,
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "customer_details",
"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,
"oldfieldtype": "Section Break",
"options": "fa fa-user",
"permlevel": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "naming_series",
"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": "Series",
"length": 0,
"no_copy": 1,
"options": "MS",
"permlevel": 0,
"precision": "",
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 1,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "customer",
"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": 1,
"label": "Customer",
"length": 0,
"no_copy": 0,
"oldfieldname": "customer",
"oldfieldtype": "Link",
"options": "Customer",
"permlevel": 0,
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 1,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break0",
"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,
"oldfieldtype": "Column Break",
"permlevel": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Draft",
"fieldname": "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": 1,
"label": "Status",
"length": 0,
"no_copy": 1,
"oldfieldname": "status",
"oldfieldtype": "Select",
"options": "\nDraft\nSubmitted\nCancelled",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "transaction_date",
"fieldtype": "Date",
"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": "Transaction Date",
"length": 0,
"no_copy": 0,
"oldfieldname": "transaction_date",
"oldfieldtype": "Date",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "items_section",
"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,
"oldfieldtype": "Section Break",
"options": "fa fa-shopping-cart",
"permlevel": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "items",
"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": "Items",
"length": 0,
"no_copy": 0,
"oldfieldname": "item_maintenance_detail",
"oldfieldtype": "Table",
"options": "Maintenance Schedule Item",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "schedule",
"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": "Schedule",
"length": 0,
"no_copy": 0,
"oldfieldtype": "Section Break",
"options": "fa fa-time",
"permlevel": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "generate_schedule",
"fieldtype": "Button",
"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": "Generate Schedule",
"length": 0,
"no_copy": 0,
"oldfieldtype": "Button",
"permlevel": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "schedules",
"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": "Schedules",
"length": 0,
"no_copy": 0,
"oldfieldname": "schedules",
"oldfieldtype": "Table",
"options": "Maintenance Schedule Detail",
"permlevel": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "contact_info",
"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": "Contact Info",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"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": 0,
"bold": 1,
"collapsible": 0,
"columns": 0,
"depends_on": "customer",
"fieldname": "customer_name",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 1,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Customer Name",
"length": 0,
"no_copy": 0,
"oldfieldname": "customer_name",
"oldfieldtype": "Data",
"permlevel": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "customer",
"fieldname": "contact_person",
"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": "Contact Person",
"length": 0,
"no_copy": 0,
"options": "Contact",
"permlevel": 0,
"print_hide": 1,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "customer",
"fieldname": "contact_mobile",
"fieldtype": "Data",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Mobile No",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "customer",
"fieldname": "contact_email",
"fieldtype": "Data",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Contact Email",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 1,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "contact_display",
"fieldtype": "Small Text",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 1,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Contact",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_17",
"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,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "customer",
"fieldname": "customer_address",
"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": "Customer Address",
"length": 0,
"no_copy": 0,
"options": "Address",
"permlevel": 0,
"print_hide": 1,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "address_display",
"fieldtype": "Small Text",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Address",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "customer",
"description": "",
"fieldname": "territory",
"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": "Territory",
"length": 0,
"no_copy": 0,
"oldfieldname": "territory",
"oldfieldtype": "Link",
"options": "Territory",
"permlevel": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "customer",
"description": "",
"fieldname": "customer_group",
"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": "Customer Group",
"length": 0,
"no_copy": 0,
"options": "Customer Group",
"permlevel": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"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,
"oldfieldname": "company",
"oldfieldtype": "Link",
"options": "Company",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 1,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "amended_from",
"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": "Amended From",
"length": 0,
"no_copy": 1,
"options": "Maintenance Schedule",
"permlevel": 0,
"print_hide": 1,
"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
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"icon": "fa fa-calendar",
"idx": 1,
"image_view": 0,
"in_create": 0,
"is_submittable": 1,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-06-27 14:59:15.629203",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Maintenance Schedule",
"owner": "Administrator",
"permissions": [
{
"amend": 1,
"cancel": 1,
"create": 1,
"delete": 1,
"email": 1,
"export": 0,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Maintenance Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 1,
"write": 1
}
],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"search_fields": "status,customer,customer_name",
"show_name_in_global_search": 0,
"sort_order": "DESC",
"timeline_field": "customer",
"track_changes": 0,
"track_seen": 0
}

+ 10
- 0
csf_tz/after_sales_services/doctype/maintenance_schedule/maintenance_schedule.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.model.document import Document

class MaintenanceSchedule(Document):
pass

+ 23
- 0
csf_tz/after_sales_services/doctype/maintenance_schedule/test_maintenance_schedule.js Näytä tiedosto

@@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line

QUnit.test("test: Maintenance Schedule", function (assert) {
let done = assert.async();

// number of asserts
assert.expect(1);

frappe.run_serially([
// insert a new Maintenance Schedule
() => frappe.tests.make('Maintenance Schedule', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);

});

+ 10
- 0
csf_tz/after_sales_services/doctype/maintenance_schedule/test_maintenance_schedule.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# See license.txt
from __future__ import unicode_literals

import frappe
import unittest

class TestMaintenanceSchedule(unittest.TestCase):
pass

csf_tz/after_sales_services/doctype/pre_delivery_inspection/# → stallation_note_dashboard.py Näytä tiedosto

@@ -0,0 +1,32 @@
# installation_note_dashboard.py
from frappe import _

def get_data():
return {
'fieldname': 'installation_note_dashboard',
'non_standard_fieldnames': {
'Delivery Note': 'against_sales_invoice',
'Journal Entry': 'reference_name',
'Payment Entry': 'reference_name',
'Payment Request': 'reference_name',
'Auto Repeat': 'reference_document',
},
'internal_links': {
'Sales Invoice': ['readings', 'sales_invoice'],
'Sales Order': ['items', 'sales_order']
},
'transactions': [
{
'label': _('Reference'),
'items': ['Sales Invoice', 'Delivery Note', 'Sales Order']
},
{
'label': _('Payment'),
'items': ['Payment Entry', 'Payment Request', 'Journal Entry']
},
{
'label': _('Subscription'),
'items': ['Auto Repeat']
},
]
}

+ 0
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection/__init__.py Näytä tiedosto


+ 81
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection/pre_delivery_inspection.js Näytä tiedosto

@@ -0,0 +1,81 @@
// Copyright (c) 2018, InfluxERP
// For license information, please see license.txt

var data = sessionStorage.getItem("item_code_stored_predelivery");
var data2 = sessionStorage.getItem("serial_stored_predelivery");


frappe.ui.form.on('Pre Delivery Inspection', {
refresh: function(frm) {
//console.log(cur_frm)
//console.log(data);
if (!frm.doc.item_code) {
frm.set_value("item_code", data);
}
if (!frm.doc.item_serial_no) {
frm.set_value("item_serial_no", data2);
}
/*frm.set_value("quality_inspection_template", data);
frappe.after_ajax(function(){
frm.events.quality_inspection_template(frm);
});*/

frm.events.load_delivery_note(frm);

},
item_code: function(frm) {
if (frm.doc.item_code && frm.doc.item_code != '') {
frappe.model.with_doc("Sales Invoice", frm.doc.sales_invoice_ref, function(){
var ref_doc = frappe.get_doc("Sales Invoice", frm.doc.sales_invoice_ref);
//console.log(ref_doc);

if (ref_doc.items && ref_doc.items.length > 0) {
ref_doc.items.forEach(function(row){

if(row.item_code == data){
frm.doc.item_name = row.item_name;
frm.doc.description = row.description;
frm.doc.batch_no = row.batch_no;
frm.set_value("quality_inspection_template", row.item_code);
//frm.doc.quality_inspection_template = row.item_code;
}
})
}

});
}
frappe.after_ajax(function(){
frm.refresh_field("item_name")
frm.refresh_field("description")
frm.refresh_field("batch_no")
frm.events.quality_inspection_template(frm);
})
},
quality_inspection_template: function(frm){
if(frm.doc.quality_inspection_template){
frappe.model.with_doc("Pre Delivery Inspection Template", frm.doc.quality_inspection_template, function(){
var ref_doc = frappe.get_doc("Pre Delivery Inspection Template", frm.doc.quality_inspection_template);
if(ref_doc && ref_doc.item_quality_inspection_parameter){
frm.clear_table("readings");
ref_doc.item_quality_inspection_parameter.forEach(function(row){
var new_row = frm.add_child("readings");
new_row.specification = row.specification;
})
}
});
frappe.after_ajax(function(){
frm.refresh_field('readings');
})
}
},

load_delivery_note: function(frm){
if(frm.fields_dict['dashboard_links_html'] && "dashboard_links_html" in frm.doc.__onload) {
frm.fields_dict['dashboard_links_html'].wrapper.innerHTML = frm.doc.__onload.dashboard_links_html.display;
}
},
});

+ 1065
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection/pre_delivery_inspection.json
File diff suppressed because it is too large
Näytä tiedosto


+ 41
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection/pre_delivery_inspection.py Näytä tiedosto

@@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.model.document import Document
from frappe import _, msgprint, throw
import json

class PreDeliveryInspection(Document):
def onload(self):
""" Load delivery Note link """
dashboard_links_html = self.load_delivery_note()
self.set_onload("dashboard_links_html", {"display": dashboard_links_html})

def load_delivery_note(self):
delivery_note_links = []
delivery_note_links = frappe.db.sql("""
SELECT
tdni.item_code,
tdni.parent,
tdni.serial_no,
tdni.against_sales_invoice,
tip.name As installation
FROM
(`tabDelivery Note Item` tdni)
LEFT JOIN
(`tabInstallation Note` tip)
ON tdni.parent = tip.delivery_note
where
tdni.against_sales_invoice = %(inv)s
AND
tdni.item_code = %(item)s
AND
tdni.serial_no = %(serial)s
""",{'inv':self.reference_name, 'item':self.item_code, 'serial':self.item_serial_no}, as_dict=True)
self.set_onload("delivery_note_links", delivery_note_links)
#frappe.msgprint(_(json.dumps(delivery_note_links)))

return frappe.render_template("templates/pre_delivery_links.html", {"delivery_note_links": delivery_note_links})

+ 12
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection/pre_delivery_inspection_dashboard.py Näytä tiedosto

@@ -0,0 +1,12 @@
# from frappe import _

# def get_data():
# return {
# 'fieldname': 'pre_delivery_inspection',
# 'transactions': [
# {
# 'label': _('Delivery and Installation'),
# 'items': ['Delivery Note', 'Installation Note']
# },
# ]
# }

+ 23
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection/test_pre_delivery_inspection.js Näytä tiedosto

@@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line

QUnit.test("test: Pre-delivery Inspection", function (assert) {
let done = assert.async();

// number of asserts
assert.expect(1);

frappe.run_serially([
// insert a new Pre-delivery Inspection
() => frappe.tests.make('Pre-delivery Inspection', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);

});

+ 10
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection/test_pre_delivery_inspection.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# See license.txt
from __future__ import unicode_literals

import frappe
import unittest

class TestPredeliveryInspection(unittest.TestCase):
pass

+ 0
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection___old/__init__.py Näytä tiedosto


+ 8
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection___old/pre_delivery_inspection___old.js Näytä tiedosto

@@ -0,0 +1,8 @@
// Copyright (c) 2018, InfluxERP
// For license information, please see license.txt

frappe.ui.form.on('Pre Delivery Inspection - old', {
refresh: function(frm) {

}
});

+ 435
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection___old/pre_delivery_inspection___old.json Näytä tiedosto

@@ -0,0 +1,435 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "PDI.####",
"beta": 0,
"creation": "2018-07-09 05:25:54.165592",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "customer",
"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": "Customer",
"length": 0,
"no_copy": 0,
"options": "Customer",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "verified_by",
"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": "Verified By",
"length": 0,
"no_copy": 0,
"options": "User",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_3",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "remarks",
"fieldtype": "Small Text",
"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": "Overall Remarks",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_break_5",
"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,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "inspection_details",
"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": "Inspection Details",
"length": 0,
"no_copy": 0,
"options": "Pre Delivery Inspection Details",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_break_7",
"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,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "customer_remarks",
"fieldtype": "Text",
"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": "Customer Remarks",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_9",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "heading_customer_signature",
"fieldtype": "Heading",
"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": "Customer Signature",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Customer Signature",
"description": "Customer Signature",
"fieldname": "customer_signature",
"fieldtype": "Signature",
"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": "Customer Signature",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "amended_from",
"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": "Amended From",
"length": 0,
"no_copy": 1,
"options": "Pre Delivery Inspection - old",
"permlevel": 0,
"print_hide": 1,
"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
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 1,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-07-25 18:38:22.390447",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Pre Delivery Inspection - old",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 1,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 1,
"write": 1
}
],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

+ 10
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection___old/pre_delivery_inspection___old.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.model.document import Document

class PreDeliveryInspectionOld(Document):
pass

+ 23
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection___old/test_pre_delivery_inspection___old.js Näytä tiedosto

@@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line

QUnit.test("test: Pre Delivery Inspection - old", function (assert) {
let done = assert.async();

// number of asserts
assert.expect(1);

frappe.run_serially([
// insert a new Pre Delivery Inspection - old
() => frappe.tests.make('Pre Delivery Inspection - old', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);

});

+ 10
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection___old/test_pre_delivery_inspection___old.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# See license.txt
from __future__ import unicode_literals

import frappe
import unittest

class TestPreDeliveryInspectionOld(unittest.TestCase):
pass

+ 0
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_details/__init__.py Näytä tiedosto


+ 199
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_details/pre_delivery_inspection_details.json Näytä tiedosto

@@ -0,0 +1,199 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"creation": "2018-07-09 17:56:13.244299",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "item_code",
"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": "Item Code",
"length": 0,
"no_copy": 0,
"options": "Item",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "serial_no",
"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": "Serial Number",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "checked_parameter",
"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": "Checked Parameter",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "sales_invoice",
"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": "Sales Invoice",
"length": 0,
"no_copy": 0,
"options": "Sales Invoice",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "sales_order",
"fieldtype": "Data",
"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": "Sales Order",
"length": 0,
"no_copy": 0,
"options": "Sales Order",
"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
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2018-07-26 10:30:02.581501",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Pre Delivery Inspection Details",
"name_case": "",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

+ 10
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_details/pre_delivery_inspection_details.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.model.document import Document

class PreDeliveryInspectionDetails(Document):
pass

+ 0
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_old/__init__.py Näytä tiedosto


+ 8
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_old/pre_delivery_inspection_old.js Näytä tiedosto

@@ -0,0 +1,8 @@
// Copyright (c) 2018, InfluxERP
// For license information, please see license.txt

frappe.ui.form.on('Pre Delivery Inspection Old', {
refresh: function(frm) {

}
});

+ 435
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_old/pre_delivery_inspection_old.json Näytä tiedosto

@@ -0,0 +1,435 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "PDI.####",
"beta": 0,
"creation": "2018-07-09 05:25:54.165592",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "customer",
"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": "Customer",
"length": 0,
"no_copy": 0,
"options": "Customer",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "verified_by",
"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": "Verified By",
"length": 0,
"no_copy": 0,
"options": "User",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_3",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "remarks",
"fieldtype": "Small Text",
"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": "Overall Remarks",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_break_5",
"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,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "inspection_details",
"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": "Inspection Details",
"length": 0,
"no_copy": 0,
"options": "Pre Delivery Inspection Details",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_break_7",
"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,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "customer_remarks",
"fieldtype": "Text",
"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": "Customer Remarks",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_9",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "heading_customer_signature",
"fieldtype": "Heading",
"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": "Customer Signature",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Customer Signature",
"description": "Customer Signature",
"fieldname": "customer_signature",
"fieldtype": "Signature",
"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": "Customer Signature",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "amended_from",
"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": "Amended From",
"length": 0,
"no_copy": 1,
"options": "Pre Delivery Inspection Old",
"permlevel": 0,
"print_hide": 1,
"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
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 1,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-07-25 18:39:13.934350",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Pre Delivery Inspection Old",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 1,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 1,
"write": 1
}
],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

+ 10
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_old/pre_delivery_inspection_old.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.model.document import Document

class PreDeliveryInspectionOld(Document):
pass

+ 23
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_old/test_pre_delivery_inspection_old.js Näytä tiedosto

@@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line

QUnit.test("test: Pre Delivery Inspection Old", function (assert) {
let done = assert.async();

// number of asserts
assert.expect(1);

frappe.run_serially([
// insert a new Pre Delivery Inspection Old
() => frappe.tests.make('Pre Delivery Inspection Old', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);

});

+ 10
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_old/test_pre_delivery_inspection_old.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# See license.txt
from __future__ import unicode_literals

import frappe
import unittest

class TestPreDeliveryInspectionOld(unittest.TestCase):
pass

+ 0
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_reading/__init__.py Näytä tiedosto


+ 270
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_reading/pre_delivery_inspection_reading.json Näytä tiedosto

@@ -0,0 +1,270 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "hash",
"beta": 0,
"creation": "2018-07-25 18:45:21.438389",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "specification",
"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": "Parameter",
"length": 0,
"no_copy": 0,
"oldfieldname": "specification",
"oldfieldtype": "Data",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "value",
"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": "Acceptance Criteria",
"length": 0,
"no_copy": 0,
"oldfieldname": "value",
"oldfieldtype": "Data",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Accepted",
"fieldname": "status",
"fieldtype": "Select",
"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": "Status",
"length": 0,
"no_copy": 0,
"oldfieldname": "status",
"oldfieldtype": "Select",
"options": "Accepted\nRejected",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "sales_invoice",
"fieldtype": "Link",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Sales Invoice",
"length": 0,
"no_copy": 0,
"options": "Sales Invoice",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "sales_order",
"fieldtype": "Link",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Sales Order",
"length": 0,
"no_copy": 0,
"options": "Sales Order",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "sales_invoice_item",
"fieldtype": "Data",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Sales Invoice Item",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "sales_order_item",
"fieldtype": "Data",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Sales Order Item",
"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
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2018-07-26 16:42:28.475938",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Pre Delivery Inspection Reading",
"name_case": "",
"owner": "Administrator",
"permissions": [],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 0,
"track_seen": 0
}

+ 10
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_reading/pre_delivery_inspection_reading.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.model.document import Document

class PreDeliveryInspectionReading(Document):
pass

+ 0
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_template/__init__.py Näytä tiedosto


+ 8
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_template/pre_delivery_inspection_template.js Näytä tiedosto

@@ -0,0 +1,8 @@
// Copyright (c) 2018, InfluxERP
// For license information, please see license.txt

frappe.ui.form.on('Pre Delivery Inspection Template', {
refresh: function(frm) {

}
});

+ 182
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_template/pre_delivery_inspection_template.json Näytä tiedosto

@@ -0,0 +1,182 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 1,
"allow_rename": 1,
"autoname": "field:quality_inspection_template_name",
"beta": 0,
"creation": "2018-07-25 18:44:06.024204",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "quality_inspection_template_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": "Quality Inspection Template Name",
"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": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "item_quality_inspection_parameter",
"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": "Item Quality Inspection Parameter",
"length": 0,
"no_copy": 0,
"options": "Item Quality Inspection Parameter",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-07-25 18:50:06.701732",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Pre Delivery Inspection Template",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Stock User",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Quality Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Manufacturing User",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
}
],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

+ 10
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_template/pre_delivery_inspection_template.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.model.document import Document

class PreDeliveryInspectionTemplate(Document):
pass

+ 23
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_template/test_pre_delivery_inspection_template.js Näytä tiedosto

@@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line

QUnit.test("test: Pre Delivery Inspection Template", function (assert) {
let done = assert.async();

// number of asserts
assert.expect(1);

frappe.run_serially([
// insert a new Pre Delivery Inspection Template
() => frappe.tests.make('Pre Delivery Inspection Template', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);

});

+ 10
- 0
csf_tz/after_sales_services/doctype/pre_delivery_inspection_template/test_pre_delivery_inspection_template.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# See license.txt
from __future__ import unicode_literals

import frappe
import unittest

class TestPreDeliveryInspectionTemplate(unittest.TestCase):
pass

+ 0
- 0
csf_tz/after_sales_services/doctype/reference_payment_table/__init__.py Näytä tiedosto


+ 317
- 0
csf_tz/after_sales_services/doctype/reference_payment_table/reference_payment_table.json Näytä tiedosto

@@ -0,0 +1,317 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"creation": "2017-04-25 14:10:41.177611",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Pastel",
"fieldname": "accounting_system",
"fieldtype": "Data",
"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": "Accounting System",
"length": 0,
"no_copy": 0,
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "amount",
"fieldtype": "Float",
"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": "Amount",
"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": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "currency",
"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": "Currency",
"length": 0,
"no_copy": 0,
"options": "Currency",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "date_of_payment",
"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": "Date of Payment",
"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": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "reference_no",
"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": "Reference Number",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "paid_to",
"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": "Paid To",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "payment_method",
"fieldtype": "Select",
"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": "Payment Method",
"length": 0,
"no_copy": 0,
"options": "\nCash\nCheque\nBank Transfer",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "payment_account",
"fieldtype": "Select",
"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": "Payment Account",
"length": 0,
"no_copy": 0,
"options": "\nCRDB\nBank M\nStanbic Bank\nEco Bank\nPetty Cash Fund\nM-Pesa\nInter Africa\nYash International (Fuel Account)\nMount Meru (Fuel Account)\nPetcom (Fuel Account)\nVital Oil (Fuel Account)",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "new",
"fieldname": "status",
"fieldtype": "Data",
"hidden": 1,
"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,
"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,
"unique": 0
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2017-07-14 10:59:00.661721",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Reference Payment Table",
"name_case": "",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

+ 48
- 0
csf_tz/after_sales_services/doctype/reference_payment_table/reference_payment_table.py Näytä tiedosto

@@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2015, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.model.document import Document

class ReferencePaymentTable(Document):
pass

def update_child_table(self, fieldname, df=None):
'''Updated function to prevent saving of approved or rejected funds request'''
'''sync child table for given fieldname'''
rows = []
if not df:
df = self.meta.get_field(fieldname)

for d in self.get(df.fieldname):
if df.fieldname in ["requested_funds", "main_requested_funds", "return_requested_funds"]:
if d.get("request_status") not in ["Approved", "Rejected"]:
d.db_update()
else:
d.db_update()
rows.append(d.name)

if df.options in (self.flags.ignore_children_type or []):
# do not delete rows for this because of flags
# hack for docperm :(
return

if rows:
# select rows that do not match the ones in the document
deleted_rows = frappe.db.sql("""select name from `tab{0}` where parent=%s
and parenttype=%s and parentfield=%s
and name not in ({1})""".format(df.options, ','.join(['%s'] * len(rows))),
[self.name, self.doctype, fieldname] + rows)
if len(deleted_rows) > 0:
# delete rows that do not match the ones in the document
frappe.db.sql("""delete from `tab{0}` where name in ({1})""".format(df.options,
','.join(['%s'] * len(deleted_rows))), tuple(row[0] for row in deleted_rows))

else:
# no rows found, delete all rows
frappe.db.sql("""delete from `tab{0}` where parent=%s
and parenttype=%s and parentfield=%s""".format(df.options),
(self.name, self.doctype, fieldname))

+ 0
- 0
csf_tz/after_sales_services/doctype/requested_funds_accounts_table/__init__.py Näytä tiedosto


+ 1289
- 0
csf_tz/after_sales_services/doctype/requested_funds_accounts_table/requested_funds_accounts_table.json
File diff suppressed because it is too large
Näytä tiedosto


+ 10
- 0
csf_tz/after_sales_services/doctype/requested_funds_accounts_table/requested_funds_accounts_table.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.model.document import Document

class RequestedFundsAccountsTable(Document):
pass

+ 0
- 0
csf_tz/after_sales_services/doctype/requested_funds_details/__init__.py Näytä tiedosto


+ 1257
- 0
csf_tz/after_sales_services/doctype/requested_funds_details/requested_funds_details.json
File diff suppressed because it is too large
Näytä tiedosto


+ 10
- 0
csf_tz/after_sales_services/doctype/requested_funds_details/requested_funds_details.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.model.document import Document

class RequestedFundsDetails(Document):
pass

+ 0
- 0
csf_tz/after_sales_services/doctype/requested_payments/__init__.py Näytä tiedosto


+ 611
- 0
csf_tz/after_sales_services/doctype/requested_payments/requested_payments.js Näytä tiedosto

@@ -0,0 +1,611 @@
// Copyright (c) 2016, InfluxERP
// For license information, please see license.txt
//<button class="btn btn-default btn-xs" data-fieldtype="Button" data-fieldname="button_reject2" placeholder="" data-doctype="Requested Payments" value="">Reject-custom</button>
frappe.ui.form.on('Requested Payments', {
onload: function(frm){
//Load the approve and reject buttons
var html = '<button style="background-color: green; color: #FFF;" class="btn btn-default btn-xs" onclick="cur_frm.cscript.approve_request(\'' + frm + '\');">Approve</button> ';
html += '<button style="background-color: red; color: #FFF;" class="btn btn-default btn-xs" onclick="cur_frm.cscript.reject_request(\'' + frm + '\');">Reject</button>'
$(frm.fields_dict.html1.wrapper).html(html);
//Load the recommend and recommend against buttons
var html2 = '<button style="background-color: green; color: #FFF;" class="btn btn-default btn-xs" onclick="cur_frm.cscript.recommend_request(\'' + frm + '\');">Recommend</button> ';
html2 += '<button style="background-color: red; color: #FFF;" class="btn btn-default btn-xs" onclick="cur_frm.cscript.recommend_against_request(\'' + frm + '\');">Recommend Against</button>'
$(frm.fields_dict.html2.wrapper).html(html2);
//Load the accounts approval buttons
var html3 = '<button style="background-color: green; color: #FFF;" class="btn btn-default btn-xs" onclick="cur_frm.cscript.accounts_approval(\'' + frm + '\');">Approve</button> ';
html3 += '<button style="background-color: red; color: #FFF;" class="btn btn-default btn-xs" onclick="cur_frm.cscript.accounts_cancel(\'' + frm + '\');">Cancel</button>'
$(frm.fields_dict.account_approval_buttons.wrapper).html(html3);
//cur_frm.disable_save();
frappe.after_ajax(function(){
frm.events.show_hide_sections(frm);
});
},
refresh: function(frm){
console.log(frm);
//Beautify the previous approved table
$(frm.wrapper).on("grid-row-render", function(e, grid_row) {
if(grid_row.doc.request_status == "Approved")
{
$(grid_row.columns.request_status).css({"font-weight": "bold", "color": "green"});
}
else if(grid_row.doc.request_status == "Rejected")
{
$(grid_row.columns.request_status).css({"font-weight": "bold", "color": "red"});
}
});
frappe.after_ajax(function(){
frm.events.show_hide_sections(frm);
});
//For total requested
var total_request_tsh = 0;
var total_request_usd = 0;
var all_approved = true;
cur_frm.doc.requested_funds.forEach(function(row){
if(row.request_currency == 'TZS')
{
total_request_tsh += row.request_amount;
}
else if(row.request_currency == 'USD')
{
total_request_usd += row.request_amount;
}
});
//If all requests have been processed, change approval status
if(total_request_tsh == 0 && total_request_usd == 0 && frm.doc.approval_status != "Processed")
{
frm.set_value('approval_status', 'Processed');
frm.save_or_update();
}
cur_frm.get_field("request_total_amount").wrapper.innerHTML = '<p class="text-muted small">Total Amount Approved</p><b>USD ' + total_request_usd.toLocaleString() + ' <br> TZS ' + total_request_tsh.toLocaleString() + '</b>';
//For total approved
var total_approved_tsh = 0;
var total_approved_usd = 0;
/*cur_frm.doc.previous_requested_funds.forEach(function(row){
if(row.request_status == "Approved" && row.request_currency == 'TZS')
{
total_approved_tsh += row.request_amount;
}
else if(row.request_status == "Approved" && row.request_currency == 'USD')
{
total_approved_usd += row.request_amount;
}
});
cur_frm.get_field("total_approved_amount").wrapper.innerHTML = '<p class="text-muted small">Total Amount Approved</p><b>USD ' + total_approved_usd.toLocaleString() + ' <br> TZS ' + total_approved_tsh.toLocaleString() + '</b>'; */
//For total paid amount
var total_tsh = 0;
var total_usd = 0;
frm.doc.payments_reference.forEach(function(row){
if(row.currency == "TZS")
{
total_tsh += row.amount;
}
else if(row.currency == 'USD')
{
total_usd += row.amount;
}
});
//For payment status (If all payments have been paid, payment status == 'Paid')
if(total_usd > 0 && total_tsh > 0 && total_usd >= total_approved_usd && total_tsh >= total_approved_tsh && frm.doc.payment_status != "Paid")
{
frm.set_value('payment_status', "Paid");
frm.save_or_update();
}
else if((total_approved_tsh > total_tsh || total_approved_usd > total_usd) && frm.doc.payment_status != "Waiting Payment")
{
frm.set_value('payment_status', 'Waiting Payment');
frm.save_or_update();
}
cur_frm.get_field("total_paid_amount").wrapper.innerHTML = '<p class="text-muted small">Total Amount Paid</p><b>USD ' + total_usd.toLocaleString() + ' <br> TZS ' + total_tsh.toLocaleString() + '</b>';
//Make payment button
frm.add_custom_button(__('Make Payment'),
function() {
frm.events.make_payment();
}
);
frm.add_custom_button(__('Accounting Ledger'), function() {
frappe.route_options = {
voucher_no: frm.doc.name,
company: frm.doc.company,
group_by_voucher: false
};
frappe.set_route("query-report", "General Ledger");
}, __("View"));
},
make_payment: function() {
frappe.model.open_mapped_doc({
method: "csf_tz.after_sales_services.doctype.requested_payments.requested_payments.make_payment",
frm: cur_frm
})
},
validate_payment: function(frm){
var to_return = true;
frm.doc.payments_reference.forEach(function(row){
if(row.amount <= 0 || !row.date_of_payment || row.date_of_payment == "" || !row.reference_no || row.reference_no == "" || !row.paid_to || row.paid_to == "" || row.payment_method == "" || row.payment_account == "")
{
to_return = false;
}
});
return to_return;
},
show_hide_sections: function(frm){
frm.toggle_display(['request_total_amount', 'html1', 'html2'], (frm.doc.requested_funds.length > 0));
//frm.toggle_display('section_previous_requested_funds', (frm.doc.previous_requested_funds.length > 0));
//frm.toggle_display('section_payments_details', frm.doc.previous_requested_funds.length > 0);
//frm.toggle_display('total_paid_amount', (frm.doc.previous_requested_funds.length > 0));
//frm.toggle_display(['requested_funds', 'request_total_amount', 'section_previous_requested_funds', 'total_approved_amount', 'payments_reference', 'total_paid_amount'], true);
},
get_account_currency(frm, cdt, cdn, account){
if(account){
frappe.call({
'method': 'frappe.client.get_value',
'args': {
'doctype': 'Account',
'filters': {
'name': account
},
'fieldname':'account_currency'
},
'callback': function(res){
return res.message.account_currency;
}
});
}
}
});


frappe.ui.form.on('Requested Funds Accounts Table', {
form_render: function(frm, cdt, cdn){
frappe.call({
'method': 'frappe.client.get_value',
'args': {
'doctype': 'Company',
'filters': {
name: frm.doc.company
},
'fieldname':'cost_center'
},
'callback': function(r){
frappe.model.set_value(cdt, cdn, 'cost_center', r.message.cost_center);
}
});
if(!locals[cdt][cdn].posting_date){
frappe.model.set_value(cdt, cdn, 'posting_date', frappe.datetime.get_today());
}
if(locals[cdt][cdn].conversion_rate == 0){
frappe.model.set_value(cdt, cdn, 'conversion_rate', 1);
}
},
expense_type: function(frm, cdt, cdn){
frappe.call({
method: "erpnext.hr.doctype.expense_claim.expense_claim.get_expense_claim_account",
args: {
"expense_claim_type": locals[cdt][cdn].expense_type,
"company": frm.doc.company
},
callback: function(r) {
if (r.message) {
locals[cdt][cdn].expense_account = r.message.account;
if(r.message.account){
frappe.model.set_value(cdt, cdn, 'expense_account_currency', frm.events.get_account_currency(frm, cdt, cdn, r.message.account));
}
}
}
});
},
expense_account: function(frm, cdt, cdn){
if(locals[cdt][cdn].expense_account){
var expense_account_currency = frm.events.get_account_currency(frm, cdt, cdn, locals[cdt][cdn].expense_account);
if(expense_account_currency){
frappe.model.set_value(cdt, cdn, 'expense_account_currency', expense_account_currency);
}
}
},
payable_account: function(frm, cdt, cdn){
if(locals[cdt][cdn].payable_account){
var payable_account_currency = frm.events.get_account_currency(frm, cdt, cdn, locals[cdt][cdn].payable_account);
if(payable_account_currency){
frappe.model.set_value(cdt, cdn, 'payable_account_currency', payable_account_currency);
}
}
}
});


frappe.ui.form.on('Requested Payments', {
form_render: function(frm, cdt, cdn){
if(locals[cdt][cdn].status == ""){
}
}
});


//For recommend button
cur_frm.cscript.recommend_request = function(frm){
var selected = cur_frm.get_selected();
if(selected['requested_funds'])
{
frappe.confirm(
'Confirm: Recommend selected requests?',
function(){
$.each(selected['requested_funds'], function(index, value){
frappe.call({
method: "csf_tz.after_sales_services.doctype.requested_payments.requested_payments.recommend_request",
freeze: true,
args: {
request_doctype: "Requested Funds Details",
request_docname: value,
user: frappe.user.full_name()
},
callback: function(data){
//alert(JSON.stringify(data));
}
});
});
location.reload();
},
function(){
//Do nothing
}
);
}
else
{
show_alert("Error: Please select requests to process.");
}
}


//For recommend against button
cur_frm.cscript.recommend_against_request = function(frm){
var selected = cur_frm.get_selected();
if(selected['requested_funds'])
{
frappe.confirm(
'Confirm: Recommend against the selected requests?',
function(){
$.each(selected['requested_funds'], function(index, value){
frappe.call({
method: "erpnext.accounts.doctype.requested_payments.requested_payments.recommend_against_request",
freeze: true,
args: {
request_doctype: "Requested Funds Details",
request_docname: value,
user: frappe.user.full_name()
},
callback: function(data){
//alert(JSON.stringify(data));
}
});
});
location.reload();
},
function(){
//Do nothing
}
);
}
else
{
show_alert("Error: Please select requests to process.");
}
}


//For approve button
cur_frm.cscript.approve_request = function(frm){
var selected = cur_frm.get_selected();
if(selected['requested_funds'])
{
frappe.confirm(
'Confirm: Approve selected requests?',
function(){
$.each(selected['requested_funds'], function(index, value){
frappe.call({
method: "csf_tz.after_sales_services.doctype.requested_payments.requested_payments.approve_request",
freeze: true,
args: {
request_doctype: "Requested Funds Details",
request_docname: value,
user: frappe.user.full_name()
},
callback: function(data){
//alert(JSON.stringify(data));
}
});
});
location.reload();
},
function(){
//Do nothing
}
);
}
else
{
show_alert("Error: Please select requests to process.");
}
}

//For reject button
cur_frm.cscript.reject_request = function(frm){
//cur_frm.cscript.populate_child(cur_frm.doc.reference_doctype, cur_frm.doc.reference_docname);
var selected = cur_frm.get_selected();
if(selected['requested_funds'])
{
frappe.confirm(
'Confirm: Reject selected requests?',
function(){
$.each(selected['requested_funds'], function(index, value){
frappe.call({
method: "csf_tz.after_sales_services.doctype.requested_payments.requested_payments.reject_request",
freeze: true,
args: {
request_doctype: "Requested Funds Details",
request_docname: value,
user: frappe.user.full_name()
},
callback: function(data){
//alert(JSON.stringify(data));
}
});
});
location.reload();
},
function(){
//Do nothing
}
);
}
else
{
show_alert("Error: Please select requests to process.");
}
}


//For accounts approval
cur_frm.cscript.accounts_approval = function(frm){
var selected = cur_frm.get_selected();
if(selected['accounts_approval'])
{
frappe.confirm(
'Confirm: Approve selected requests?',
function(){
$.each(selected['accounts_approval'], function(index, value){
frappe.call({
method: "csf_tz.after_sales_services.doctype.requested_payments.requested_payments.accounts_approval",
freeze: true,
args: {
request_doctype: "Requested Funds Accounts Table",
request_docname: value,
parent_doctype: cur_frm.doctype,
parent_docname: cur_frm.docname,
local: locals['Requested Funds Accounts Table'][value],
reference: locals['Requested Funds Accounts Table'][value].reference,
user: frappe.user.full_name()
},
callback: function(data){
console.log(JSON.stringify(data));
}
});
});
frappe.after_ajax(function(){
cur_frm.reload_doc();
})
},
function(){
//Do nothing
}
);
}
else
{
show_alert("Error: Please select requests to process.");
}
}


//For accounts cancel
cur_frm.cscript.accounts_cancel = function(frm){
var selected = cur_frm.get_selected();
var reload = false;
if(selected['accounts_approval'])
{
frappe.confirm(
'Confirm: Cancel selected requests?',
function(){
$.each(selected['accounts_approval'], function(index, value){
reload = false;
frappe.call({
method: "csf_tz.after_sales_services.doctype.requested_payments.requested_payments.accounts_cancel",
freeze: true,
args: {
request_doctype: "Requested Funds Accounts Table",
request_docname: value,
parent_doctype: cur_frm.doctype,
parent_docname: cur_frm.docname,
local: locals['Requested Funds Accounts Table'][value],
reference: locals['Requested Funds Accounts Table'][value].reference,
user: frappe.user.full_name()
},
callback: function(data){
console.log(data.message);
}
});
});
location.reload();
},
function(){
//Do nothing
}
);
}
else
{
show_alert("Error: Please select requests to process.");
}
}


cur_frm.cscript.populate_child = function(reference_doctype, reference_docname){
frappe.model.with_doc(reference_doctype, reference_docname, function(){
var request_total_amount_tsh = 0;
var request_total_amount_usd = 0;
var reference_doc = frappe.get_doc(reference_doctype, reference_docname);
//If its requested from vehicle trip, there is main and return requested funds
if('Vehicle Trip' == reference_doctype)
{
//For main trip
reference_doc.main_requested_funds.forEach(function(row){
//if(row.request_hidden_status == "0")
if(row.request_status != "Approved" && row.request_status != "Rejected")
{
var new_row = cur_frm.add_child("requested_funds");
new_row.name = row.name;
new_row.request_date = row.request_date;
new_row.request_amount = row.request_amount;
new_row.request_currency = row.request_currency;
new_row.request_description = row.request_description;
new_row.request_comment = row.request_comment;
new_row.request_status = row.request_status;
if(row.request_currency == 'TZS')
{
request_total_amount_tsh += row.request_amount;
}
else if(row.request_currency == 'USD')
{
request_total_amount_usd += row.request_amount;
}
cur_frm.refresh_field("requested_funds");
}
else{
console.log("Executing");
var new_row = cur_frm.add_child("previous_requested_funds");
new_row.name = row.name;
new_row.request_date = row.request_date;
new_row.request_amount = row.request_amount;
new_row.request_currency = row.request_currency;
new_row.request_description = row.request_description;
new_row.request_comment = row.request_comment;
new_row.request_status = row.request_status;
cur_frm.refresh_field("previous_requested_funds");
}
});
//For return trip
reference_doc.return_requested_funds.forEach(function(row){
//if(row.request_hidden_status == "0")
if(row.request_status != "Approved" && row.request_status != "Rejected")
{
var new_row = cur_frm.add_child("requested_funds");
new_row.name = row.name;
new_row.request_date = row.request_date;
new_row.request_amount = row.request_amount;
new_row.request_currency = row.request_currency;
new_row.request_description = row.request_description;
new_row.request_comment = row.request_comment;
new_row.request_status = row.request_status;
if(row.request_currency == 'TZS')
{
request_total_amount_tsh += row.request_amount;
}
else if(row.request_currency == 'USD')
{
request_total_amount_usd += row.request_amount;
}
cur_frm.refresh_field("requested_funds");
}
else{
var new_row = cur_frm.add_child("previous_requested_funds");
new_row.name = row.name;
new_row.request_date = row.request_date;
new_row.request_amount = row.request_amount;
new_row.request_currency = row.request_currency;
new_row.request_description = row.request_description;
new_row.request_comment = row.request_comment;
new_row.request_status = row.request_status;
cur_frm.refresh_field("previous_requested_funds");
}
});
}
else
{
reference_doc.requested_funds.forEach(function(row){
//if(row.request_hidden_status == "0")
if(row.request_status != "Approved" && row.request_status != "Rejected")
{
var new_row = cur_frm.add_child("requested_funds");
new_row.name = row.name;
new_row.request_date = row.request_date;
new_row.request_amount = row.request_amount;
new_row.request_currency = row.request_currency;
new_row.request_description = row.request_description;
new_row.request_comment = row.request_comment;
new_row.request_status = row.request_status;
if(row.request_currency == 'TZS')
{
request_total_amount_tsh += row.request_amount;
}
else if(row.request_currency == 'USD')
{
request_total_amount_usd += row.request_amount;
}
cur_frm.refresh_field("requested_funds");
}
else{
var new_row = cur_frm.add_child("previous_requested_funds");
new_row.name = row.name;
new_row.request_date = row.request_date;
new_row.request_amount = row.request_amount;
new_row.request_currency = row.request_currency;
new_row.request_description = row.request_description;
new_row.request_comment = row.request_comment;
new_row.request_status = row.request_status;
cur_frm.refresh_field("previous_requested_funds");
}
});
}
if(request_total_amount_tsh != 0 || request_total_amount_usd != 0)
{
cur_frm.set_df_property("html1", "hidden", 0);
cur_frm.set_df_property("html2", "hidden", 0);
console.log(cur_frm.get_field('request_total_amount'));
cur_frm.get_field("request_total_amount").$wrapper[0].innerHTML = '<p class="text-muted small">Total Requested Amount</p><b>USD ' + request_total_amount_usd + ' <br> TZS ' + request_total_amount_tsh.toLocaleString() + '</b>';
//cur_frm.refresh_field("request_total_amount");
}
else
{
cur_frm.set_df_property("request_total_amount", "hidden", 1);
cur_frm.set_df_property("html1", "hidden", 1);
cur_frm.set_df_property("html2", "hidden", 1);
}
});
};

+ 755
- 0
csf_tz/after_sales_services/doctype/requested_payments/requested_payments.json Näytä tiedosto

@@ -0,0 +1,755 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "REQ.###",
"beta": 0,
"creation": "2017-01-25 20:04:28.414635",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "Document",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "request_date",
"fieldtype": "Date",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"description": "Requested Funds",
"fieldname": "requested_funds",
"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": "Requested Funds",
"length": 0,
"no_copy": 0,
"options": "Requested Funds Details",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "html2",
"fieldtype": "HTML",
"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": "Recommendation Buttons",
"length": 0,
"no_copy": 0,
"permlevel": 1,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "html1",
"fieldtype": "HTML",
"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": "Approval Buttons",
"length": 0,
"no_copy": 0,
"permlevel": 2,
"precision": "",
"print_hide": 1,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "request_total_amount",
"fieldtype": "HTML",
"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": "Total Requested Amount",
"length": 0,
"no_copy": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_previous_requested_funds",
"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,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "total_approved_amount",
"fieldtype": "HTML",
"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": "Total Approved Amount",
"length": 0,
"no_copy": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_payments_details",
"fieldtype": "Section Break",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Payments Details",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"description": "",
"fieldname": "payments_reference",
"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": "Payments Reference",
"length": 0,
"no_copy": 0,
"options": "Reference Payment Table",
"permlevel": 3,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "total_paid_amount",
"fieldtype": "HTML",
"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": "Total Paid Amount",
"length": 0,
"no_copy": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_accounts_approval",
"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": "Accounts Approval",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "accounts_approval",
"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,
"length": 0,
"no_copy": 0,
"options": "Requested Funds Accounts Table",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "account_approval_buttons",
"fieldtype": "HTML",
"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": 4,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "reference_section",
"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": "References",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "reference_doctype",
"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": 1,
"label": "Requested From Module",
"length": 0,
"no_copy": 0,
"options": "DocType",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "reference_docname",
"fieldtype": "Dynamic 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": 1,
"label": "Requested From",
"length": 0,
"no_copy": 0,
"options": "reference_doctype",
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"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": 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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_10",
"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_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "amended_from",
"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": "Amended From",
"length": 0,
"no_copy": 1,
"options": "Requested Payments",
"permlevel": 0,
"print_hide": 1,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "approval_status",
"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": 1,
"label": "Approval Status",
"length": 0,
"no_copy": 0,
"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": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "payment_status",
"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": 1,
"label": "Payment Status",
"length": 0,
"no_copy": 0,
"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
}
],
"has_web_view": 0,
"hide_heading": 1,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 1,
"is_submittable": 0,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-12-12 21:47:02.706062",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Requested Payments",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 0,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Expense Approver",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 0,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Expense Recommender",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
{
"amend": 0,
"cancel": 0,
"create": 0,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Expense Recommender",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
}
],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

+ 516
- 0
csf_tz/after_sales_services/doctype/requested_payments/requested_payments.py Näytä tiedosto

@@ -0,0 +1,516 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2015, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
import time
import datetime
import json
from frappe.model.document import Document
from frappe.utils import flt, comma_or, nowdate
from frappe import msgprint, _
from erpnext.accounts.general_ledger import process_gl_map, save_entries
from erpnext.accounts.utils import get_fiscal_years, validate_fiscal_year, get_account_currency
from erpnext.controllers.accounts_controller import set_balance_in_account_currency
from erpnext.accounts.doctype.budget.budget import validate_expense_against_budget

class RequestedPayments(Document):
def onload(self):
pass
def get_all_children(self, parenttype=None):
#For getting children
return self.get('payments_reference')
def update_children(self):
'''update child tables'''
self.update_child_table('payments_reference')
def load_from_db(self):
"""Load document and children from database and create properties
from fields"""
if not getattr(self, "_metaclass", False) and self.meta.issingle:
single_doc = frappe.db.get_singles_dict(self.doctype)
if not single_doc:
single_doc = frappe.new_doc(self.doctype).as_dict()
single_doc["name"] = self.doctype
del single_doc["__islocal"]

super(Document, self).__init__(single_doc)
self.init_valid_columns()
self._fix_numeric_types()

else:
d = frappe.db.get_value(self.doctype, self.name, "*", as_dict=1)
if not d:
frappe.throw(_("{0} {1} not found").format(_(self.doctype), self.name), frappe.DoesNotExistError)

super(Document, self).__init__(d)

if self.name=="DocType" and self.doctype=="DocType":
from frappe.model.meta import doctype_table_fields
table_fields = doctype_table_fields
else:
table_fields = self.meta.get_table_fields()

for df in table_fields:
#Load details for payments already paid
if df.fieldname == "payments_reference":
children = frappe.db.get_values(df.options,
{"parent": self.name, "parenttype": self.doctype, "parentfield": df.fieldname},
"*", as_dict=True, order_by="idx asc")
if children:
self.set(df.fieldname, children)
else:
self.set(df.fieldname, [])
elif df.fieldname == "requested_funds": #Load requests which are not approved nor rejected
children = frappe.db.get_values(df.options,
{"parent": ["=", self.get('reference_docname')], "parenttype": ["=", self.get('reference_doctype')], "parentfield": ["in", ("requested_funds", "main_requested_funds", "return_requested_funds")], "request_status": ["in", ("open", "Requested", "Recommended")]},
"*", as_dict=True, order_by="idx asc")
if children:
self.set(df.fieldname, children)
else:
self.set(df.fieldname, [])
elif df.fieldname == "accounts_approval":
children = frappe.db.get_values("Requested Funds Details",
{"parent": ["=", self.get('reference_docname')], "parenttype": ["=", self.get('reference_doctype')], "parentfield": ["in", ("requested_funds", "main_requested_funds", "return_requested_funds")], "request_status": ["in", ("Approved", "Rejected", "Accounts Approved", "Accounts Rejected", "Accounts Cancelled")]},
"*", as_dict=True, order_by="idx asc")
if children:
for child in children:
child.reference = child.name
self.set(df.fieldname, children)
else:
self.set(df.fieldname, [])

# sometimes __setup__ can depend on child values, hence calling again at the end
if hasattr(self, "__setup__"):
self.__setup__()
def get_outstanding_payments(self, account_currency):
#Timestamp
ts = time.time()
#Initialize values
total_amount = outstanding_amount = 0
due_date = datetime.datetime.now().date()
requested_from = frappe.get_doc(self.reference_doctype, self.reference_docname)
if self.reference_doctype == 'Vehicle Trip':
for request in requested_from.main_requested_funds:
if request.request_status == "Approved" and request.request_currency == account_currency:
total_amount = total_amount + request.request_amount
#request_date = datetime.datetime.strptime(request.request_date, '%Y-%m-%d')
if request.request_date < due_date:
due_date = request.request_date
for request in requested_from.return_requested_funds:
if request.request_status == "Approved" and request.request_currency == account_currency:
total_amount = total_amount + request.request_amount
if request.request_date < due_date:
due_date = request.request_date
else:
for request in requested_from.requested_funds:
if request.request_status == "Approved" and request.request_currency == account_currency:
total_amount = total_amount + request.request_amount
if request.request_date < due_date:
due_date = request.request_date
paid_amount = frappe.db.sql("""SELECT (CASE WHEN SUM(debit_in_account_currency) > 0 THEN SUM(debit_in_account_currency) ELSE 0 END) AS paid_amount
FROM `tabGL Entry` WHERE debit_in_account_currency > 0 AND account_currency = %s
AND voucher_type = 'Requested Payments' AND voucher = %s""", (account_currency, self.name), as_dict=True)
#frappe.msgprint(paid_amount[0].paid_amount)
outstanding_amount = total_amount - float(paid_amount[0].paid_amount)
return frappe._dict({
"due_date": due_date,
"total_amount": total_amount,
"outstanding_amount": outstanding_amount,
"exchange_rate": 1
})
def validate_requested_funds(doc):
make_request = False
open_requests = []
for requested_fund in doc.requested_funds:
if requested_fund.request_status == "open":
make_request = True
open_requests.append(requested_fund)
if make_request:
args = {"reference_doctype": doc.doctype, "reference_docname": doc.name, "company": doc.company}
request_status = request_funds(reference_doctype = doc.doctype, reference_docname = doc.name, company = doc.company)
if request_status == "Request Inserted" or request_status == "Request Updated":
for open_request in open_requests:
open_request.set("request_status", "Requested")
@frappe.whitelist(allow_guest=True)
def request_funds(**args):
args = frappe._dict(args)
existing_payment_request = frappe.db.get_value("Requested Payments",
{"reference_doctype": args.reference_doctype, "reference_docname": args.reference_docname})
#Timestamp
ts = time.time()
timestamp = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
if existing_payment_request:
#Mark the request as open
doc = frappe.get_doc("Requested Payments", existing_payment_request)
doc.db_set("approval_status", "Waiting Approval")
doc.db_set("modified", timestamp)
doc.db_set("company", args.company)
return "Request Updated"
else:
request = frappe.new_doc("Requested Payments")
request.update({
"reference_doctype":args.reference_doctype,
"reference_docname": args.reference_docname,
"company": args.company,
"approval_status": "Waiting Approval",
"payment_status": "Waiting Approval"
})
request.insert(ignore_permissions=True)
return "Request Inserted"

@frappe.whitelist(allow_guest=True)
def recommend_request(**args):
args = frappe._dict(args)
#frappe.db.sql("UPDATE `tabRequested Funds Details` SET request_status = 'Recommended', request_hidden_status = 0 WHERE name = %s", args.request_docname)
#return args.request_docname
#Mark the request as open
doc = frappe.get_doc("Requested Funds Details", args.request_docname)
doc.db_set("request_status", "Recommended")
doc.db_set("request_hidden_status", "0")
doc.db_set("recommended_by", args.user)
return "Request Updated"

@frappe.whitelist(allow_guest=True)
def recommend_against_request(**args):
args = frappe._dict(args)
#frappe.db.sql("UPDATE `tabRequested Funds Details` SET request_status = 'Recommended', request_hidden_status = 0 WHERE name = %s", args.request_docname)
#return args.request_docname
#Mark the request as open
doc = frappe.get_doc("Requested Funds Details", args.request_docname)
doc.db_set("request_status", "Recommended Against")
doc.db_set("request_hidden_status", "0")
doc.db_set("recommended_by", args.user)
return "Request Updated"


@frappe.whitelist(allow_guest=True)
def approve_request(**args):
args = frappe._dict(args)
#frappe.db.sql("UPDATE `tabRequested Funds Details` SET request_status = 'Approved', request_hidden_status = 0 WHERE name = %s", args.request_docname)
#return args.request_docname
#Mark the request as open
doc = frappe.get_doc("Requested Funds Details", args.request_docname)
doc.db_set("request_status", "Approved")
doc.db_set("request_hidden_status", "1")
doc.db_set("approved_by", args.user)
return "Request Updated"
@frappe.whitelist(allow_guest=True)
def reject_request(**args):
args = frappe._dict(args)
#frappe.db.sql("UPDATE `tabRequested Funds Details` SET request_status = 'Rejected', request_hidden_status = 0 WHERE name = %s", args.request_docname)
#return "OK"
#Mark the request as open
doc = frappe.get_doc("Requested Funds Details", args.request_docname)
doc.db_set("request_status", "Rejected")
doc.db_set("request_hidden_status", "2")
doc.db_set("approved_by", args.user)
return "Request Updated"
@frappe.whitelist(allow_guest=True)
def accounts_approval(**args):
args = frappe._dict(args)
local = json.loads(args.local)
if args.reference:
reference = frappe.get_doc("Requested Funds Details", args.reference)
if reference.request_status in ['Approved', 'Accounts Cancelled']:
to_validate = [
{"fieldname": "posting_date", "label": "Posting Date"},
{"fieldname": "cost_center", "label": "Cost Center"},
{"fieldname": "expense_account", "label": "Expense Account"},
{"fieldname": "payable_account", "label": "Payable Account"},
{"fieldname": "party_type", "label": "Party Type"},
{"fieldname": "party", "label": "Party"},
]
for field in to_validate:
if not local.get(field["fieldname"]):
frappe.throw('Error: Please enter ' + field["label"] + ' for all rows')
#Save changes made to accounts info
to_save = ['expense_account', 'payable_account', 'party_type', 'expense_type', 'party', 'invoice_number', 'expense_account_currency',
'conversion_rate', 'payable_account_currency', 'cost_center', 'posting_date', 'accounts_approved_by', 'accounts_approved_on', 'accounts_approver_comment']
for field in to_save:
reference.db_set(field, local.get(field))
#Make GL Entries
gl_entries = get_gl_entries(reference, args.parent_doctype, args.parent_docname)
make_gl_entries(gl_entries)
reference.db_set("request_status", "Accounts Approved")
reference.db_set("request_hidden_status", "1")
reference.db_set("accounts_approved_by", args.user)
parent = frappe.get_doc("Requested Payments", args.parent_docname)
update_payment_status(parent)
return "Request Updated"
@frappe.whitelist(allow_guest=True)
def accounts_cancel(**args):
args = frappe._dict(args)
local = json.loads(args.local)
if args.reference:
reference = frappe.get_doc("Requested Funds Details", args.reference)
if reference.request_status == 'Accounts Approved':
paid_amount = get_paid_amount(args.parent_doctype, args.parent_docname, reference.party_type, reference.party, reference.payable_account)
total_approved = get_total_approved(args.parent_doctype, args.parent_docname, reference.party_type, reference.party, reference.payable_account)
in_account_currency = reference.request_amount * reference.conversion_rate
if (total_approved - (paid_amount + in_account_currency)) < 0:
frappe.throw('Unable to cancel. Payment has already been made against the account. Please cancel the payment entry first.' + 'Paid: ' + str(paid_amount) + ' Total Approved: ' + str(total_approved) + ' Account Currency: ' + str(in_account_currency))
else:
#Make GL Entries
gl_entries = get_gl_entries(reference, args.parent_doctype, args.parent_docname)
make_gl_entries(gl_entries, True)
reference.db_set("request_status", "Accounts Cancelled")
reference.db_set("request_hidden_status", "1")
reference.db_set("accounts_approved_by", args.user)
parent = frappe.get_doc("Requested Payments", args.parent_docname)
update_payment_status(parent)
return "Request Updated"

def get_paid_amount(dt, dn, party_type, party, account):
if party_type=="Customer":
dr_or_cr = "credit_in_account_currency - debit_in_account_currency"
else:
dr_or_cr = "debit_in_account_currency - credit_in_account_currency"

paid_amount = frappe.db.sql("""
select ifnull(sum({dr_or_cr}), 0) as paid_amount
from `tabGL Entry`
where against_voucher_type = %s
and against_voucher = %s
and party_type = %s
and party = %s
and account = %s
and {dr_or_cr} > 0
""".format(dr_or_cr=dr_or_cr), (dt, dn, party_type, party, account))

return paid_amount[0][0] if paid_amount else 0
def get_total_approved(dt, dn, party_type, party, account):
total_approved = frappe.db.sql("""
select ifnull(sum(credit_in_account_currency), 0) as total_approved
from `tabGL Entry`
where against_voucher_type = %s
and against_voucher = %s
and party_type = %s
and party = %s
and account = %s
""", (dt, dn, party_type, party, account))

return total_approved[0][0] if total_approved else 0

def get_gl_entries(data, reference_doctype, reference_docname):
gl_entry = []
doc = frappe.get_doc(reference_doctype, reference_docname)
company_currency = frappe.db.get_value('Company', doc.company, "default_currency")
# payable entry
payable_account_currency = get_account_currency(data.payable_account)
gl_entry.append(
get_gl_dict(doc, data,
{
"account": data.payable_account,
"credit": data.request_amount,
"credit_in_account_currency": data.request_amount \
if payable_account_currency==company_currency else data.request_amount/data.conversion_rate,
"against": data.name,
"party_type": data.party_type,
"party": data.party,
"against_voucher_type": doc.doctype,
"against_voucher": doc.name
}
)
)

# expense entries
expense_account_currency = get_account_currency(data.expense_account)
gl_entry.append(
get_gl_dict(doc, data,
{
"account": data.expense_account,
"debit": data.request_amount,
"debit_in_account_currency": data.request_amount \
if expense_account_currency==company_currency else data.request_amount/data.conversion_rate,
"against": data.name,
"cost_center": data.cost_center,
'against_voucher_type': doc.doctype,
'against_voucher': doc.name
}
)
)

return gl_entry
def get_gl_dict(doc, data, args, account_currency=None):
"""this method populates the common properties of a gl entry record"""

fiscal_years = get_fiscal_years(data.request_date, company=doc.company)
if len(fiscal_years) > 1:
frappe.throw(_("Multiple fiscal years exist for the date {0}. Please set company in Fiscal Year").format(formatdate(self.posting_date)))
else:
fiscal_year = fiscal_years[0][0]

gl_dict = frappe._dict({
'company': doc.company,
'posting_date': data.posting_date,
'fiscal_year': fiscal_year,
'voucher_type': doc.doctype,
'voucher_no': doc.name,
'remarks': data.get("remarks"),
'debit': 0,
'credit': 0,
'debit_in_account_currency': 0,
'credit_in_account_currency': 0,
'is_opening': "No",
'party_type': None,
'party': None,
'project': data.get("project")
})
gl_dict.update(args)
company_currency = frappe.db.get_value('Company', doc.company, "default_currency")

if not account_currency:
account_currency = get_account_currency(gl_dict.account)

if gl_dict.account and doc.doctype not in ["Journal Entry",
"Period Closing Voucher", "Payment Entry"]:

#self.validate_account_currency(gl_dict.account, account_currency)
set_balance_in_account_currency(gl_dict, account_currency, data.get("conversion_rate"), company_currency)

return gl_dict
def make_gl_entries(gl_map, cancel=False, adv_adj=False, merge_entries=True, update_outstanding='Yes', from_repost=False):
if gl_map:
if not cancel:
gl_map = process_gl_map(gl_map, merge_entries)
if gl_map and len(gl_map) > 1:
save_entries(gl_map, adv_adj, update_outstanding, from_repost)
else:
frappe.throw(_("Incorrect number of General Ledger Entries found. You might have selected a wrong Account in the transaction."))
else:
delete_gl_entries(gl_map, adv_adj=adv_adj, update_outstanding=update_outstanding)
def delete_gl_entries(gl_entries=None, voucher_type=None, voucher_no=None,
adv_adj=False, update_outstanding="Yes"):

from erpnext.accounts.doctype.gl_entry.gl_entry import validate_balance_type, \
check_freezing_date, update_outstanding_amt, validate_frozen_account

if not gl_entries:
gl_entries = frappe.db.sql("""
select account, posting_date, party_type, party, cost_center, fiscal_year,voucher_type,
voucher_no, against_voucher_type, against_voucher, cost_center, company
from `tabGL Entry`
where voucher_type=%s and voucher_no=%s""", (voucher_type, voucher_no), as_dict=True)

if gl_entries:
check_freezing_date(gl_entries[0]["posting_date"], adv_adj)

for entry in gl_entries:
frappe.db.sql("""delete from `tabGL Entry` where voucher_type=%s and voucher_no=%s AND against=%s""",
(entry.voucher_type, entry.voucher_no, entry.against))
validate_frozen_account(entry["account"], adv_adj)
validate_balance_type(entry["account"], adv_adj)
if not adv_adj:
validate_expense_against_budget(entry)
if entry.get("against_voucher") and update_outstanding == 'Yes' and not adv_adj:
update_outstanding_amt(entry["account"], entry.get("party_type"), entry.get("party"), entry.get("against_voucher_type"),
entry.get("against_voucher"), on_cancel=True)
def update_payment_status(doc):
paid_amount = frappe.db.sql("""select ifnull(sum(debit_in_account_currency), 0) as amt
from `tabGL Entry` where against_voucher_type = 'Requested Payments' and against_voucher = %s AND voucher_type <> 'Requested Payments'""",
(doc.name) ,as_dict=1)[0].amt
total_approved = frappe.db.sql("""
select ifnull(sum(credit_in_account_currency), 0) as total_approved
from `tabGL Entry`
where against_voucher_type = 'Requested Payments'
and against_voucher = %s
""", (doc.name), as_dict=1)[0].total_approved
if paid_amount >= total_approved:
frappe.db.set_value("Requested Payments", doc.name, "payment_status", "Paid")
else:
frappe.db.set_value("Requested Payments", doc.name, "payment_status", "Waiting Payment")

@frappe.whitelist(allow_guest=True)
def reference_payment(**args):
args = frappe._dict(args)
request = frappe.new_doc("Reference Payment Table")
request.update({
"parent":args.parent,
"parentfield": args.parentfield,
"parenttype": args.parenttype,
"date_of_payment": args.date_of_payment,
"accounting_system": args.accounting_system,
"amount": args.amount,
"currency": args.currency,
"reference_no": args.reference_no,
"status": "paid"
})
request.insert(ignore_permissions=True)
parent = frappe.get_doc('Requested Payments', args.parent)
parent.db_set("payment_status", args.payment_status)
return "inserted"
@frappe.whitelist(allow_guest=True)
def make_payment(source_name, target_doc=None, ignore_permissions=False):
pe = frappe.new_doc("Payment Entry")
pe.payment_type = "Pay"
pe.posting_date = nowdate()
pe.mode_of_payment = "Cash"
pe.party_type = "Employee"
pe.allocate_payment_amount = 1

return pe



+ 18
- 0
csf_tz/after_sales_services/doctype/requested_payments/requested_payments_dashboard.py Näytä tiedosto

@@ -0,0 +1,18 @@
from frappe import _

def get_data():
return {
'fieldname': 're',
'non_standard_fieldnames': {
'Payment Entry': 'reference_name'
},
'internal_links': {
'Sales Order': ['references', 'reference_name']
},
'transactions': [
{
'label': _('Payments'),
'items': ['Payment Entry']
}
]
}

+ 3
- 0
csf_tz/after_sales_services/doctype/requested_payments/requested_payments_list.js Näytä tiedosto

@@ -0,0 +1,3 @@
frappe.listview_settings['Requested Payments'] = {
add_fields: ['reference_docname', "approval_status", "payment_status"]
};

+ 23
- 0
csf_tz/after_sales_services/doctype/requested_payments/test_requested_payments.js Näytä tiedosto

@@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line

QUnit.test("test: Requested Payments", function (assert) {
let done = assert.async();

// number of asserts
assert.expect(1);

frappe.run_serially([
// insert a new Requested Payments
() => frappe.tests.make('Requested Payments', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);

});

+ 12
- 0
csf_tz/after_sales_services/doctype/requested_payments/test_requested_payments.py Näytä tiedosto

@@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2015, InfluxERP
# See license.txt
from __future__ import unicode_literals

import frappe
import unittest

# test_records = frappe.get_test_records('Requested Payments')

class TestRequestedPayments(unittest.TestCase):
pass

+ 0
- 0
csf_tz/after_sales_services/doctype/sales_test/__init__.py Näytä tiedosto


+ 8
- 0
csf_tz/after_sales_services/doctype/sales_test/sales_test.js Näytä tiedosto

@@ -0,0 +1,8 @@
// Copyright (c) 2018, InfluxERP
// For license information, please see license.txt

frappe.ui.form.on('Sales Test', {
refresh: function(frm) {

}
});

+ 92
- 0
csf_tz/after_sales_services/doctype/sales_test/sales_test.json Näytä tiedosto

@@ -0,0 +1,92 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"creation": "2018-06-27 11:46:19.260681",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "test",
"fieldtype": "Data",
"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": "test",
"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
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-06-27 13:59:51.973937",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Sales Test",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
}
],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

+ 10
- 0
csf_tz/after_sales_services/doctype/sales_test/sales_test.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.model.document import Document

class SalesTest(Document):
pass

+ 23
- 0
csf_tz/after_sales_services/doctype/sales_test/test_sales_test.js Näytä tiedosto

@@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line

QUnit.test("test: Sales Test", function (assert) {
let done = assert.async();

// number of asserts
assert.expect(1);

frappe.run_serially([
// insert a new Sales Test
() => frappe.tests.make('Sales Test', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);

});

+ 10
- 0
csf_tz/after_sales_services/doctype/sales_test/test_sales_test.py Näytä tiedosto

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, InfluxERP
# See license.txt
from __future__ import unicode_literals

import frappe
import unittest

class TestSalesTest(unittest.TestCase):
pass

+ 0
- 0
csf_tz/after_sales_services/report/__init__.py Näytä tiedosto


+ 0
- 0
csf_tz/after_sales_services/report/delivery_note_report/__init__.py Näytä tiedosto


+ 30
- 0
csf_tz/after_sales_services/report/delivery_note_report/delivery_note_report.js Näytä tiedosto

@@ -0,0 +1,30 @@
// Copyright (c) 2016, InfluxERP
// For license information, please see license.txt
/* eslint-disable */
var aday = new Date();
var from_date = aday.toISOString().split('T')[0];
aday.setDate(aday.getDate() + 30);
var to_date = aday.toISOString().split('T')[0];

frappe.query_reports["Delivery Note Report"] = {
"filters": [
{
"fieldname":"from_date",
"label": __("From Date"),
"fieldtype": "Date",
"default": from_date
},
{
"fieldname":"to_date",
"label": __("To Date"),
"fieldtype": "Date",
"default": to_date
},
{
"fieldname":"warehouse",
"label": __("Warehouse"),
"fieldtype": "Link",
"options": "Warehouse"
},
]
}

+ 40
- 0
csf_tz/after_sales_services/report/delivery_note_report/delivery_note_report.json Näytä tiedosto

@@ -0,0 +1,40 @@
{
"add_total_row": 0,
"creation": "2019-05-22 15:35:36.348245",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"idx": 0,
"is_standard": "Yes",
"modified": "2019-05-22 15:35:36.348245",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Delivery Note Report",
"owner": "Administrator",
"ref_doctype": "Delivery Note",
"report_name": "Delivery Note Report",
"report_type": "Script Report",
"roles": [
{
"role": "Stock User"
},
{
"role": "Accounts User"
},
{
"role": "Stock Manager"
},
{
"role": "Sales User"
},
{
"role": "Sales Executive"
},
{
"role": "Branch In Charge"
},
{
"role": "Stock Supervisor"
}
]
}

+ 144
- 0
csf_tz/after_sales_services/report/delivery_note_report/delivery_note_report.py Näytä tiedosto

@@ -0,0 +1,144 @@
# Copyright (c) 2013, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe import _


def execute(filters=None):
columns, data = [], []
columns = [
{
"fieldname": "delivery_note",
"label": _("Delivery Note"),
"fieldtype": "Link",
"options": "Delivery Note",
"width": 150
},
{
"fieldname": "customer_name",
"label": _("Customer"),
"fieldtype": "Data",
"width": 150
},
{
"fieldname": "customer_address",
"label": _("Customer Address"),
"fieldtype": "Small Text",
"width": 200
},
{
"fieldname": "phone_number",
"label": _("Phone Number"),
"fieldtype": "Data",
"width": 150
},
# {
# "fieldname": "item_name",
# "label": _("Item"),
# "fieldtype": "Data",
# "width": 150
# },
{
"fieldname": "item_code",
"label": _("Item Code"),
"fieldtype": "Data",
"width": 150
},
{
"fieldname": "quantity",
"label": _("Quantity"),
"fieldtype": "Float",
"width": 150
},
# {
# "fieldname": "uom",
# "label": _("UOM"),
# "fieldtype": "Data",
# "width": 150
# },
{
"fieldname": "serial_no",
"label": _("Serial Numbers"),
"fieldtype": "Data",
"width": 150
},
{
"fieldname": "actual_quantity",
"label": _("Actual Quantity"),
"fieldtype": "Float",
"width": 100
},
# {
# "fieldname": "projected_quantity",
# "label": _("Projected Quantity"),
# "fieldtype": "Float",
# "width": 100
# },
{
"fieldname": "warehouse",
"label": _("Warehouse"),
"fieldtype": "Data",
"width": 150
},
{
"fieldname": "sales_invoice",
"label": _("Sales Invoice"),
"fieldtype": "Link",
"options": "Sales Invoice",
"width": 150
}
]
if filters.from_date > filters.to_date:
frappe.throw(_("From Date must be before To Date {}").format(filters.to_date))

where = ''
where_filter = {"from_date": filters.from_date, "to_date": filters.to_date}

if filters.warehouse:
where += ' AND dni.warehouse = %(warehouse)s'
where_filter.update({"warehouse": filters.warehouse})
data = frappe.db.sql('''SELECT
dn.customer_name,
CONCAT(ta.address_line1,",", ta.city,',', ta.country) AS customer_address,
ta.phone AS phone_number,
dn.posting_date,
dni.item_name,
dni.item_code,
dni.serial_no,
dni.qty AS quantity,
dni.uom,
dni.warehouse,
dn.name AS delivery_note,
so.name AS sales_invoice,
`tabBin`.actual_qty AS actual_quantity,
`tabBin`.projected_qty AS projected_quantity
FROM
(`tabDelivery Note Item`dni)
LEFT JOIN
(`tabSales Invoice` so)
ON (dni.against_sales_invoice = so.name)
LEFT JOIN
(`tabDelivery Note` dn)
ON (dni.parent=dn.name)
LEFT JOIN
`tabBin` ON (`tabBin`.item_code = dni.item_code
and `tabBin`.warehouse = dni.warehouse)
LEFT JOIN
tabItem ON tabItem.item_code = dni.item_code
LEFT JOIN
(`tabAddress` ta) ON ta.name=(SELECT dl.parent
FROM (`tabDynamic Link` dl)
WHERE
dl.parenttype='Address' AND dl.link_doctype='Customer' AND
dl.link_name=dn.customer ORDER BY ta.creation LIMIT 1
)
WHERE
dn.docstatus = 1 AND dn.status IN ('Completed', 'To Bill', 'Closed')
AND dn.posting_date BETWEEN %(from_date)s AND %(to_date)s
AND (SELECT name FROM `tabDelivery Note` WHERE return_against = dn.name) IS NULL''' + where,
where_filter, as_dict=1
);
return columns, data

+ 0
- 0
csf_tz/after_sales_services/report/installation_note_report/__init__.py Näytä tiedosto


+ 31
- 0
csf_tz/after_sales_services/report/installation_note_report/installation_note_report.js Näytä tiedosto

@@ -0,0 +1,31 @@
// Copyright (c) 2016, InfluxERP
// For license information, please see license.txt
/* eslint-disable */

var aday = new Date();
var to_date = aday.toISOString().split('T')[0];
aday.setDate(aday.getDate() - 30);
var from_date = aday.toISOString().split('T')[0];

frappe.query_reports["Installation Note Report"] = {
"filters": [
{
"fieldname":"from_date",
"label": __("From Date"),
"fieldtype": "Date",
"default": from_date
},
{
"fieldname":"to_date",
"label": __("To Date"),
"fieldtype": "Date",
"default": to_date
},
{
"fieldname":"branch",
"label": __("Warehouse"),
"fieldtype": "Link",
"options": "Warehouse",
}
]
}

+ 34
- 0
csf_tz/after_sales_services/report/installation_note_report/installation_note_report.json Näytä tiedosto

@@ -0,0 +1,34 @@
{
"add_total_row": 0,
"creation": "2019-05-22 14:55:06.120622",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"idx": 0,
"is_standard": "Yes",
"modified": "2019-05-22 14:56:02.838056",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Installation Note Report",
"owner": "Administrator",
"ref_doctype": "Installation Note",
"report_name": "Installation Note Report",
"report_type": "Script Report",
"roles": [
{
"role": "Sales User"
},
{
"role": "Sales Executive"
},
{
"role": "Branch Service Controller"
},
{
"role": "Branch In Charge"
},
{
"role": "Stock Supervisor"
}
]
}

+ 87
- 0
csf_tz/after_sales_services/report/installation_note_report/installation_note_report.py Näytä tiedosto

@@ -0,0 +1,87 @@
# Copyright (c) 2013, Bravo Logistics and contributors
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.utils import flt, getdate, cstr
from frappe import _
import ast
import datetime

def execute(filters=None):
columns, data = [], []
columns = [
{
"fieldname": "reference",
"label": _("Installation Note"),
"fieldtype": "Link",
"options": "Installation Note",
"width": 100
},
{
"fieldname": "inst_date",
"label": _("Installation Date"),
"fieldtype": "Date",
"width": 100
},
{
"fieldname": "customer",
"label": _("Customer"),
"fieldtype": "data",
"width": 100
},
{
"fieldname": "item_code",
"label": _("Item code"),
"fieldtype": "Data",
"width": 150
},
{
"fieldname": "warehouse",
"label": _("Warehouse"),
"fieldtype": "Data",
"width": 150
},
{
"fieldname": "remarks",
"label": _("Remarks"),
"fieldtype": "Text",
"width": 200
}
]
if filters.from_date > filters.to_date:
frappe.throw(_("From Date must be before To Date {}").format(filters.to_date))
where = ''
where_filter = {"from_date": filters.from_date, "to_date": filters.to_date}

if filters.branch:
where += ' AND `tabDelivery Note Item`.warehouse = %(branch)s'
where_filter.update({"branch": filters.branch})
data = frappe.db.sql('''SELECT
`tabInstallation Note`.name AS reference,
`tabInstallation Note`.inst_date AS inst_date,
`tabInstallation Note`.customer AS customer,
`tabInstallation Note`.item_code AS item_code,
`tabInstallation Note`.remarks AS remarks,
`tabInstallation Note`.status AS status,
`tabInstallation Note`.delivery_note,
`tabDelivery Note Item`.warehouse

FROM
`tabInstallation Note`
LEFT JOIN
`tabDelivery Note Item`
ON
(`tabDelivery Note Item`.parent = `tabInstallation Note`.delivery_note)
WHERE
`tabInstallation Note`.docstatus <> 2 \
AND `tabInstallation Note`.inst_date BETWEEN %(from_date)s AND %(to_date)s
'''+ where,
where_filter, as_dict=1,)
return columns, data

+ 0
- 0
csf_tz/after_sales_services/report/pre_delivery_inspection_report/__init__.py Näytä tiedosto


+ 31
- 0
csf_tz/after_sales_services/report/pre_delivery_inspection_report/pre_delivery_inspection_report.js Näytä tiedosto

@@ -0,0 +1,31 @@
// Copyright (c) 2016, Bravo Logistics and contributors
// For license information, please see license.txt
/* eslint-disable */

var aday = new Date();
var to_date = aday.toISOString().split('T')[0];
aday.setDate(aday.getDate() - 30);
var from_date = aday.toISOString().split('T')[0];

frappe.query_reports["Pre Delivery Inspection Report"] = {
"filters": [
{
"fieldname":"from_date",
"label": __("From Date"),
"fieldtype": "Date",
"default": from_date
},
{
"fieldname":"to_date",
"label": __("To Date"),
"fieldtype": "Date",
"default": to_date
},
{
"fieldname":"branch",
"label": __("Warehouse"),
"fieldtype": "Link",
"options": "Warehouse",
}
]
}

+ 34
- 0
csf_tz/after_sales_services/report/pre_delivery_inspection_report/pre_delivery_inspection_report.json Näytä tiedosto

@@ -0,0 +1,34 @@
{
"add_total_row": 0,
"creation": "2019-05-22 14:24:38.122103",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"idx": 0,
"is_standard": "Yes",
"modified": "2019-05-22 14:55:26.715680",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Pre Delivery Inspection Report",
"owner": "Administrator",
"ref_doctype": "Pre Delivery Inspection",
"report_name": "Pre Delivery Inspection Report",
"report_type": "Script Report",
"roles": [
{
"role": "Quality Manager"
},
{
"role": "Sales Executive"
},
{
"role": "Branch Service Controller"
},
{
"role": "Branch In Charge"
},
{
"role": "Stock Supervisor"
}
]
}

+ 113
- 0
csf_tz/after_sales_services/report/pre_delivery_inspection_report/pre_delivery_inspection_report.py Näytä tiedosto

@@ -0,0 +1,113 @@
# Copyright (c) 2013, Bravo Logistics and contributors
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe.utils import flt, getdate, cstr
from frappe import _
import ast
import datetime

def execute(filters=None):
columns, data = [], []
columns = [
{
"fieldname": "reference",
"label": _("Pre Delivery Inspection Reference"),
"fieldtype": "Link",
"options": "Pre Delivery Inspection",
"width": 100
},
{
"fieldname": "report_date",
"label": _("Done On"),
"fieldtype": "Date",
"width": 100
},
{
"fieldname": "customer",
"label": _("Customer"),
"fieldtype": "data",
"width": 100
},
{
"fieldname": "inspection_type",
"label": _("Inspection Type"),
"fieldtype": "Data",
"width": 100
},
{
"fieldname": "item_code",
"label": _("Item code"),
"fieldtype": "Data",
"width": 150
},
{
"fieldname": "item_serial_no",
"label": _("Serial no"),
"fieldtype": "Data",
"width": 200
},
{
"fieldname": "inspected_by",
"label": _("Inspected By"),
"fieldtype": "Data",
"width": 150
},
{
"fieldname": "verified_by",
"label": _("Verified By"),
"fieldtype": "Data",
"width": 150
},
{
"fieldname": "warehouse",
"label": _("Warehouse"),
"fieldtype": "Data",
"width": 150
},
{
"fieldname": "remarks",
"label": _("Remarks"),
"fieldtype": "Text",
"width": 200
}
]
if filters.from_date > filters.to_date:
frappe.throw(_("From Date must be before To Date {}").format(filters.to_date))
where = ''
where_filter = {"from_date": filters.from_date, "to_date": filters.to_date}

if filters.branch:
where += ' AND sit.warehouse = %(branch)s'
where_filter.update({"branch": filters.branch})
data = frappe.db.sql('''SELECT
`tabPre Delivery Inspection`.name AS reference,
`tabPre Delivery Inspection`.report_date,
`tabPre Delivery Inspection`.customer,
`tabPre Delivery Inspection`.inspection_type,
`tabPre Delivery Inspection`.item_code,
`tabPre Delivery Inspection`.item_serial_no,
`tabPre Delivery Inspection`.inspected_by,
`tabPre Delivery Inspection`.verified_by,
`tabPre Delivery Inspection`.reference_name,
`tabPre Delivery Inspection`.remarks,
sit.warehouse

FROM
`tabPre Delivery Inspection`
LEFT JOIN
(`tabSales Invoice Item` sit)
ON (`tabPre Delivery Inspection`.sales_invoice = sit.parent)
WHERE
`tabPre Delivery Inspection`.docstatus <> 2 \
AND `tabPre Delivery Inspection`.report_date BETWEEN %(from_date)s AND %(to_date)s
'''+ where,
where_filter, as_dict=1)
return columns, data

+ 0
- 0
csf_tz/after_sales_services/report/technicians_performance_report/__init__.py Näytä tiedosto


+ 51
- 0
csf_tz/after_sales_services/report/technicians_performance_report/technicians_performance_report.js Näytä tiedosto

@@ -0,0 +1,51 @@
// Copyright (c) 2016, InfluxERP
// For license information, please see license.txt
/* eslint-disable */

var aday = new Date();
var to_date = aday.toISOString().split('T')[0];
aday.setDate(aday.getDate() - 30);
var from_date = aday.toISOString().split('T')[0];

frappe.query_reports["Technicians Performance Report"] = {
"filters": [
{
"fieldname":"from_date",
"label": __("From Date"),
"fieldtype": "Date",
"default": from_date,
"reqd": 1
},
{
"fieldname":"to_date",
"label": __("To Date"),
"fieldtype": "Date",
"default": to_date,
"reqd": 1
},
{
"fieldname":"status",
"label": __("Status"),
"fieldtype": "Select",
"options": ["", "Open", "Closed"],
},
{
"fieldname":"user",
"label": __("Technician"),
"fieldtype": "Link",
"options": "Employee",
},
{
"fieldname":"workshop",
"label": __("Warehouse"),
"fieldtype": "Link",
"options": "Warehouse",
},
{
"fieldname":"custm",
"label": __("Customer"),
"fieldtype": "Link",
"options": "Customer",
},
]
}

+ 38
- 0
csf_tz/after_sales_services/report/technicians_performance_report/technicians_performance_report.json Näytä tiedosto

@@ -0,0 +1,38 @@
{
"add_total_row": 1,
"creation": "2020-04-03 18:13:32.274707",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"idx": 0,
"is_standard": "Yes",
"letter_head": "Default Letter Head",
"modified": "2020-04-09 14:09:12.974702",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Technicians Performance Report",
"owner": "Administrator",
"ref_doctype": "Job Card",
"report_name": "Technicians Performance Report",
"report_type": "Script Report",
"roles": [
{
"role": "System Manager"
},
{
"role": "After Sales User"
},
{
"role": "After Sales Manager"
},
{
"role": "After Sales Branch Manager"
},
{
"role": "Parts Consultant"
},
{
"role": "Service and Training Supervisor"
}
]
}

+ 106
- 0
csf_tz/after_sales_services/report/technicians_performance_report/technicians_performance_report.py Näytä tiedosto

@@ -0,0 +1,106 @@
# Copyright (c) 2013, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe import _
from frappe.desk.query_report import add_total_row
import datetime

def execute(filters=None):
return _execute(filters)

def _execute(filters=None, additional_table_columns=None, additional_query_columns=None):
if not filters: filters = {}
columns = get_columns(additional_table_columns)
item_list = get_items(filters, additional_query_columns)

data = []
for d in item_list:
#For actual hours time calculation = date difference in hours + time difference. There may be a simpler way to do it but ......
time_difference = 0
if d.end_date == d.start_date:
time_difference = (d.end_time.seconds - d.start_time.seconds) / 3600
else:
time_difference = ((86400 - d.start_time.seconds) + d.end_time.seconds) / 3600
date_difference = (d.end_date - d.start_date).total_seconds() / 3600
actual_hrs = date_difference + time_difference
service_value = d.billable_hours * d.standard_cost
hrs_difference = actual_hrs - d.standard_hours
row = [d.name, d.technician, d.employee_name, d.start_date, d.start_time, d.end_date, d.end_time, d.service, d.standard_hours,
actual_hrs, hrs_difference, d.billable_hours, d.standard_cost, service_value, d.warehouse, d.customer]
data.append(row)
return columns, data

def get_columns(additional_table_columns):
columns = [
_("Job Card") + ":Link/Job Card:120",
_("Technician") + ":Link/User:100",
_("Technician Name") + ":Data:100",
_("Start Date") + ":Date:80",
_("Start Time") + ":Time:80",
_("End Date") + ":Date:80",
_("End Time") + ":Time:80",
_("Service") + ":Link/Maintenance Service:120",
_("Standard Hrs") + ":Float:120",
_("Actual Hrs") + ":Float:120",
_("Hrs Difference") + ":Float:120",
_("Billable Hrs") + ":Float:120",
_("Standard Rate") + ":Currency/currency:120",
_("Service Value") + ":Currency/currency:120",
_("Warehouse") + ":Link/Warehouse:120",
_("Customer") + ":Link/Customer:120"]

return columns

def get_conditions(filters):
conditions = ""

for opts in (("custm", " and `tabJob Card`.customer=%(custm)s"),
("workshop", " and `tabJob Card`.warehouse = %(workshop)s"),
("user", " and `tabMaintenance Services Table`.technician = %(user)s"),
("from_date", " and `tabMaintenance Services Table`.start_date>=%(from_date)s"),
("to_date", " and `tabMaintenance Services Table`.start_date<=%(to_date)s")):
if filters.get(opts[0]):
conditions += opts[1]

return conditions

def get_items(filters, additional_query_columns):
conditions = get_conditions(filters)
match_conditions = frappe.build_match_conditions("Job Card")
if match_conditions:
match_conditions = " and {0} ".format(match_conditions)
if additional_query_columns:
additional_query_columns = ', ' + ', '.join(additional_query_columns)

return frappe.db.sql("""
select
`tabJob Card`.name,
`tabMaintenance Services Table`.start_date,
`tabMaintenance Services Table`.end_date,
`tabMaintenance Services Table`.start_time,
`tabMaintenance Services Table`.end_time,
`tabJob Card`.name,
`tabJob Card`.customer,
`tabJob Card`.status,
`tabJob Card`.warehouse,
`tabEmployee`.employee_name,
`tabMaintenance Services Table`.service,
`tabMaintenance Services Table`.billable_hours,
`tabMaintenance Services Table`.standard_hours,
`tabMaintenance Services Table`.technician,
`tabMaintenance Services Table`.standard_cost
from
`tabJob Card`, `tabMaintenance Services Table`
left join
`tabEmployee` on `tabEmployee`.name = `tabMaintenance Services Table`.technician
where
`tabJob Card`.name = `tabMaintenance Services Table`.parent and `tabJob Card`.docstatus = 1 %s %s
order by
`tabMaintenance Services Table`.start_date
""".format(additional_query_columns or '') % (conditions, match_conditions), filters, as_dict=1)


+ 0
- 0
csf_tz/after_sales_services/report/workshop_performance_report/__init__.py Näytä tiedosto


+ 39
- 0
csf_tz/after_sales_services/report/workshop_performance_report/workshop_performance_report.js Näytä tiedosto

@@ -0,0 +1,39 @@
// Copyright (c) 2016, InfluxERP
// For license information, please see license.txt
/* eslint-disable */

var aday = new Date();
var to_date = aday.toISOString().split('T')[0];
aday.setDate(aday.getDate() - 30);
var from_date = aday.toISOString().split('T')[0];

frappe.query_reports["Workshop Performance Report"] = {
"filters": [
{
"fieldname":"from_date",
"label": __("From Date"),
"fieldtype": "Date",
"default": from_date,
"reqd": 1
},
{
"fieldname":"to_date",
"label": __("To Date"),
"fieldtype": "Date",
"default": to_date,
"reqd": 1
},
{
"fieldname":"technician",
"label": __("Technician"),
"fieldtype": "Link",
"options": "Employee",
},
{
"fieldname":"workshop",
"label": __("Warehouse"),
"fieldtype": "Link",
"options": "Warehouse",
},
]
}

+ 38
- 0
csf_tz/after_sales_services/report/workshop_performance_report/workshop_performance_report.json Näytä tiedosto

@@ -0,0 +1,38 @@
{
"add_total_row": 1,
"creation": "2020-04-09 15:05:49.073861",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"idx": 0,
"is_standard": "Yes",
"letter_head": "Default Letter Head",
"modified": "2020-04-09 15:05:49.073861",
"modified_by": "Administrator",
"module": "After Sales Services",
"name": "Workshop Performance Report",
"owner": "Administrator",
"ref_doctype": "Job Card",
"report_name": "Workshop Performance Report",
"report_type": "Script Report",
"roles": [
{
"role": "System Manager"
},
{
"role": "After Sales User"
},
{
"role": "After Sales Manager"
},
{
"role": "After Sales Branch Manager"
},
{
"role": "Parts Consultant"
},
{
"role": "Service and Training Supervisor"
}
]
}

+ 102
- 0
csf_tz/after_sales_services/report/workshop_performance_report/workshop_performance_report.py Näytä tiedosto

@@ -0,0 +1,102 @@
# Copyright (c) 2013, InfluxERP
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe import _
from frappe.desk.query_report import add_total_row

def execute(filters=None):
columns, data = [], []
columns = [
{
"fieldname": "technician",
"label": _("Technician"),
"fieldtype": "Link",
"options": "Employee",
"width": 150
},
{
"fieldname": "employee_name",
"label": _("Technician Name"),
"fieldtype": "Data",
"width": 150,
"hidden": True
},
{
"fieldname": "workshop",
"label": _("Workshop"),
"fieldtype": "link",
"options": "Warehouse",
"width": 150
},
{
"fieldname": "no_of_jobs_completed",
"label": _("No of Jobs Completed"),
"fieldtype": "Float",
"width": 150
},
{
"fieldname": "total_billable_hours",
"label": _("Total Billable Hours"),
"fieldtype": "Float",
"width": 150
},
{
"fieldname": "total_standard_hours",
"label": _("Standard Hours"),
"fieldtype": "Float",
"width": 150
},
{
"fieldname": "total_work_value",
"label": _("Total Work Value"),
"fieldtype": "Currency",
"width": 150
},
{
"fieldname": "job_efficiency",
"label": _("Technician Efficiency (%)"),
"fieldtype": "Float",
"width": 150
},
]

if filters.from_date > filters.to_date:
frappe.throw(_("From Date must be before To Date {}").format(filters.to_date))

where_filter = {"from_date": filters.from_date,"to_date": filters.to_date,}
where = ""

if filters.workshop:
where += ' AND tjc.warehouse = %(workshop)s '
where_filter.update({"workshop": filters.workshop})
if filters.technician:
where += ' AND tmst.technician = %(technician)s '
where_filter.update({"technician": filters.technician})


data = frappe.db.sql('''SELECT
tmst.technician,
tabEmployee.employee_name,
tjc.warehouse AS workshop,
COUNT(tmst.name) AS no_of_jobs_completed,
SUM(tmst.billable_hours) AS total_billable_hours,
SUM(tmst.standard_hours) AS total_standard_hours,
SUM(tmst.standard_cost * tmst.billable_hours) as total_work_value,
(SUM(tmst.billable_hours) / SUM(tmst.standard_hours)) * 100 AS job_efficiency
FROM
(`tabMaintenance Services Table` tmst)
LEFT JOIN
(`tabJob Card` tjc) ON (tmst.parent = tjc.name)
LEFT JOIN
tabEmployee ON tabEmployee.name = tmst.technician
WHERE
tmst.start_date BETWEEN %(from_date)s AND %(to_date)s AND tjc.docstatus = 1
AND tmst.service_status = 'Fully Completed' '''+ where + '''
GROUP BY
tmst.technician, tjc.warehouse
''',
where_filter, as_list=1);
return columns, data

+ 449
- 0
csf_tz/bank_api.py Näytä tiedosto

@@ -0,0 +1,449 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2020, Youssef Restom and contributors
# For license information, please see license.txt

from __future__ import unicode_literals
import frappe
from frappe import _
import json
import requests
from frappe.utils import get_host_name, flt
from time import sleep
import binascii
import os
from werkzeug import url_fix
import urllib.parse as urlparse
from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
from frappe.utils.background_jobs import enqueue
from datetime import datetime
from frappe.utils.password import get_decrypted_password
from csf_tz.csf_tz.doctype.csf_api_response_log.csf_api_response_log import add_log


class ToObject(object):
def __init__(self, data):
self.__dict__ = json.loads(data)


def set_callback_token(doc, method):
send_fee_details_to_bank = (
frappe.get_value("Company", doc.company, "send_fee_details_to_bank") or 0
)
if not send_fee_details_to_bank:
return
doc.callback_token = binascii.hexlify(os.urandom(14)).decode()
series = frappe.get_value("Company", doc.company, "nmb_series") or ""
if not series:
frappe.throw(_("Please set NMB User Series in Company {0}".format(doc.company)))
reference = str(series) + "F" + str(doc.name)
if not doc.abbr:
doc.abbr = frappe.get_value("Company", doc.company, "abbr") or ""
doc.bank_reference = reference.replace("-", "").replace("FEE" + doc.abbr, "")
if method == "invoice_submission":
doc.save()
frappe.db.commit()


def get_nmb_token(company):
url = frappe.get_value("Company", company, "nmb_url")
if not url:
frappe.throw(_("Please set NMB URL in Company {0}".format(company)))
url = url + str("auth")
username = frappe.get_value("Company", company, "nmb_username")
if not username:
frappe.throw(_("Please set NMB User Name in Company {0}".format(company)))
password = get_decrypted_password("Company", company, "nmb_password")
if not password:
frappe.throw(_("Please set NMB Password in Company {0}".format(company)))
data = {
"username": username,
"password": password,
}
for i in range(3):
try:
r = requests.post(url, data=json.dumps(data), timeout=5)
r.raise_for_status()
frappe.logger().debug({"get_nmb_token webhook_success": r.text})
if json.loads(r.text):
add_log(
request_type="NMB token",
request_url=url,
request_header="no header",
request_body=json.dumps(data),
response_data=json.loads(r.text),
)
if json.loads(r.text)["status"] == 1:
return json.loads(r.text)["token"]
else:
frappe.throw(json.loads(r.text))
except Exception as e:
frappe.logger().debug({"get_nmb_token webhook_error": e, "try": i + 1})
sleep(3 * i + 1)
if i != 2:
continue
else:
raise e


def send_nmb(method, data, company):
url = frappe.get_value("Company", company, "nmb_url")
if not url:
frappe.throw(_("Please set NMB URL in Company {0}".format(company)))
data["token"] = get_nmb_token(company)
url = url + str(method)
for i in range(3):
try:
r = requests.post(url, data=json.dumps(data), timeout=5)
r.raise_for_status()
frappe.logger().debug({"send_nmb webhook_success": r.text})
if json.loads(r.text):
add_log(
request_type="NMB " + method,
request_url=url,
request_header="no header",
request_body=json.dumps(data),
response_data=json.loads(r.text),
)
if json.loads(r.text)["status"] == 1:
frappe.msgprint(
"Response from bank:<br><hr>" + json.loads(r.text)["description"]
)
return json.loads(r.text)
else:
print(json.loads(r.text)["description"])
if json.loads(r.text)["description"] == "Duplicate Invoice Number":
return json.loads(r.text)
frappe.msgprint(
"Error detected at bank:<br><hr>"
+ json.loads(r.text)["description"]
)
frappe.throw(json.loads(r.text))
except Exception as e:
frappe.logger().debug({"send_nmb webhook_error": e, "try": i + 1})
sleep(3 * i + 1)
if i != 2:
continue
else:
raise e


@frappe.whitelist()
def invoice_submission(doc=None, method=None, fees_name=None):
send_fee_details_to_bank = (
frappe.get_value("Company", doc.company, "send_fee_details_to_bank") or 0
)
if not send_fee_details_to_bank:
return
if not doc and fees_name:
doc = frappe.get_doc("Fees", fees_name)
if not doc.callback_token:
frappe.msgprint(
_(
"This fee is not set with a token to be sent to the Bank. Generating the token..."
),
alert=True,
)
set_callback_token(doc, "invoice_submission")
series = frappe.get_value("Company", doc.company, "nmb_series") or ""
abbr = frappe.get_value("Company", doc.company, "abbr") or ""
if not series:
frappe.throw(_("Please set NMB User Series in Company {0}".format(doc.company)))
data = {
"reference": doc.bank_reference,
"student_name": doc.student_name,
"student_id": doc.student,
"amount": doc.grand_total,
"type": "Fees Invoice",
"code": 10,
"allow_partial": "FALSE",
"callback_url": "https://"
+ get_host_name()
+ "/api/method/csf_tz.bank_api.receive_callback?token="
+ doc.callback_token,
}
send_nmb("invoice_submission", data, doc.company)


@frappe.whitelist(allow_guest=True)
def receive_callback(*args, **kwargs):
r = frappe.request
uri = url_fix(r.url.replace("+", " "))
# http_method = r.method
body = r.get_data()
# headers = r.headers
message = {}
if body:
data = body.decode("utf-8")
msgs = ToObject(data)
atr_list = list(msgs.__dict__)
for atr in atr_list:
if getattr(msgs, atr):
message[atr] = getattr(msgs, atr)
else:
frappe.throw("This has no body!")
parsed_url = urlparse.urlparse(uri)
message["fees_token"] = parsed_url[4][6:]
message["doctype"] = "NMB Callback"
nmb_doc = frappe.get_doc(message)

if nmb_doc.insert(ignore_permissions=True):
frappe.response["status"] = 1
frappe.response["description"] = "success"
else:
frappe.response["description"] = "insert failed"
frappe.response["http_status_code"] = 409

enqueue(
method=make_payment_entry,
queue="short",
timeout=10000,
is_async=True,
kwargs=nmb_doc,
)


def make_payment_entry(method="callback", **kwargs):
for key, value in kwargs.items():
nmb_doc = value
doc_info = get_fee_info(nmb_doc.reference)
accounts = get_fees_default_accounts(doc_info["company"])

nmb_amount = flt(nmb_doc.amount)
frappe.flags.ignore_account_permission = True
if doc_info["doctype"] == "Fees":
if method == "callback":
frappe.set_user("Administrator")
fees_name = doc_info["name"]
bank_reference = frappe.get_value("Fees", fees_name, "bank_reference")
if bank_reference == nmb_doc.reference:
payment_entry = get_payment_entry(
"Fees", fees_name, party_amount=nmb_amount
)
payment_entry.update(
{
"reference_no": nmb_doc.reference,
"reference_date": nmb_doc.timestamp,
"remarks": "Payment Entry against {0} {1} via NMB Bank Payment {2}".format(
"Fees", fees_name, nmb_doc.reference
),
"paid_to": accounts["bank"],
}
)
payment_entry.flags.ignore_permissions = True
# payment_entry.references = []
# payment_entry.set_missing_values()
payment_entry.save()
payment_entry.submit()
return nmb_doc

elif doc_info["doctype"] == "Student Applicant Fees":
doc = frappe.get_doc("Student Applicant Fees", doc_info["name"])
if not doc.callback_token == nmb_doc.fees_token:
return
# Below remarked after introducing VFD in AV solutions
# jl_rows = []
# debit_row = dict(
# account=accounts["bank"],
# debit_in_account_currency=nmb_amount,
# account_currency=accounts["currency"],
# cost_center=doc.cost_center,
# )
# jl_rows.append(debit_row)

# credit_row_1 = dict(
# account=accounts["income"],
# credit_in_account_currency=nmb_amount,
# account_currency=accounts["currency"],
# cost_center=doc.cost_center,
# )
# jl_rows.append(credit_row_1)

# user_remark = (
# "Journal Entry against {0} {1} via NMB Bank Payment {2}".format(
# "Student Applicant Fees", doc_info["name"], nmb_doc.reference
# )
# )
# jv_doc = frappe.get_doc(
# dict(
# doctype="Journal Entry",
# posting_date=nmb_doc.timestamp,
# accounts=jl_rows,
# company=doc.company,
# multi_currency=0,
# user_remark=user_remark,
# )
# )

# jv_doc.flags.ignore_permissions = True
# frappe.flags.ignore_account_permission = True
# jv_doc.save()
# jv_doc.submit()
# jv_url = frappe.utils.get_url_to_form(jv_doc.doctype, jv_doc.name)
# si_msgprint = "Journal Entry Created <a href='{0}'>{1}</a>".format(
# jv_url, jv_doc.name
# )
# frappe.msgprint(_(si_msgprint))
frappe.db.set_value(
"Student Applicant", doc.student, "application_status", "Approved"
)
return nmb_doc


@frappe.whitelist(allow_guest=True)
def receive_validate_reference(*args, **kwargs):
r = frappe.request
# uri = url_fix(r.url.replace("+"," "))
# http_method = r.method
body = r.get_data()
# headers = r.headers
message = {}
if body:
data = body.decode("utf-8")
msgs = ToObject(data)
atr_list = list(msgs.__dict__)
for atr in atr_list:
if getattr(msgs, atr):
message[atr] = getattr(msgs, atr)
else:
frappe.throw("This has no body!")

doc_info = get_fee_info(message["reference"])
if doc_info["name"]:
doc = frappe.get_doc(doc_info["doctype"], doc_info["name"])
response = dict(
status=1,
reference=doc.bank_reference,
student_name=doc.student_name,
student_id=doc.student,
amount=doc.grand_total,
type="Fees Invoice",
code=10,
allow_partial="FALSE",
callback_url="https://"
+ get_host_name()
+ "/api/method/csf_tz.bank_api.receive_callback?token="
+ doc.callback_token,
token=message["token"],
)
return response
else:
frappe.response["status"] = 0
frappe.response["description"] = "Not Exist"


def cancel_invoice(doc, method):
send_fee_details_to_bank = (
frappe.get_value("Company", doc.company, "send_fee_details_to_bank") or 0
)
if not send_fee_details_to_bank:
return
data = {
"reference": str(doc.bank_reference),
}
message = send_nmb("invoice_cancel", data, doc.company)
frappe.msgprint(str(message))


def reconciliation(doc=None, method=None):
companys = frappe.get_all("Company")
for company in companys:
if not frappe.get_value("Company", company["name"], "nmb_username"):
continue
data = {"reconcile_date": datetime.today().strftime("%d-%m-%Y")}
frappe.msgprint(str(data))
message = send_nmb("reconcilliation", data, company["name"])
if message["status"] == 1 and len(message["transactions"]) > 0:
for i in message["transactions"]:
if (
len(
frappe.get_all(
"NMB Callback",
filters=[
["NMB Callback", "reference", "=", i.reference],
["NMB Callback", "receipt", "=", i.receipt],
],
fields=["name"],
)
)
== 1
):
doc_info = get_fee_info(message["reference"])
if doc_info["name"]:
message["fees_token"] = frappe.get_value(
doc_info["doctype"], doc_info["name"], "callback_token"
)
message["doctype"] = "NMB Callback"
nmb_doc = frappe.get_doc(message)
enqueue(
method=make_payment_entry,
queue="short",
timeout=10000,
is_async=True,
kwargs=nmb_doc,
)


def get_fee_info(bank_reference):
data = {"name": "", "doctype": ""}
doc_list = frappe.get_all(
"Fees",
filters=[
["Fees", "bank_reference", "=", bank_reference],
["Fees", "docstatus", "=", 1],
],
fields=["name", "company"],
)
if len(doc_list):
data["name"] = doc_list[0]["name"]
data["doctype"] = "Fees"
data["company"] = doc_list[0]["company"]
return data
else:
doc_list = frappe.get_all(
"Student Applicant Fees",
filters=[
["Student Applicant Fees", "bank_reference", "=", bank_reference],
["Student Applicant Fees", "docstatus", "=", 1],
],
fields=["name", "company"],
)
if len(doc_list):
data["name"] = doc_list[0]["name"]
data["doctype"] = "Student Applicant Fees"
data["company"] = doc_list[0]["company"]
return data


def get_fees_default_accounts(company):
data = {"bank": "", "income": "", "currency": ""}
data["currency"] = frappe.get_value("Company", company, "default_currency") or ""
data["bank"] = frappe.get_value("Company", company, "fee_bank_account") or ""
if not data["bank"]:
data["bank"] = (
frappe.get_value("Company", company, "default_bank_account") or ""
)
data["income"] = (
frappe.get_value("Company", company, "student_applicant_fees_revenue_account")
or ""
)
if not data["income"]:
data["bank"] = (
frappe.get_value("Company", company, "default_income_account") or ""
)
if not data["bank"]:
frappe.throw(_("Please set Fee Bank Account in Company {0}".format(company)))
if not data["income"]:
frappe.throw(
_(
"Please set Student Applicant Fees Revenue Account in Company {0}".format(
company
)
)
)
return data


@frappe.whitelist()
def make_payment_entry_from_call(docname):
nmb_doc = frappe.get_doc("NMB Callback", docname)
make_payment_entry(method="frontend", kwargs=nmb_doc)

+ 4
- 0
csf_tz/bench-restart.sh Näytä tiedosto

@@ -0,0 +1,4 @@
#!/bin/bash

bench restart
bench clear-cache

Some files were not shown because too many files changed in this diff

Ladataan…
Peruuta
Tallenna