diff --git a/fleet_rental/static/description/index.html b/fleet_rental/static/description/index.html index 54eb37c98..3852f3aca 100644 --- a/fleet_rental/static/description/index.html +++ b/fleet_rental/static/description/index.html @@ -198,6 +198,15 @@ +
+
+

You Looking for a functional Documentation of this Application.?

+

Give a Request Mail to:    odoo@cybrosys.com

+
+
+
+ +

Need Any Help?

diff --git a/fleet_rental/static/description/index.html~ b/fleet_rental/static/description/index.html~ index 7b3fd6a31..54eb37c98 100644 --- a/fleet_rental/static/description/index.html~ +++ b/fleet_rental/static/description/index.html~ @@ -27,7 +27,7 @@

Overview

- This module is an application for Vehicle Rental System which helps in managing the rental of fleet/vehicle. + This module is an application for Vehicle Rental System by Cybrosys Technologies which helps in managing the rental of fleet/vehicle. It manages fleet/vehicle property by extending the basic fleet module of Odoo. Currently fleet module does not have any connection with accounting module. But in this module, we integrate the module with accounting also. diff --git a/laundry_management/README.rst b/laundry_management/README.rst new file mode 100644 index 000000000..6cc90cd25 --- /dev/null +++ b/laundry_management/README.rst @@ -0,0 +1,22 @@ +Laundry Management v10 +====================== +This module helps you to manage laundry service. + +Features +======== + +* Recording Laundry Order. +* Assigning Works. +* Make Invoices. +* Separate View for Works. +* Billing Facility for Extra Works. +* Label Printing for Every Order. +* Detailed Laundry Work Analysis Report. +* Access Rights From Multiple Level. +* Configuration for Washing Type. +* Configuration for Extra Works (Ironing/Patching etc..). + +Credits +======= +Developer: Jesni Banu @ cybrosys, jesni@cybrosys.in +Developer: Nilmar Shereef @ cybrosys, shereef@cybrosys.in diff --git a/laundry_management/__init__.py b/laundry_management/__init__.py new file mode 100644 index 000000000..547c6daeb --- /dev/null +++ b/laundry_management/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Jesni Banu() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +import models +import reports diff --git a/laundry_management/__manifest__.py b/laundry_management/__manifest__.py new file mode 100644 index 000000000..a969b13bd --- /dev/null +++ b/laundry_management/__manifest__.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Jesni Banu() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +{ + 'name': 'Laundry Management', + 'version': '10.0.1.0.0', + 'summary': """Complete Laundry Service Management""", + 'description': 'This module is very useful to manage all process of laundry service', + "category": "Industries", + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'website': "https://www.cybrosys.com", + 'depends': ['base', 'mail', 'sale', 'account'], + 'data': [ + 'data/data.xml', + 'security/laundry_security.xml', + 'security/ir.model.access.csv', + 'views/laundry_view.xml', + 'views/washing_view.xml', + 'views/config_view.xml', + 'views/laundry_report.xml', + 'views/laundry_label.xml', + ], + 'images': ['static/description/banner.jpg'], + 'license': 'LGPL-3', + 'demo': [], + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/laundry_management/data/data.xml b/laundry_management/data/data.xml new file mode 100644 index 000000000..38b466b5d --- /dev/null +++ b/laundry_management/data/data.xml @@ -0,0 +1,7 @@ + + + + Laundry Service + service + + \ No newline at end of file diff --git a/laundry_management/models/__init__.py b/laundry_management/models/__init__.py new file mode 100644 index 000000000..92a38571a --- /dev/null +++ b/laundry_management/models/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Jesni Banu() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +import laundry diff --git a/laundry_management/models/laundry.py b/laundry_management/models/laundry.py new file mode 100644 index 000000000..76824f219 --- /dev/null +++ b/laundry_management/models/laundry.py @@ -0,0 +1,399 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Jesni Banu() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +import time +from datetime import datetime +from odoo import models, fields, api, _ +from odoo.exceptions import UserError + + +class LaundryManagement(models.Model): + _name = 'laundry.order' + _inherit = ['mail.thread', 'ir.needaction_mixin'] + _description = "Laundry Order" + _order = 'order_date desc, id desc' + + @api.model + def create(self, vals): + vals['name'] = self.env['ir.sequence'].next_by_code('laundry.order') + return super(LaundryManagement, self).create(vals) + + @api.multi + @api.depends('order_lines') + def get_total(self): + total = 0 + for obj in self: + for each in obj.order_lines: + total += each.amount + obj.total_amount = total + + @api.multi + def confirm_order(self): + self.state = 'order' + sale_obj = self.env['sale.order'].create({'partner_id': self.partner_id.id, + 'partner_invoice_id': self.partner_invoice_id.id, + 'partner_shipping_id': self.partner_shipping_id.id}) + self.sale_obj = sale_obj + product_id = self.env.ref('laundry_management.laundry_service') + self.env['sale.order.line'].create({'product_id': product_id.id, + 'name': 'Laundry Service', + 'price_unit': self.total_amount, + 'order_id': sale_obj.id + }) + for each in self: + for obj in each.order_lines: + self.env['washing.washing'].create({'name': obj.product_id.name + '-Washing', + 'user_id': obj.washing_type.assigned_person.id, + 'description': obj.description, + 'laundry_obj': obj.id, + 'state': 'draft', + 'washing_date': datetime.now().strftime('%Y-%m-%d %H:%M:%S')}) + + @api.multi + def create_invoice(self): + if self.sale_obj.state in ['draft', 'sent']: + self.sale_obj.action_confirm() + # self.state = 'invoice' + self.invoice_status = self.sale_obj.invoice_status + print "self.sale_obj.id", self.invoice_status + return { + 'name': 'Create Invoice', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'sale.advance.payment.inv', + 'type': 'ir.actions.act_window', + 'context': {'laundry_sale_obj': self.sale_obj.id}, + 'target': 'new' + } + + @api.multi + def return_dress(self): + self.state = 'return' + + @api.multi + def cancel_order(self): + self.state = 'cancel' + + @api.multi + def _invoice_count(self): + wrk_ordr_ids = self.env['account.invoice'].search([('origin', '=', self.sale_obj.name)]) + print len(wrk_ordr_ids) + self.invoice_count = len(wrk_ordr_ids) + + @api.multi + def _work_count(self): + wrk_ordr_ids = self.env['washing.washing'].search([('laundry_obj.laundry_obj.id', '=', self.id)]) + print len(wrk_ordr_ids) + self.work_count = len(wrk_ordr_ids) + + @api.multi + def action_view_laundry_works(self): + work_obj = self.env['washing.washing'].search([('laundry_obj.laundry_obj.id', '=', self.id)]) + work_ids = [] + for each in work_obj: + work_ids.append(each.id) + view_id = self.env.ref('laundry_management.washing_form_view').id + if work_ids: + if len(work_ids) <= 1: + value = { + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'washing.washing', + 'view_id': view_id, + 'type': 'ir.actions.act_window', + 'name': _('Works'), + 'res_id': work_ids and work_ids[0] + } + else: + value = { + 'domain': str([('id', 'in', work_ids)]), + 'view_type': 'form', + 'view_mode': 'tree,form', + 'res_model': 'washing.washing', + 'view_id': False, + 'type': 'ir.actions.act_window', + 'name': _('Works'), + 'res_id': work_ids + } + + return value + + @api.multi + def action_view_invoice(self): + inv_obj = self.env['account.invoice'].search([('origin', '=', self.sale_obj.name)]) + inv_ids = [] + for each in inv_obj: + inv_ids.append(each.id) + view_id = self.env.ref('account.invoice_form').id + if inv_ids: + if len(inv_ids) <= 1: + value = { + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'account.invoice', + 'view_id': view_id, + 'type': 'ir.actions.act_window', + 'name': _('Invoice'), + 'res_id': inv_ids and inv_ids[0] + } + else: + value = { + 'domain': str([('id', 'in', inv_ids)]), + 'view_type': 'form', + 'view_mode': 'tree,form', + 'res_model': 'account.invoice', + 'view_id': False, + 'type': 'ir.actions.act_window', + 'name': _('Invoice'), + 'res_id': inv_ids + } + + return value + + name = fields.Char(string="Label", copy=False) + invoice_status = fields.Selection([ + ('upselling', 'Upselling Opportunity'), + ('invoiced', 'Fully Invoiced'), + ('to invoice', 'To Invoice'), + ('no', 'Nothing to Invoice') + ], string='Invoice Status', invisible=1, related='sale_obj.invoice_status', store=True) + sale_obj = fields.Many2one('sale.order', invisible=1) + invoice_count = fields.Integer(compute='_invoice_count', string='# Invoice') + work_count = fields.Integer(compute='_work_count', string='# Works') + partner_id = fields.Many2one('res.partner', string='Customer', readonly=True, + states={'draft': [('readonly', False)], 'order': [('readonly', False)]}, required=True, + change_default=True, index=True, track_visibility='always') + partner_invoice_id = fields.Many2one('res.partner', string='Invoice Address', readonly=True, required=True, + states={'draft': [('readonly', False)], 'order': [('readonly', False)]}, + help="Invoice address for current sales order.") + partner_shipping_id = fields.Many2one('res.partner', string='Delivery Address', readonly=True, required=True, + states={'draft': [('readonly', False)], 'order': [('readonly', False)]}, + help="Delivery address for current sales order.") + order_date = fields.Datetime(string="Date", default=datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + laundry_person = fields.Many2one('res.users', string='Laundry Person', required=1) + order_lines = fields.One2many('laundry.order.line', 'laundry_obj', required=1, ondelete='cascade') + total_amount = fields.Float(compute='get_total', string='Total', store=1) + currency_id = fields.Many2one("res.currency", string="Currency") + note = fields.Text(string='Terms and conditions') + state = fields.Selection([ + ('draft', 'Draft'), + ('order', 'Laundry Order'), + ('process', 'Processing'), + ('done', 'Done'), + ('return', 'Returned'), + ('cancel', 'Cancelled'), + ], string='Status', readonly=True, copy=False, index=True, track_visibility='onchange', default='draft') + + +class LaundryManagementLine(models.Model): + _name = 'laundry.order.line' + + @api.depends('washing_type', 'extra_work', 'qty') + def get_amount(self): + for obj in self: + total = obj.washing_type.amount*obj.qty + for each in obj.extra_work: + total += each.amount*obj.qty + obj.amount = total + + product_id = fields.Many2one('product.product', string='Dress', required=1) + qty = fields.Integer(string='No of items', required=1) + description = fields.Text(string='Description') + washing_type = fields.Many2one('washing.type', string='Washing Type', required=1) + extra_work = fields.Many2many('washing.work', string='Extra Work') + amount = fields.Float(compute='get_amount', string='Amount') + laundry_obj = fields.Many2one('laundry.order', invisible=1) + state = fields.Selection([ + ('draft', 'Draft'), + ('wash', 'Washing'), + ('extra_work', 'Make Over'), + ('done', 'Done'), + ('cancel', 'Cancelled'), + ], string='Status', readonly=True, copy=False, index=True, default='draft') + + +class WashingType(models.Model): + _name = 'washing.type' + + name = fields.Char(string='Name', required=1) + assigned_person = fields.Many2one('res.users', string='Assigned Person', required=1) + amount = fields.Float(string='Service Charge', required=1) + + +class ExtraWork(models.Model): + _name = 'washing.work' + + name = fields.Char(string='Name', required=1) + assigned_person = fields.Many2one('res.users', string='Assigned Person', required=1) + amount = fields.Float(string='Service Charge', required=1) + + +class Washing(models.Model): + _name = 'washing.washing' + + @api.multi + def start_wash(self): + if not self.laundry_works: + self.laundry_obj.state = 'wash' + self.laundry_obj.laundry_obj.state = 'process' + for each in self: + for obj in each.product_line: + self.env['sale.order.line'].create({'product_id': obj.product_id.id, + 'name': obj.name, + 'price_unit': obj.price_unit, + 'order_id': each.laundry_obj.laundry_obj.sale_obj.id, + 'product_uom_qty': obj.quantity, + 'product_uom': obj.uom_id.id, + }) + self.state = 'process' + + @api.multi + def set_to_done(self): + self.state = 'done' + f = 0 + if not self.laundry_works: + if self.laundry_obj.extra_work: + for each in self.laundry_obj.extra_work: + self.create({'name': each.name, + 'user_id': each.assigned_person.id, + 'description': self.laundry_obj.description, + 'laundry_obj': self.laundry_obj.id, + 'state': 'draft', + 'laundry_works': True, + 'washing_date': datetime.now().strftime('%Y-%m-%d %H:%M:%S')}) + self.laundry_obj.state = 'extra_work' + laundry_obj = self.search([('laundry_obj.laundry_obj', '=', self.laundry_obj.laundry_obj.id)]) + for each in laundry_obj: + if each.state != 'done' or each.state == 'cancel': + f = 1 + break + if f == 0: + self.laundry_obj.laundry_obj.state = 'done' + laundry_obj1 = self.search([('laundry_obj', '=', self.laundry_obj.id)]) + f1 = 0 + for each in laundry_obj1: + if each.state != 'done' or each.state == 'cancel': + f1 = 1 + break + if f1 == 0: + self.laundry_obj.state = 'done' + + @api.multi + @api.depends('product_line') + def get_total(self): + total = 0 + for obj in self: + for each in obj.product_line: + total += each.subtotal + obj.total_amount = total + + name = fields.Char(string='Work') + laundry_works = fields.Boolean(default=False, invisible=1) + user_id = fields.Many2one('res.users', string='Assigned Person') + washing_date = fields.Datetime(string='Date') + description = fields.Text(string='Description') + state = fields.Selection([ + ('draft', 'Draft'), + ('process', 'Process'), + ('done', 'Done'), + ('cancel', 'Cancelled'), + ], string='Status', readonly=True, copy=False, index=True, default='draft') + laundry_obj = fields.Many2one('laundry.order.line', invisible=1) + product_line = fields.One2many('wash.order.line', 'wash_obj', string='Products', ondelete='cascade') + total_amount = fields.Float(compute='get_total', string='Grand Total') + + +class SaleOrderInherit(models.Model): + _name = 'wash.order.line' + + @api.depends('price_unit', 'quantity') + def compute_amount(self): + total = 0 + for obj in self: + total += obj.price_unit * obj.quantity + obj.subtotal = total + + wash_obj = fields.Many2one('washing.washing', string='Order Reference', ondelete='cascade') + name = fields.Text(string='Description', required=True) + uom_id = fields.Many2one('product.uom', 'Unit of Measure ', required=True) + quantity = fields.Integer(string='Quantity') + product_id = fields.Many2one('product.product', string='Product') + price_unit = fields.Float('Unit Price', default=0.0, related='product_id.list_price') + subtotal = fields.Float(compute='compute_amount', string='Subtotal', readonly=True, store=True) + + +class LaundryManagementInvoice(models.TransientModel): + _inherit = 'sale.advance.payment.inv' + + @api.multi + def create_invoices(self): + context = self._context + if context.get('laundry_sale_obj'): + sale_orders = self.env['sale.order'].browse(context.get('laundry_sale_obj')) + else: + sale_orders = self.env['sale.order'].browse(self._context.get('active_ids', [])) + if self.advance_payment_method == 'delivered': + sale_orders.action_invoice_create() + elif self.advance_payment_method == 'all': + sale_orders.action_invoice_create(final=True) + else: + # Create deposit product if necessary + if not self.product_id: + vals = self._prepare_deposit_product() + self.product_id = self.env['product.product'].create(vals) + self.env['ir.values'].sudo().set_default('sale.config.settings', 'deposit_product_id_setting', + self.product_id.id) + + sale_line_obj = self.env['sale.order.line'] + for order in sale_orders: + if self.advance_payment_method == 'percentage': + amount = order.amount_untaxed * self.amount / 100 + else: + amount = self.amount + if self.product_id.invoice_policy != 'order': + raise UserError(_( + 'The product used to invoice a down payment should have an invoice policy set to "Ordered' + ' quantities". Please update your deposit product to be able to create a deposit invoice.')) + if self.product_id.type != 'service': + raise UserError(_( + "The product used to invoice a down payment should be of type 'Service'. Please use another " + "product or update this product.")) + taxes = self.product_id.taxes_id.filtered( + lambda r: not order.company_id or r.company_id == order.company_id) + if order.fiscal_position_id and taxes: + tax_ids = order.fiscal_position_id.map_tax(taxes).ids + else: + tax_ids = taxes.ids + so_line = sale_line_obj.create({ + 'name': _('Advance: %s') % (time.strftime('%m %Y'),), + 'price_unit': amount, + 'product_uom_qty': 0.0, + 'order_id': order.id, + 'discount': 0.0, + 'product_uom': self.product_id.uom_id.id, + 'product_id': self.product_id.id, + 'tax_id': [(6, 0, tax_ids)], + }) + self._create_invoice(order, so_line, amount) + if self._context.get('open_invoices', False): + return sale_orders.action_view_invoice() + return {'type': 'ir.actions.act_window_close'} diff --git a/laundry_management/reports/__init__.py b/laundry_management/reports/__init__.py new file mode 100644 index 000000000..28da15959 --- /dev/null +++ b/laundry_management/reports/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Jesni Banu() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +import laundry_report diff --git a/laundry_management/reports/laundry_report.py b/laundry_management/reports/laundry_report.py new file mode 100644 index 000000000..10918dc9f --- /dev/null +++ b/laundry_management/reports/laundry_report.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Jesni Banu() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +from odoo import models, fields, tools + + +class DifferedCheckHistory(models.Model): + _name = "report.laundry.order" + _description = "Laundry Order Analysis" + _auto = False + + name = fields.Char(string="Label") + invoice_status = fields.Selection([ + ('upselling', 'Upselling Opportunity'), + ('invoiced', 'Fully Invoiced'), + ('to invoice', 'To Invoice'), + ('no', 'Nothing to Invoice') + ], string='Invoice Status', store=True) + partner_id = fields.Many2one('res.partner', string='Customer') + partner_invoice_id = fields.Many2one('res.partner', string='Invoice Address') + partner_shipping_id = fields.Many2one('res.partner', string='Delivery Address') + order_date = fields.Datetime(string="Date") + laundry_person = fields.Many2one('res.users', string='Laundry Person') + total_amount = fields.Float(string='Total') + currency_id = fields.Many2one("res.currency", string="Currency") + state = fields.Selection([ + ('draft', 'Draft'), + ('order', 'Laundry Order'), + ('process', 'Processing'), + ('done', 'Done'), + ('return', 'Returned'), + ('cancel', 'Cancelled'), + ], string='Status') + + _order = 'name desc' + + def _select(self): + select_str = """ + SELECT + (select 1 ) AS nbr, + t.id as id, + t.name as name, + t.invoice_status as invoice_status, + t.partner_id as partner_id, + t.partner_invoice_id as partner_invoice_id, + t.partner_shipping_id as partner_shipping_id, + t.order_date as order_date, + t.laundry_person as laundry_person, + t.total_amount as total_amount, + t.currency_id as currency_id, + t.state as state + """ + return select_str + + def _group_by(self): + group_by_str = """ + GROUP BY + t.id, + name, + invoice_status, + partner_id, + partner_invoice_id, + partner_shipping_id, + order_date, + laundry_person, + total_amount, + currency_id, + state + """ + return group_by_str + + def init(self): + tools.sql.drop_view_if_exists(self._cr, 'report_laundry_order') + self._cr.execute(""" + CREATE view report_laundry_order as + %s + FROM laundry_order t + %s + """ % (self._select(), self._group_by())) diff --git a/laundry_management/security/ir.model.access.csv b/laundry_management/security/ir.model.access.csv new file mode 100644 index 000000000..2433d0414 --- /dev/null +++ b/laundry_management/security/ir.model.access.csv @@ -0,0 +1,19 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +laundry_model_access_right_user,laundry_model_access_right,model_laundry_order,laundry_group_user,1,1,0,0 +laundry_model_access_right_manager,laundry_model_access_right1,model_laundry_order,laundry_group_manager,1,1,1,1 +laundry_order_line_model_access_right_user,laundry_order_line_model_access_right,model_laundry_order_line,laundry_group_user,1,1,0,0 +laundry_order_line_model_access_right_manager,laundry_order_line_model_access_right1,model_laundry_order_line,laundry_group_manager,1,1,1,1 +laundry_washing_type_model_access_right_user,laundry_washing_type_model_access_right,model_washing_type,laundry_group_user,1,0,0,0 +laundry_washing_type_model_access_right_manager,laundry_washing_type_model_access_right1,model_washing_type,laundry_group_manager,1,1,1,1 +laundry_washing_work_model_access_right_user,laundry_model_washing_work_access_right,model_washing_work,laundry_group_user,1,0,0,0 +laundry_washing_work_model_access_right_manager,laundry_model_washing_work_access_right1,model_washing_work,laundry_group_manager,1,1,1,1 +laundry_washing_washing_model_access_right_user,laundry_model_washing_washing_access_right,model_washing_washing,laundry_group_user,1,1,1,0 +laundry_washing_washing_model_access_right_manager,laundry_model_washing_washing_access_right1,model_washing_washing,laundry_group_manager,1,1,1,1 +laundry_wash_order_line_model_access_right_user,laundry_model_wash_order_line_access_right,model_wash_order_line,laundry_group_user,1,1,1,0 +laundry_wash_order_line_model_access_right_manager,laundry_model_wash_order_line_access_right1,model_wash_order_line,laundry_group_manager,1,1,1,1 +laundry_report_laundry_order_model_access_right_user,laundry_model_report_laundry_order_access_right,model_report_laundry_order,laundry_group_user,1,0,0,0 +laundry_report_laundry_order_model_access_right_manager,laundry_model_report_laundry_order_access_right1,model_report_laundry_order,laundry_group_manager,1,1,1,1 +laundry_report_laundry_order_model_access_right_manager1,laundry_model_report_laundry_order_access_right11,sale.model_sale_order,laundry_group_manager,1,1,1,1 +laundry_report_laundry_order_model_access_right_manager12,laundry_model_report_laundry_order_access_right112,sale.model_sale_order_line,laundry_group_manager,1,1,1,1 +laundry_report_laundry_order_model_access_right_manager11,laundry_model_report_laundry_order_access_right111,sale.model_sale_order,laundry_group_user,1,1,1,1 +laundry_report_laundry_order_model_access_right_manager112,laundry_model_report_laundry_order_access_right1112,sale.model_sale_order_line,laundry_group_user,1,1,1,1 \ No newline at end of file diff --git a/laundry_management/security/laundry_security.xml b/laundry_management/security/laundry_security.xml new file mode 100644 index 000000000..37085ff17 --- /dev/null +++ b/laundry_management/security/laundry_security.xml @@ -0,0 +1,20 @@ + + + + + Laundry + 18 + + + User + + + + + Manager + + + + + + diff --git a/laundry_management/static/description/additional.png b/laundry_management/static/description/additional.png new file mode 100644 index 000000000..47f7bf29a Binary files /dev/null and b/laundry_management/static/description/additional.png differ diff --git a/laundry_management/static/description/banner.jpg b/laundry_management/static/description/banner.jpg new file mode 100644 index 000000000..9231f382f Binary files /dev/null and b/laundry_management/static/description/banner.jpg differ diff --git a/laundry_management/static/description/cybro_logo.png b/laundry_management/static/description/cybro_logo.png new file mode 100644 index 000000000..bb309114c Binary files /dev/null and b/laundry_management/static/description/cybro_logo.png differ diff --git a/laundry_management/static/description/demo_work.png b/laundry_management/static/description/demo_work.png new file mode 100644 index 000000000..41585f68e Binary files /dev/null and b/laundry_management/static/description/demo_work.png differ diff --git a/laundry_management/static/description/icon.png b/laundry_management/static/description/icon.png new file mode 100644 index 000000000..fbf1320b2 Binary files /dev/null and b/laundry_management/static/description/icon.png differ diff --git a/laundry_management/static/description/index.html b/laundry_management/static/description/index.html new file mode 100644 index 000000000..adca66f0f --- /dev/null +++ b/laundry_management/static/description/index.html @@ -0,0 +1,222 @@ +

+
+

Laundry Service Management

+

Cybrosys Industrial Module Which Helps You To Manage Laundry Service

+

Cybrosys Technologies

+
+
+

Features:

+
+ Recording Laundry Order.
+ Assigning Works.
+ Make Invoices.
+ Separate View for Works.
+ Billing Facility for Extra Works.
+ Label Printing for Every Order.
+ Detailed Laundry Work Analysis Report.
+ Access Rights From Multiple Level.
+ Configuration for Washing Type.
+ Configuration for Extra Works (Ironing/Patching etc..).
+
+
+
+ +
+
+
+

Overview

+

+ This is an industrial specific module by Cybrosys Technologies + for Laundry Management. It manages + the laundry process with assigning works to workers. +

+
+
+
+ +
+
+

Recording Laundry Order

+
+

+

Laundry Management -> Laundry Management -> Laundry Order

+

+ ☛ When you install this module, an extra menu + Laundry Management will created in main menu. You + can see the different sub menus under the main menu. Here you + can create Laundry Order via clicking the 'Create' button. There you can specify the customer, laundry person, + order lines with washing type and Extra works for your order. + +

+
+
+ +
+
+
+
+ ☛ When you confirm the Laundry Order the corresponding works will created under the + assigned person. There you can add extra products also. It will also add in Billing. +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ +
+
+

Laundry Label

+
+
+ ☛ You can print label for each order from the print menu. +
+
+ +
+
+
+
+ +
+
+

Laundry Works

+
+
+

+

Laundry Management -> Laundry Management -> Laundry Works

+

+

+
+ ☛ This is the Separate Laundry Works Form. Here you can see the work status of Laundry Works. +
+
+ +
+
+ ☛ If there is any extra works , it will created as work When you finish the main work. Then we can see the + status of that order line is become 'Make Over'. +
+
+ +
+
+
+
+ +
+
+

Invoice

+
+ ☛ + You can create Invoice via the button 'Create Invoice' when the order reaches to 'Done' state. + +
+ +
+
+
+ ☛ + You can see all the Invoice through the smart button "Invoices" from the Laundry Order form. + +
+ +
+
+
+
+ +
+
+

Configuration

+
+ ☛ + You can configure washing types from the menu Laundry Management -> Configuration -> Washing Type by + specifying the name, assigned person and service charge + +
+ +
+
+
+ ☛ + You can configure additional works from the menu Laundry Management -> Configuration -> Additional Works by + specifying the name, assigned person and service charge + +
+ +
+
+
+
+ +
+
+

Laundry Work Analysis Report

+
+ ☛ + You can also analyse your all Laundry Works from Laundry Management -> Report -> Laundry Order Analysis. + +
+ +
+
+
+
+ +
+
+

Access Rights

+
+ ☛Laundry Manager :- Laundry manager have all the access across the fleet rental management
+ ☛Laundry User :- Laundry user can read, write and create the records. +
+
+
+ +
+
+

You Looking for a functional Documentation of this Application.?

+

Give a Request Mail to:    odoo@cybrosys.com

+
+
+
+ +
+

Need Any Help?

+ +
+ + + diff --git a/laundry_management/static/description/index.html~ b/laundry_management/static/description/index.html~ new file mode 100644 index 000000000..fc431506e --- /dev/null +++ b/laundry_management/static/description/index.html~ @@ -0,0 +1,214 @@ +
+
+

Laundry Service Management

+

Cybrosys Industrial Module Which Helps You To Manage Laundry Service

+

Cybrosys Technologies

+
+
+

Features:

+
+ Recording Laundry Order.
+ Assigning Works.
+ Make Invoices.
+ Separate View for Works.
+ Billing Facility for Extra Works.
+ Label Printing for Every Order.
+ Detailed Laundry Work Analysis Report.
+ Access Rights From Multiple Level.
+ Configuration for Washing Type.
+ Configuration for Extra Works (Ironing/Patching etc..).
+
+
+
+ +
+
+
+

Overview

+

+ This is an industrial specific module by Cybrosys Technologies + for Laundry Management. It manages + the laundry process with assigning works to workers. +

+
+
+
+ +
+
+

Recording Laundry Order

+
+

+

Laundry Management -> Laundry Management -> Laundry Order

+

+ ☛ When you install this module, an extra menu + Laundry Management will created in main menu. You + can see the different sub menus under the main menu. Here you + can create Laundry Order via clicking the 'Create' button. There you can specify the customer, laundry person, + order lines with washing type and Extra works for your order. + +

+
+
+ +
+
+
+
+ ☛ When you confirm the Laundry Order the corresponding works will created under the + assigned person. There you can add extra products also. It will also add in Billing. +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ +
+
+

Laundry Label

+
+
+ ☛ You can print label for each order from the print menu. +
+
+ +
+
+
+
+ +
+
+

Laundry Works

+
+
+

+

Laundry Management -> Laundry Management -> Laundry Works

+

+

+
+ ☛ This is the Separate Laundry Works Form. Here you can see the work status of Laundry Works. +
+
+ +
+
+ ☛ If there is any extra works , it will created as work When you finish the main work. Then we can see the + status of that order line is become 'Make Over'. +
+
+ +
+
+
+
+ +
+
+

Invoice

+
+ ☛ + You can create Invoice via the button 'Create Invoice' when the order reaches to 'Done' state. + +
+ +
+
+
+ ☛ + You can see all the Invoice through the smart button "Invoices" from the Laundry Order form. + +
+ +
+
+
+
+ +
+
+

Configuration

+
+ ☛ + You can configure washing types from the menu Laundry Management -> Configuration -> Washing Type by + specifying the name, assigned person and service charge + +
+ +
+
+
+ ☛ + You can configure additional works from the menu Laundry Management -> Configuration -> Additional Works by + specifying the name, assigned person and service charge + +
+ +
+
+
+
+ +
+
+

Laundry Work Analysis Report

+
+ ☛ + You can also analyse your all Laundry Works from Laundry Management -> Report -> Laundry Order Analysis. + +
+ +
+
+
+
+ +
+
+

Access Rights

+
+ ☛Laundry Manager :- Laundry manager have all the access across the fleet rental management
+ ☛Laundry User :- Laundry user can read, write and create the records. +
+
+
+ +
+

Need Any Help?

+ +
+ + + diff --git a/laundry_management/static/description/invoice.png b/laundry_management/static/description/invoice.png new file mode 100644 index 000000000..a41c51043 Binary files /dev/null and b/laundry_management/static/description/invoice.png differ diff --git a/laundry_management/static/description/invoice1.png b/laundry_management/static/description/invoice1.png new file mode 100644 index 000000000..0f84c4d17 Binary files /dev/null and b/laundry_management/static/description/invoice1.png differ diff --git a/laundry_management/static/description/label.png b/laundry_management/static/description/label.png new file mode 100644 index 000000000..d83d63b5f Binary files /dev/null and b/laundry_management/static/description/label.png differ diff --git a/laundry_management/static/description/laundr_work.png b/laundry_management/static/description/laundr_work.png new file mode 100644 index 000000000..7df1b973c Binary files /dev/null and b/laundry_management/static/description/laundr_work.png differ diff --git a/laundry_management/static/description/laundry_order.png b/laundry_management/static/description/laundry_order.png new file mode 100644 index 000000000..5ec927dc1 Binary files /dev/null and b/laundry_management/static/description/laundry_order.png differ diff --git a/laundry_management/static/description/laundry_report.png b/laundry_management/static/description/laundry_report.png new file mode 100644 index 000000000..671a1e535 Binary files /dev/null and b/laundry_management/static/description/laundry_report.png differ diff --git a/laundry_management/static/description/makeover.png b/laundry_management/static/description/makeover.png new file mode 100644 index 000000000..6b0b7025e Binary files /dev/null and b/laundry_management/static/description/makeover.png differ diff --git a/laundry_management/static/description/order.png b/laundry_management/static/description/order.png new file mode 100644 index 000000000..b49e99cde Binary files /dev/null and b/laundry_management/static/description/order.png differ diff --git a/laundry_management/static/description/washing_type.png b/laundry_management/static/description/washing_type.png new file mode 100644 index 000000000..efa3529e2 Binary files /dev/null and b/laundry_management/static/description/washing_type.png differ diff --git a/laundry_management/views/config_view.xml b/laundry_management/views/config_view.xml new file mode 100644 index 000000000..aee6d38b4 --- /dev/null +++ b/laundry_management/views/config_view.xml @@ -0,0 +1,91 @@ + + + + + washing.type.form + washing.type + +
+ + + + + + + + + + + +
+
+
+ + + washing.type.tree + washing.type + + + + + + + + + + + Washing Type + ir.actions.act_window + washing.type + form + tree,form + + + + washing.work.form + washing.work + +
+ + + + + + + + + + + +
+
+
+ + + washing.work.tree + washing.work + + + + + + + + + + + Additional Works + ir.actions.act_window + washing.work + form + tree,form + + + + + + + + +
+
\ No newline at end of file diff --git a/laundry_management/views/laundry_label.xml b/laundry_management/views/laundry_label.xml new file mode 100644 index 000000000..d794889ca --- /dev/null +++ b/laundry_management/views/laundry_label.xml @@ -0,0 +1,45 @@ + + + + + + + diff --git a/laundry_management/views/laundry_report.xml b/laundry_management/views/laundry_report.xml new file mode 100644 index 000000000..d86230e37 --- /dev/null +++ b/laundry_management/views/laundry_report.xml @@ -0,0 +1,26 @@ + + + + + report.laundry.order.pivot + report.laundry.order + + + + + + + + + Laundry Order Analysis + report.laundry.order + form + pivot + {'group_by_no_leaf':1,'group_by':[]} + This report allows you to analyse the performance of your Laundry Mangement. + + + + + + \ No newline at end of file diff --git a/laundry_management/views/laundry_view.xml b/laundry_management/views/laundry_view.xml new file mode 100644 index 000000000..87cf4a511 --- /dev/null +++ b/laundry_management/views/laundry_view.xml @@ -0,0 +1,119 @@ + + + + + Laundry Order Code + laundry.order + + LO + + + laundry.order.form + laundry.order + +
+
+
+ +
+ + +
+
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + +
+ + + + + + laundry.order.tree + laundry.order + + + + + + + + + + + + + + Laundry Management + ir.actions.act_window + laundry.order + form + tree,form + [('laundry_person','=', uid)] + +

+ Click to create a New Order. +

+
+
+ + + + + + \ No newline at end of file diff --git a/laundry_management/views/washing_view.xml b/laundry_management/views/washing_view.xml new file mode 100644 index 000000000..19db6c85a --- /dev/null +++ b/laundry_management/views/washing_view.xml @@ -0,0 +1,77 @@ + + + + + washing.washing.form + washing.washing + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + washing.washing.tree + washing.washing + + + + + + + + + + + + Washing + ir.actions.act_window + washing.washing + form + tree,form + [('user_id','=', uid)] + + + + + + \ No newline at end of file