diff --git a/erpnext/__init__.py b/erpnext/__init__.py index c5d99719f7..42508f7e89 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from erpnext.hooks import regional_overrides -__version__ = '9.2.5' +__version__ = '9.2.6' def get_default_company(user=None): '''Get default company for user''' diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general.json index f6015f3744..018d368de4 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general.json @@ -851,7 +851,7 @@ "4457-Taxes sur le chiffre d'affaires collect\u00e9es par l'entreprise": { "44571-TVA collect\u00e9e": { "account_type": "Tax", - "tax_rate": 20.0 + "is_group": 1 }, "44578-Taxes assimil\u00e9es \u00e0 la TVA": {} }, diff --git a/erpnext/docs/user/manual/es/index.txt b/erpnext/docs/user/manual/es/index.txt index feb68a2fe0..00cf97b420 100644 --- a/erpnext/docs/user/manual/es/index.txt +++ b/erpnext/docs/user/manual/es/index.txt @@ -1,3 +1,4 @@ introduction accounts +projects schools diff --git a/erpnext/docs/user/manual/es/projects/__init__.py b/erpnext/docs/user/manual/es/projects/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/docs/user/manual/es/projects/activity-cost.md b/erpnext/docs/user/manual/es/projects/activity-cost.md new file mode 100644 index 0000000000..71eb15e432 --- /dev/null +++ b/erpnext/docs/user/manual/es/projects/activity-cost.md @@ -0,0 +1,6 @@ +# Costo de Actividad + +El costo de la actividad registra la tasa de facturación por hora y la tasa de costos de un empleado en comparación con un tipo de actividad. +El sistema hace uso de esta tasa mientras hace registros de tiempo. Se usa para Costeo de proyectos. + +Activity Cost diff --git a/erpnext/docs/user/manual/es/projects/activity-type.md b/erpnext/docs/user/manual/es/projects/activity-type.md new file mode 100644 index 0000000000..20a03e2932 --- /dev/null +++ b/erpnext/docs/user/manual/es/projects/activity-type.md @@ -0,0 +1,15 @@ +# Tipo de Actividad + +Los tipos de actividad son la lista de los diferentes tipos de actividades sobre las que se hacen registro de tiempo. + +Activity Type + +Por defecto, los siguientes tipos de actividades son creados. + +* Planning +* Research +* Proposal Writing +* Execution +* Communication + +{next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/es/projects/articles/__init__.py b/erpnext/docs/user/manual/es/projects/articles/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/docs/user/manual/es/projects/articles/index.md b/erpnext/docs/user/manual/es/projects/articles/index.md new file mode 100644 index 0000000000..2d959ecb6e --- /dev/null +++ b/erpnext/docs/user/manual/es/projects/articles/index.md @@ -0,0 +1,3 @@ +# Artículos + +{index} \ No newline at end of file diff --git a/erpnext/docs/user/manual/es/projects/articles/index.txt b/erpnext/docs/user/manual/es/projects/articles/index.txt new file mode 100644 index 0000000000..56c193c277 --- /dev/null +++ b/erpnext/docs/user/manual/es/projects/articles/index.txt @@ -0,0 +1 @@ +project-costing \ No newline at end of file diff --git a/erpnext/docs/user/manual/es/projects/articles/project-costing.md b/erpnext/docs/user/manual/es/projects/articles/project-costing.md new file mode 100644 index 0000000000..a8820c7e29 --- /dev/null +++ b/erpnext/docs/user/manual/es/projects/articles/project-costing.md @@ -0,0 +1,40 @@ +# Costeo de proyectos + +Cada proyecto tiene multiples tareas asociadas a el. Para hacer el seguimiento del costo actual de un proyecto, primeramente en términos de servicios, el usuario +tiene que crear un registro de tiempo basado en el tiempo que invirtió en una tarea del proyecto. Siguiendo los pasos de como puedes hacer el seguimiento del costo actual de un servicio usando el proyecto. + +#### Tipo de actividad + +Tipo de actividad es un maestro de los servicios ofrecidos por su personal. Puedes agregar un nuevo Tipo de Actividad desde: + +`Project > Activity Type > New` + +#### Costo de actividad + +Costo de actividad es un maestro donde puedes hacer el seguimiento de los montos de facturación y costo de cada empleado, y por cada tipo de Tipo de Actividad. + +Activity Cost + +#### Registro de Tiempo + +Basados en el tiempo actual invertido en una Tarea del Proyecto, El empleado va a crear un registro de tiempo. + +Time Log + +Al momento de seleccionar el Tipo de Actividad en el Registro de tiempo, el monto de Facturación y Costo del empleado va a ser traído de su respectivo registro en el master de Costo de Actividad. + +Time Log Costing + +Multiplicando esos montos con el total de número de horas en el registro de tiempo, nos da el monto de costos y Facturación para el registro de tiempo específico. + +#### Costeo en Proyectos y Tareas + +Basados en el total de registros de tiempos creados por una tarea en específico, su costo va a ser actualizado en el registro maestro de la tarea, o sea, en el detalle de la tarea. + +Costing in Task + +De la misma manera, el detalle del Proyecto va a actualizar su costo basado en el total de registros de tiempo a ese proyecto, y las tareas asociadas a ese proyecto. + +Costing in Project + + \ No newline at end of file diff --git a/erpnext/docs/user/manual/es/projects/index.md b/erpnext/docs/user/manual/es/projects/index.md new file mode 100644 index 0000000000..0882752a40 --- /dev/null +++ b/erpnext/docs/user/manual/es/projects/index.md @@ -0,0 +1,15 @@ +# Proyectos + +ERPNext le ayuda en la administración de su proyecto a traves de la creacion de tareas y +poder asignarlas a diferentes personas. + +Las compras y las ventas también se pueden rastrear en relación con los proyectos y +esto puede ayudar a la empresa a controlar su presupuesto, entrega y rentabilidad para un proyecto. + +Los proyectos pueden ser usados para manejar los proyectos internos, trabajos de manufacturación y +planificación de servicios. Para los trabajos de servicios, los Time Sheets (hojas de tiempo) pueden ser creadas +para facturar a los clientes, en caso que el proceso de facturación se haga basado en tiempo y dinero de tareas. + +### Temas + +{index} \ No newline at end of file diff --git a/erpnext/docs/user/manual/es/projects/index.txt b/erpnext/docs/user/manual/es/projects/index.txt new file mode 100644 index 0000000000..716ec1fe3a --- /dev/null +++ b/erpnext/docs/user/manual/es/projects/index.txt @@ -0,0 +1,7 @@ +tasks +project +time-log-batch +activity-type +activity-cost +articles +timesheet \ No newline at end of file diff --git a/erpnext/docs/user/manual/es/projects/project.md b/erpnext/docs/user/manual/es/projects/project.md new file mode 100644 index 0000000000..942433b47b --- /dev/null +++ b/erpnext/docs/user/manual/es/projects/project.md @@ -0,0 +1,110 @@ +# Proyecto + +El manejo de proyectos en ERPNext se hace a traves de tareas. Puedes crear un proyecto y asignar varias tareas al mismo. + +Project + +También puedes hacer el seguimiento del % completado del proyecto usando diferentes métodos. + + 1. Tareas Completadas + 2. Progreso de tareas + 3. Peso de tarea + +Project + +Algunos ejemplos de como el % completado es cálculado basado en tareas. + +Project + +Project + +### Manejando tareas + +Los proyecto pueden ser divididos en multiples tareas. +Las tareas pueden ser creadas a traves del documento de Proyecto o pueden ser creadas via [Tarea](/docs/user/manual/en/projects/tasks.html) + +Project + +* Para ver las tareas creadas a un proyecto click en 'Tasks' + +Project - View Task + +Project - Task List + +* También puedes ver las tareas desde la misma vista del proyecto. + +Project - Task Grid + +* Para agregar peso a las tareas puedes seguir los pasos siguientes + +Project - Task Grid +Project - Task Grid + + +### Manejando tiempo + +ERPNext usa [Time Log](/docs/user/manual/en/projects/time-log.html) para hacer el seguimiento del progreso de un Proyecto. +Puedes crear registros de tiempo sobre cada Tarea. +El tiempo actual de inicio y finalización junto con el costo deben ser actualizados basados en los Registros de Tiempo. + +* Para ver los Registros de Tiempo realizados a un proyecto, dar click en 'Time Logs' + +Project - View Time Log + +Project - Time Log List + +* Puedes agregar un registro de tiempo directamente y luego asociarlo con el proyecto. + +Project - Link Time Log + +### Gestión de gastos + +Puede reservar la [Reclamación de gastos](/docs/user/manual/en/human-resources/expense-claim.html) contra una tarea de proyecto. +El sistema actualizará el monto total de las reclamaciones de gastos en la sección de costos del proyecto. + +* Para ver las reclamaciones de gastos realizadas en un proyecto, haga clic en 'Reclamaciones de gastos' + +Project - View Expense Claim + +* También puede crear un Reclamo de gastos directamente y vincularlo al Proyecto. + +Project - Link Expense Claim + +* El monto total de los Reclamos de gastos reservados contra un proyecto se muestra en 'Reclamo de gastos totales' en la Sección de Costos del proyecto + +Project - Total Expense Claim + +### Centro de Costo + +Puedes crear un [Cost Center](/docs/user/manual/en/accounts/setup/cost-center.html) sobre un proyecto o usar un centro de costo existente para hacer el seguimiento de todos los gastos realizados al proyecto. + +Project - Cost Center + +###Costeo del proyecto + +La sección Costeo del proyecto le ayuda a rastrear el tiempo y los gastos incurridos en relación con el proyecto. + +Project - Costing + +* La sección de cálculo de costos se actualiza según los registros de tiempo realizados. + +* El margen bruto es la diferencia entre el monto total de costos y el monto total de facturación + +###Facturación + +Puedes crear/enlazar una [Sales Order](/docs/user/manual/en/selling/sales-order.html) a un proyecto. Una vez asociada puedes usar el módulo de ventas para facturar a un cliente sobre el proyecto. + +Project - Sales Order + +###Gantt Chart + +Un Gantt Chart muestra la planificación del proyecto. +ERPNext te provee con una vista para visualizar las tareas de forma calendarizada usando un Gantt Chart (Hoja de Gantt). + +* Para visualizar el gantt chart de un proyecto, ve hasta el proyecto y dar click en 'Gantt Chart' + +Project - View Gantt Chart + +Project - Gantt Chart + +{next} diff --git a/erpnext/docs/user/manual/es/projects/tasks.md b/erpnext/docs/user/manual/es/projects/tasks.md new file mode 100644 index 0000000000..b07b305b7a --- /dev/null +++ b/erpnext/docs/user/manual/es/projects/tasks.md @@ -0,0 +1,61 @@ +# Tareas + +Proyecto es dividido en Tareas. +En ERPNext, puedes crear las tareas de forma independiente. + +Task + +### Estado de una Tarea + +Una tarea puede tener uno de los siguientes estados - Abierto, Trabajando, Pendiente de Revisión, Cerrado, o Cancelado. + +Task - Status + +* Por defecto, cada nueva tarea creada se le establece el estado 'Abierto'. + +* Si un registro de tiempo es realizado sobre una tarea, su estado es asignado a 'Working'. + +### Tarea Dependiente + +Puedes especificar una lista de tareas dependientes en la sección 'Depende de' + +Depends On + +* No puedes cerrar una tarea padre hasta que todas las tareas dependientes esten cerradas. + +* Si una tarea dependiente se encuentra en retraso y se sobrepone con la fecha esperada de inicio de la tarea padre, el sistema va a re calandarizar la tarea padre. + +### Manejando el tiempo + +ERPNext usa [Time Log](/docs/user/manual/en/projects/time-log.html) para seguir el progreso de una tarea. +Puedes crear varios registros de tiempo para cada tarea. +El tiempo de inicio y fin actual junto con el costo es actualizado en base al Registro de Tiempo. + +* Para ver el Registro de tiempo realizado a una tarea, dar click en 'Time Logs' + +Task - View Time Log + +Task - Time Log List + +* Puedes también crear un Registro de Tiempo directamente y luego asociarlo a una Tarea. + +Task - Link Time Log + +### Gestión de gastos + +Puede reservar la [Reclamación de gastos](/docs/user/manual/en/human-resources/expense-claim.html) contra una tarea de proyecto. +El sistema actualizará el monto total de las reclamaciones de gastos en la sección de costos del proyecto. + +* Para ver las reclamaciones de gastos realizadas en un proyecto, haga clic en 'Reclamaciones de gastos' + +Task - View Expense Claim + +* También puede crear un Reclamo de gastos directamente y vincularlo al Proyecto. + +Task - Link Expense Claim + +* El monto total de los Reclamos de gastos reservados contra un proyecto se muestra en 'Reclamo de gastos totales' en la Sección de Costos del proyecto + +Task - Total Expense Claim + +{next} diff --git a/erpnext/docs/user/manual/es/projects/time-log-batch.md b/erpnext/docs/user/manual/es/projects/time-log-batch.md new file mode 100644 index 0000000000..72c77b4ff8 --- /dev/null +++ b/erpnext/docs/user/manual/es/projects/time-log-batch.md @@ -0,0 +1,25 @@ +# Lote de registro de tiempo + +Puede facturar Registros de tiempo viéndolos juntos. Esto le da la flexibilidad de administrar la facturación de su cliente de la manera que desee. Para crear una nueva hoja de tiempo, ve a + +> Projects > Time Sheet > New Time Sheet + +O + +Simplemente abra su lista de registro de tiempo y marque los elementos que desea agregar al registro de tiempo. A continuación, haga clic en el botón "Crear hoja de tiempo" y se seleccionarán estos registros de tiempo. + +Time Log - Drag Calender + +###Creando Factura de Venta + +* Despues de crear la Hoja de Tiempo/Horario, el botón "Crear Factura" debe aparecer. + +Time Log - Drag Calender + +* Haga clic en ese botón para hacer una factura de venta usando la hoja de tiempo. + +Time Log - Drag Calender + +* Cuando "Presente" la Factura de Ventas, el número de Factura de Ventas se actualizará en los Registros de Tiempo y la Hoja de Horario y su estado cambiará a "Facturado". + +{next} \ No newline at end of file diff --git a/erpnext/hr/doctype/offer_letter/test_offer_letter.js b/erpnext/hr/doctype/offer_letter/test_offer_letter.js index 5b61d64eb5..c9b08a6c50 100644 --- a/erpnext/hr/doctype/offer_letter/test_offer_letter.js +++ b/erpnext/hr/doctype/offer_letter/test_offer_letter.js @@ -27,13 +27,13 @@ QUnit.test("Test: Offer Letter [HR]", function (assert) { ]}, ]); }, - () => frappe.timeout(12), + () => frappe.timeout(10), () => frappe.click_button('Submit'), () => frappe.timeout(2), () => frappe.click_button('Yes'), - () => frappe.timeout(8), + () => frappe.timeout(5), + // To check if the fields are correctly set () => { - // To check if the fields are correctly set assert.ok(cur_frm.get_field('status').value=='Accepted', 'Status of job offer is correct'); assert.ok(cur_frm.get_field('designation').value=='Software Developer', @@ -45,7 +45,7 @@ QUnit.test("Test: Offer Letter [HR]", function (assert) { () => { assert.ok(cur_list.data[0].docstatus==1,'Offer Letter Submitted successfully'); }, - () => frappe.timeout(4), + () => frappe.timeout(2), () => done() ]); }); \ No newline at end of file diff --git a/erpnext/hr/doctype/training_event/tests/test_training_event.js b/erpnext/hr/doctype/training_event/tests/test_training_event.js index a359af3329..8ff4fecd6e 100644 --- a/erpnext/hr/doctype/training_event/tests/test_training_event.js +++ b/erpnext/hr/doctype/training_event/tests/test_training_event.js @@ -1,7 +1,7 @@ QUnit.module('hr'); QUnit.test("Test: Training Event [HR]", function (assert) { - assert.expect(4); + assert.expect(5); let done = assert.async(); let employee_name; @@ -21,7 +21,8 @@ QUnit.test("Test: Training Event [HR]", function (assert) { { employees: [ [ {employee: employee_name}, - {employee_name: 'Test Employee 1'} + {employee_name: 'Test Employee 1'}, + {attendance: 'Optional'} ] ]}, ]); @@ -41,6 +42,9 @@ QUnit.test("Test: Training Event [HR]", function (assert) { assert.ok(cur_frm.doc.employees[0].employee_name=='Test Employee 1', 'Attendee Employee is correctly set'); + + assert.ok(cur_frm.doc.employees[0].attendance=='Optional', + 'Attendance is correctly set'); }, () => frappe.set_route('List','Training Event','List'), diff --git a/erpnext/hr/doctype/training_event/tests/test_training_event_attendance.js b/erpnext/hr/doctype/training_event/tests/test_training_event_attendance.js deleted file mode 100644 index 6364308f73..0000000000 --- a/erpnext/hr/doctype/training_event/tests/test_training_event_attendance.js +++ /dev/null @@ -1,40 +0,0 @@ -QUnit.module('hr'); - -QUnit.test("test: Training Event", function (assert) { - // number of asserts - assert.expect(1); - let done = assert.async(); - - frappe.run_serially([ - // insert a new Training Event - () => frappe.set_route("List", "Training Event", "List"), - () => frappe.new_doc("Training Event"), - () => frappe.timeout(1), - () => frappe.click_link('Edit in full page'), - () => cur_frm.set_value("event_name", "Test Event " + frappe.utils.get_random(10)), - () => cur_frm.set_value("start_time", "2017-07-26, 2:00 pm PDT"), - () => cur_frm.set_value("end_time", "2017-07-26, 2:30 pm PDT"), - () => cur_frm.set_value("introduction", "This is a test report"), - () => cur_frm.set_value("location", "Fake office"), - () => frappe.click_button('Add Row'), - () => frappe.db.get_value('Employee', {'employee_name':'Test Employee 1'}, 'name'), - (r) => { - console.log(r); - return cur_frm.fields_dict.employees.grid.grid_rows[0].doc.employee = r.message.name; - }, - () => { - return cur_frm.fields_dict.employees.grid.grid_rows[0].doc.attendance = "Optional"; - }, - () => frappe.click_button('Save'), - () => frappe.timeout(2), - () => frappe.click_button('Submit'), - () => frappe.timeout(2), - () => frappe.click_button('Yes'), - () => frappe.timeout(1), - () => { - assert.equal(cur_frm.doc.docstatus, 1); - }, - () => done() - ]); - -}); \ No newline at end of file diff --git a/erpnext/hr/doctype/training_event/training_event.json b/erpnext/hr/doctype/training_event/training_event.json index c1e18d32c6..4b812a992e 100644 --- a/erpnext/hr/doctype/training_event/training_event.json +++ b/erpnext/hr/doctype/training_event/training_event.json @@ -809,7 +809,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-10-18 11:22:20.143491", + "modified": "2017-10-23 06:13:29.065781", "modified_by": "Administrator", "module": "HR", "name": "Training Event", @@ -837,7 +837,7 @@ "write": 1 } ], - "quick_entry": 1, + "quick_entry": 0, "read_only": 0, "read_only_onload": 0, "search_fields": "event_name", diff --git a/erpnext/hr/doctype/training_program/training_program_dashboard.py b/erpnext/hr/doctype/training_program/training_program_dashboard.py index b5d9f19a26..a314081c6b 100644 --- a/erpnext/hr/doctype/training_program/training_program_dashboard.py +++ b/erpnext/hr/doctype/training_program/training_program_dashboard.py @@ -5,7 +5,7 @@ def get_data(): 'fieldname': 'training_program', 'transactions': [ { - 'label': _('Training Event'), + 'label': _('Training Events'), 'items': ['Training Event'] }, ] diff --git a/erpnext/hub_node/page/hub/hub.js b/erpnext/hub_node/page/hub/hub.js index 297a4d1291..8a715b8185 100644 --- a/erpnext/hub_node/page/hub/hub.js +++ b/erpnext/hub_node/page/hub/hub.js @@ -484,7 +484,7 @@ erpnext.hub.Hub = class Hub { } frappe.call({ method: 'erpnext.hub_node.get_company_details', - args: {company_id: company_id} + args: {hub_sync_id: company_id} }).then((r) => { if (r.message) { const company_details = r.message.company_details; diff --git a/erpnext/projects/doctype/timesheet/timesheet.js b/erpnext/projects/doctype/timesheet/timesheet.js index 1ea5962911..43f5705e82 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.js +++ b/erpnext/projects/doctype/timesheet/timesheet.js @@ -191,7 +191,6 @@ var update_time_rates = function(frm, cdt, cdn){ var child = locals[cdt][cdn]; if(!child.billable){ frappe.model.set_value(cdt, cdn, 'billing_rate', 0.0); - frappe.model.set_value(cdt, cdn, 'costing_rate', 0.0); } } @@ -202,9 +201,8 @@ var calculate_billing_costing_amount = function(frm, cdt, cdn){ if(child.billing_hours && child.billable){ billing_amount = (child.billing_hours * child.billing_rate); - costing_amount = flt(child.costing_rate * child.billing_hours); } - + costing_amount = flt(child.costing_rate * child.hours); frappe.model.set_value(cdt, cdn, 'billing_amount', billing_amount); frappe.model.set_value(cdt, cdn, 'costing_amount', costing_amount); calculate_time_and_amount(frm); diff --git a/erpnext/projects/doctype/timesheet/timesheet.py b/erpnext/projects/doctype/timesheet/timesheet.py index ad566d5ac1..01552a50c9 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.py +++ b/erpnext/projects/doctype/timesheet/timesheet.py @@ -49,10 +49,10 @@ class Timesheet(Document): self.update_time_rates(d) self.total_hours += flt(d.hours) + self.total_costing_amount += flt(d.costing_amount) if d.billable: self.total_billable_hours += flt(d.billing_hours) self.total_billable_amount += flt(d.billing_amount) - self.total_costing_amount += flt(d.costing_amount) self.total_billed_amount += flt(d.billing_amount) if d.sales_invoice else 0.0 self.total_billed_hours += flt(d.billing_hours) if d.sales_invoice else 0.0 @@ -265,19 +265,19 @@ class Timesheet(Document): def update_cost(self): for data in self.time_logs: - if data.activity_type and data.billable: + if data.activity_type or data.billable: rate = get_activity_cost(self.employee, data.activity_type) hours = data.billing_hours or 0 + costing_hours = data.billing_hours or data.hours or 0 if rate: data.billing_rate = flt(rate.get('billing_rate')) if flt(data.billing_rate) == 0 else data.billing_rate data.costing_rate = flt(rate.get('costing_rate')) if flt(data.costing_rate) == 0 else data.costing_rate data.billing_amount = data.billing_rate * hours - data.costing_amount = data.costing_rate * hours + data.costing_amount = data.costing_rate * costing_hours def update_time_rates(self, ts_detail): if not ts_detail.billable: ts_detail.billing_rate = 0.0 - ts_detail.costing_rate = 0.0 @frappe.whitelist() def get_projectwise_timesheet_data(project, parent=None): diff --git a/erpnext/selling/doctype/product_bundle/product_bundle.json b/erpnext/selling/doctype/product_bundle/product_bundle.json index 5a1aeb4eb5..b63fb4bdcf 100644 --- a/erpnext/selling/doctype/product_bundle/product_bundle.json +++ b/erpnext/selling/doctype/product_bundle/product_bundle.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 0, "beta": 0, @@ -12,6 +13,7 @@ "editable_grid": 0, "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -40,6 +42,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -72,6 +75,37 @@ "unique": 0 }, { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "description", + "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": "Description", + "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, @@ -101,6 +135,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -132,6 +167,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -160,6 +196,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -190,19 +227,19 @@ "unique": 0 } ], + "has_web_view": 0, "hide_heading": 0, "hide_toolbar": 0, "icon": "fa fa-sitemap", "idx": 1, "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-02-22 05:06:30.143089", - "modified_by": "Administrator", + "modified": "2017-10-18 14:23:06.538568", + "modified_by": "tundebabzy@gmail.com", "module": "Selling", "name": "Product Bundle", "owner": "Administrator", diff --git a/erpnext/setup/doctype/customer_group/customer_group.py b/erpnext/setup/doctype/customer_group/customer_group.py index 0f1ee81863..7472c51aff 100644 --- a/erpnext/setup/doctype/customer_group/customer_group.py +++ b/erpnext/setup/doctype/customer_group/customer_group.py @@ -17,11 +17,11 @@ class CustomerGroup(NestedSet): def validate_name_with_customer(self): if frappe.db.exists("Customer", self.name): - frappe.msgprint(_("An Customer exists with same name"), raise_exception=1) + frappe.msgprint(_("A customer with the same name already exists"), raise_exception=1) def get_parent_customer_groups(customer_group): lft, rgt = frappe.db.get_value("Customer Group", customer_group, ['lft', 'rgt']) return frappe.db.sql("""select name from `tabCustomer Group` where lft <= %s and rgt >= %s - order by lft asc""", (lft, rgt), as_dict=True) \ No newline at end of file + order by lft asc""", (lft, rgt), as_dict=True) diff --git a/erpnext/templates/utils.py b/erpnext/templates/utils.py index 6ebe41185f..7ee39602f5 100644 --- a/erpnext/templates/utils.py +++ b/erpnext/templates/utils.py @@ -28,11 +28,12 @@ def send_message(subject="Website Query", message="", sender="", status="Open"): )).insert(ignore_permissions=True) opportunity = frappe.get_doc(dict( - doctype='Opportunity', + doctype ='Opportunity', enquiry_from = 'Customer' if customer else 'Lead', status = 'Open', title = subject, - to_discuss=message + contact_email = sender, + to_discuss = message )) if customer: diff --git a/erpnext/tests/ui/tests.txt b/erpnext/tests/ui/tests.txt index 38c138db0a..e7de60439a 100644 --- a/erpnext/tests/ui/tests.txt +++ b/erpnext/tests/ui/tests.txt @@ -72,7 +72,6 @@ erpnext/hr/doctype/appraisal/test_appraisal.js erpnext/hr/doctype/expense_claim_type/test_expense_claim_type.js erpnext/hr/doctype/expense_claim/test_expense_claim.js erpnext/hr/doctype/training_event/tests/test_training_event.js -erpnext/hr/doctype/training_event/tests/test_training_event_attendance.js erpnext/hr/doctype/training_result_employee/test_training_result.js erpnext/hr/doctype/training_feedback/test_training_feedback.js erpnext/hr/doctype/loan_type/test_loan_type.js