diff --git a/laundry_management/README.rst b/laundry_management/README.rst new file mode 100644 index 000000000..949743d30 --- /dev/null +++ b/laundry_management/README.rst @@ -0,0 +1,23 @@ +Laundry Management v11 +====================== +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 +Developer: Nilmar Shereef \ No newline at end of file diff --git a/laundry_management/__init__.py b/laundry_management/__init__.py new file mode 100644 index 000000000..6fa5b5e73 --- /dev/null +++ b/laundry_management/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from . import models +from . import reports diff --git a/laundry_management/__manifest__.py b/laundry_management/__manifest__.py new file mode 100644 index 000000000..1241a3442 --- /dev/null +++ b/laundry_management/__manifest__.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +{ + 'name': 'Laundry Management', + 'version': '11.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': 'AGPL-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..2a97af4d9 --- /dev/null +++ b/laundry_management/models/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from . import laundry diff --git a/laundry_management/models/laundry.py b/laundry_management/models/laundry.py new file mode 100644 index 000000000..2d832aa46 --- /dev/null +++ b/laundry_management/models/laundry.py @@ -0,0 +1,395 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# 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' + _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.invoice_status = self.sale_obj.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)]) + 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)]) + 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..b1554e660 --- /dev/null +++ b/laundry_management/reports/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from . 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..488e2ca28 --- /dev/null +++ b/laundry_management/reports/laundry_report.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies(). +# Author: Cybrosys Techno Solutions () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# 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..4929f95e3 --- /dev/null +++ b/laundry_management/security/laundry_security.xml @@ -0,0 +1,22 @@ + + + + + + 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..d97a72dc8 --- /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..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/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..c105e34cd --- /dev/null +++ b/laundry_management/views/config_view.xml @@ -0,0 +1,92 @@ + + + + + + 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..6a8948c93 --- /dev/null +++ b/laundry_management/views/laundry_label.xml @@ -0,0 +1,48 @@ + + + + + + + + + + diff --git a/laundry_management/views/laundry_report.xml b/laundry_management/views/laundry_report.xml new file mode 100644 index 000000000..4381c5558 --- /dev/null +++ b/laundry_management/views/laundry_report.xml @@ -0,0 +1,28 @@ + + + + + + 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..f425afcce --- /dev/null +++ b/laundry_management/views/laundry_view.xml @@ -0,0 +1,122 @@ + + + + + + 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..78bf05fac --- /dev/null +++ b/laundry_management/views/washing_view.xml @@ -0,0 +1,78 @@ + + + + + + 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